]> git.sur5r.net Git - i3/i3/blob - testcases/t/156-fullscreen-focus.t
Migrate the move command to use typed numbers.
[i3/i3] / testcases / t / 156-fullscreen-focus.t
1 #!perl
2 # vim:ts=4:sw=4:expandtab
3 #
4 # Please read the following documents before working on tests:
5 # • http://build.i3wm.org/docs/testsuite.html
6 #   (or docs/testsuite)
7 #
8 # • http://build.i3wm.org/docs/lib-i3test.html
9 #   (alternatively: perldoc ./testcases/lib/i3test.pm)
10 #
11 # • http://build.i3wm.org/docs/ipc.html
12 #   (or docs/ipc)
13 #
14 # • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
15 #   (unless you are already familiar with Perl)
16 #
17 # Test if new containers get focused when there is a fullscreen container at
18 # the time of launching the new one. Also make sure that focusing containers
19 # in other workspaces work even when there is a fullscreen container.
20 #
21 use i3test i3_autostart => 0;
22
23 # Screen setup looks like this:
24 # +----+----+
25 # | S1 | S2 |
26 # +----+----+
27 my $config = <<EOT;
28 # i3 config file (v4)
29 font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
30
31 fake-outputs 1024x768+0+0,1024x768+1024+0
32 EOT
33
34 my $pid = launch_with_config($config);
35
36 my $i3 = i3(get_socket_path());
37
38 my $tmp = fresh_workspace;
39
40 ################################################################################
41 # Open the left window.
42 ################################################################################
43
44 my $left = open_window({ background_color => '#ff0000' });
45
46 is($x->input_focus, $left->id, 'left window focused');
47
48 diag("left = " . $left->id);
49
50 ################################################################################
51 # Open the right window.
52 ################################################################################
53
54 my $right = open_window({ background_color => '#00ff00' });
55
56 diag("right = " . $right->id);
57
58 ################################################################################
59 # Set the right window to fullscreen.
60 ################################################################################
61
62 cmd 'nop setting fullscreen';
63 cmd 'fullscreen';
64
65 ################################################################################
66 # Open a third window. Since we're fullscreen, the window won't be # mapped, so
67 # don't wait for it to be mapped. Instead, just send the map request and sync
68 # with i3 to make sure i3 recognizes it.
69 ################################################################################
70
71 my $third = open_window({
72         background_color => '#0000ff',
73         name => 'Third window',
74         dont_map => 1,
75     });
76
77 $third->map;
78
79 sync_with_i3;
80
81 diag("third = " . $third->id);
82
83 ################################################################################
84 # Move the window to a different workspace, and verify that the third window now
85 # gets focused in the current workspace.
86 ################################################################################
87
88 my $tmp2 = get_unused_workspace;
89
90 cmd "move workspace $tmp2";
91
92 is($x->input_focus, $third->id, 'third window focused');
93
94 ################################################################################
95 # Ensure that moving a window to a workspace which has a fullscreen window does
96 # not focus it (otherwise the user cannot get out of fullscreen mode anymore).
97 ################################################################################
98
99 $tmp = fresh_workspace;
100
101 my $fullscreen_window = open_window;
102 cmd 'fullscreen';
103
104 my $nodes = get_ws_content($tmp);
105 is(scalar @$nodes, 1, 'precisely one window');
106 is($nodes->[0]->{focused}, 1, 'fullscreen window focused');
107 my $old_id = $nodes->[0]->{id};
108
109 $tmp2 = fresh_workspace;
110 my $move_window = open_window;
111 cmd "move workspace $tmp";
112
113 cmd "workspace $tmp";
114
115 $nodes = get_ws_content($tmp);
116 is(scalar @$nodes, 2, 'precisely two windows');
117 is($nodes->[0]->{id}, $old_id, 'id unchanged');
118 is($nodes->[0]->{focused}, 1, 'fullscreen window focused');
119
120 ################################################################################
121 # Ensure it's possible to change focus if it doesn't escape the fullscreen
122 # container with fullscreen global. We can't even focus a container in a
123 # different workspace.
124 ################################################################################
125
126 cmd 'fullscreen';
127
128 # Focus screen 1
129 sync_with_i3;
130 $x->root->warp_pointer(1025, 0);
131 sync_with_i3;
132
133 $tmp = fresh_workspace;
134 cmd "workspace $tmp";
135 my $diff_ws = open_window;
136
137 # Focus screen 0
138 sync_with_i3;
139 $x->root->warp_pointer(0, 0);
140 sync_with_i3;
141
142 $tmp2 = fresh_workspace;
143 cmd "workspace $tmp2";
144 cmd 'split h';
145
146 $left = open_window;
147 my $right1 = open_window;
148 cmd 'split v';
149 my $right2 = open_window;
150
151 cmd 'focus parent';
152 cmd 'fullscreen global';
153
154 cmd '[id="' . $right1->id . '"] focus';
155 is($x->input_focus, $right1->id, 'upper right window focused');
156
157 cmd '[id="' . $right2->id . '"] focus';
158 is($x->input_focus, $right2->id, 'bottom right window focused');
159
160 cmd 'focus parent';
161 isnt($x->input_focus, $right2->id, 'bottom right window no longer focused');
162
163 cmd 'focus child';
164 is($x->input_focus, $right2->id, 'bottom right window focused again');
165
166 cmd '[id="' . $left->id . '"] focus';
167 is($x->input_focus, $right2->id, 'prevented focus change to left window');
168
169 cmd 'focus up';
170 is($x->input_focus, $right1->id, 'allowed focus up');
171
172 cmd 'focus down';
173 is($x->input_focus, $right2->id, 'allowed focus down');
174
175 cmd 'focus left';
176 is($x->input_focus, $right2->id, 'prevented focus left');
177
178 cmd 'focus right';
179 is($x->input_focus, $right2->id, 'prevented focus right');
180
181 cmd 'focus down';
182 is($x->input_focus, $right1->id, 'allowed focus wrap (down)');
183
184 cmd 'focus up';
185 is($x->input_focus, $right2->id, 'allowed focus wrap (up)');
186
187 cmd '[id="' . $diff_ws->id . '"] focus';
188 is($x->input_focus, $right2->id, 'prevented focus change to different ws');
189
190 ################################################################################
191 # Same tests when we're in non-global fullscreen mode. It should now be possible
192 # to focus a container in a different workspace.
193 ################################################################################
194
195 cmd 'focus parent';
196 cmd 'fullscreen global';
197 cmd 'fullscreen';
198
199 cmd '[id="' . $right1->id . '"] focus';
200 is($x->input_focus, $right1->id, 'upper right window focused');
201
202 cmd '[id="' . $right2->id . '"] focus';
203 is($x->input_focus, $right2->id, 'bottom right window focused');
204
205 cmd 'focus parent';
206 isnt($x->input_focus, $right2->id, 'bottom right window no longer focused');
207
208 cmd 'focus child';
209 is($x->input_focus, $right2->id, 'bottom right window focused again');
210
211 cmd '[id="' . $left->id . '"] focus';
212 is($x->input_focus, $right2->id, 'prevented focus change to left window');
213
214 cmd 'focus up';
215 is($x->input_focus, $right1->id, 'allowed focus up');
216
217 cmd 'focus down';
218 is($x->input_focus, $right2->id, 'allowed focus down');
219
220 cmd 'focus down';
221 is($x->input_focus, $right1->id, 'allowed focus wrap (down)');
222
223 cmd 'focus up';
224 is($x->input_focus, $right2->id, 'allowed focus wrap (up)');
225
226 cmd 'focus left';
227 is($x->input_focus, $right2->id, 'focus left wrapped (no-op)');
228
229 cmd 'focus right';
230 is($x->input_focus, $diff_ws->id, 'allowed focus change to different ws');
231
232 cmd 'focus left';
233 is($x->input_focus, $right2->id, 'focused back into fullscreen container');
234
235 cmd '[id="' . $diff_ws->id . '"] focus';
236 is($x->input_focus, $diff_ws->id, 'allowed focus change to different ws by id');
237
238 ################################################################################
239 # More testing of the interaction between wrapping and the fullscreen focus
240 # restrictions.
241 ################################################################################
242
243 cmd '[id="' . $right1->id . '"] focus';
244 is($x->input_focus, $right1->id, 'upper right window focused');
245
246 cmd 'focus parent';
247 cmd 'fullscreen';
248 cmd 'focus child';
249
250 cmd 'split v';
251 my $right12 = open_window;
252
253 cmd 'focus down';
254 is($x->input_focus, $right2->id, 'bottom right window focused');
255
256 cmd 'split v';
257 my $right22 = open_window;
258
259 cmd 'focus parent';
260 cmd 'fullscreen';
261 cmd 'focus child';
262
263 cmd 'focus down';
264 is($x->input_focus, $right2->id, 'focus did not leave parent container (1)');
265
266 cmd 'focus down';
267 is($x->input_focus, $right22->id, 'focus did not leave parent container (2)');
268
269 cmd 'focus up';
270 is($x->input_focus, $right2->id, 'focus did not leave parent container (3)');
271
272 cmd 'focus up';
273 is($x->input_focus, $right22->id, 'focus did not leave parent container (4)');
274
275 ################################################################################
276 # Ensure that moving in a direction doesn't violate the focus restrictions.
277 ################################################################################
278
279 sub verify_move {
280     my $num = shift;
281     my $msg = shift;
282     my $nodes = get_ws_content($tmp2);
283     my $split = $nodes->[1];
284     my $fs = $split->{nodes}->[1];
285     is(scalar @{$fs->{nodes}}, $num, $msg);
286 }
287
288 cmd 'move left';
289 verify_move(2, 'prevented move left');
290 cmd 'move right';
291 verify_move(2, 'prevented move right');
292 cmd 'move down';
293 verify_move(2, 'prevented move down');
294 cmd 'move up';
295 cmd 'move up';
296 verify_move(2, 'prevented move up');
297
298 ################################################################################
299 # Moving to a different workspace is allowed with per-output fullscreen
300 # containers.
301 ################################################################################
302
303 cmd "move to workspace $tmp";
304 verify_move(1, 'did not prevent move to workspace by name');
305
306 cmd "workspace $tmp";
307 cmd "move to workspace $tmp2";
308 cmd "workspace $tmp2";
309
310 cmd "move to workspace prev";
311 verify_move(1, 'did not prevent move to workspace by position');
312
313 ################################################################################
314 # Ensure that is not allowed with global fullscreen containers.
315 ################################################################################
316
317 cmd "workspace $tmp";
318 cmd "move to workspace $tmp2";
319 cmd "workspace $tmp2";
320
321 cmd 'focus parent';
322 cmd 'fullscreen';
323 cmd 'fullscreen global';
324 cmd 'focus child';
325
326 cmd "move to workspace $tmp";
327 verify_move(2, 'prevented move to workspace by name');
328
329 cmd "move to workspace prev";
330 verify_move(2, 'prevented move to workspace by position');
331
332 # TODO: Tests for "move to output" and "move workspace to output".
333
334 exit_gracefully($pid);
335
336 done_testing;