URI: 
       implemented nn < n case, k-zed please recheck - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 30fed9a211e524f2b1d7387fc62468c2225ab93d
   DIR parent c45d46ad9a44b9897c8c12eacb60b5cbdd31be7c
  HTML Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Tue, 22 Sep 2009 20:33:42 +0100
       
       implemented nn < n case, k-zed please recheck
       Diffstat:
         M dwm.c                               |      44 +++++++++++++++++++++----------
       
       1 file changed, 30 insertions(+), 14 deletions(-)
       ---
   DIR diff --git a/dwm.c b/dwm.c
       @@ -158,7 +158,7 @@ static void attachstack(Client *c);
        static void buttonpress(XEvent *e);
        static void checkotherwm(void);
        static void cleanup(void);
       -static void cleanupmons(void);
       +static void cleanupmon(Monitor *mon);
        static void clearurgent(Client *c);
        static void configure(Client *c);
        static void configurenotify(XEvent *e);
       @@ -480,22 +480,25 @@ cleanup(void) {
                XFreeCursor(dpy, cursor[CurNormal]);
                XFreeCursor(dpy, cursor[CurResize]);
                XFreeCursor(dpy, cursor[CurMove]);
       -        cleanupmons();
       +        while(mons)
       +                cleanupmon(mons);
                XSync(dpy, False);
                XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
        }
        
        void
       -cleanupmons(void) {
       +cleanupmon(Monitor *mon) {
                Monitor *m;
        
       -        while(mons) {
       -                m = mons->next;
       -                XUnmapWindow(dpy, mons->barwin);
       -                XDestroyWindow(dpy, mons->barwin);
       -                free(mons);
       -                mons = m;
       +        if(mon == mons)
       +                mons = mons->next;
       +        else {
       +                for(m = mons; m && m->next != mon; m = m->next);
       +                m->next = mon->next;
                }
       +        XUnmapWindow(dpy, mon->barwin);
       +        XDestroyWindow(dpy, mon->barwin);
       +        free(mon);
        }
        
        void
       @@ -1727,6 +1730,7 @@ updategeom(void) {
        #ifdef XINERAMA
                if(XineramaIsActive(dpy)) {
                        int i, j, n, nn;
       +                Client *c;
                        Monitor *m;
                        XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
                        XineramaScreenInfo *unique = NULL;
       @@ -1755,7 +1759,7 @@ updategeom(void) {
                                            || unique[i].width != m->mw || unique[i].height != m->mh))
                                        {
                                                dirty = True;
       -                                        m->num = unique[i].screen_number;
       +                                        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;
       @@ -1763,10 +1767,22 @@ updategeom(void) {
                                                updatebarpos(m);
                                        }
                        }
       -                else { /* less monitors available */
       -                        cleanup();
       -                        setup();
       -                        scan();
       +                else { /* less monitors available nn < n */
       +                        for(i = nn; i < n; i++) {
       +                                for(m = mons; m && m->next; m = m->next);
       +                                while(m->clients) {
       +                                        dirty = True;
       +                                        c = m->clients;
       +                                        m->clients = c->next;
       +                                        detachstack(c);
       +                                        c->mon = mons;
       +                                        attach(c);
       +                                        attachstack(c);
       +                                }
       +                                if(m == selmon)
       +                                        selmon = mons;
       +                                cleanupmon(m);
       +                        }
                        }
                        free(unique);
                }