#pragma once #include #include #include #include #include #include "xdg-shell.h" typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef int8_t i8; typedef int16_t i16; typedef int32_t i32; typedef int64_t i64; #if UINT64_MAX == UINTPTR_MAX typedef u64 usize; typedef i64 isize; #elif UINT32_MAX == UINTPTR_MAX typedef u32 usize; typedef i32 isize; #else #error "Unsupported pointer size" #endif typedef struct wl_display* wl_display_t; typedef struct wl_registry* wl_registry_t; typedef struct wl_compositor* wl_compositor_t; typedef struct wl_surface* wl_surface_t; typedef struct xdg_wm_base* xdg_wm_base_t; typedef struct xdg_surface* xdg_surface_t; typedef struct xdg_toplevel* xdg_toplevel_t; typedef struct wl_egl_window* wl_egl_window_t; static inline u32 wayc_min(u32 a, u32 b) { return a > b ? a : b; } [[noreturn]] static inline void wayc_panic_impl(const char* file, int line, const char* func, const char* fmt, ...) { fprintf(stderr, "Panic at %s:%d in %s: ", file, line, func); va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); exit(EXIT_FAILURE); } #define wayc_panic(...) \ wayc_panic_impl(__FILE__, __LINE__, __func__, __VA_ARGS__) #define wayc_assert(expr) \ do { \ if (!(expr)) wayc_panic("Assertion failed: %s", #expr); \ } 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 struct is_same { static constexpr bool value = false; }; template struct is_same { static constexpr bool value = true; }; template 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; }) template struct defer_cond_s { Func func; S* signal; S expected; defer_cond_s(Func func, S* cond, S expected) : func(func), signal(cond), expected(expected) {} ~defer_cond_s() { if (*signal == expected) return; func(); } }; #define wayc_defer_cond(func, cond, expected) \ auto WAYC_UNIQUE(_defer_) = defer_cond_s([&]() { func; }, &cond, expected)