#!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)
+#
use i3test i3_autostart => 0;
use X11::XCB qw(PROP_MODE_REPLACE);
+my (@nodes);
+
##############################################################
# 1: test the following directive:
# for_window [class="borderless"] border none
cmp_ok(@content, '==', 0, 'no more nodes');
diag('content = '. Dumper(\@content));
-
-# TODO: move this to X11::XCB::Window
-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"
- );
-}
-
$window = open_window(
name => 'Borderless window',
- before_map => sub { set_wm_class($_->id, 'borderless', 'borderless') },
+ wm_class => 'borderless',
);
@content = @{get_ws_content($tmp)};
$window = open_window(
name => 'usethis',
- before_map => sub { set_wm_class($_->id, 'borderless', 'borderless') },
+ wm_class => 'borderless',
);
@content = @{get_ws_content($tmp)};
cmp_ok(@content, '==', 0, 'no nodes on this workspace now');
$window->_create;
-
-set_wm_class($window->id, 'borderless', 'borderless');
+$window->wm_class('borderless');
$window->name('notthis');
$window->map;
wait_for_map $window;
$window = open_window(
name => 'usethis',
- before_map => sub { set_wm_class($_->id, 'bar', 'foo') },
+ wm_class => 'bar',
+ instance => 'foo',
);
@content = @{get_ws_content($tmp)};
$window = open_window(
name => 'usethis',
- before_map => sub { set_wm_class($_->id, 'bar', 'foo') },
+ wm_class => 'bar',
+ instance => 'foo',
);
@content = @{get_ws_content($tmp)};
$window = open_window(
name => 'usethis',
- before_map => sub { set_wm_class($_->id, 'bar', 'foo') },
+ wm_class => 'bar',
+ instance => 'foo',
);
@content = @{get_ws_content($tmp)};
# 8: check that the role criterion works properly
##############################################################
-# this configuration is broken because "asdf" is not a valid integer
-# the for_window should therefore recognize this error and don’t add the
-# assignment
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# *after* the window has been mapped
##############################################################
-# this configuration is broken because "asdf" is not a valid integer
-# the for_window should therefore recognize this error and don’t add the
-# assignment
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
exit_gracefully($pid);
+##############################################################
+# 10: check that the criterion 'window_type' works
+##############################################################
+
+# test all window types
+my %window_types = (
+ 'normal' => '_NET_WM_WINDOW_TYPE_NORMAL',
+ 'dialog' => '_NET_WM_WINDOW_TYPE_DIALOG',
+ 'utility' => '_NET_WM_WINDOW_TYPE_UTILITY',
+ 'toolbar' => '_NET_WM_WINDOW_TYPE_TOOLBAR',
+ 'splash' => '_NET_WM_WINDOW_TYPE_SPLASH',
+ 'menu' => '_NET_WM_WINDOW_TYPE_MENU',
+ 'dropdown_menu' => '_NET_WM_WINDOW_TYPE_DROPDOWN_MENU',
+ 'popup_menu' => '_NET_WM_WINDOW_TYPE_POPUP_MENU',
+ 'tooltip' => '_NET_WM_WINDOW_TYPE_TOOLTIP'
+);
+
+while (my ($window_type, $atom) = each %window_types) {
+
+ $config = <<"EOT";
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [window_type="$window_type"] floating enable, mark branded
+EOT
+
+ $pid = launch_with_config($config);
+ $tmp = fresh_workspace;
+
+ $window = open_window(window_type => $x->atom(name => $atom));
+
+ my @nodes = @{get_ws($tmp)->{floating_nodes}};
+ cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
+ is($nodes[0]->{nodes}[0]->{mark}, 'branded', "mark set (window_type = $atom)");
+
+ exit_gracefully($pid);
+
+}
+
+##############################################################
+# 11: check that the criterion 'window_type' works if the
+# _NET_WM_WINDOW_TYPE is changed after managing.
+##############################################################
+
+while (my ($window_type, $atom) = each %window_types) {
+
+ $config = <<"EOT";
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [window_type="$window_type"] floating enable, mark branded
+EOT
+
+ $pid = launch_with_config($config);
+ $tmp = fresh_workspace;
+
+ $window = open_window();
+
+ my $atomname = $x->atom(name => '_NET_WM_WINDOW_TYPE');
+ 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 => $atom)->id));
+ $x->flush;
+ sync_with_i3;
+
+ my @nodes = @{get_ws($tmp)->{floating_nodes}};
+ cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
+ is($nodes[0]->{nodes}[0]->{mark}, 'branded', "mark set (window_type = $atom)");
+
+ exit_gracefully($pid);
+
+}
+
+##############################################################
+# 12: check that the criterion 'workspace' works
+##############################################################
+
+$config = <<"EOT";
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [workspace="trigger"] floating enable, mark triggered
+EOT
+
+$pid = launch_with_config($config);
+
+cmd 'workspace trigger';
+$window = open_window;
+
+@nodes = @{get_ws('trigger')->{floating_nodes}};
+cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
+is($nodes[0]->{nodes}[0]->{mark}, 'triggered', "mark set for workspace criterion");
+
+exit_gracefully($pid);
+
+##############################################################
done_testing;