diff options
| author | Federico Angelilli <code@fedang.net> | 2024-11-21 23:20:49 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-11-21 23:20:49 +0100 |
| commit | b4d57d18b858824d0f5bde061d79c8f578630072 (patch) | |
| tree | f56fc6f842da7fc82f3059b7814f9327e002b2bb /src/event.c | |
| parent | cd39dc62e94cbbb5025740552aa09731c8911bf7 (diff) | |
Update event dispatch
Diffstat (limited to 'src/event.c')
| -rw-r--r-- | src/event.c | 41 |
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); } } |
