dwm

Extremely fast, small, and dynamic window manager for X
git clone git://git.janpasierb.com/dwm.git
Log | 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); }