Files
contrib
debian
docs
i3-config-wizard
i3-dump-log
i3-input
i3-msg
i3-nagbar
i3bar
include
libi3
man
parser-specs
src
testcases
lib
t
000-load-deps.t
001-tile.t
002-i3-sync.t
003-ipc.t
004-unmanaged.t
005-floating.t
100-fullscreen.t
101-focus.t
102-dock.t
103-move.t
104-focus-stack.t
105-stacking.t
111-goto.t
112-floating-resize.t
113-urgent.t
114-client-leader.t
115-ipc-workspaces.t
116-nestedcons.t
117-workspace.t
118-openkill.t
119-match.t
120-multiple-cmds.t
121-next-prev.t
122-split.t
124-move.t
126-regress-close.t
127-regress-floating-parent.t
128-open-order.t
129-focus-after-close.t
130-close-empty-split.t
131-stacking-order.t
132-move-workspace.t
133-size-hints.t
134-invalid-command.t
135-floating-focus.t
136-floating-ws-empty.t
137-floating-unmap.t
138-floating-attach.t
139-ws-numbers.t
140-focus-lost.t
141-resize.t
142-regress-move-floating.t
143-regress-floating-restart.t
144-regress-floating-resize.t
145-flattening.t
146-floating-reinsert.t
147-regress-floatingmove.t
148-regress-floatingmovews.t
150-regress-dock-restart.t
151-regress-float-size.t
152-regress-level-up.t
153-floating-originalsize.t
154-regress-multiple-dock.t
155-floating-split-size.t
156-fullscreen-focus.t
158-wm_take_focus.t
159-socketpaths.t
161-regress-borders-restart.t
162-regress-dock-urgent.t
163-wm-state.t
164-kill-win-vs-client.t
165-for_window.t
166-assign.t
167-workspace_layout.t
168-regress-fullscreen-restart.t
169-border-toggle.t
170-force_focus_wrapping.t
171-config-migrate.t
172-start-on-named-ws.t
173-get-marks.t
173-regress-focus-assign.t
174-border-config.t
174-regress-focus-toggle.t
175-startup-notification.t
176-workspace-baf.t
177-bar-config.t
178-regress-workspace-open.t
179-regress-multiple-ws.t
180-fd-leaks.t
181-regress-float-border.t
182-regress-focus-dock.t
183-config-variables.t
184-regress-float-split-resize.t
185-scratchpad.t
186-regress-assign-focus-parent.t
187-commands-parser.t
188-regress-focus-restart.t
189-floating-constraints.t
190-scratchpad-diff-ws.t
191-resize-levels.t
192-layout.t
193-ipc-version.t
194-regress-floating-size.t
195-net-active-window.t
196-randr-output-names.t
197-regression-move-vanish.t
198-regression-scratchpad-crash.t
199-ipc-mode-event.t
200-urgency-timer.t
201-config-parser.t
202-scratchpad-criteria.t
203-regress-assign-and-move.t
204-regress-scratchpad-move.t
205-ipc-windows.t
206-fullscreen-scratchpad.t
207-shmlog.t
208-regress-floating-criteria.t
209-ewmh-net-workarea.t
210-mark-unmark.t
211-regress-urgency-assign.t
212-assign-urgency.t
213-layout-restore-simple.t
213-move-branch-position.t
214-layout-restore-criteria.t
215-layout-restore-crash.t
216-layout-restore-split-swallows.t
217-NET_CURRENT_DESKTOP.t
218-regress-floating-split.t
219-ipc-window-focus.t
220-ipc-window-title.t
221-floating-type-hints.t
222-regress-dock-resize.t
223-net-client-list.t
224-regress-resize-branch.t
225-ipc-window-fullscreen.t
226-internal-workspaces.t
227-ipc-workspace-empty.t
228-border-widths.t
229-cleanup-tmpdir.t
230-floating-fullscreen-restart.t
231-ipc-floating-event.t
231-ipc-window-close.t
231-ipc-window-move.t
232-cmd-move-criteria.t
232-ipc-window-urgent.t
233-regress-manage-focus-unmapped.t
234-ewmh-desktop-names.t
234-layout-restore-output.t
234-regress-default-floating-border.t
235-check-config-no-x.t
235-wm-class-change-handler.t
236-floating-focus-raise.t
237-regress-assign-focus.t
238-ipc-binding-event.t
238-regress-reload-bindsym.t
239-net-close-window-request.t
500-multi-monitor.t
501-scratchpad.t
502-focus-output.t
503-workspace.t
504-move-workspace-to-output.t
505-scratchpad-resolution.t
506-focus-right.t
507-workspace-move-crash.t
509-workspace_layout.t
510-focus-across-outputs.t
511-scratchpad-configure-request.t
512-move-wraps.t
513-move-workspace.t
514-ipc-workspace-multi-monitor.t
515-create-workspace.t
516-move.t
517-regress-move-direction-ipc.t
518-interpret-workspace-numbers.t
519-mouse-warping.t
520-regress-focus-direction-floating.t
521-ewmh-desktop-viewport.t
522-rename-assigned-workspace.t
.gitignore
Makefile.PL
complete-run.pl
i3-test.config
new-test
restart-state.golden
valgrind.supp
tests
.clang-format
.gitignore
.travis.yml
CONTRIBUTING.md
DEPENDS
LICENSE
Makefile
PACKAGE-MAINTAINER
RELEASE-NOTES-4.9.1
common.mk
generate-command-parser.pl
i3-dmenu-desktop
i3-migrate-config-to-v4
i3-save-tree
i3-sensible-editor
i3-sensible-pager
i3-sensible-terminal
i3-with-shmlog.xsession.desktop
i3.applications.desktop
i3.config
i3.config.keycodes
i3.xsession.desktop
logo.svg
pseudo-doc.doxygen
release.sh
i3/testcases/t/510-focus-across-outputs.t
Michael Stapelberg 07d583d780 tests: sync_with_i3 before warping pointer
To be honest, I’m not entirely sure where the race condition originates
from, but when making sure that there are no pending events
(which is what sync_with_i3 accomplishes) before warping the pointer, we
have less flaky testsuite runs.

