From 138e04fd4d50e5f80d445761de86c0c9617916b3 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 1 Jan 2013 16:31:08 +0100 Subject: [PATCH] Bugfix: Fix for_window moving of assigned windows (Thanks bafain) fixes #909 --- src/manage.c | 4 ++ testcases/t/203-regress-assign-and-move.t | 64 +++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 testcases/t/203-regress-assign-and-move.t diff --git a/src/manage.c b/src/manage.c index 9835aa2a..2d102eeb 100644 --- a/src/manage.c +++ b/src/manage.c @@ -402,6 +402,10 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki /* Check if any assignments match */ run_assignments(cwindow); + /* 'ws' may be invalid because of the assignments, e.g. when the user uses + * "move window to workspace 1", but had it assigned to workspace 2. */ + ws = con_get_workspace(nc); + /* If this window was put onto an invisible workspace (via assignments), we * render this workspace. It wouldn’t be rendered in our normal code path * because only the visible workspaces get rendered. diff --git a/testcases/t/203-regress-assign-and-move.t b/testcases/t/203-regress-assign-and-move.t new file mode 100644 index 00000000..bf3df91e --- /dev/null +++ b/testcases/t/203-regress-assign-and-move.t @@ -0,0 +1,64 @@ +#!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) +# +# Verifies that you can assign a window _and_ use for_window with a move +# command. +# Ticket: #909 +# Bug still in: 4.4-69-g6856b23 +use i3test i3_autostart => 0; +use X11::XCB qw(:all); + +my $config = <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" + ); +} + +# We use dont_map because i3 will not map the window on the current +# workspace. Thus, open_window would time out in wait_for_map (2 seconds). +my $window = open_window( + before_map => sub { set_wm_class($_->id, '__i3-test-window', '__i3-test-window') }, + dont_map => 1, +); +$window->map; + +does_i3_live; + +exit_gracefully($pid); + +done_testing;