aboutsummaryrefslogtreecommitdiff
path: root/src/event.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-21 23:20:49 +0100
committerFederico Angelilli <code@fedang.net>2024-11-21 23:20:49 +0100
commitb4d57d18b858824d0f5bde061d79c8f578630072 (patch)
treef56fc6f842da7fc82f3059b7814f9327e002b2bb /src/event.c
parentcd39dc62e94cbbb5025740552aa09731c8911bf7 (diff)
Update event dispatch
Diffstat (limited to 'src/event.c')
-rw-r--r--src/event.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/event.c b/src/event.c
index 9ff3e61..4fb40d8 100644
--- a/src/event.c
+++ b/src/event.c
@@ -76,17 +76,17 @@ static bool event_dispatch_mouse(layout_t *layout, event_t event)
return true;
}
-static void event_dispatch_once(display_t *display, layout_t *layout, xcb_generic_event_t *xevent)
+static void event_dispatch_once(window_t *window, layout_t *layout, xcb_generic_event_t *xevent)
{
int type = xevent->response_type & ~0x80;
switch (type) {
case 0: {
xcb_generic_error_t *error = (xcb_generic_error_t *)xevent;
- const char *extension;
- const char *name = xcb_errors_get_name_for_error(display->errors, error->error_code, &extension);
- const char *major = xcb_errors_get_name_for_major_code(display->errors, error->major_code);
- const char *minor = xcb_errors_get_name_for_minor_code(display->errors, error->major_code, error->minor_code);
+ const char *extension = NULL;
+ const char *name = xcb_errors_get_name_for_error(window->display->errors, error->error_code, &extension);
+ const char *major = xcb_errors_get_name_for_major_code(window->display->errors, error->major_code);
+ const char *minor = xcb_errors_get_name_for_minor_code(window->display->errors, error->major_code, error->minor_code);
log_value_error("Xcb error",
"s:name", name,
@@ -114,8 +114,19 @@ static void event_dispatch_once(display_t *display, layout_t *layout, xcb_generi
xcb_create_notify_event_t *create = (xcb_create_notify_event_t *)xevent;
log_trace("Processing 'CreateNotify' event");
- // TODO: Circulate top the window if override_redirect == 0
(void)create;
+
+ if (window->cw_params.override_redirect) break;
+ xcb_circulate_window(window->display->connection, XCB_CIRCULATE_RAISE_LOWEST, window->window);
+ break;
+ }
+
+ case XCB_LEAVE_NOTIFY: {
+ xcb_leave_notify_event_t *leave = (xcb_leave_notify_event_t *)xevent;
+ log_trace("Processing 'LeaveNotify' event");
+
+ if (leave->event != window->window) break;
+ // Leaving
break;
}
@@ -144,8 +155,8 @@ static void event_dispatch_once(display_t *display, layout_t *layout, xcb_generi
log_trace("Processing 'PropertyNotify' event");
if (property->atom == XCB_ATOM_RESOURCE_MANAGER) {
- display_update_xrm(display);
- display_update_scale(display);
+ display_update_xrm(window->display);
+ display_update_scale(window->display);
// Redraw
}
break;
@@ -166,22 +177,22 @@ static void event_dispatch_once(display_t *display, layout_t *layout, xcb_generi
}
default: {
- const char *extension;
- const char *name = xcb_errors_get_name_for_xcb_event(display->errors, xevent, &extension);
+ const char *extension = NULL;
+ const char *name = xcb_errors_get_name_for_xcb_event(window->display->errors, xevent, &extension);
log_value_trace("Ignoring Xcb event",
"s:name", name,
- "u:type", xevent->response_type & 0x7f,
+ "u:type", type,
"s:extension", extension ? extension : "none");
break;
}
}
}
-void event_dispatch(display_t *display, layout_t *layout)
+void event_dispatch(window_t *window, layout_t *layout)
{
xcb_generic_event_t *xevent, *motion = NULL;
- while ((xevent = xcb_poll_for_event(display->connection)) != NULL) {
+ while ((xevent = xcb_poll_for_event(window->display->connection)) != NULL) {
int type = xevent->response_type & ~0x80;
if (type == XCB_MOTION_NOTIFY) {
@@ -190,14 +201,14 @@ void event_dispatch(display_t *display, layout_t *layout)
continue;
}
- event_dispatch_once(display, layout, xevent);
+ event_dispatch_once(window, layout, xevent);
free(xevent);
}
// We only consider the last motion notify received
//
if (motion != NULL) {
- event_dispatch_once(display, layout, motion);
+ event_dispatch_once(window, layout, motion);
free(motion);
}
}