]> git.sur5r.net Git - i3/i3/commitdiff
Fix switching containers by moving the mouse over their decorations when in the same...
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 28 Nov 2010 00:13:18 +0000 (01:13 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 28 Nov 2010 00:13:18 +0000 (01:13 +0100)
include/handlers.h
include/xcb.h
src/handlers.c
src/main.c

index 71e2bc92cf60e2b84c00662fd5634f715f8ac590..1f2e4b18d7ed35ae174f66ecb12af5e360f15e21 100644 (file)
@@ -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).
index 3f4b735cef73522ff4487fcd7996b89db7f6d0ba..3752e9f4846b121f5d19baebfc544b7801c47383 100644 (file)
@@ -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 */ \
index 03fd802c5046f072263989f825686175afc6b0c4..0fc6b8a5353a6ce4396b846e32a28d498bea06c4 100644 (file)
@@ -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).
index f0118f983071168c671415a9b4d740997bab5666..2d52ef8ad97ae0d502bfe4ab44cec75f27fe396f 100644 (file)
@@ -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);