]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Don’t set focus when unmapping clients if the workspace is not active (Thanks...
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 7 Jun 2009 17:09:39 +0000 (19:09 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 7 Jun 2009 17:09:39 +0000 (19:09 +0200)
This fixes ticket #53 because current workspace was set to the
workspace which was deleted.

src/commands.c
src/handlers.c

index d84adf45d16d4804be3581d37dbe1c50607b908e..d1ee5c69a41d73319ae2bc31daaa50f021bb15fd 100644 (file)
@@ -890,7 +890,7 @@ void parse_command(xcb_connection_t *conn, const char *command) {
         }
 
         if (*rest == '\0') {
-                /* No rest? This was a tag number, not a times specification */
+                /* No rest? This was a workspace number, not a times specification */
                 show_workspace(conn, times);
                 return;
         }
index 250465d1b32aa026110f701a3f0a79461e554348..45cb37c198334c11a3e2d59d6bc5b665b3b9ced1 100644 (file)
@@ -578,25 +578,30 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
 
         /* 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_active = false;
         Client *to_focus = (!workspace_empty ? SLIST_FIRST(&(client->workspace->focus_stack)) : NULL);
 
         /* If this workspace is currently active, we don’t delete it */
         i3Screen *screen;
         TAILQ_FOREACH(screen, virtual_screens, screens)
                 if (screen->current_workspace == client->workspace->num) {
+                        workspace_active = true;
                         workspace_empty = false;
                         break;
                 }
 
-        if (workspace_empty)
+        if (workspace_empty) {
+                LOG("setting ws to NULL for workspace %d (%p)\n", client->workspace->num,
+                                client->workspace);
                 client->workspace->screen = NULL;
+        }
 
         free(client);
 
         render_layout(conn);
 
         /* Ensure the focus is set to the next client in the focus stack */
-        if (to_focus != NULL)
+        if (workspace_active && to_focus != NULL)
                 set_focus(conn, to_focus, true);
 
         return 1;