Make 'focus' disable blocking fullscreen windows
The problem here is that con_fullscreen_permits_focusing() does not check if there is a blocking fullscreen container in the workspace that the container to be focused belongs. This makes it possible to focus a container behind a fullscreen window if it's in an unfocused workspace. This commit introduces a change in the 'focus' command behaviour. When focusing a container blocked by a fullscreen container, either CF_OUTPUT or CF_GLOBAL, the blocking container loses its fullscreen mode and the target container is focused like normal. This should not affect directional focus commands: left, right, up, down, parent, child. Fixes issue #1819.
This commit is contained in:
@ -1250,6 +1250,20 @@ void cmd_focus_direction(I3_CMD, const char *direction) {
|
||||
ysuccess(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Focus a container and disable any other fullscreen container not permitting the focus.
|
||||
*
|
||||
*/
|
||||
static void cmd_focus_force_focus(Con *con) {
|
||||
/* Disable fullscreen container in workspace with container to be focused. */
|
||||
Con *ws = con_get_workspace(con);
|
||||
Con *fullscreen_on_ws = (focused && focused->fullscreen_mode == CF_GLOBAL) ? focused : con_get_fullscreen_con(ws, CF_OUTPUT);
|
||||
if (fullscreen_on_ws && fullscreen_on_ws != con && !con_has_parent(con, fullscreen_on_ws)) {
|
||||
con_disable_fullscreen(fullscreen_on_ws);
|
||||
}
|
||||
con_focus(con);
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of 'focus tiling|floating|mode_toggle'.
|
||||
*
|
||||
@ -1274,7 +1288,7 @@ void cmd_focus_window_mode(I3_CMD, const char *window_mode) {
|
||||
(!to_floating && current->type == CT_FLOATING_CON))
|
||||
continue;
|
||||
|
||||
con_focus(con_descend_focused(current));
|
||||
cmd_focus_force_focus(con_descend_focused(current));
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
@ -1341,13 +1355,6 @@ void cmd_focus(I3_CMD) {
|
||||
if (!ws)
|
||||
continue;
|
||||
|
||||
/* Check the fullscreen focus constraints. */
|
||||
if (!con_fullscreen_permits_focusing(current->con)) {
|
||||
LOG("Cannot change focus while in fullscreen mode (fullscreen rules).\n");
|
||||
ysuccess(false);
|
||||
return;
|
||||
}
|
||||
|
||||
/* In case this is a scratchpad window, call scratchpad_show(). */
|
||||
if (ws == __i3_scratch) {
|
||||
scratchpad_show(current->con);
|
||||
@ -1371,7 +1378,7 @@ void cmd_focus(I3_CMD) {
|
||||
* So we focus 'current' to make it the currently focused window of
|
||||
* the target workspace, then revert focus. */
|
||||
Con *currently_focused = focused;
|
||||
con_focus(current->con);
|
||||
cmd_focus_force_focus(current->con);
|
||||
con_focus(currently_focused);
|
||||
|
||||
/* Now switch to the workspace, then focus */
|
||||
|
Reference in New Issue
Block a user