about summary refs log tree commit diff stats
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/dwm.c b/dwm.c
index 48f50da..5199e71 100644
--- 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);
 	}