]> git.sur5r.net Git - i3/i3/blob - testcases/t/113-urgent.t
Merge branch 'next'
[i3/i3] / testcases / t / 113-urgent.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 use i3test;
18 use List::Util qw(first);
19
20 my $tmp = fresh_workspace;
21
22 #####################################################################
23 # Create two windows and put them in stacking mode
24 #####################################################################
25
26 cmd 'split v';
27
28 my $top = open_window;
29 my $bottom = open_window;
30
31 my @urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
32 is(@urgent, 0, 'no window got the urgent flag');
33
34 # cmd 'layout stacking';
35
36 #####################################################################
37 # Add the urgency hint, switch to a different workspace and back again
38 #####################################################################
39 $top->add_hint('urgency');
40 sync_with_i3;
41
42 my @content = @{get_ws_content($tmp)};
43 @urgent = grep { $_->{urgent} } @content;
44 my $top_info = first { $_->{window} == $top->id } @content;
45 my $bottom_info = first { $_->{window} == $bottom->id } @content;
46
47 ok($top_info->{urgent}, 'top window is marked urgent');
48 ok(!$bottom_info->{urgent}, 'bottom window is not marked urgent');
49 is(@urgent, 1, 'exactly one window got the urgent flag');
50
51 cmd '[id="' . $top->id . '"] focus';
52
53 @urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
54 is(@urgent, 0, 'no window got the urgent flag after focusing');
55
56 $top->add_hint('urgency');
57 sync_with_i3;
58
59 @urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
60 is(@urgent, 0, 'no window got the urgent flag after re-setting urgency hint');
61
62 #####################################################################
63 # Check if the workspace urgency hint gets set/cleared correctly
64 #####################################################################
65
66 my $ws = get_ws($tmp);
67 ok(!$ws->{urgent}, 'urgent flag not set on workspace');
68
69 my $otmp = fresh_workspace;
70
71 $top->add_hint('urgency');
72 sync_with_i3;
73
74 $ws = get_ws($tmp);
75 ok($ws->{urgent}, 'urgent flag set on workspace');
76
77 cmd "workspace $tmp";
78
79 $ws = get_ws($tmp);
80 ok(!$ws->{urgent}, 'urgent flag not set on workspace after switching');
81
82 ################################################################################
83 # Use the 'urgent' criteria to switch to windows which have the urgency hint set.
84 ################################################################################
85
86 # Go to a new workspace, open a different window, verify focus is on it.
87 $otmp = fresh_workspace;
88 my $different_window = open_window;
89 is($x->input_focus, $different_window->id, 'new window focused');
90
91 # Add the urgency hint on the other window.
92 $top->add_hint('urgency');
93 sync_with_i3;
94
95 # Now try to switch to that window and see if focus changes.
96 cmd '[urgent=latest] focus';
97 isnt($x->input_focus, $different_window->id, 'window no longer focused');
98 is($x->input_focus, $top->id, 'urgent window focused');
99
100 ################################################################################
101 # Same thing, but with multiple windows and using the 'urgency=latest' criteria
102 # (verify that it works in the correct order).
103 ################################################################################
104
105 cmd "workspace $otmp";
106 is($x->input_focus, $different_window->id, 'new window focused again');
107
108 $top->add_hint('urgency');
109 sync_with_i3;
110
111 $bottom->add_hint('urgency');
112 sync_with_i3;
113
114 cmd '[urgent=latest] focus';
115 is($x->input_focus, $bottom->id, 'latest urgent window focused');
116 $bottom->delete_hint('urgency');
117 sync_with_i3;
118
119 cmd '[urgent=latest] focus';
120 is($x->input_focus, $top->id, 'second urgent window focused');
121 $top->delete_hint('urgency');
122 sync_with_i3;
123
124 ################################################################################
125 # Same thing, but with multiple windows and using the 'urgency=oldest' criteria
126 # (verify that it works in the correct order).
127 ################################################################################
128
129 cmd "workspace $otmp";
130 is($x->input_focus, $different_window->id, 'new window focused again');
131
132 $top->add_hint('urgency');
133 sync_with_i3;
134
135 $bottom->add_hint('urgency');
136 sync_with_i3;
137
138 cmd '[urgent=oldest] focus';
139 is($x->input_focus, $top->id, 'oldest urgent window focused');
140 $top->delete_hint('urgency');
141 sync_with_i3;
142
143 cmd '[urgent=oldest] focus';
144 is($x->input_focus, $bottom->id, 'oldest urgent window focused');
145 $bottom->delete_hint('urgency');
146 sync_with_i3;
147
148 done_testing;