]> git.sur5r.net Git - i3/i3/commitdiff
Add test for floating types
authorTony Crisci <tony@dubstepdish.com>
Sat, 8 Mar 2014 13:18:56 +0000 (08:18 -0500)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 8 Mar 2014 20:00:50 +0000 (21:00 +0100)
Add a test that verifies that windows with properties that indicate they
should be floating are indeed opened floating.

testcases/t/221-floating-type-hints.t [new file with mode: 0644]

diff --git a/testcases/t/221-floating-type-hints.t b/testcases/t/221-floating-type-hints.t
new file mode 100644 (file)
index 0000000..01c73a7
--- /dev/null
@@ -0,0 +1,119 @@
+#!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 windows with properties that indicate they should be floating
+# are indeed opened floating.
+# Ticket: #1182
+# Bug still in: 4.7.2-97-g84fc808
+use i3test;
+use X11::XCB qw(PROP_MODE_REPLACE);
+
+sub open_with_type {
+    my $window_type = shift;
+
+    my $window = open_window(
+        window_type => $x->atom(name => $window_type),
+    );
+    return $window;
+}
+
+sub open_with_state {
+    my $window_state = shift;
+
+    my $window = open_window(
+        before_map => sub {
+            my ($window) = @_;
+
+            my $atomname = $x->atom(name => '_NET_WM_STATE');
+            my $atomtype = $x->atom(name => 'ATOM');
+            $x->change_property(
+                PROP_MODE_REPLACE,
+                $window->id,
+                $atomname->id,
+                $atomtype->id,
+                32,
+                1,
+                pack('L1', $x->atom(name => $window_state)->id),
+            );
+        },
+    );
+
+    return $window;
+}
+
+sub open_with_fixed_size {
+    # The type of the WM_NORMAL_HINTS property is WM_SIZE_HINTS
+    # http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.3
+    my $XCB_ICCCM_SIZE_HINT_P_MIN_SIZE = 0x32;
+    my $XCB_ICCCM_SIZE_HINT_P_MAX_SIZE = 0x16;
+
+    my $flags = $XCB_ICCCM_SIZE_HINT_P_MIN_SIZE | $XCB_ICCCM_SIZE_HINT_P_MAX_SIZE;
+
+    my $min_width = 55;
+    my $max_width = 55;
+    my $min_height = 77;
+    my $max_height = 77;
+
+    my $pad = 0x00;
+
+    my $window = open_window(
+        before_map => sub {
+            my ($window) = @_;
+
+            my $atomname = $x->atom(name => 'WM_NORMAL_HINTS');
+            my $atomtype = $x->atom(name => 'WM_SIZE_HINTS');
+            $x->change_property(
+                PROP_MODE_REPLACE,
+                $window->id,
+                $atomname->id,
+                $atomtype->id,
+                32,
+                12,
+                pack('C5N8', $flags, $pad, $pad, $pad, $pad, 0, 0, 0, $min_width, $min_height, $max_width, $max_height),
+            );
+        },
+    );
+
+    return $window;
+}
+
+my $ws = fresh_workspace;
+
+my $window = open_with_type '_NET_WM_WINDOW_TYPE_DIALOG';
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Dialog window opened floating');
+$window->unmap;
+
+$window = open_with_type '_NET_WM_WINDOW_TYPE_UTILITY';
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Utility window opened floating');
+$window->unmap;
+
+$window = open_with_type '_NET_WM_WINDOW_TYPE_TOOLBAR';
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Toolbar window opened floating');
+$window->unmap;
+
+$window = open_with_type '_NET_WM_WINDOW_TYPE_SPLASH';
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Splash window opened floating');
+$window->unmap;
+
+$window = open_with_state '_NET_WM_STATE_MODAL';
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Modal window opened floating');
+$window->unmap;
+
+$window = open_with_fixed_size;
+is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Fixed size window opened floating');
+$window->unmap;
+
+done_testing;