tests: move set_wm_class to X11::XCB::Window

This code was duplicated way too often for a long time :)
This commit is contained in:
Michael Stapelberg 2013-09-24 21:53:48 +02:00
parent 031de8f720
commit 8d38529bcd
10 changed files with 21 additions and 232 deletions

View File

@ -9,7 +9,7 @@ WriteMakefile(
PREREQ_PM => { PREREQ_PM => {
'AnyEvent' => 0, 'AnyEvent' => 0,
'AnyEvent::I3' => '0.14', 'AnyEvent::I3' => '0.14',
'X11::XCB' => '0.03', 'X11::XCB' => '0.09',
'Inline' => 0, 'Inline' => 0,
'ExtUtils::PkgConfig' => 0, 'ExtUtils::PkgConfig' => 0,
'Test::More' => '0.94', 'Test::More' => '0.94',

View File

@ -17,7 +17,6 @@
# Tests all kinds of matching methods # Tests all kinds of matching methods
# #
use i3test; use i3test;
use X11::XCB qw(PROP_MODE_REPLACE);
my $tmp = fresh_workspace; my $tmp = fresh_workspace;
@ -61,39 +60,10 @@ is_num_children($tmp, 0, 'window killed');
$tmp = fresh_workspace; $tmp = fresh_workspace;
# TODO: move to X11::XCB my $left = open_window(wm_class => 'special', name => 'left');
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 $left = open_special(name => 'left');
ok($left->mapped, 'left window mapped'); ok($left->mapped, 'left window mapped');
my $right = open_special(name => 'right'); my $right = open_window(wm_class => 'special', name => 'right');
ok($right->mapped, 'right window mapped'); ok($right->mapped, 'right window mapped');
# two windows should be here # two windows should be here
@ -111,7 +81,7 @@ is_num_children($tmp, 1, 'one window still there');
$tmp = fresh_workspace; $tmp = fresh_workspace;
$left = open_special(name => 'left', wm_class => 'special7'); $left = open_window(name => 'left', wm_class => 'special7');
ok($left->mapped, 'left window mapped'); ok($left->mapped, 'left window mapped');
is_num_children($tmp, 1, 'window opened'); is_num_children($tmp, 1, 'window opened');
@ -125,7 +95,7 @@ is_num_children($tmp, 0, 'window killed');
$tmp = fresh_workspace; $tmp = fresh_workspace;
$left = open_special(name => 'ä 3', wm_class => 'special7'); $left = open_window(name => 'ä 3', wm_class => 'special7');
ok($left->mapped, 'left window mapped'); ok($left->mapped, 'left window mapped');
is_num_children($tmp, 1, 'window opened'); is_num_children($tmp, 1, 'window opened');

View File

@ -49,29 +49,9 @@ wait_for_unmap $window;
cmp_ok(@content, '==', 0, 'no more nodes'); cmp_ok(@content, '==', 0, 'no more nodes');
diag('content = '. Dumper(\@content)); 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( $window = open_window(
name => 'Borderless window', name => 'Borderless window',
before_map => sub { set_wm_class($_->id, 'borderless', 'borderless') }, wm_class => 'borderless',
); );
@content = @{get_ws_content($tmp)}; @content = @{get_ws_content($tmp)};
@ -190,7 +170,7 @@ $tmp = fresh_workspace;
$window = open_window( $window = open_window(
name => 'usethis', name => 'usethis',
before_map => sub { set_wm_class($_->id, 'borderless', 'borderless') }, wm_class => 'borderless',
); );
@content = @{get_ws_content($tmp)}; @content = @{get_ws_content($tmp)};
@ -208,8 +188,7 @@ sync_with_i3;
cmp_ok(@content, '==', 0, 'no nodes on this workspace now'); cmp_ok(@content, '==', 0, 'no nodes on this workspace now');
$window->_create; $window->_create;
$window->wm_class('borderless');
set_wm_class($window->id, 'borderless', 'borderless');
$window->name('notthis'); $window->name('notthis');
$window->map; $window->map;
wait_for_map $window; wait_for_map $window;
@ -238,7 +217,8 @@ $tmp = fresh_workspace;
$window = open_window( $window = open_window(
name => 'usethis', name => 'usethis',
before_map => sub { set_wm_class($_->id, 'bar', 'foo') }, wm_class => 'bar',
instance => 'foo',
); );
@content = @{get_ws_content($tmp)}; @content = @{get_ws_content($tmp)};
@ -264,7 +244,8 @@ $tmp = fresh_workspace;
$window = open_window( $window = open_window(
name => 'usethis', name => 'usethis',
before_map => sub { set_wm_class($_->id, 'bar', 'foo') }, wm_class => 'bar',
instance => 'foo',
); );
@content = @{get_ws_content($tmp)}; @content = @{get_ws_content($tmp)};
@ -292,7 +273,8 @@ $tmp = fresh_workspace;
$window = open_window( $window = open_window(
name => 'usethis', name => 'usethis',
before_map => sub { set_wm_class($_->id, 'bar', 'foo') }, wm_class => 'bar',
instance => 'foo',
); );
@content = @{get_ws_content($tmp)}; @content = @{get_ws_content($tmp)};

View File

@ -17,37 +17,16 @@
# Tests if assignments work # Tests if assignments work
# #
use i3test i3_autostart => 0; use i3test i3_autostart => 0;
use X11::XCB qw(PROP_MODE_REPLACE);
# 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 { sub open_special {
my %args = @_; my %args = @_;
my $wm_class = delete($args{wm_class}) || 'special';
$args{name} //= 'special window'; $args{name} //= 'special window';
# We use dont_map because i3 will not map the window on the current # 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). # workspace. Thus, open_window would time out in wait_for_map (2 seconds).
my $window = open_window( my $window = open_window(
%args, %args,
before_map => sub { set_wm_class($_->id, $wm_class, $wm_class) }, wm_class => 'special',
dont_map => 1, dont_map => 1,
); );
$window->map; $window->map;

View File

@ -18,37 +18,16 @@
# assigned to an invisible workspace # assigned to an invisible workspace
# #
use i3test i3_autostart => 0; use i3test i3_autostart => 0;
use X11::XCB qw(PROP_MODE_REPLACE);
# 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 { sub open_special {
my %args = @_; my %args = @_;
my $wm_class = delete($args{wm_class}) || 'special';
$args{name} //= 'special window'; $args{name} //= 'special window';
# We use dont_map because i3 will not map the window on the current # 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). # workspace. Thus, open_window would time out in wait_for_map (2 seconds).
my $window = open_window( my $window = open_window(
%args, %args,
before_map => sub { set_wm_class($_->id, $wm_class, $wm_class) }, wm_class => 'special',
dont_map => 1, dont_map => 1,
); );
$window->map; $window->map;

View File

@ -18,44 +18,13 @@
# window is shown on another workspace. # window is shown on another workspace.
# #
use i3test; use i3test;
use List::Util qw(first);
use X11::XCB qw(:all);
my $i3 = i3(get_socket_path()); my $i3 = i3(get_socket_path());
my $tmp = fresh_workspace; 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 $win = open_window;
my $scratch = open_special; my $scratch = open_window(wm_class => 'special');
cmd '[class="special"] move scratchpad'; cmd '[class="special"] move scratchpad';
is_num_children($tmp, 1, 'one window on current ws'); is_num_children($tmp, 1, 'one window on current ws');

View File

@ -19,7 +19,6 @@
# Ticket: #909 # Ticket: #909
# Bug still in: 4.4-69-g6856b23 # Bug still in: 4.4-69-g6856b23
use i3test i3_autostart => 0; use i3test i3_autostart => 0;
use X11::XCB qw(:all);
my $config = <<EOT; my $config = <<EOT;
# i3 config file (v4) # i3 config file (v4)
@ -31,28 +30,10 @@ EOT
my $pid = launch_with_config($config); my $pid = launch_with_config($config);
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"
);
}
# We use dont_map because i3 will not map the window on the current # 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). # workspace. Thus, open_window would time out in wait_for_map (2 seconds).
my $window = open_window( my $window = open_window(
before_map => sub { set_wm_class($_->id, '__i3-test-window', '__i3-test-window') }, wm_class => '__i3-test-window',
dont_map => 1, dont_map => 1,
); );
$window->map; $window->map;

View File

@ -20,41 +20,11 @@
# Ticket: #913 # Ticket: #913
# Bug still in: 4.4-97-gf767ac3 # Bug still in: 4.4-97-gf767ac3
use i3test; use i3test;
use X11::XCB qw(:all);
# 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 $tmp = fresh_workspace; my $tmp = fresh_workspace;
# Open a new window which we can identify later on based on its WM_CLASS. # Open a new window which we can identify later on based on its WM_CLASS.
my $scratch = open_special; my $scratch = open_window(wm_class => 'special');
my $tmp2 = fresh_workspace; my $tmp2 = fresh_workspace;

View File

@ -19,7 +19,6 @@
# Ticket: #1027 # Ticket: #1027
# Bug still in: 4.5.1-90-g6582da9 # Bug still in: 4.5.1-90-g6582da9
use i3test i3_autostart => 0; use i3test i3_autostart => 0;
use X11::XCB qw(PROP_MODE_REPLACE);
my $config = <<'EOT'; my $config = <<'EOT';
# i3 config file (v4) # i3 config file (v4)
@ -31,28 +30,9 @@ EOT
my $pid = launch_with_config($config); my $pid = launch_with_config($config);
# 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"
);
}
my $window = open_window( my $window = open_window(
name => 'Borderless window', name => 'Borderless window',
before_map => sub { set_wm_class($_->id, 'special', 'special') }, wm_class => 'special',
dont_map => 1, dont_map => 1,
); );
$window->map; $window->map;

View File

@ -21,37 +21,16 @@
# Ticket: #1086 # Ticket: #1086
# Bug still in: 4.6-62-g7098ef6 # Bug still in: 4.6-62-g7098ef6
use i3test i3_autostart => 0; use i3test i3_autostart => 0;
use X11::XCB qw(:all);
# 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 { sub open_special {
my %args = @_; my %args = @_;
my $wm_class = delete($args{wm_class}) || 'special';
$args{name} //= 'special window'; $args{name} //= 'special window';
# We use dont_map because i3 will not map the window on the current # 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). # workspace. Thus, open_window would time out in wait_for_map (2 seconds).
my $window = open_window( my $window = open_window(
%args, %args,
before_map => sub { set_wm_class($_->id, $wm_class, $wm_class) }, wm_class => 'special',
dont_map => 1, dont_map => 1,
); );
$window->add_hint('urgency'); $window->add_hint('urgency');