summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice <fabrice@schaub-dev.xyz>2026-02-10 11:19:00 +0100
committerFabrice <fabrice@schaub-dev.xyz>2026-02-10 11:19:00 +0100
commite833a9d2318625eb641cff2edca9b5ca56594ce5 (patch)
treec5b132fa35dbca3a4cb610ed5d5b428c833afee4
parent6b82cee41f6d144ddb302f696806d3a4dfeee48a (diff)
adding handler method
-rw-r--r--src/events.cc10
-rw-r--r--src/events.h13
-rw-r--r--src/wayclock.cc13
-rw-r--r--src/window.cc11
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<struct event_s> events;
- window_id_t winid;
struct hashmap_s<window_id_t, struct window_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 <cstring>
@@ -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 = {