diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | src/utils.h | 30 | ||||
| -rw-r--r-- | src/wayclock.cc | 34 |
3 files changed, 45 insertions, 21 deletions
@@ -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 |
