From 3e1b2694095d27ef1b0789e4268e0e0507b8d6db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 21 Feb 2016 14:12:02 +0100 Subject: [PATCH 1/3] Revert "Add 'tray_output primary' to the default config" This reverts commit e2e7b70d002cac2031cb65d6f5f197c9583913d6. relates to #2220 --- i3.config | 1 - i3.config.keycodes | 1 - 2 files changed, 2 deletions(-) diff --git a/i3.config b/i3.config index b2d7fac8..f7722d36 100644 --- a/i3.config +++ b/i3.config @@ -165,7 +165,6 @@ bindsym Mod1+r mode "resize" # finds out, if available) bar { status_command i3status - tray_output primary } ####################################################################### diff --git a/i3.config.keycodes b/i3.config.keycodes index e606d347..0c978d0b 100644 --- a/i3.config.keycodes +++ b/i3.config.keycodes @@ -152,5 +152,4 @@ bindcode $mod+27 mode "resize" # finds out, if available) bar { status_command i3status - tray_output primary } From 320591ac196df95f6087ad0f8374d68e9f243d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 21 Feb 2016 14:13:58 +0100 Subject: [PATCH 2/3] Remove unreachable fallback code for tray_output primary. This commit removes the code for falling back to the first available output for the system tray if 'tray_output primary' has been specified but there is no primary output (managed by this bar). This fallback behavior was broken/unreachable because the tray will never be initialized in this situation in the first place. Having this dead code lead to a wrong assumption in #1855 and hence to commit e2e7b70d002cac2031cb65d6f5f197c9583913d6, which makes the system tray not show up for many users when first installing i3. Thanks to @rtlanceroad for reporting this issue. fixes #2220 --- i3bar/src/xcb.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index d2aa28e9..1c2134f4 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -769,19 +769,9 @@ static void handle_client_message(xcb_client_message_event_t *event) { break; } - /* Check whether any "tray_output primary" was defined for this bar. */ - bool contains_primary = false; - TAILQ_FOREACH(tray_output, &(config.tray_outputs), tray_outputs) { - if (strcasecmp("primary", tray_output->output) == 0) { - contains_primary = true; - break; - } - } - - /* In case of tray_output == primary and there is no primary output - * configured, we fall back to the first available output. We do the - * same if no tray_output was specified. */ - if (output == NULL && (contains_primary || TAILQ_EMPTY(&(config.tray_outputs)))) { + /* If no tray_output has been specified, we fall back to the first + * available output. */ + if (output == NULL && TAILQ_EMPTY(&(config.tray_outputs))) { SLIST_FOREACH(walk, outputs, slist) { if (!walk->active) continue; @@ -790,6 +780,7 @@ static void handle_client_message(xcb_client_message_event_t *event) { break; } } + if (output == NULL) { ELOG("No output found\n"); return; From b8109c3a59ff07486d719c95a68bb78edbc66ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 21 Feb 2016 14:26:13 +0100 Subject: [PATCH 3/3] Document tray initialization better. This commit removes an unnecessary fallback to the first output's name as this name ("first") will only be used to see whether "tray_output none" has been specified, anyway. We also add documentation that clearly states when we want to initialize the tray and when we don't want to do the same. relates to #2220 --- i3bar/src/xcb.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 1c2134f4..496035c2 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -1761,16 +1761,35 @@ void reconfig_windows(bool redraw_bars) { } /* Unless "tray_output none" was specified, we need to initialize the tray. */ - const char *first = (TAILQ_EMPTY(&(config.tray_outputs))) ? SLIST_FIRST(outputs)->name : TAILQ_FIRST(&(config.tray_outputs))->output; - if (!tray_configured && strcasecmp(first, "none") != 0) { - /* We do a sanity check here to ensure that this i3bar instance actually handles - * the output on which the tray should appear. For example, - * consider tray_output == [VGA-1], but output == [HDMI-1]. */ + bool no_tray = false; + if (!(TAILQ_EMPTY(&(config.tray_outputs)))) { + no_tray = strcasecmp(TAILQ_FIRST(&(config.tray_outputs))->output, "none") == 0; + } + /* + * There are three scenarios in which we need to initialize the tray: + * 1. A specific output was listed in tray_outputs which is also + * in the list of outputs managed by this bar. + * 2. No tray_output directive was specified. In this case, we + * use the first available output. + * 3. 'tray_output primary' was specified. In this case we use the + * primary output. + * + * Three scenarios in which we specifically don't want to + * initialize the tray are: + * 1. 'tray_output none' was specified. + * 2. A specific output was listed as a tray_output, but is not + * one of the outputs managed by this bar. For example, consider + * tray_outputs == [VGA-1], but outputs == [HDMI-1]. + * 3. 'tray_output primary' was specified and no output in the list + * is primary. + */ + if (!tray_configured && !no_tray) { /* If no tray_output was specified, we go ahead and initialize the tray as * we will be using the first available output. */ - if (TAILQ_EMPTY(&(config.tray_outputs))) + if (TAILQ_EMPTY(&(config.tray_outputs))) { init_tray(); + } /* If one or more tray_output assignments were specified, we ensure that at least one of * them is actually an output managed by this instance. */