closes 
2014-02-25 20:44:17 +01:00

150 lines
3.8 KiB
Perl

#!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)
#
# Tests that switching workspaces via 'focus $dir' never leaves a floating
# window focused.
#
use i3test i3_autostart => 0;
# Ensure the pointer is at (0, 0) so that we really start on the first
# (the left) workspace.
$x->root->warp_pointer(0, 0);
my $config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
fake-outputs 1024x768+0+0,1024x768+1024+0,1024x768+0+768,1024x768+1024+768
EOT
my $pid = launch_with_config($config);
my $s0_ws = fresh_workspace;
my $first = open_window;
my $second = open_window;
my $third = open_window;
cmd 'floating toggle';
# Focus screen 1
sync_with_i3;
$x->root->warp_pointer(1025, 0);
sync_with_i3;
my $s1_ws = fresh_workspace;
my $fourth = open_window;
# Focus screen 2
sync_with_i3;
$x->root->warp_pointer(0, 769);
sync_with_i3;
my $s2_ws = fresh_workspace;
my $fifth = open_window;
# Focus screen 3
sync_with_i3;
$x->root->warp_pointer(1025, 769);
sync_with_i3;
my $s3_ws = fresh_workspace;
my $sixth = open_window;
my $seventh = open_window;
my $eighth = open_window;
cmd 'floating toggle';
# Layout should look like this (windows 3 and 8 are floating):
# S0 S1
# ┌───┬───┬───────┐
# │ ┌─┴─┐ │ │
# │1│ 3 │2│ 4 │
# │ └─┬─┘ │ │
# ├───┴───┼───┬───┤
# │ │ ┌─┴─┐ │
# │ 5 │6│ 8 │7│
# │ │ └─┬─┘ │
# └───────┴───┴───┘
# S2 S3
#
###################################################################
# Test that focus (left|down|right|up) doesn't focus floating
# windows when moving into horizontally-split workspaces.
###################################################################
sub reset_focus {
my $ws = shift;
cmd "workspace $ws; focus floating";
}
cmd "workspace $s1_ws";
cmd 'focus left';
is($x->input_focus, $second->id, 'second window focused');
reset_focus $s0_ws;
cmd "workspace $s1_ws";
cmd 'focus down';
is($x->input_focus, $seventh->id, 'seventh window focused');
reset_focus $s3_ws;
cmd "workspace $s2_ws";
cmd 'focus right';
is($x->input_focus, $sixth->id, 'sixth window focused');
reset_focus $s3_ws;
cmd "workspace $s2_ws";
cmd 'focus up';
is($x->input_focus, $second->id, 'second window focused');
reset_focus $s0_ws;
###################################################################
# Put the workspaces on screens 0 and 3 into vertical split mode
# and test focus (left|down|right|up) again.
###################################################################
cmd "workspace $s0_ws";
is($x->input_focus, $third->id, 'third window focused');
cmd 'focus parent';
cmd 'focus parent';
cmd 'split v';
reset_focus $s0_ws;
cmd "workspace $s3_ws";
is($x->input_focus, $eighth->id, 'eighth window focused');
cmd 'focus parent';
cmd 'focus parent';
cmd 'split v';
reset_focus $s3_ws;
cmd "workspace $s1_ws";
cmd 'focus left';
is($x->input_focus, $second->id, 'second window focused');
reset_focus $s0_ws;
cmd "workspace $s1_ws";
cmd 'focus down';
is($x->input_focus, $sixth->id, 'sixth window focused');
reset_focus $s3_ws;
cmd "workspace $s2_ws";
cmd 'focus right';
is($x->input_focus, $sixth->id, 'sixth window focused');
cmd "workspace $s2_ws";
cmd 'focus up';
is($x->input_focus, $second->id, 'second window focused');
exit_gracefully($pid);
done_testing;