diff options
| -rw-r--r-- | src/comet.c | 2 | ||||
| -rw-r--r-- | src/event.c | 41 | ||||
| -rw-r--r-- | src/event.h | 4 | ||||
| -rw-r--r-- | src/window.c | 8 |
4 files changed, 33 insertions, 22 deletions
diff --git a/src/comet.c b/src/comet.c index ad42c7a..7081d6d 100644 --- a/src/comet.c +++ b/src/comet.c @@ -134,7 +134,7 @@ int main(int argc, char **argv) layout_t layout; layout_init(&layout, block, info); - event_dispatch(&display, &layout); + event_dispatch(&window, &layout); cairo_surface_t *surface = render_all(&layout, &config, info); window_present(&window, surface); 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); } } diff --git a/src/event.h b/src/event.h index 1197afa..8d380ea 100644 --- a/src/event.h +++ b/src/event.h @@ -1,7 +1,7 @@ #ifndef COMET_EVENT_H #define COMET_EVENT_H -#include "display.h" +#include "window.h" typedef enum { EVENT_HOVER, @@ -28,6 +28,6 @@ bool event_is_click(event_t event); bool event_is_scroll(event_t event); -void event_dispatch(display_t *display, layout_t *layout); +void event_dispatch(window_t *window, layout_t *layout); #endif diff --git a/src/window.c b/src/window.c index b4b68bd..52530d9 100644 --- a/src/window.c +++ b/src/window.c @@ -97,10 +97,10 @@ void window_init(window_t *window, display_t *display, config_t *config) window->cw_mask = XCB_CW_BACK_PIXMAP | XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP; - uint32_t event_mask = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY - | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_FOCUS_CHANGE - | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_PRESS - | XCB_EVENT_MASK_POINTER_MOTION; + uint32_t event_mask = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_EXPOSURE + | XCB_EVENT_MASK_FOCUS_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY + | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE + | XCB_EVENT_MASK_LEAVE_WINDOW | XCB_EVENT_MASK_POINTER_MOTION; xcb_colormap_t colormap = xcb_generate_id(display->connection); xcb_create_colormap(display->connection, XCB_COLORMAP_ALLOC_NONE, colormap, |
