X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=5199e71d9ac667bbf308619c1e70d7738a8c7004;hp=0d2f670d71e418f2d243830cbf8b22bf57864104;hb=30fed9a211e524f2b1d7387fc62468c2225ab93d;hpb=6f55de83100547e6f78ebc276dfdbca5ee2581d9 diff --git a/dwm.c b/dwm.c index 0d2f670..5199e71 100644 --- 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); }