Hi,
there is an annoyance with dwm where it does not re-adjust monitor
positions upon screen removal, and if the leftmost screen is removed
some or all windows may be placed outside the viewable area. (The bug
can be worked around by first moving the screen to the right side and
remove only after that, but I always forget to do that :)
The attached patch removes some ifs to adjust monitor coordinates also
in the removal case.
--
Santtu LakkalaFrom 2d9e420aaf8eac81b53f45970197a9c443756408 Mon Sep 17 00:00:00 2001
From: Santtu Lakkala
Date: Wed, 16 Feb 2022 15:20:31 +0200
Subject: [PATCH] Update monitor positions when monitors removed
---
dwm.c | 68 +--
1 file changed, 34 insertions(+), 34 deletions(-)
diff --git a/dwm.c b/dwm.c
index a96f33c..85419e3 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1874,42 +1874,42 @@ updategeom(void)
memcpy([j++], [i], sizeof(XineramaScreenInfo));
XFree(info);
nn = j;
- if (n <= nn) { /* new monitors available */
- for (i = 0; i < (nn - n); i++) {
-for (m = mons; m && m->next; m = m->next);
-if (m)
- m->next = createmon();
-else
- mons = createmon();
+
+ /* new monitors if nn > n */
+ for (i = n; i < nn; i++) {
+ for (m = mons; m && m->next; m = m->next);
+ if (m)
+m->next = createmon();
+ else
+mons = createmon();
+ }
+ for (i = 0, m = mons; i < nn && m; m = m->next, i++)
+ if (i >= n
+ || unique[i].x_org != m->mx || unique[i].y_org != m->my
+ || unique[i].width != m->mw || unique[i].height != m->mh)
+ {
+dirty = 1;
+m->num = i;
+m->mx = m->wx = unique[i].x_org;
+m->my = m->wy = unique[i].y_org;
+m->mw = m->ww = unique[i].width;
+m->mh = m->wh = unique[i].height;
+updatebarpos(m);
}
- for (i = 0, m = mons; i < nn && m; m = m->next, i++)
-if (i >= n
-|| unique[i].x_org != m->mx || unique[i].y_org != m->my
-|| unique[i].width != m->mw || unique[i].height != m->mh)
-{
- dirty = 1;
- m->num = i;
- m->mx = m->wx = unique[i].x_org;
- m->my = m->wy = unique[i].y_org;
- m->mw = m->ww = unique[i].width;
- m->mh = m->wh = unique[i].height;
- updatebarpos(m);
-}
- } else { /* less monitors available nn < n */
- for (i = nn; i < n; i++) {
-for (m = mons; m && m->next; m = m->next);
-while ((c = m->clients)) {
- dirty = 1;
- m->clients = c->next;
- detachstack(c);
- c->mon = mons;
- attach(c);
- attachstack(c);
-}
-if (m == selmon)
- selmon = mons;
-cleanupmon(m);
+ /* removed monitors if n > nn */
+ for (i = nn; i < n; i++) {
+ for (m = mons; m && m->next; m = m->next);
+ while ((c = m->clients)) {
+dirty = 1;
+m->clients = c->next;
+detachstack(c);
+c->mon = mons;
+attach(c);
+attachstack(c);
}
+ if (m == selmon)
+selmon = mons;
+ cleanupmon(m);
}
free(unique);
} else
--
2.32.0