From e061b81ccb00a21488bf63d6fab00d093f680bed Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Fri, 29 Mar 2024 22:00:01 -0600 Subject: [PATCH 1/3] Add preferred monitor logic to FvwmPager. First, this fixes an issue if monitor_to_track is set and that monitor is disconnected, then fvwm pager stops tracking anything. Instead, if monitor_to_track is disconnected, monitor_to_track will switch to the current monitor instead. If that monitor is enabled again, fvwm will resume tracking it. --- modules/FvwmPager/FvwmPager.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/FvwmPager/FvwmPager.c b/modules/FvwmPager/FvwmPager.c index ddfbdc5e7..38e5fc102 100644 --- a/modules/FvwmPager/FvwmPager.c +++ b/modules/FvwmPager/FvwmPager.c @@ -112,6 +112,7 @@ char *BalloonFont = NULL; char *BalloonBorderColor = NULL; char *BalloonFormatString = NULL; char *monitor_to_track = NULL; +char *preferred_monitor = NULL; int BalloonBorderWidth = 1; int BalloonYOffset = 3; Window BalloonView = None; @@ -177,6 +178,14 @@ void fpmonitor_disable(struct fpmonitor *fp) for (int i = 0; i < ndesks; i++) { XMoveWindow(dpy, fp->CPagerWin[i], -32768,-32768); } + + if (monitor_to_track != NULL && + strcmp(monitor_to_track, fp->m->si->name) == 0) + { + free(monitor_to_track); + struct fpmonitor *tm = fpmonitor_this(NULL); + monitor_to_track = fxstrdup(tm->m->si->name); + } } struct fpmonitor * @@ -1573,6 +1582,17 @@ void list_config_info(unsigned long *body) fp->m->flags |= MONITOR_NEW; } + /* This ensures that if monitor_to_track gets disconnected + * then reconnected, the pager can resume tracking it. + */ + if (preferred_monitor != NULL && + strcmp(fp->m->si->name, preferred_monitor) == 0 && + strcmp(preferred_monitor, monitor_to_track) != 0) + { + if (monitor_to_track != NULL) + free(monitor_to_track); + monitor_to_track = fxstrdup(preferred_monitor); + } fp->disabled = false; fp->scr_width = scr_width; fp->scr_height = scr_height; @@ -1935,6 +1955,9 @@ ImagePath = NULL; } fvwm_debug(__func__, "Assigning monitor: %s\n", m->m->si->name); monitor_to_track = fxstrdup(m->m->si->name); + if (preferred_monitor != NULL) + free(preferred_monitor); + preferred_monitor = fxstrdup(monitor_to_track); } else if(StrEquals(resource, "DeskLabels")) { use_desk_label = True; } else if(StrEquals(resource, "NoDeskLabels")) { From b4f728bf0ac886c0219dabd821a77c6284380e1e Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Fri, 29 Mar 2024 23:51:46 -0600 Subject: [PATCH 2/3] Don't let windows have zero size. Allowing the height or width of a window to become zero can causes them to misbehave (noticed this when switching between monitors). Use MinSize instead of zero for windows in this case. --- modules/FvwmPager/x_pager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/FvwmPager/x_pager.c b/modules/FvwmPager/x_pager.c index c8686069a..9cf674301 100644 --- a/modules/FvwmPager/x_pager.c +++ b/modules/FvwmPager/x_pager.c @@ -305,7 +305,7 @@ static struct fpmonitor *fpmonitor_from_xy(int x, int y) static rectangle CalcGeom(PagerWindow *t, bool is_icon) { /* Place initial rectangle off screen. */ - rectangle rec = {-32768, -32768, 0, 0}; + rectangle rec = {-32768, -32768, MinSize, MinSize}; struct fpmonitor *fp = fpmonitor_this(NULL); /* If the monitor we expect to find is disabled, then From 88b713eab657f7c5848c300f7bfa43431de93b2e Mon Sep 17 00:00:00 2001 From: Thomas Adam Date: Sat, 30 Mar 2024 10:47:12 +0000 Subject: [PATCH 3/3] FvwmPager: free vars on ExitPager When the FvwmPager is closed/killed, ensure we free some of the variables which had been malloc()d. --- modules/FvwmPager/FvwmPager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/FvwmPager/FvwmPager.c b/modules/FvwmPager/FvwmPager.c index 38e5fc102..8a682bbc6 100644 --- a/modules/FvwmPager/FvwmPager.c +++ b/modules/FvwmPager/FvwmPager.c @@ -2515,5 +2515,7 @@ void ExitPager(void) XSync(dpy,0); } XUngrabKeyboard(dpy, CurrentTime); + free(monitor_to_track); + free(preferred_monitor); exit(0); }