Merge pull request #3814 from orestisfl/net_active_fullscreen

handlers.c: new focus should not end up behind fullscreen
This commit is contained in:
Ingo Bürk
2019-10-09 13:25:38 +02:00
committed by GitHub
5 changed files with 64 additions and 45 deletions

View File

@ -1238,20 +1238,6 @@ 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 = con_get_fullscreen_covering_ws(ws);
if (fullscreen_on_ws && fullscreen_on_ws != con && !con_has_parent(con, fullscreen_on_ws)) {
con_disable_fullscreen(fullscreen_on_ws);
}
con_activate(con);
}
/*
* Implementation of 'focus tiling|floating|mode_toggle'.
*
@ -1276,7 +1262,7 @@ void cmd_focus_window_mode(I3_CMD, const char *window_mode) {
(!to_floating && current->type == CT_FLOATING_CON))
continue;
cmd_focus_force_focus(con_descend_focused(current));
con_activate_unblock(con_descend_focused(current));
success = true;
break;
}
@ -1353,26 +1339,8 @@ void cmd_focus(I3_CMD) {
break;
}
/* If the container is not on the current workspace,
* workspace_show() will switch to a different workspace and (if
* enabled) trigger a mouse pointer warp to the currently focused
* container (!) on the target workspace.
*
* Therefore, before calling workspace_show(), we make sure that
* 'current' will be focused on the workspace. However, we cannot
* just con_focus(current) because then the pointer will not be
* warped at all (the code thinks we are already there).
*
* So we focus 'current' to make it the currently focused window of
* the target workspace, then revert focus. */
Con *currently_focused = focused;
cmd_focus_force_focus(current->con);
con_activate(currently_focused);
/* Now switch to the workspace, then focus */
workspace_show(ws);
LOG("focusing %p / %s\n", current->con, current->con->name);
con_activate(current->con);
con_activate_unblock(current->con);
count++;
}