diff --git a/src/workspace.c b/src/workspace.c index 2b7b19e5..1e707187 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -340,11 +340,16 @@ static void _workspace_show(Con *workspace) { /* Remember currently focused workspace for switching back to it later with * the 'workspace back_and_forth' command. * NOTE: We have to duplicate the name as the original will be freed when - * the corresponding workspace is cleaned up. */ - - FREE(previous_workspace_name); - if (current) - previous_workspace_name = sstrdup(current->name); + * the corresponding workspace is cleaned up. + * NOTE: Internal cons such as __i3_scratch (when a scratchpad window is + * focused) are skipped, see bug #868. */ + if (current && !con_is_internal(current)) { + FREE(previous_workspace_name); + if (current) { + previous_workspace_name = sstrdup(current->name); + DLOG("Setting previous_workspace_name = %s\n", previous_workspace_name); + } + } workspace_reassign_sticky(workspace); diff --git a/testcases/t/176-workspace-baf.t b/testcases/t/176-workspace-baf.t index 07c3c84a..659d469d 100644 --- a/testcases/t/176-workspace-baf.t +++ b/testcases/t/176-workspace-baf.t @@ -106,6 +106,23 @@ is(focused_ws, '6: baz', 'workspace 6 now focused'); cmd 'workspace number 6'; is(focused_ws, '5: foo', 'workspace 5 focused again'); +################################################################################ +# Place a window in the scratchpad, see if BAF works after showing the +# scratchpad window. +################################################################################ + +my $scratchwin = open_window; +cmd 'move scratchpad'; + +# show scratchpad window +cmd 'scratchpad show'; + +# hide scratchpad window +cmd 'scratchpad show'; + +cmd 'workspace back_and_forth'; +is(focused_ws, '6: baz', 'workspace 6 now focused'); + exit_gracefully($pid); done_testing;