From 34c217acc878f200614ea756501863daba6da600 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Wed, 9 Oct 2019 02:31:52 +0300 Subject: [PATCH] Introduce con_activate_unblock --- include/con.h | 7 +++++++ src/commands.c | 36 ++---------------------------------- src/con.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 34 deletions(-) diff --git a/include/con.h b/include/con.h index 2d843eeb..d8330098 100644 --- a/include/con.h +++ b/include/con.h @@ -45,6 +45,13 @@ void con_focus(Con *con); */ void con_activate(Con *con); +/** + * Activates the container like in con_activate but removes fullscreen + * restrictions and properly warps the pointer if needed. + * + */ +void con_activate_unblock(Con *con); + /** * Closes the given container. * diff --git a/src/commands.c b/src/commands.c index 5b11fce1..b4f2ee19 100644 --- a/src/commands.c +++ b/src/commands.c @@ -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++; } diff --git a/src/con.c b/src/con.c index e9f82cf4..e0993ade 100644 --- a/src/con.c +++ b/src/con.c @@ -265,6 +265,41 @@ void con_activate(Con *con) { con_raise(con); } +/* + * Activates the container like in con_activate but removes fullscreen + * restrictions and properly warps the pointer if needed. + * + */ +void con_activate_unblock(Con *con) { + Con *ws = con_get_workspace(con); + Con *previous_focus = focused; + 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); + + /* 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 'con' will + * be focused on the workspace. However, we cannot just con_focus(con) + * because then the pointer will not be warped at all (the code thinks we + * are already there). + * + * So we focus 'con' to make it the currently focused window of the target + * workspace, then revert focus. */ + if (ws != con_get_workspace(previous_focus)) { + con_activate(previous_focus); + /* Now switch to the workspace, then focus */ + workspace_show(ws); + con_activate(con); + } +} + /* * Closes the given container. *