JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
implemented nn < n case, k-zed please recheck
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 0d2f670..5199e71 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -121,7 +121,7 @@ typedef struct {
 } Layout;
 
 struct Monitor {
-       const char *ltsymbol;
+       char ltsymbol[16];
        float mfact;
        int num;
        int by;               /* bar geometry */
@@ -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);
@@ -386,7 +386,7 @@ arrange(void) {
                showhide(m->stack);
        focus(NULL);
        for(m = mons; m; m = m->next) {
-               m->ltsymbol = m->lt[m->sellt]->symbol;
+               strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
                if(m->lt[m->sellt]->arrange)
                        m->lt[m->sellt]->arrange(m);
                restack(m);
@@ -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
@@ -605,7 +608,7 @@ createmon(void) {
        m->topbar = topbar;
        m->lt[0] = &layouts[0];
        m->lt[1] = &layouts[1 % LENGTH(layouts)];
-       m->ltsymbol = layouts[0].symbol;
+       strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
        return m;
 }
 
@@ -1163,17 +1166,14 @@ maprequest(XEvent *e) {
 
 void
 monocle(Monitor *m) {
-       static char ntext[8];
        unsigned int n = 0;
        Client *c;
 
        for(c = m->clients; c; c = c->next)
                if(ISVISIBLE(c))
                        n++;
-       if(n > 0) { /* override layout symbol */
-               snprintf(ntext, sizeof ntext, "[%d]", n);
-               m->ltsymbol = ntext;
-       }
+       if(n > 0) /* override layout symbol */
+               snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
        for(c = nexttiled(m->clients); c; c = nexttiled(c->next))
                resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False);
 }
@@ -1730,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;
@@ -1758,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;
@@ -1766,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);
        }