From d0f1f762ea7040358ee3ae3c21566472e81fdd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 4 Dec 2020 21:16:14 +0100 Subject: [PATCH] bar/xcb: fallback to non-primary monitor If the user did *not* configured a specific monitor, we prefer the primary monitor. However, if that monitor is disconnected, yambar would exit with: no matching monitor This patch changes this, to use the *last* connected monitor. It also improves the error message. Note: if the user did specify a monitor in the configuration, but perhaps misspelled it, we will *not* fallback to another monitor, but instead log an error saying that specific monitor could not be found. --- bar/xcb.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/bar/xcb.c b/bar/xcb.c index f95c445..f7a3ee1 100644 --- a/bar/xcb.c +++ b/bar/xcb.c @@ -101,27 +101,38 @@ setup(struct bar *_bar) mon->width, mon->height, mon->x, mon->y, mon->width_in_millimeters, mon->height_in_millimeters); - if (!((bar->monitor == NULL && mon->primary) || - (bar->monitor != NULL && strcmp(bar->monitor, name) == 0))) - { + /* User wants a specific monitor, and this is not the one */ + if (bar->monitor != NULL && strcmp(bar->monitor, name) != 0) { free(name); continue; } - free(name); - backend->x = mon->x; backend->y = mon->y; bar->width = mon->width; backend->y += bar->location == BAR_TOP ? 0 : screen->height_in_pixels - bar->height_with_border; + found_monitor = true; - break; + + if ((bar->monitor != NULL && strcmp(bar->monitor, name) == 0) || + (bar->monitor == NULL && mon->primary)) + { + /* Exact match */ + free(name); + break; + } + + free(name); } free(monitors); if (!found_monitor) { - LOG_ERR("no matching monitor"); + if (bar->monitor == NULL) + LOG_ERR("no monitors found"); + else + LOG_ERR("no monitor '%s'", bar->monitor); + /* TODO: cleanup */ return false; }