summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice <fabrice@schaub-dev.xyz>2026-02-11 11:13:20 +0100
committerFabrice <fabrice@schaub-dev.xyz>2026-02-11 11:13:20 +0100
commit16dc21cd1a820b49901df69ab3f21da1ddc69476 (patch)
treef633c2ee79af2f0fd70fdea411b20eb4d30f2854
parent9f6a7d71b179b72a12790a9d363789240003e20a (diff)
interduce defer macro
-rw-r--r--Makefile2
-rw-r--r--src/utils.h30
-rw-r--r--src/wayclock.cc34
3 files changed, 45 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index 21c9120..ea58df2 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ CC_STD = -std=c11
CC_FLAGS = $(CC_STD) $(CSH_FLAGS)
CXX = clang++
-CXX_STD = -std=c++11
+CXX_STD = -std=c++17
CXX_FLAGS = -fno-rtti -fno-exceptions $(CXX_STD) $(CSH_FLAGS)
CARGO = cargo
diff --git a/src/utils.h b/src/utils.h
index a4467d3..deba95f 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -1,9 +1,9 @@
#pragma once
-#include <stdint.h>
#include <wayland-client.h>
-#include <wayland-egl-core.h>
+#include <wayland-egl.h>
+#include <cstdint>
#include <cstdio>
#include <cstdlib>
@@ -63,3 +63,29 @@ static inline u32 wayc_min(u32 a, u32 b) { return a > b ? a : b; }
} while (0)
#define wayc_notnull(expr) wayc_assert(expr != NULL)
+
+#define WAYC_CONCAT_IMPL(a, b) a##b
+#define WAYC_CONCAT(a, b) WAYC_CONCAT_IMPL(a, b)
+
+#define WAYC_UNIQUE(base) WAYC_CONCAT(base, WAYC_CONCAT(__LINE__, __COUNTER__))
+
+template <typename A, typename B>
+struct is_same {
+ static constexpr bool value = false;
+};
+
+template <typename A>
+struct is_same<A, A> {
+ static constexpr bool value = true;
+};
+
+template <typename Func>
+struct defer_s {
+ Func func;
+
+ defer_s(Func func) : func(func) {}
+
+ ~defer_s() { func(); }
+};
+
+#define wayc_defer(func) auto WAYC_UNIQUE(_defer_) = defer_s([&]() { func; }) \ No newline at end of file
diff --git a/src/wayclock.cc b/src/wayclock.cc
index 3911ca0..d089ea6 100644
--- a/src/wayclock.cc
+++ b/src/wayclock.cc
@@ -59,34 +59,38 @@ int main() {
if (wayc_font_context_init(&fctx) != FONT_CONTEXT_ERROR_NONE)
wayc_panic("Failed to initialize font context");
+ wayc_defer(wayc_font_context_deinit(&fctx));
+
struct eventloop_s loop;
- if (wayc_eventloop_init(&loop, wayc_handle) != EVENTLOOP_ERROR_NONE) {
- wayc_font_context_deinit(&fctx);
+ if (wayc_eventloop_init(&loop, wayc_handle) != EVENTLOOP_ERROR_NONE)
wayc_panic("Failed to initialize event loop");
- }
+
+ wayc_defer(wayc_eventloop_deinit(&loop));
struct graphics_s graphics;
if (wayc_graphics_init(&graphics, &loop.state) != GRAPHICS_ERROR_NONE)
wayc_panic("Failed to initialize graphics");
+ wayc_defer(wayc_graphics_deinit(&graphics));
+
struct window_s window;
- if (wayc_window_init(&window, WAYC_APP_NAME, &loop) != WINDOW_ERROR_NONE) {
- wayc_graphics_deinit(&graphics);
- wayc_eventloop_deinit(&loop);
+ if (wayc_window_init(&window, WAYC_APP_NAME, &loop) != WINDOW_ERROR_NONE)
wayc_panic("Failed to initialize window");
- }
window_id_t winid = wayc_eventloop_register(&loop, &window);
window.id = winid;
+ wayc_defer({
+ wayc_eventloop_unregister(&loop, winid);
+ wayc_window_deinit(&window);
+ });
+
struct renderer_s renderer;
if (wayc_renderer_init(&renderer, &window, &graphics, WAYC_APP_WIDTH,
- WAYC_APP_HEIGHT) != RENDERER_ERROR_NONE) {
- wayc_window_deinit(&window);
- wayc_graphics_deinit(&graphics);
- wayc_eventloop_deinit(&loop);
+ WAYC_APP_HEIGHT) != RENDERER_ERROR_NONE)
wayc_panic("Failed to initialize renderer");
- }
+
+ wayc_defer(wayc_renderer_deinit(&renderer));
wayc_renderer_use(&renderer);
wayc_window_redraw(&window, &loop);
@@ -101,11 +105,5 @@ int main() {
wayc_window_redraw(&window, &loop);
}
- wayc_renderer_deinit(&renderer);
- wayc_window_deinit(&window);
- wayc_graphics_deinit(&graphics);
- wayc_eventloop_deinit(&loop);
-
- wayc_font_context_deinit(&fctx);
return 0;
} \ No newline at end of file