From 15499bf8e7687c346577ffe05c17afa4335f280a Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 14 Sep 2012 13:03:39 +0200 Subject: [PATCH] =?UTF-8?q?Bugfix:=20Don=E2=80=99t=20focus=20the=20wrong?= =?UTF-8?q?=20workspace=20when=20moving=20to=20scratchpad=20(+test)=20(Tha?= =?UTF-8?q?nks=20loblik)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The problem was that scratchpad_move() didn’t check whether the source workspace was focused. Therefore, 'move scratchpad' only worked reliably interactively , but not when used with criteria. --- src/con.c | 4 +++- src/scratchpad.c | 3 ++- testcases/t/198-regression-scratchpad-crash.t | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 testcases/t/198-regression-scratchpad-crash.t diff --git a/src/con.c b/src/con.c index c24a379f..23cf1568 100644 --- a/src/con.c +++ b/src/con.c @@ -657,7 +657,9 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool * con focused. Otherwise, we leave the focus on the current workspace as we * don’t want to focus invisible workspaces */ if (source_output != dest_output && - workspace_is_visible(workspace)) { + workspace_is_visible(workspace) && + workspace->name[0] != '_' && + workspace->name[1] != '_') { DLOG("Moved to a different output, focusing target\n"); } else { /* Descend focus stack in case focus_next is a workspace which can diff --git a/src/scratchpad.c b/src/scratchpad.c index 5f65bba8..c54b1ada 100644 --- a/src/scratchpad.c +++ b/src/scratchpad.c @@ -58,7 +58,8 @@ void scratchpad_move(Con *con) { /* 4: Fix focus. Normally, when moving a window to a different output, the * destination output gets focused. In this case, we don’t want that. */ - con_focus(focus_next); + if (con_get_workspace(focus_next) == con_get_workspace(focused)) + con_focus(focus_next); } /* diff --git a/testcases/t/198-regression-scratchpad-crash.t b/testcases/t/198-regression-scratchpad-crash.t new file mode 100644 index 00000000..8f732bac --- /dev/null +++ b/testcases/t/198-regression-scratchpad-crash.t @@ -0,0 +1,19 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# When using a command which moves a window to scratchpad from an invisible +# (e.g. unfocused) workspace and immediately shows that window again, i3 +# crashed. +# Bug still in: 4.2-305-g22922a9 +use i3test; + +my $ws1 = fresh_workspace; +my $invisible_window = open_window; +my $other_focusable_window = open_window; + +my $ws2 = fresh_workspace; +my $id = $invisible_window->id; +cmd qq|[id="$id"] move scratchpad, scratchpad show|; + +does_i3_live; + +done_testing;