]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Only ignore EnterNotify events after UnmapNotifies from managed windows
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 17 Jan 2012 20:37:36 +0000 (20:37 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 21 Jan 2012 11:46:23 +0000 (11:46 +0000)
This should fix (some?) focus follows mouse problems.

Conflicts:

src/handlers.c

src/handlers.c

index d835d367e5afb5bfcf5441120f10c989690430a7..09e9f11ed97a0a93ddbc324168f442043d17d6a8 100644 (file)
@@ -457,22 +457,7 @@ static int handle_screen_change(xcb_generic_event_t *e) {
  * now, so we better clean up before.
  *
  */
-static int handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
-    /* If the client (as opposed to i3) destroyed or unmapped a window, an
-     * EnterNotify event will follow (indistinguishable from an EnterNotify
-     * event caused by moving your mouse), causing i3 to set focus to whichever
-     * window is now visible.
-     *
-     * In a complex stacked or tabbed layout (take two v-split containers in a
-     * tabbed container), when the bottom window in tab2 is closed, the bottom
-     * window of tab1 is visible instead. X11 will thus send an EnterNotify
-     * event for the bottom window of tab1, while the focus should be set to
-     * the remaining window of tab2.
-     *
-     * Therefore, we ignore all EnterNotify events which have the same sequence
-     * as an UnmapNotify event. */
-    add_ignore_event(event->sequence, XCB_ENTER_NOTIFY);
-
+static void handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
     DLOG("UnmapNotify for 0x%08x (received from 0x%08x), serial %d\n", event->window, event->event, event->sequence);
     Con *con = con_by_window_id(event->window);
     if (con == NULL) {
@@ -481,63 +466,40 @@ static int handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
         con = con_by_frame_id(event->window);
         if (con == NULL) {
             LOG("Not a managed window, ignoring UnmapNotify event\n");
-            return 1;
+            return;
         }
+
         if (con->ignore_unmap > 0)
             con->ignore_unmap--;
         DLOG("ignore_unmap = %d for frame of container %p\n", con->ignore_unmap, con);
-        return 1;
+        goto ignore_end;
     }
 
     if (con->ignore_unmap > 0) {
         DLOG("ignore_unmap = %d, dec\n", con->ignore_unmap);
         con->ignore_unmap--;
-        return 1;
+        goto ignore_end;
     }
 
     tree_close(con, DONT_KILL_WINDOW, false, false);
     tree_render();
     x_push_changes(croot);
-    return 1;
-
-#if 0
-        if (client == NULL) {
-                DLOG("not a managed window. Ignoring.\n");
-
-                /* This was most likely the destroyed frame of a client which is
-                 * currently being unmapped, so we add this sequence (again!) to
-                 * the ignore list (enter_notify events will get sent for both,
-                 * the child and its frame). */
-                add_ignore_event(event->sequence);
 
-                return 0;
-        }
-#endif
-
-
-#if 0
-        /* Let’s see how many clients there are left on the workspace to delete it if it’s empty */
-        bool workspace_empty = SLIST_EMPTY(&(client->workspace->focus_stack));
-        bool workspace_focused = (c_ws == client->workspace);
-        Client *to_focus = (!workspace_empty ? SLIST_FIRST(&(client->workspace->focus_stack)) : NULL);
-
-        /* If this workspace is currently visible, we don’t delete it */
-        if (workspace_is_visible(client->workspace))
-                workspace_empty = false;
-
-        if (workspace_empty) {
-                client->workspace->output = NULL;
-                ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"empty\"}");
-        }
-
-        /* Remove the urgency flag if set */
-        client->urgent = false;
-        workspace_update_urgent_flag(client->workspace);
-
-        render_layout(conn);
-#endif
-
-        return 1;
+ignore_end:
+    /* If the client (as opposed to i3) destroyed or unmapped a window, an
+     * EnterNotify event will follow (indistinguishable from an EnterNotify
+     * event caused by moving your mouse), causing i3 to set focus to whichever
+     * window is now visible.
+     *
+     * In a complex stacked or tabbed layout (take two v-split containers in a
+     * tabbed container), when the bottom window in tab2 is closed, the bottom
+     * window of tab1 is visible instead. X11 will thus send an EnterNotify
+     * event for the bottom window of tab1, while the focus should be set to
+     * the remaining window of tab2.
+     *
+     * Therefore, we ignore all EnterNotify events which have the same sequence
+     * as an UnmapNotify event. */
+    add_ignore_event(event->sequence, XCB_ENTER_NOTIFY);
 }
 
 /*