}
t_ws->screen->current_workspace = workspace-1;
+ Workspace *old_workspace = c_ws;
+ c_ws = &workspaces[workspace-1];
- /* Unmap all clients of the current workspace */
- unmap_workspace(conn, c_ws);
+ /* Unmap all clients of the old workspace */
+ unmap_workspace(conn, old_workspace);
- c_ws = &workspaces[workspace-1];
current_row = c_ws->current_row;
current_col = c_ws->current_col;
LOG("new current row = %d, current col = %d\n", current_row, current_col);
return 1;
}
/* Some events are not interesting, because they were not generated actively by the
- user, but be reconfiguration of windows */
+ user, but by reconfiguration of windows */
if (event_is_ignored(event->sequence))
return 1;
return 1;
}
+ if (client->container->workspace != c_ws) {
+ /* This can happen when a client gets assigned to a different workspace than
+ * the current one (see src/mainx.c:reparent_window). Shortly after it was created,
+ * an enter_notify will follow. */
+ LOG("enter_notify for a client on a different workspace, ignoring\n");
+ return 1;
+ }
+
set_focus(conn, client, false);
return 1;
}
/* If we did not unmap any clients, the workspace is empty and we can destroy it */
- if (unmapped_clients == 0)
+ if (unmapped_clients == 0) {
+ /* Re-assign the workspace of all dock clients which use this workspace */
+ Client *dock;
+ SLIST_FOREACH(dock, &(u_ws->screen->dock_clients), dock_clients) {
+ if (dock->workspace != u_ws)
+ continue;
+
+ LOG("Re-assigning dock client to c_ws (%p)\n", c_ws);
+ dock->workspace = c_ws;
+ }
u_ws->screen = NULL;
+ }
/* Unmap the stack windows on the current workspace, if any */
SLIST_FOREACH(stack_win, &stack_wins, stack_windows)