From c0c2fd631b2dcf0a99abe2c96e76c17ca8132504 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 5 Apr 2012 18:12:24 +0200 Subject: [PATCH] add a testcase for the previous commit --- testcases/t/190-scratchpad-diff-ws.t | 59 ++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 testcases/t/190-scratchpad-diff-ws.t diff --git a/testcases/t/190-scratchpad-diff-ws.t b/testcases/t/190-scratchpad-diff-ws.t new file mode 100644 index 00000000..9b6e6c7a --- /dev/null +++ b/testcases/t/190-scratchpad-diff-ws.t @@ -0,0 +1,59 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Test for ticket #676: 'scratchpad show' causes a segfault if the scratchpad +# window is shown on another workspace. +# +use i3test; +use List::Util qw(first); +use X11::XCB qw(:all); + +my $i3 = i3(get_socket_path()); +my $tmp = fresh_workspace; + +# 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 $win = open_window; + +my $scratch = open_special; +cmd '[class="special"] move scratchpad'; + +my ($nodes, $focus) = get_ws_content($tmp); +is(scalar @$nodes, 1, 'one window on current ws'); + +my $otmp = fresh_workspace; +cmd 'scratchpad show'; + +cmd "workspace $tmp"; +cmd '[class="special"] scratchpad show'; + +does_i3_live; + +done_testing;