From d1652ca7cd156b91fbea6cdc89ac7a5f6fad5f30 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Thu, 12 Jul 2018 00:12:27 +0300 Subject: [PATCH] cmd_rename_workspace: always call con_focus This was introduced in 252db3b8c (#3245). That commit moved the con_activate line inside the loop, meaning it wouldn't always be called. When the mouse moved after a rename with focus_follows_mouse enabled, check_crossing_screen_boundary (src/handlers.c:111) called con_descend_focused that used the wrong focus order. I also change con_activate to con_focus since we don't really want to raise floating containers there. Fixes #3325 --- src/commands.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/commands.c b/src/commands.c index c7b57ab3..fb7b08bf 100644 --- a/src/commands.c +++ b/src/commands.c @@ -2021,28 +2021,27 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) { } workspace_move_to_output(workspace, target_output); - 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_activate(previously_focused); - } - break; } + 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); + } + cmd_output->needs_tree_render = true; ysuccess(true);