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;