]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Ignore enter_notify when warping pointer (makes "goto" work correctly)
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 27 Mar 2010 16:04:56 +0000 (17:04 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 27 Mar 2010 16:04:56 +0000 (17:04 +0100)
include/handlers.h
src/client.c
src/handlers.c
src/workspace.c

index c7cbb3226a44b960c0caf5e9022db34dfc7df99b..7d0662e16a671152869c5f7979bf71f8f6ce90c8 100644 (file)
 
 #include <xcb/randr.h>
 
+/**
+ * Adds the sequence number of an event to the ignored events.
+ * Useful to ignore for example the enter notify caused by a pointer warp of
+ * i3.
+ *
+ */
+void add_ignore_event(const int sequence);
+
 /**
  * There was a key press. We compare this key code with our bindings table and
  * pass the bound action to parse_command().
index 9c136ca6bc4ba68dfb98095e2f0a766bad960d8c..ba3babe073592d5eed6e68f61eb13893194b5c0a 100644 (file)
@@ -29,6 +29,7 @@
 #include "workspace.h"
 #include "config.h"
 #include "log.h"
+#include "handlers.h"
 
 /*
  * Removes the given client from the container, either because it will be inserted into another
@@ -62,7 +63,12 @@ void client_remove_from_container(xcb_connection_t *conn, Client *client, Contai
 void client_warp_pointer_into(xcb_connection_t *conn, Client *client) {
         int mid_x = client->rect.width / 2,
             mid_y = client->rect.height / 2;
-        xcb_warp_pointer(conn, XCB_NONE, client->child, 0, 0, 0, 0, mid_x, mid_y);
+        xcb_void_cookie_t cookie;
+        cookie = xcb_warp_pointer(conn, XCB_NONE, client->child, 0, 0, 0, 0, mid_x, mid_y);
+        /* We need to add this event twice because we get one enter_notify for
+         * the child and one for the frame */
+        add_ignore_event(cookie.sequence);
+        add_ignore_event(cookie.sequence);
 }
 
 /*
index 624c34305d5bd78caa9bcdbe89ab6291ad0e5095..5eddf244029dac976bb50030e7330b50b4caff51 100644 (file)
    changing workspaces */
 static SLIST_HEAD(ignore_head, Ignore_Event) ignore_events;
 
-static void add_ignore_event(const int sequence) {
+/*
+ * Adds the sequence number of an event to the ignored events.
+ * Useful to ignore for example the enter notify caused by a pointer warp of
+ * i3.
+ *
+ */
+void add_ignore_event(const int sequence) {
         struct Ignore_Event *event = smalloc(sizeof(struct Ignore_Event));
 
         event->sequence = sequence;
index c950df8f92e27eda7e9ea56140889a6a855f10c3..2798687dad641094e769977076d8e8719d6ff1ec 100644 (file)
@@ -29,6 +29,7 @@
 #include "log.h"
 #include "ewmh.h"
 #include "ipc.h"
+#include "handlers.h"
 
 /*
  * Returns a pointer to the workspace with the given number (starting at 0),
@@ -139,8 +140,10 @@ void workspace_show(xcb_connection_t *conn, int workspace) {
                         need_warp = true;
                 else {
                         Rect *dims = &(c_ws->output->rect);
-                        xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0,
+                        xcb_void_cookie_t cookie;
+                        cookie = xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0,
                                          dims->x + (dims->width / 2), dims->y + (dims->height / 2));
+                        add_ignore_event(cookie.sequence);
                 }
 
                 /* Re-decorate the old client, it’s not focused anymore */