i3/testcases/t/177-bar-config.t
Ingo Bürk bc250b26a0 Allow multiple tray_output directives.
This patch introduces the possibility to specify the tray_output directive
multiple times. All values will be used by i3bar, in the order they are
given.

This way, a single bar configuration can be used for several machines with
internal output names "eDP1" and "LVDS-0" by specifying tray_output for both.
Any external output (e.g., "DP-0") will still not receive the tray. The same
effect can be achieved by using "primary", but forces the user to couple the
tray display to the primary output which may not be desirable behavior.

relates to #555
2015-11-01 16:35:17 -05:00

318 lines
9.5 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)
#
# Checks that the bar config is parsed correctly.
#
use i3test i3_autostart => 0;
#####################################################################
# test a config without any bars
#####################################################################
my $config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
EOT
my $pid = launch_with_config($config);
my $i3 = i3(get_socket_path(0));
my $bars = $i3->get_bar_config()->recv;
is(@$bars, 0, 'no bars configured');
exit_gracefully($pid);
#####################################################################
# now provide a simple bar configuration
#####################################################################
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
bar {
# Start a default instance of i3bar which provides workspace buttons.
# Additionally, i3status will provide a statusline.
status_command i3status --foo
}
EOT
$pid = launch_with_config($config);
$i3 = i3(get_socket_path(0));
$bars = $i3->get_bar_config()->recv;
is(@$bars, 1, 'one bar configured');
my $bar_id = shift @$bars;
my $bar_config = $i3->get_bar_config($bar_id)->recv;
is($bar_config->{status_command}, 'i3status --foo', 'status_command correct');
ok(!$bar_config->{verbose}, 'verbose off by default');
ok($bar_config->{workspace_buttons}, 'workspace buttons enabled per default');
ok($bar_config->{binding_mode_indicator}, 'mode indicator enabled per default');
is($bar_config->{mode}, 'dock', 'dock mode by default');
is($bar_config->{position}, 'bottom', 'position bottom by default');
is($bar_config->{tray_padding}, 2, 'tray_padding ok');
#####################################################################
# ensure that reloading cleans up the old bar configs
#####################################################################
cmd 'reload';
$bars = $i3->get_bar_config()->recv;
is(@$bars, 1, 'still one bar configured');
exit_gracefully($pid);
#####################################################################
# validate a more complex configuration
#####################################################################
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
bar {
# Start a default instance of i3bar which does not provide
# workspace buttons.
# Additionally, i3status will provide a statusline.
status_command i3status --bar
output HDMI1
output HDMI2
tray_output LVDS1
tray_output HDMI2
tray_padding 0
position top
mode dock
font Terminus
workspace_buttons no
binding_mode_indicator no
verbose yes
socket_path /tmp/foobar
colors {
background #ff0000
statusline #00ff00
focused_background #cc0000
focused_statusline #cccc00
focused_separator #0000cc
focused_workspace #4c7899 #285577 #ffffff
active_workspace #333333 #222222 #888888
inactive_workspace #333333 #222222 #888888
urgent_workspace #2f343a #900000 #ffffff
binding_mode #abc123 #123abc #ababab
}
}
EOT
$pid = launch_with_config($config);
$i3 = i3(get_socket_path(0));
$bars = $i3->get_bar_config()->recv;
is(@$bars, 1, 'one bar configured');
$bar_id = shift @$bars;
$bar_config = $i3->get_bar_config($bar_id)->recv;
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
ok($bar_config->{verbose}, 'verbose on');
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
ok(!$bar_config->{binding_mode_indicator}, 'mode indicator disabled');
is($bar_config->{mode}, 'dock', 'dock mode');
is($bar_config->{position}, 'top', 'position top');
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
is_deeply($bar_config->{tray_outputs}, [ 'LVDS1', 'HDMI2' ], 'tray_output ok');
is($bar_config->{tray_padding}, 0, 'tray_padding ok');
is($bar_config->{font}, 'Terminus', 'font ok');
is($bar_config->{socket_path}, '/tmp/foobar', 'socket_path ok');
is_deeply($bar_config->{colors},
{
background => '#ff0000',
statusline => '#00ff00',
focused_background => '#cc0000',
focused_statusline=> '#cccc00',
focused_separator => '#0000cc',
focused_workspace_border => '#4c7899',
focused_workspace_text => '#ffffff',
focused_workspace_bg => '#285577',
active_workspace_border => '#333333',
active_workspace_text => '#888888',
active_workspace_bg => '#222222',
inactive_workspace_border => '#333333',
inactive_workspace_text => '#888888',
inactive_workspace_bg => '#222222',
urgent_workspace_border => '#2f343a',
urgent_workspace_text => '#ffffff',
urgent_workspace_bg => '#900000',
binding_mode_border => '#abc123',
binding_mode_text => '#ababab',
binding_mode_bg => '#123abc',
}, 'colors ok');
exit_gracefully($pid);
#####################################################################
# ensure that multiple bars get different IDs
#####################################################################
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
bar {
# Start a default instance of i3bar which provides workspace buttons.
# Additionally, i3status will provide a statusline.
status_command i3status --bar
output HDMI1
}
bar {
output VGA1
}
EOT
$pid = launch_with_config($config);
$i3 = i3(get_socket_path(0));
$bars = $i3->get_bar_config()->recv;
is(@$bars, 2, 'two bars configured');
isnt($bars->[0], $bars->[1], 'bar IDs are different');
my $bar1_config = $i3->get_bar_config($bars->[0])->recv;
my $bar2_config = $i3->get_bar_config($bars->[1])->recv;
isnt($bar1_config->{outputs}, $bar2_config->{outputs}, 'outputs different');
exit_gracefully($pid);
#####################################################################
# make sure comments work properly
#####################################################################
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
bar {
# Start a default instance of i3bar which provides workspace buttons.
# Additionally, i3status will provide a statusline.
status_command i3status --bar
#status_command i3status --qux
#status_command i3status --qux
output HDMI1
colors {
background #000000
#background #ffffff
}
}
EOT
$pid = launch_with_config($config);
$i3 = i3(get_socket_path(0));
$bars = $i3->get_bar_config()->recv;
$bar_id = shift @$bars;
$bar_config = $i3->get_bar_config($bar_id)->recv;
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
is($bar_config->{colors}->{background}, '#000000', 'background color ok');
exit_gracefully($pid);
#####################################################################
# verify that the old syntax still works
#####################################################################
$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
bar {
# Start a default instance of i3bar which does not provide
# workspace buttons.
# Additionally, i3status will provide a statusline.
status_command i3status --bar
output HDMI1
output HDMI2
tray_output LVDS1
tray_output HDMI2
position top
mode dock
font Terminus
workspace_buttons no
binding_mode_indicator yes
verbose yes
socket_path /tmp/foobar
colors {
background #ff0000
statusline #00ff00
focused_workspace #ffffff #285577
active_workspace #888888 #222222
inactive_workspace #888888 #222222
urgent_workspace #ffffff #900000
}
}
EOT
$pid = launch_with_config($config);
$i3 = i3(get_socket_path(0));
$bars = $i3->get_bar_config()->recv;
is(@$bars, 1, 'one bar configured');
$bar_id = shift @$bars;
cmd 'nop yeah';
$bar_config = $i3->get_bar_config($bar_id)->recv;
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
ok($bar_config->{verbose}, 'verbose on');
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
ok($bar_config->{binding_mode_indicator}, 'mode indicator enabled');
is($bar_config->{mode}, 'dock', 'dock mode');
is($bar_config->{position}, 'top', 'position top');
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
is_deeply($bar_config->{tray_outputs}, [ 'LVDS1', 'HDMI2' ], 'tray_output ok');
is($bar_config->{font}, 'Terminus', 'font ok');
is($bar_config->{socket_path}, '/tmp/foobar', 'socket_path ok');
is_deeply($bar_config->{colors},
{
background => '#ff0000',
statusline => '#00ff00',
focused_workspace_text => '#ffffff',
focused_workspace_bg => '#285577',
active_workspace_text => '#888888',
active_workspace_bg => '#222222',
inactive_workspace_text => '#888888',
inactive_workspace_bg => '#222222',
urgent_workspace_text => '#ffffff',
urgent_workspace_bg => '#900000',
}, '(old) colors ok');
exit_gracefully($pid);
done_testing;