From a32d2d5d618db50e0277aef2dcbc850425a77c6b Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 25 Jan 2013 15:26:53 +0100 Subject: [PATCH] scratchpad: fix crash when moving last window of an invisible workspace (+test) (Thanks bafain) It looks like the code which was removed with this commit was not necessary anyways since con_move_to_workspace() by now checks on its own whether it moves to the scratchpad. fixes #913 --- src/scratchpad.c | 8 +-- testcases/t/204-regress-scratchpad-move.t | 65 +++++++++++++++++++++++ 2 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 testcases/t/204-regress-scratchpad-move.t diff --git a/src/scratchpad.c b/src/scratchpad.c index c38e63b1..e7b8f61b 100644 --- a/src/scratchpad.c +++ b/src/scratchpad.c @@ -4,7 +4,7 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009-2013 Michael Stapelberg and contributors (see also: LICENSE) * * scratchpad.c: Moving windows to the scratchpad and making them visible again. * @@ -53,7 +53,6 @@ void scratchpad_move(Con *con) { /* 2: Send the window to the __i3_scratch workspace, mainting its * coordinates and not warping the pointer. */ - Con *focus_next = con_next_focused(con); con_move_to_workspace(con, __i3_scratch, true, true); /* 3: If this is the first time this window is used as a scratchpad, we set @@ -63,11 +62,6 @@ void scratchpad_move(Con *con) { DLOG("This window was never used as a scratchpad before.\n"); con->scratchpad_state = SCRATCHPAD_FRESH; } - - /* 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. */ - if (con_get_workspace(focus_next) == con_get_workspace(focused)) - con_focus(focus_next); } /* diff --git a/testcases/t/204-regress-scratchpad-move.t b/testcases/t/204-regress-scratchpad-move.t new file mode 100644 index 00000000..8c307aa5 --- /dev/null +++ b/testcases/t/204-regress-scratchpad-move.t @@ -0,0 +1,65 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Please read the following documents before working on tests: +# • http://build.i3wm.org/docs/testsuite.html +# (or docs/testsuite) +# +# • http://build.i3wm.org/docs/lib-i3test.html +# (alternatively: perldoc ./testcases/lib/i3test.pm) +# +# • http://build.i3wm.org/docs/ipc.html +# (or docs/ipc) +# +# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf +# (unless you are already familiar with Perl) +# +# Moves the last window of a workspace to the scratchpad. The workspace will be +# cleaned up and previously, the subsequent focusing of a destroyed container +# would crash i3. +# Ticket: #913 +# Bug still in: 4.4-97-gf767ac3 +use i3test; +use X11::XCB qw(:all); + +# TODO: move to X11::XCB +sub set_wm_class { + my ($id, $class, $instance) = @_; + + # Add a _NET_WM_STRUT_PARTIAL hint + my $atomname = $x->atom(name => 'WM_CLASS'); + my $atomtype = $x->atom(name => 'STRING'); + + $x->change_property( + PROP_MODE_REPLACE, + $id, + $atomname->id, + $atomtype->id, + 8, + length($class) + length($instance) + 2, + "$instance\x00$class\x00" + ); +} + +sub open_special { + my %args = @_; + my $wm_class = delete($args{wm_class}) || 'special'; + + return open_window( + %args, + before_map => sub { set_wm_class($_->id, $wm_class, $wm_class) }, + ); +} + +my $tmp = fresh_workspace; + +# Open a new window which we can identify later on based on its WM_CLASS. +my $scratch = open_special; + +my $tmp2 = fresh_workspace; + +cmd '[class="special"] move scratchpad'; + +does_i3_live; + +done_testing;