Update monitor positions also on removal

When monitors are removed, the coordinates of existing monitors may
change, if the removed monitors had smaller coordinates than the
remaining ones.

Remove special case handling so that the same update-if-necessary loop
is run also in the case when monitors are removed.
This commit is contained in:
Santtu Lakkala 2022-02-21 16:58:28 +02:00 committed by Hiltjo Posthuma
parent 8806b6e237
commit d93ff48803

68
dwm.c
View file

@ -1876,42 +1876,42 @@ updategeom(void)
memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
XFree(info); XFree(info);
nn = j; nn = j;
if (n <= nn) { /* new monitors available */
for (i = 0; i < (nn - n); i++) { /* new monitors if nn > n */
for (m = mons; m && m->next; m = m->next); for (i = n; i < nn; i++) {
if (m) for (m = mons; m && m->next; m = m->next);
m->next = createmon(); if (m)
else m->next = createmon();
mons = 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++) /* removed monitors if n > nn */
if (i >= n for (i = nn; i < n; i++) {
|| unique[i].x_org != m->mx || unique[i].y_org != m->my for (m = mons; m && m->next; m = m->next);
|| unique[i].width != m->mw || unique[i].height != m->mh) while ((c = m->clients)) {
{ dirty = 1;
dirty = 1; m->clients = c->next;
m->num = i; detachstack(c);
m->mx = m->wx = unique[i].x_org; c->mon = mons;
m->my = m->wy = unique[i].y_org; attach(c);
m->mw = m->ww = unique[i].width; attachstack(c);
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);
} }
if (m == selmon)
selmon = mons;
cleanupmon(m);
} }
free(unique); free(unique);
} else } else