aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/comet.c2
-rw-r--r--src/event.c41
-rw-r--r--src/event.h4
-rw-r--r--src/window.c8
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,