Re: [hackers] [dwm][PATCH] Update monitor positions also on removal

From: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
Date: Sat, 9 Apr 2022 12:51:11 +0200

On Mon, Feb 21, 2022 at 04:58:28PM +0200, Santtu Lakkala wrote:
> 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.
> ---
> 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
> _AT_@ -1874,42 +1874,42 @@ updategeom(void)
> memcpy(&unique[j++], &info[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
>
>

Hi,

I've heard similar reports with monitor plugging and unplugging not working nicely.

Can someone test this patch and report back these conditions or if it improves things?

-- 
Kind regards,
Hiltjo
Received on Sat Apr 09 2022 - 12:51:11 CEST

This archive was generated by hypermail 2.3.0 : Sat Apr 09 2022 - 13:00:36 CEST