diff --git a/src/backend/x11/backend.c b/src/backend/x11/backend.c index be25fb3..9f1f4bc 100644 --- a/src/backend/x11/backend.c +++ b/src/backend/x11/backend.c @@ -15,13 +15,7 @@ #include "base/log.h" #include "base/memory.h" #include "core/types.h" - -struct backend_t { - xcb_connection_t *conn; - xcb_screen_t *screen; - int screenp; - bool have_xfixes; -}; +#include "internal.h" /* IWYU pragma: keep */ backend_t *backend_create(const char *display_name) { int screen_num = 0; diff --git a/src/backend/x11/event.c b/src/backend/x11/event.c new file mode 100644 index 0000000..db9cb4c --- /dev/null +++ b/src/backend/x11/event.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include + +#include "base/memory.h" +#include "core/backend.h" +#include "internal.h" /* IWYU pragma: keep */ + +static bool handle_map_request(event_t *event, + const xcb_map_request_event_t *xcb_event) { + p_clear(event, 1); + event->type = ZDWM_EVENT_WINDOW_MAP_REQUEST; + /* TODO: */ + return true; +} + +static bool handle_unmap_notify(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(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( + 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(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; + } +} diff --git a/src/backend/x11/internal.h b/src/backend/x11/internal.h new file mode 100644 index 0000000..460bc5e --- /dev/null +++ b/src/backend/x11/internal.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include "core/backend.h" /* IWYU pragma: keep */ + +struct backend_t { + xcb_connection_t *conn; + xcb_screen_t *screen; + int screenp; + bool have_xfixes; +}; diff --git a/src/core/backend.h b/src/core/backend.h index 317fb98..e46f09d 100644 --- a/src/core/backend.h +++ b/src/core/backend.h @@ -2,6 +2,7 @@ #include +#include "core/event.h" #include "core/types.h" typedef struct backend_t backend_t; @@ -16,3 +17,5 @@ void backend_destroy(backend_t *backend); backend_detect_t *backend_detect(backend_t *backend); void backend_detect_destroy(backend_detect_t *detect); + +bool backend_next_event(backend_t *backend, event_t *event); diff --git a/src/core/event.h b/src/core/event.h index 9c34e02..b6612cc 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -63,9 +63,10 @@ typedef struct pointer_enter_event_t { } pointer_enter_event_t; typedef struct window_map_request_event_t { - window_id_t id; + window_id_t window; window_props_t props; window_metadata_t metadata; + window_geometry_mode_t geometry; } window_map_request_event_t; typedef enum window_remove_reason_t { @@ -154,7 +155,6 @@ typedef struct configure_request_event_t { typedef struct event_t { event_type_t type; - uint32_t time_ms; union { key_press_event_t key_press; pointer_button_event_t pointer_button_press; diff --git a/src/core/runtime.c b/src/core/runtime.c index c77549c..6c15e34 100644 --- a/src/core/runtime.c +++ b/src/core/runtime.c @@ -4,6 +4,7 @@ #include "base/memory.h" #include "core/backend.h" +#include "core/event.h" #include "core/state.h" #include "core/wm_desc.h" @@ -90,3 +91,12 @@ void runtime_shutdown(runtime_t *runtime) { if (runtime->config_module_handle) dlclose(runtime->config_module_handle); runtime->config_module_handle = nullptr; } + +void runtime_run(runtime_t *runtime) { + for (;;) { + event_t event = {0}; + if (!backend_next_event(runtime->backend, &event)) { + break; + } + } +} diff --git a/src/core/runtime.h b/src/core/runtime.h index 455f679..0ec78cb 100644 --- a/src/core/runtime.h +++ b/src/core/runtime.h @@ -30,3 +30,4 @@ typedef struct runtime_t { bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc); void runtime_init_desc_cleanup(runtime_init_desc_t *desc); void runtime_shutdown(runtime_t *runtime); +void runtime_run(runtime_t *runtime); diff --git a/src/core/window.h b/src/core/window.h index 05fdb64..e1d0259 100644 --- a/src/core/window.h +++ b/src/core/window.h @@ -34,6 +34,8 @@ typedef struct window_props_t { window_id_t transient_for; bool override_redirect; + bool skip_taskbar; + bool urgent; window_type_t *types; size_t type_count; @@ -48,3 +50,9 @@ typedef struct window_metadata_t { const char *class_name; const char *instance_name; } window_metadata_t; + +typedef struct window_geometry_t { + window_geometry_mode_t mode; + rect_t rect; + bool fixed_size; +} window_geometry_t; diff --git a/tests/config/runtime_config_test.c b/tests/config/runtime_config_test.c index e94c8a8..bfc847d 100644 --- a/tests/config/runtime_config_test.c +++ b/tests/config/runtime_config_test.c @@ -16,6 +16,12 @@ struct backend_t { void backend_destroy(backend_t *backend) { free(backend); } +bool backend_next_event(backend_t *backend, event_t *event) { + (void)backend; + (void)event; + return false; +} + static backend_t *test_backend_create(void) { return calloc(1, sizeof(backend_t)); } diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt index 0402a2f..1f16a73 100644 --- a/tests/core/CMakeLists.txt +++ b/tests/core/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(${TEST_APP_NAME} ${SOURCE_DIR}/config/loader.c ${SOURCE_DIR}/config/runtime_config.c ${SOURCE_DIR}/backend/x11/backend.c + ${SOURCE_DIR}/backend/x11/event.c ${SOURCE_DIR}/core/layout.c ${SOURCE_DIR}/core/runtime.c ${SOURCE_DIR}/core/state.c diff --git a/tests/core/main.c b/tests/core/main.c index 5dd5f61..71fc834 100644 --- a/tests/core/main.c +++ b/tests/core/main.c @@ -36,6 +36,7 @@ int main(void) { runtime_t runtime = {0}; bootstrap(&runtime); + runtime_run(&runtime); runtime_shutdown(&runtime); return 0;