@content = @{get_ws_content($tmp)};
cmp_ok(@content, '==', 0, 'no more nodes');
+kill_all_windows;
+
##############################################################
# 2: match on the title, check if for_window is really executed
# only once
@content = @{get_ws_content($tmp)};
cmp_ok(@content, '==', 0, 'no more nodes');
+kill_all_windows;
+
##############################################################
# 3: match on the title, set border style *and* a mark
##############################################################
@content = @{get_ws_content($tmp)};
ok($content[0]->{focused}, 'first node focused');
+kill_all_windows;
+
##############################################################
# 4: multiple criteria for the for_window command
##############################################################
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'normal', 'no border');
+kill_all_windows;
+
##############################################################
# 5: check that a class criterion does not match the instance
##############################################################
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'normal', 'normal border, not matched');
+kill_all_windows;
+
##############################################################
# 6: check that the 'instance' criterion works
##############################################################
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'none', 'no border');
+kill_all_windows;
+
##############################################################
# 7: check that invalid criteria don’t end up matching all windows
##############################################################
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'normal', 'normal border');
+kill_all_windows;
+
##############################################################
# 8: check that the role criterion works properly
##############################################################
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'none', 'no border (window_role)');
+kill_all_windows;
+
##############################################################
# 9: another test for the window_role, but this time it changes
# *after* the window has been mapped
cmp_ok(@content, '==', 1, 'one node on this workspace now');
is($content[0]->{border}, 'none', 'no border (window_role 2)');
+kill_all_windows;
+
##############################################################
# 10: check that the criterion 'window_type' works
##############################################################
my @nodes = @{get_ws($tmp)->{floating_nodes}};
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ "branded-$window_type" ], "mark set (window_type = $atom)");
+
+ kill_all_windows;
}
##############################################################
my @nodes = @{get_ws($tmp)->{floating_nodes}};
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ "branded-$window_type" ], "mark set (window_type = $atom)");
+
+ kill_all_windows;
}
##############################################################
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'triggered' ], "mark set for workspace criterion");
+kill_all_windows;
+
##############################################################
exit_gracefully($pid);
cmd "swap container with con_id 1";
does_i3_live;
+kill_all_windows;
###############################################################################
# Swap 2 windows in different workspaces using con_id
cmd "swap container with con_id $A";
is(get_focused($ws), $A, 'A is now focused');
+kill_all_windows;
+
###############################################################################
# Swap two containers next to each other.
# Focus should stay on B because both windows are on the focused workspace.
is($nodes->[1]->{window}, $A->{id}, 'A is on the right');
is(get_focused($ws), $expected_focus, 'B is still focused');
+kill_all_windows;
+
###############################################################################
# Swap two containers with different parents.
# In this test, the focus head of the left v-split container is A.
is($nodes->[1]->{nodes}->[1]->{window}, $A->{id}, 'A is on the bottom right');
is(get_focused($ws), $expected_focus, 'B is still focused');
+kill_all_windows;
+
###############################################################################
# Swap two containers with different parents.
# In this test, the focus head of the left v-split container is _not_ A.
is($nodes->[1]->{nodes}->[1]->{window}, $A->{id}, 'A is on the bottom right');
is(get_focused($ws), $expected_focus, 'B is still focused');
+kill_all_windows;
+
###############################################################################
# Swap two containers with one being on a different workspace.
# The focused container is B.
is($nodes->[1]->{window}, $A->{id}, 'A is on ws2:right');
is(get_focused($ws2), $expected_focus, 'A is focused');
+kill_all_windows;
+
###############################################################################
# Swap two non-focused containers within the same workspace.
#
is($nodes->[1]->{nodes}->[1]->{window}, $A->{id}, 'A is on the bottom right');
is(get_focused($ws), $expected_focus, 'F is still focused');
+kill_all_windows;
+
###############################################################################
# Swap two non-focused containers which are both on different workspaces.
#
is(get_focused($ws3), $expected_focus, 'F is still focused');
+kill_all_windows;
+
###############################################################################
# Swap two non-focused containers with one being on a different workspace.
#
is($nodes->[0]->{window}, $A->{id}, 'A is on the left of the second workspace');
is(get_focused($ws2), $expected_focus, 'F is still focused');
+kill_all_windows;
+
###############################################################################
# 1. A container cannot be swapped with its parent.
# 2. A container cannot be swapped with one of its children.
$result = cmd '[con_mark=A] swap container with mark B';
is($result->[0]->{success}, 0, 'A cannot be swappd with one of its children');
+kill_all_windows;
+
###############################################################################
# Swapping two containers preserves the geometry of the container they are
# being swapped with.
cmp_float($nodes->[0]->{percent}, 0.25, 'B has 25% width');
cmp_float($nodes->[1]->{percent}, 0.75, 'A has 75% width');
+kill_all_windows;
+
###############################################################################
# Swapping containers not sharing the same parent preserves the geometry of
# the container they are swapped with.
cmp_float($nodes->[0]->{nodes}->[0]->{percent}, 0.25, 'B has 25% height');
cmp_float($nodes->[1]->{nodes}->[0]->{percent}, 0.75, 'A has 75% height');
+kill_all_windows;
+
###############################################################################
# Swapping containers moves the urgency hint correctly.
###############################################################################
is(@urgent, 0, 'A is not marked urgent');
is(get_ws($ws2)->{urgent}, 0, 'the second workspace is not marked urgent');
+kill_all_windows;
+
###############################################################################
exit_gracefully($pid);
return $window;
}
-# We need to kill all windows in between tests since they survive the i3 restart
-# and will interfere with the following tests.
-sub kill_windows {
- sync_with_i3;
- cmd '[title="Window.*"] kill';
-}
-
###############################################################################
my $config = <<EOT;
is(get_net_wm_desktop($con), 0, '_NET_WM_DESKTOP is set upon managing a window');
-kill_windows;
+kill_all_windows;
###############################################################################
# Upon managing a window which sets _NET_WM_DESKTOP, the window is moved to
is(get_net_wm_desktop($con), 1, '_NET_WM_DESKTOP still has the correct value');
is_num_children('1', 2, 'The window was moved to workspace 1');
-kill_windows;
+kill_all_windows;
###############################################################################
# Upon managing a window which sets _NET_WM_DESKTOP to the appropriate value,
is(@{get_ws('0')->{floating_nodes}}, 1, 'The window is floating');
ok(get_ws('0')->{floating_nodes}->[0]->{nodes}->[0]->{sticky}, 'The window is sticky');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when the window is moved to another workspace
is(get_net_wm_desktop($con), 1, '_NET_WM_DESKTOP is updated when moving the window');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when the floating window is moved to another
is(get_net_wm_desktop($con), 1, '_NET_WM_DESKTOP is updated when moving the window');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is removed when the window is withdrawn.
is(get_net_wm_desktop($con), undef, '_NET_WM_DESKTOP is removed');
-kill_windows;
+kill_all_windows;
###############################################################################
# A _NET_WM_DESKTOP client message sent to the root window moves a window
is_num_children('1', 2, 'The window is now on workspace 1');
is(get_net_wm_desktop($con), 1, '_NET_WM_DESKTOP is updated');
-kill_windows;
+kill_all_windows;
###############################################################################
# A _NET_WM_DESKTOP client message sent to the root window can make a window
is(@{get_ws('0')->{floating_nodes}}, 1, 'The window is floating');
ok(get_ws('0')->{floating_nodes}->[0]->{nodes}->[0]->{sticky}, 'The window is sticky');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when a new workspace with a lower number is
cmd 'workspace 0';
is(get_net_wm_desktop($con), 1, '_NET_WM_DESKTOP is updated');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when a window is made sticky by command.
cmd 'sticky enable';
is(get_net_wm_desktop($con), 0xFFFFFFFF, '_NET_WM_DESKTOP is updated');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when a window is made sticky by client message.
is(get_net_wm_desktop($con), 0xFFFFFFFF, '_NET_WM_DESKTOP is updated');
-kill_windows;
+kill_all_windows;
###############################################################################
# _NET_WM_DESKTOP is updated when a window is moved to the scratchpad.
cmd 'scratchpad show';
is(get_net_wm_desktop($con), 0, '_NET_WM_DESKTOP is set sanity check)');
-kill_windows;
+kill_all_windows;
###############################################################################