#pragma once #include "hash.h" #include "vec.h" #include "window.h" #include "wlstate.h" enum event_kind_e { EVENT_KIND_RESIZE, EVENT_KIND_CLOSE, EVENT_KIND_FRAME, }; struct event_resize_s { i32 width, height; }; union event_data_u { struct event_resize_s resize; }; struct event_s { enum event_kind_e kind; struct window_s* window; union event_data_u data; }; #define WAYC_EVENT_INIT(kind, window, ...) \ event_s { kind, window, __VA_ARGS__ } #define WAYC_EVENT_CLOSE(window) \ WAYC_EVENT_INIT(EVENT_KIND_CLOSE, window, event_data_u{}) #define WAYC_EVENT_RESIZE(window, width, height) \ WAYC_EVENT_INIT(EVENT_KIND_RESIZE, window, \ event_data_u{event_resize_s{width, height}}) #define WAYC_EVENT_FRAME(window) \ WAYC_EVENT_INIT(EVENT_KIND_FRAME, window, event_data_u{}) struct eventloop_s; typedef void (*event_handler_t)(u8* user, struct eventloop_s* loop, struct event_s* event); enum eventloop_error_e { EVENTLOOP_ERROR_NONE = 0, EVENTLOOP_ERROR_WLSTATE, }; struct eventloop_s { window_id_t winid; struct wlstate_s state; struct vec_s events; struct hashmap_s windows; event_handler_t handler; bool running; }; enum eventloop_error_e 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); void wayc_eventloop_unregister(struct eventloop_s* loop, window_id_t winid); bool wayc_eventloop_running(struct eventloop_s* loop); void wayc_eventloop_update(struct eventloop_s* loop, u8* user);