#include "core/event.h" #include #include #include #include #include "backend/x11/window.h" #include "base/memory.h" #include "core/backend.h" #include "core/window.h" #include "internal.h" /* IWYU pragma: keep */ static bool handle_map_request(backend_t *backend, event_t *event, const xcb_map_request_event_t *xcb_event) { p_clear(event, 1); xcb_window_t window = xcb_event->window; event->type = ZDWM_EVENT_WINDOW_MAP_REQUEST; event->data.window_map_request.window = window; window_metadata_t *metadata = &event->data.window_map_request.metadata; metadata->role = window_get_role(backend, window); metadata->title = window_get_title(backend, window); window_get_class(backend, window, &metadata->class_name, &metadata->instance_name); /* TODO: */ return true; } static bool handle_unmap_notify(backend_t *backend, event_t *event, const xcb_unmap_notify_event_t *xcb_event) { p_clear(event, 1); event->type = ZDWM_EVENT_WINDOW_REMOVE; /* TODO: */ return true; } static bool handle_destroy_notify(backend_t *backend, event_t *event, const xcb_destroy_notify_event_t *xcb_event) { p_clear(event, 1); event->type = ZDWM_EVENT_WINDOW_REMOVE; /* TODO: */ return true; } static bool handle_configure_request( backend_t *backend, event_t *event, const xcb_configure_request_event_t *xcb_event) { p_clear(event, 1); event->type = ZDWM_EVENT_CONFIGURE_REQUEST; /* TODO: */ return true; } bool backend_next_event(backend_t *backend, event_t *event) { if (!backend || !backend->conn || !event) return false; for (;;) { xcb_generic_event_t *raw_event = xcb_wait_for_event(backend->conn); if (!raw_event) return false; uint8_t response_type = XCB_EVENT_RESPONSE_TYPE(raw_event); bool handled = false; printf("xcb event type: %u\n", response_type); switch (response_type) { #define EVENT(type, handler) \ case type: \ handled = handler(backend, event, (void *)raw_event); \ break EVENT(XCB_MAP_REQUEST, handle_map_request); EVENT(XCB_UNMAP_NOTIFY, handle_unmap_notify); EVENT(XCB_DESTROY_NOTIFY, handle_destroy_notify); EVENT(XCB_CONFIGURE_REQUEST, handle_configure_request); #undef EVENT default: break; } p_delete(&raw_event); if (handled) return true; } }