dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 30fed9a211e524f2b1d7387fc62468c2225ab93d
parent c45d46ad9a44b9897c8c12eacb60b5cbdd31be7c
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:
Mdwm.c | 44++++++++++++++++++++++++++++++--------------
1 file changed, 30 insertions(+), 14 deletions(-)
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);
     }