i3/testcases/t/198-urgency-timer.t
Simon Elsbrock 28104a480c implement delayed urgency hint reset
If there is a client with an urgency hint on another workspace and
switching to this workspace would cause the urgency to be reset (by
moving the focusing to the client), delay the reset by some time. This
gives the user the chance to see it.

This commit adds the possibility to configure the urgency delay timer
duration using the 'force_display_urgency_hint' directive. Also,
documentation and a testcase was added to allow for automated checks of
the intended behavior.

fixes #482
2012-09-22 14:12:09 +02:00

96 lines
2.7 KiB
Perl

#!perl
# vim:ts=4:sw=4:expandtab
#
# Tests whether the urgency timer works as expected and does not break
# urgency handling.
#
use List::Util qw(first);
use i3test i3_autostart => 0;
use Time::HiRes qw(sleep);
# 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
force_display_urgency_hint 150ms
EOT
my $pid = launch_with_config($config);
#####################################################################
# Initial setup: one window on ws1, empty ws2
#####################################################################
my $tmp1 = fresh_workspace;
my $w = open_window;
my $tmp2 = fresh_workspace;
cmd "workspace $tmp2";
$w->add_hint('urgency');
sync_with_i3;
#######################################################################
# Create a window on ws1, then switch to ws2, set urgency, switch back
#######################################################################
isnt($x->input_focus, $w->id, 'window not focused');
my @content = @{get_ws_content($tmp1)};
my @urgent = grep { $_->{urgent} } @content;
is(@urgent, 1, "window marked as urgent");
# switch to ws1
cmd "workspace $tmp1";
# this will start the timer
sleep(0.1);
@content = @{get_ws_content($tmp1)};
@urgent = grep { $_->{urgent} } @content;
is(@urgent, 1, 'window still marked as urgent');
# now check if the timer was triggered
cmd "workspace $tmp2";
sleep(0.1);
@content = @{get_ws_content($tmp1)};
@urgent = grep { $_->{urgent} } @content;
is(@urgent, 0, 'window not marked as urgent anymore');
#######################################################################
# Create another window on ws1, focus it, switch to ws2, make the other
# window urgent, and switch back. This should not trigger the timer.
#######################################################################
cmd "workspace $tmp1";
my $w2 = open_window;
is($x->input_focus, $w2->id, 'window 2 focused');
cmd "workspace $tmp2";
$w->add_hint('urgency');
sync_with_i3;
@content = @{get_ws_content($tmp1)};
@urgent = grep { $_->{urgent} } @content;
is(@urgent, 1, 'window 1 marked as urgent');
# Switch back to ws1. This should focus w2.
cmd "workspace $tmp1";
is($x->input_focus, $w2->id, 'window 2 focused');
@content = @{get_ws_content($tmp1)};
@urgent = grep { $_->{urgent} } @content;
is(@urgent, 1, 'window 1 still marked as urgent');
# explicitly focusing the window should result in immediate urgency reset
cmd '[id="' . $w->id . '"] focus';
@content = @{get_ws_content($tmp1)};
@urgent = grep { $_->{urgent} } @content;
is(@urgent, 0, 'window 1 not marked as urgent anymore');
done_testing;