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
> @@ -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

Reply via email to