- /* Restore the previous focus since con_attach messes with the focus. */
- con_activate(previously_focused);
+ bool can_restore_focus = previously_focused != NULL;
+ /* NB: If previously_focused is a workspace we can't work directly with it
+ * since it might have been cleaned up by workspace_show() already,
+ * depending on the focus order/number of other workspaces on the output.
+ * Instead, we loop through the available workspaces and only focus
+ * previously_focused if we still find it. */
+ if (previously_focused_content) {
+ Con *workspace = NULL;
+ GREP_FIRST(workspace, previously_focused_content, child == previously_focused);
+ can_restore_focus &= (workspace != NULL);
+ }
+
+ if (can_restore_focus) {
+ /* Restore the previous focus since con_attach messes with the focus. */
+ workspace_show(con_get_workspace(previously_focused));
+ con_focus(previously_focused);
+ }