]> git.sur5r.net Git - i3/i3/commitdiff
Fix t/158-wm_take_focus, it was not properly verifying events (Thanks TonyC)
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 9 Apr 2014 19:47:32 +0000 (21:47 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 9 Apr 2014 19:47:32 +0000 (21:47 +0200)
See also http://cr.i3wm.org/patch/500 for TonyC’s patch. This version
reduces code duplication.

testcases/lib/i3test.pm
testcases/t/158-wm_take_focus.t

index d71a6e86cb9ece155cf90a67093cfb7b2aeb6567..5dd96acd8b6efae338890b1075b110a879e31430 100644 (file)
@@ -714,6 +714,8 @@ sub sync_with_i3 {
     # event mask, it will get the ClientMessage.
     $x->send_event(0, $root, EVENT_MASK_SUBSTRUCTURE_REDIRECT, $msg);
 
+    return $myrnd if $args{dont_wait_for_event};
+
     # now wait until the reply is here
     return wait_for_event 2, sub {
         my ($event) = @_;
index 222c93e47176877d91d77588248c2336cc243c4b..b9bc610014e4d3afe53e7ec9c7bd160568fc7906 100644 (file)
@@ -22,10 +22,29 @@ subtest 'Window without WM_TAKE_FOCUS', sub {
     fresh_workspace;
 
     my $window = open_window;
-    # sync_with_i3 will send a ClientMessage to i3 and receive one targeted to
-    # $window->id. If it receives WM_TAKE_FOCUS instead, it will return 0, thus
-    # the test will fail.
-    ok(sync_with_i3(window_id => $window->id), 'did not receive ClientMessage');
+    # sync_with_i3 will send a ClientMessage to i3 and i3 will send the same
+    # payload back to $window->id.
+    my $myrnd = sync_with_i3(
+        window_id => $window->id,
+        dont_wait_for_event => 1,
+    );
+
+    # We check whether the first received message has the correct payload — if
+    # not, the received message was a WM_TAKE_FOCUS message.
+    my $first_event_is_clientmessage;
+    wait_for_event 2, sub {
+        my ($event) = @_;
+        # TODO: const
+        return 0 unless $event->{response_type} == 161;
+
+        my ($win, $rnd) = unpack "LL", $event->{data};
+        if (!defined($first_event_is_clientmessage)) {
+            $first_event_is_clientmessage = ($rnd == $myrnd);
+        }
+        return ($rnd == $myrnd);
+    };
+
+    ok($first_event_is_clientmessage, 'did not receive ClientMessage');
 
     done_testing;
 };