From e833a9d2318625eb641cff2edca9b5ca56594ce5 Mon Sep 17 00:00:00 2001 From: Fabrice Date: Tue, 10 Feb 2026 11:19:00 +0100 Subject: adding handler method --- src/events.cc | 10 +++++++++- src/events.h | 13 +++++++++++-- src/wayclock.cc | 13 +++++++++++-- src/window.cc | 11 ++++++++++- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/events.cc b/src/events.cc index 1795c85..755c034 100644 --- a/src/events.cc +++ b/src/events.cc @@ -8,15 +8,19 @@ static inline window_id_t wayc_eventloop_genid(struct eventloop_s *loop) { return loop->winid++; } -bool wayc_eventloop_init(struct eventloop_s *loop) { +bool wayc_eventloop_init(struct eventloop_s *loop, event_handler_t handler) { wayc_notnull(loop); + wayc_notnull(handler); + memset(loop, 0, sizeof(*loop)); if (!wayc_wlstate_init(&loop->state)) return false; loop->events = WAYC_VEC_INIT(struct event_s); + loop->handler = handler; loop->running = true; + wayc_hashmap_init(&loop->windows); return true; @@ -55,4 +59,8 @@ void wayc_eventloop_update(struct eventloop_s *loop) { loop->running = false; wayc_wlstate_update(&loop->state); + + struct event_s event; + while (wayc_vec_pop(&loop->events, &event)) + loop->handler(loop, &event); } diff --git a/src/events.h b/src/events.h index 3bef775..c2820c5 100644 --- a/src/events.h +++ b/src/events.h @@ -14,15 +14,24 @@ struct event_s { struct window_s *window; }; +#define WAYC_EVENT_INIT(kind, window) {kind, window} +#define WAYC_EVENT_CLOSE(window) WAYC_EVENT_INIT(EVENT_KIND_CLOSE, window) + +struct eventloop_s; + +typedef void (*event_handler_t)(struct eventloop_s *loop, + struct event_s *event); + struct eventloop_s { + window_id_t winid; struct wlstate_s state; struct vec_s events; - window_id_t winid; struct hashmap_s windows; + event_handler_t handler; bool running; }; -bool wayc_eventloop_init(struct eventloop_s *loop); +bool wayc_eventloop_init(struct eventloop_s *loop, event_handler_t handler); void wayc_eventloop_deinit(struct eventloop_s *loop); window_id_t wayc_eventloop_register(struct eventloop_s *loop, struct window_s *window); diff --git a/src/wayclock.cc b/src/wayclock.cc index 32d7023..369657e 100644 --- a/src/wayclock.cc +++ b/src/wayclock.cc @@ -3,9 +3,19 @@ #define WAYC_APP_NAME "Wayclock" +void handle(struct eventloop_s *loop, struct event_s *event) { + switch (event->kind) { + case EVENT_KIND_CLOSE: + wayc_eventloop_unregister(loop, event->window->id); + break; + default: + break; + } +} + int main() { struct eventloop_s loop; - if (!wayc_eventloop_init(&loop)) + if (!wayc_eventloop_init(&loop, handle)) wayc_panic("Failed to initialize event loop"); struct window_s window; @@ -19,7 +29,6 @@ int main() { while (wayc_eventloop_running(&loop)) { wayc_eventloop_update(&loop); - wayc_eventloop_unregister(&loop, winid); } wayc_window_deinit(&window); diff --git a/src/window.cc b/src/window.cc index 301aeea..99b168e 100644 --- a/src/window.cc +++ b/src/window.cc @@ -1,6 +1,7 @@ #include "window.h" #include "events.h" #include "utils.h" +#include "vec.h" #include "wlstate.h" #include "xdg-shell.h" #include @@ -23,8 +24,16 @@ static void wayc_toplevel_configure(void *data, } static void wayc_toplevel_close(void *data, struct xdg_toplevel *xdg_toplevel) { - (void)data; (void)xdg_toplevel; + + struct window_s *window = (struct window_s *)data; + wayc_notnull(window); + + struct eventloop_s *loop = window->loop; + wayc_notnull(loop); + + struct event_s event = WAYC_EVENT_CLOSE(window); + wayc_vec_push(&loop->events, &event); } static struct xdg_surface_listener WAYC_SURFACE_LISTENER = { -- cgit v1.2.3