From 8144a0f480355c0cb134223d704345d67bd2b31d Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Tue, 19 Sep 2017 14:46:27 +0000 Subject: [PATCH] Do not canonicalize special output names canonicalize_output_name allowed the "primary" special output name to be canonicalized, thus converting it to the name of whatever output was the primary output at the time. This caused settings (specifically, i3bar output and tray_output settings) to be stored as specific output names, instead of the intended special names whose referred output may change as the system's configuration (i.e. current primary output) changes. Add a check to canonicalize_output_name to return the name as-is if it is the special name "primary". --- src/ipc.c | 4 +++ testcases/t/538-i3bar-primary-output.t | 40 ++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 testcases/t/538-i3bar-primary-output.t diff --git a/src/ipc.c b/src/ipc.c index dc953adc..759665fe 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -580,6 +580,10 @@ static void dump_bar_bindings(yajl_gen gen, Barconfig *config) { } static char *canonicalize_output_name(char *name) { + /* Do not canonicalize special output names. */ + if (strcasecmp(name, "primary") == 0) { + return name; + } Output *output = get_output_by_name(name, false); return output ? output_primary_name(output) : name; } diff --git a/testcases/t/538-i3bar-primary-output.t b/testcases/t/538-i3bar-primary-output.t new file mode 100644 index 00000000..67fd1b6c --- /dev/null +++ b/testcases/t/538-i3bar-primary-output.t @@ -0,0 +1,40 @@ +#!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 i3bars configured to use the primary output do not have +# their output names canonicalized to something other than "primary". +# Ticket: #2948 +# Bug still in: 4.14-93-ga3a7d04a +use i3test i3_config => <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_deeply($bar_config->{outputs}, [ "primary" ], 'bar_config output is primary'); + +done_testing;