Bugfix: Don’t set focus when unmapping clients if the workspace is not active (Thanks Mirko)
This fixes ticket #53 because current workspace was set to the workspace which was deleted.
This commit is contained in:
parent
2330c20092
commit
2f334c3f59
@ -890,7 +890,7 @@ void parse_command(xcb_connection_t *conn, const char *command) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*rest == '\0') {
|
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);
|
show_workspace(conn, times);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
/* 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_empty = SLIST_EMPTY(&(client->workspace->focus_stack));
|
||||||
|
bool workspace_active = false;
|
||||||
Client *to_focus = (!workspace_empty ? SLIST_FIRST(&(client->workspace->focus_stack)) : NULL);
|
Client *to_focus = (!workspace_empty ? SLIST_FIRST(&(client->workspace->focus_stack)) : NULL);
|
||||||
|
|
||||||
/* If this workspace is currently active, we don’t delete it */
|
/* If this workspace is currently active, we don’t delete it */
|
||||||
i3Screen *screen;
|
i3Screen *screen;
|
||||||
TAILQ_FOREACH(screen, virtual_screens, screens)
|
TAILQ_FOREACH(screen, virtual_screens, screens)
|
||||||
if (screen->current_workspace == client->workspace->num) {
|
if (screen->current_workspace == client->workspace->num) {
|
||||||
|
workspace_active = true;
|
||||||
workspace_empty = false;
|
workspace_empty = false;
|
||||||
break;
|
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;
|
client->workspace->screen = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
free(client);
|
free(client);
|
||||||
|
|
||||||
render_layout(conn);
|
render_layout(conn);
|
||||||
|
|
||||||
/* Ensure the focus is set to the next client in the focus stack */
|
/* 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);
|
set_focus(conn, to_focus, true);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user