]> git.sur5r.net Git - i3/i3/blob - testcases/t/102-dock.t
Merge branch 'master' into next
[i3/i3] / testcases / t / 102-dock.t
1 #!perl
2 # vim:ts=4:sw=4:expandtab
3
4 use i3test;
5 use X11::XCB 'PROP_MODE_REPLACE';
6 use List::Util qw(first);
7
8 #####################################################################
9 # verify that there is no dock window yet
10 #####################################################################
11
12 # Children of all dockareas
13 my @docked = get_dock_clients;
14 is(@docked, 0, 'no dock clients yet');
15
16 #####################################################################
17 # Create a dock window and see if it gets managed
18 #####################################################################
19
20 my $screens = $x->screens;
21
22 # Get the primary screen
23 my $primary = first { $_->primary } @{$screens};
24
25 # TODO: focus the primary screen before
26 my $window = open_window({
27         window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
28     });
29
30 my $rect = $window->rect;
31 is($rect->width, $primary->rect->width, 'dock client is as wide as the screen');
32 is($rect->height, 30, 'height is unchanged');
33
34 #####################################################################
35 # check that we can find it in the layout tree at the expected position
36 #####################################################################
37
38 @docked = get_dock_clients('top');
39 is(@docked, 1, 'one dock client found');
40
41 # verify the position/size
42 my $docknode = $docked[0];
43
44 is($docknode->{rect}->{x}, 0, 'dock node placed at x=0');
45 is($docknode->{rect}->{y}, 0, 'dock node placed at y=0');
46 is($docknode->{rect}->{width}, $primary->rect->width, 'dock node as wide as the screen');
47 is($docknode->{rect}->{height}, 30, 'dock node has unchanged height');
48
49 #####################################################################
50 # check that re-configuring the height works
51 #####################################################################
52
53 $window->rect(X11::XCB::Rect->new(x => 0, y => 0, width => 50, height => 40));
54
55 sync_with_i3;
56
57 @docked = get_dock_clients('top');
58 is(@docked, 1, 'one dock client found');
59
60 # verify the position/size
61 $docknode = $docked[0];
62
63 is($docknode->{rect}->{x}, 0, 'dock node placed at x=0');
64 is($docknode->{rect}->{y}, 0, 'dock node placed at y=0');
65 is($docknode->{rect}->{width}, $primary->rect->width, 'dock node as wide as the screen');
66 is($docknode->{rect}->{height}, 40, 'dock height changed');
67
68 $window->destroy;
69
70 wait_for_unmap $window;
71
72 @docked = get_dock_clients();
73 is(@docked, 0, 'no more dock clients');
74
75 #####################################################################
76 # check if it gets placed on bottom (by coordinates)
77 #####################################################################
78
79 $window = open_window({
80         rect => [ 0, 1000, 30, 30 ],
81         background_color => '#FF0000',
82         window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
83     });
84
85 $rect = $window->rect;
86 is($rect->width, $primary->rect->width, 'dock client is as wide as the screen');
87 is($rect->height, 30, 'height is unchanged');
88
89 @docked = get_dock_clients('bottom');
90 is(@docked, 1, 'dock client on bottom');
91
92 $window->destroy;
93
94 wait_for_unmap $window;
95
96 @docked = get_dock_clients();
97 is(@docked, 0, 'no more dock clients');
98
99 #####################################################################
100 # check if it gets placed on bottom (by hint)
101 #####################################################################
102
103 $window = open_window({
104         dont_map => 1,
105         rect => [ 0, 1000, 30, 30 ],
106         background_color => '#FF0000',
107         window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
108     });
109
110 $window->_create();
111
112 # Add a _NET_WM_STRUT_PARTIAL hint
113 my $atomname = $x->atom(name => '_NET_WM_STRUT_PARTIAL');
114 my $atomtype = $x->atom(name => 'CARDINAL');
115
116 $x->change_property(
117     PROP_MODE_REPLACE,
118     $window->id,
119     $atomname->id,
120     $atomtype->id,
121     32,         # 32 bit integer
122     12,
123     pack('L12', 0, 0, 16, 0, 0, 0, 0, 0, 0, 1280, 0, 0)
124 );
125
126 $window->map;
127
128 wait_for_map $window;
129
130 @docked = get_dock_clients('top');
131 is(@docked, 1, 'dock client on top');
132
133 $window->destroy;
134
135 wait_for_unmap $window;
136
137 @docked = get_dock_clients();
138 is(@docked, 0, 'no more dock clients');
139
140 $window = open_window({
141         dont_map => 1,
142         rect => [ 0, 1000, 30, 30 ],
143         background_color => '#FF0000',
144         window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
145     });
146
147 $window->_create();
148
149 # Add a _NET_WM_STRUT_PARTIAL hint
150 $atomname = $x->atom(name => '_NET_WM_STRUT_PARTIAL');
151 $atomtype = $x->atom(name => 'CARDINAL');
152
153 $x->change_property(
154     PROP_MODE_REPLACE,
155     $window->id,
156     $atomname->id,
157     $atomtype->id,
158     32,         # 32 bit integer
159     12,
160     pack('L12', 0, 0, 0, 16, 0, 0, 0, 0, 0, 1280, 0, 0)
161 );
162
163 $window->map;
164
165 wait_for_map $window;
166
167 @docked = get_dock_clients('bottom');
168 is(@docked, 1, 'dock client on bottom');
169
170 $window->destroy;
171
172
173 #####################################################################
174 # regression test: transient dock client
175 #####################################################################
176
177 my $fwindow = open_window({
178         dont_map => 1,
179         background_color => '#FF0000',
180         window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
181     });
182
183 $fwindow->transient_for($window);
184 $fwindow->map;
185
186 wait_for_map $fwindow;
187
188 does_i3_live;
189
190 done_testing;