diff --git a/src/backend/x11/event.c b/src/backend/x11/event.c index 1d008ed..a2e2777 100644 --- a/src/backend/x11/event.c +++ b/src/backend/x11/event.c @@ -65,7 +65,7 @@ static bool handle_map_request(backend_t *backend, event_t *event, const xcb_map_request_event_t *xcb_event) { xcb_window_t window = xcb_event->window; - p_clear(event, 1); + event_reset(event); event->type = ZDWM_EVENT_WINDOW_MAP_REQUEST; window_map_request_event_t *ev = &event->as.window_map_request; @@ -125,7 +125,7 @@ static bool handle_map_request(backend_t *backend, event_t *event, static bool handle_unmap_notify(backend_t *backend, event_t *event, const xcb_unmap_notify_event_t *xcb_event) { - p_clear(event, 1); + event_reset(event); event->type = ZDWM_EVENT_WINDOW_REMOVE; /* TODO: */ return true; @@ -133,7 +133,7 @@ static bool handle_unmap_notify(backend_t *backend, event_t *event, static bool handle_destroy_notify(backend_t *backend, event_t *event, const xcb_destroy_notify_event_t *xcb_event) { - p_clear(event, 1); + event_reset(event); event->type = ZDWM_EVENT_WINDOW_REMOVE; /* TODO: */ return true; @@ -142,7 +142,7 @@ static bool handle_destroy_notify(backend_t *backend, event_t *event, static bool handle_configure_request( backend_t *backend, event_t *event, const xcb_configure_request_event_t *xcb_event) { - p_clear(event, 1); + event_reset(event); event->type = ZDWM_EVENT_CONFIGURE_REQUEST; /* TODO: */ return true; @@ -179,5 +179,6 @@ bool backend_next_event(backend_t *backend, event_t *event) { p_delete(&raw_event); if (handled) return true; + event_reset(event); } } diff --git a/src/core/event.c b/src/core/event.c new file mode 100644 index 0000000..0268dc3 --- /dev/null +++ b/src/core/event.c @@ -0,0 +1,45 @@ +#include "core/event.h" + +#include "base/memory.h" + +static void window_layer_props_cleanup(window_layer_props_t *props) { + if (!props) return; + + p_delete(&props->types); + props->type_count = 0; + p_delete(&props->states); + props->state_count = 0; +} + +static void window_metadata_cleanup(window_metadata_t *metadata) { + if (!metadata) return; + + p_delete(&metadata->title); + p_delete(&metadata->app_id); + p_delete(&metadata->role); + p_delete(&metadata->class_name); + p_delete(&metadata->instance_name); +} + +void event_cleanup(event_t *event) { + if (!event) return; + + switch (event->type) { + case ZDWM_EVENT_WINDOW_MAP_REQUEST: + window_layer_props_cleanup(&event->as.window_map_request.props); + window_metadata_cleanup(&event->as.window_map_request.metadata); + break; + case ZDWM_EVENT_WINDOW_METADATA_CHANGED: + window_metadata_cleanup(&event->as.window_metadata_change.metadata); + break; + default: + break; + } +} + +void event_reset(event_t *event) { + if (!event) return; + + event_cleanup(event); + p_clear(event, 1); +} diff --git a/src/core/event.h b/src/core/event.h index 38a7a9f..8463af2 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -178,3 +178,6 @@ typedef struct event_t { configure_request_event_t configure_request; } as; } event_t; + +void event_cleanup(event_t *event); +void event_reset(event_t *event); diff --git a/src/core/runtime.c b/src/core/runtime.c index b4b0e9c..51f6ef9 100644 --- a/src/core/runtime.c +++ b/src/core/runtime.c @@ -97,5 +97,7 @@ void runtime_run(runtime_t *runtime) { if (!backend_next_event(runtime->backend, &event)) { break; } + + event_cleanup(&event); } } diff --git a/tests/config/CMakeLists.txt b/tests/config/CMakeLists.txt index 86dd7dc..f58afde 100644 --- a/tests/config/CMakeLists.txt +++ b/tests/config/CMakeLists.txt @@ -41,6 +41,7 @@ add_executable(${RUNTIME_CONFIG_TEST_APP_NAME} ${SOURCE_DIR}/config/defaults.c ${SOURCE_DIR}/config/loader.c ${SOURCE_DIR}/config/runtime_config.c + ${SOURCE_DIR}/core/event.c ${SOURCE_DIR}/core/layer.c ${SOURCE_DIR}/core/layout.c ${SOURCE_DIR}/core/rules.c diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt index 22f4a40..bcc4cd6 100644 --- a/tests/core/CMakeLists.txt +++ b/tests/core/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable(${TEST_APP_NAME} ${SOURCE_DIR}/backend/x11/backend.c ${SOURCE_DIR}/backend/x11/event.c ${SOURCE_DIR}/backend/x11/window.c + ${SOURCE_DIR}/core/event.c ${SOURCE_DIR}/core/layer.c ${SOURCE_DIR}/core/layout.c ${SOURCE_DIR}/core/rules.c