/* 7: focus the con on the target workspace (the X focus is only updated by
* calling tree_render(), so for the "real" focus this is a no-op).
- * We don’t focus when there is a fullscreen con on that workspace. */
- if (con_get_fullscreen_con(workspace, CF_OUTPUT) == NULL)
+ * We don’t focus the con for i3 pseudo workspaces like __i3_scratch and
+ * we don’t focus when there is a fullscreen con on that workspace. */
+ if ((workspace->name[0] != '_' || workspace->name[1] != '_') &&
+ con_get_fullscreen_con(workspace, CF_OUTPUT) == NULL)
con_focus(con_descend_focused(con));
/* 8: when moving to a visible workspace on a different output, we keep the
*/
Con *con_descend_focused(Con *con) {
Con *next = con;
- while (!TAILQ_EMPTY(&(next->focus_head)))
+ while (next != focused && !TAILQ_EMPTY(&(next->focus_head)))
next = TAILQ_FIRST(&(next->focus_head));
return next;
}
Con *next = con;
Con *before;
Con *child;
+ if (next == focused)
+ return next;
do {
before = next;
TAILQ_FOREACH(child, &(next->focus_head), focused) {
next = child;
break;
}
- } while (before != next);
+ } while (before != next && next != focused);
return next;
}