From 622b51a1ea592d76c9399f4d6e2af16adfaf90e1 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 28 Nov 2010 01:13:18 +0100 Subject: [PATCH] Fix switching containers by moving the mouse over their decorations when in the same container --- include/handlers.h | 2 +- include/xcb.h | 1 + src/handlers.c | 32 ++++++++++++++++++++++++++------ src/main.c | 2 ++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/include/handlers.h b/include/handlers.h index 71e2bc92..1f2e4b18 100644 --- a/include/handlers.h +++ b/include/handlers.h @@ -32,7 +32,6 @@ int handle_key_press(void *ignored, xcb_connection_t *conn, int handle_enter_notify(void *ignored, xcb_connection_t *conn, xcb_enter_notify_event_t *event); -#if 0 /** * When the user moves the mouse but does not change the active window * (e.g. when having no windows opened but moving mouse on the root screen @@ -42,6 +41,7 @@ int handle_enter_notify(void *ignored, xcb_connection_t *conn, int handle_motion_notify(void *ignored, xcb_connection_t *conn, xcb_motion_notify_event_t *event); +#if 0 /** * Called when the keyboard mapping changes (for example by using Xmodmap), * we need to update our key bindings then (re-translate symbols). diff --git a/include/xcb.h b/include/xcb.h index 3f4b735c..3752e9f4 100644 --- a/include/xcb.h +++ b/include/xcb.h @@ -37,6 +37,7 @@ /** The XCB_CW_EVENT_MASK for its frame */ #define FRAME_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | /* …mouse is pressed/released */ \ XCB_EVENT_MASK_BUTTON_RELEASE | \ + XCB_EVENT_MASK_POINTER_MOTION | /* …mouse is moved */ \ XCB_EVENT_MASK_EXPOSURE | /* …our window needs to be redrawn */ \ XCB_EVENT_MASK_STRUCTURE_NOTIFY | /* …the frame gets destroyed */ \ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | /* …the application tries to resize itself */ \ diff --git a/src/handlers.c b/src/handlers.c index 03fd802c..0fc6b8a5 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -243,7 +243,6 @@ int handle_enter_notify(void *ignored, xcb_connection_t *conn, return 1; } -#if 0 /* * When the user moves the mouse but does not change the active window @@ -252,16 +251,37 @@ int handle_enter_notify(void *ignored, xcb_connection_t *conn, * */ int handle_motion_notify(void *ignored, xcb_connection_t *conn, xcb_motion_notify_event_t *event) { - /* Skip events where the pointer was over a child window, we are only - * interested in events on the root window. */ - if (event->child != 0) - return 1; + /* Skip events where the pointer was over a child window, we are only + * interested in events on the root window. */ + if (event->child != 0) + return 1; - check_crossing_screen_boundary(event->root_x, event->root_y); + Con *con; + if ((con = con_by_frame_id(event->event)) == NULL) { + /* TODO; handle root window: */ + //check_crossing_screen_boundary(event->root_x, event->root_y); + return 1; + } + /* see over which rect the user is */ + Con *current; + TAILQ_FOREACH(current, &(con->nodes_head), nodes) { + if (!rect_contains(current->deco_rect, event->event_x, event->event_y)) + continue; + + /* We found the rect, let’s see if this window is focused */ + if (TAILQ_FIRST(&(con->focus_head)) == current) + return 1; + + con_focus(current); + x_push_changes(croot); return 1; + } + + return 1; } +#if 0 /* * Called when the keyboard mapping changes (for example by using Xmodmap), * we need to update our key bindings then (re-translate symbols). diff --git a/src/main.c b/src/main.c index f0118f98..2d52ef8a 100644 --- a/src/main.c +++ b/src/main.c @@ -211,6 +211,8 @@ int main(int argc, char *argv[]) { xcb_event_set_expose_handler(&evenths, handle_expose_event, NULL); + xcb_event_set_motion_notify_handler(&evenths, handle_motion_notify, NULL); + /* Enter window = user moved his mouse over the window */ xcb_event_set_enter_notify_handler(&evenths, handle_enter_notify, NULL); -- 2.39.2