#include "events.h" #include #include "hash.h" #include "vec.h" static inline window_id_t wayc_eventloop_genid(struct eventloop_s* loop) { wayc_notnull(loop); return loop->winid++; } enum eventloop_error_e 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) != WLSTATE_ERROR_NONE) return EVENTLOOP_ERROR_WLSTATE; loop->events = WAYC_VEC_INIT(struct event_s); loop->handler = handler; loop->running = true; wayc_hashmap_init(&loop->windows); return EVENTLOOP_ERROR_NONE; } void wayc_eventloop_deinit(struct eventloop_s* loop) { wayc_notnull(loop); wayc_wlstate_deinit(&loop->state); wayc_vec_deinit(&loop->events); } window_id_t wayc_eventloop_register(struct eventloop_s* loop, struct window_s* window) { wayc_notnull(loop); wayc_notnull(window); window_id_t winid = wayc_eventloop_genid(loop); wayc_hashmap_insert(&loop->windows, &winid, &window); return winid; } void wayc_eventloop_unregister(struct eventloop_s* loop, window_id_t winid) { wayc_notnull(loop); wayc_hashmap_remove(&loop->windows, &winid); } bool wayc_eventloop_running(struct eventloop_s* loop) { wayc_notnull(loop); return loop->running; } void wayc_eventloop_update(struct eventloop_s* loop) { wayc_notnull(loop); if (wayc_hashmap_count(&loop->windows) == 0) loop->running = false; wayc_wlstate_update(&loop->state); struct event_s event; while (wayc_vec_pop(&loop->events, &event)) loop->handler(loop, &event); }