implemented nn < n case, k-zed please recheck

master
Anselm R Garbe 2009-09-22 20:33:42 +01:00
parent c45d46ad9a
commit 30fed9a211
1 changed files with 30 additions and 14 deletions

44
dwm.c
View File

@ -158,7 +158,7 @@ static void attachstack(Client *c);
static void buttonpress(XEvent *e); static void buttonpress(XEvent *e);
static void checkotherwm(void); static void checkotherwm(void);
static void cleanup(void); static void cleanup(void);
static void cleanupmons(void); static void cleanupmon(Monitor *mon);
static void clearurgent(Client *c); static void clearurgent(Client *c);
static void configure(Client *c); static void configure(Client *c);
static void configurenotify(XEvent *e); static void configurenotify(XEvent *e);
@ -480,22 +480,25 @@ cleanup(void) {
XFreeCursor(dpy, cursor[CurNormal]); XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]); XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]); XFreeCursor(dpy, cursor[CurMove]);
cleanupmons(); while(mons)
cleanupmon(mons);
XSync(dpy, False); XSync(dpy, False);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
} }
void void
cleanupmons(void) { cleanupmon(Monitor *mon) {
Monitor *m; Monitor *m;
while(mons) { if(mon == mons)
m = mons->next; mons = mons->next;
XUnmapWindow(dpy, mons->barwin); else {
XDestroyWindow(dpy, mons->barwin); for(m = mons; m && m->next != mon; m = m->next);
free(mons); m->next = mon->next;
mons = m;
} }
XUnmapWindow(dpy, mon->barwin);
XDestroyWindow(dpy, mon->barwin);
free(mon);
} }
void void
@ -1727,6 +1730,7 @@ updategeom(void) {
#ifdef XINERAMA #ifdef XINERAMA
if(XineramaIsActive(dpy)) { if(XineramaIsActive(dpy)) {
int i, j, n, nn; int i, j, n, nn;
Client *c;
Monitor *m; Monitor *m;
XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
XineramaScreenInfo *unique = NULL; XineramaScreenInfo *unique = NULL;
@ -1755,7 +1759,7 @@ updategeom(void) {
|| unique[i].width != m->mw || unique[i].height != m->mh)) || unique[i].width != m->mw || unique[i].height != m->mh))
{ {
dirty = True; dirty = True;
m->num = unique[i].screen_number; m->num = i;
m->mx = m->wx = unique[i].x_org; m->mx = m->wx = unique[i].x_org;
m->my = m->wy = unique[i].y_org; m->my = m->wy = unique[i].y_org;
m->mw = m->ww = unique[i].width; m->mw = m->ww = unique[i].width;
@ -1763,10 +1767,22 @@ updategeom(void) {
updatebarpos(m); updatebarpos(m);
} }
} }
else { /* less monitors available */ else { /* less monitors available nn < n */
cleanup(); for(i = nn; i < n; i++) {
setup(); for(m = mons; m && m->next; m = m->next);
scan(); 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); free(unique);
} }