X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=1cb07d3ab8436c4e31555463dc4c636f35d98a30;hp=e2f306c1e64fbf20bfee3a6a7dd3da5667b2d815;hb=e7300e0f6f10900b50d15ea3ae8949049431e38b;hpb=8ef465d592fada11dab075bb7569239c03e3afa4 diff --git a/dwm.c b/dwm.c index e2f306c..1cb07d3 100644 --- a/dwm.c +++ b/dwm.c @@ -121,6 +121,7 @@ typedef struct { } Layout; struct Monitor { + const char *ltsymbol; float mfact; int num; int by; /* bar geometry */ @@ -218,7 +219,7 @@ static void togglefloating(const Arg *arg); static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); static void unfocus(Client *c); -static void unmanage(Client *c); +static void unmanage(Client *c, Bool destroyed); static void unmapnotify(XEvent *e); static void updategeom(void); static void updatebarpos(Monitor *m); @@ -238,7 +239,7 @@ static void zoom(const Arg *arg); /* variables */ static const char broken[] = "broken"; -static char stext[256], ntext[8]; +static char stext[256]; static int screen; static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ @@ -384,6 +385,7 @@ arrange(void) { showhide(m->stack); focus(NULL); for(m = mons; m; m = m->next) { + m->ltsymbol = m->lt[m->sellt]->symbol; if(m->lt[m->sellt]->arrange) m->lt[m->sellt]->arrange(m); restack(m); @@ -466,7 +468,7 @@ cleanup(void) { selmon->lt[selmon->sellt] = &foo; for(m = mons; m; m = m->next) while(m->stack) - unmanage(m->stack); + unmanage(m->stack, False); if(dc.font.set) XFreeFontSet(dpy, dc.font.set); else @@ -530,7 +532,7 @@ configurenotify(XEvent *e) { Monitor *m; XConfigureEvent *ev = &e->xconfigure; - if(ev->window == root && (ev->width != sw || ev->height != sh)) { + if(ev->window == root) { sw = ev->width; sh = ev->height; updategeom(); @@ -564,9 +566,9 @@ configurerequest(XEvent *e) { c->w = ev->width; if(ev->value_mask & CWHeight) c->h = ev->height; - if((c->x - m->mx + c->w) > m->mw && c->isfloating) + if((c->x + c->w) > m->mx + m->mw && c->isfloating) c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */ - if((c->y - m->my + c->h) > m->mh && c->isfloating) + if((c->y + c->h) > m->my + m->mh && c->isfloating) c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */ if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) configure(c); @@ -595,7 +597,7 @@ destroynotify(XEvent *e) { XDestroyWindowEvent *ev = &e->xdestroywindow; if((c = wintoclient(ev->window))) - unmanage(c); + unmanage(c, True); } void @@ -649,13 +651,11 @@ dirtomon(int dir) { void drawbar(Monitor *m) { int x; - unsigned int i, n = 0, occ = 0, urg = 0; + unsigned int i, occ = 0, urg = 0; unsigned long *col; Client *c; for(c = m->clients; c; c = c->next) { - if(ISVISIBLE(c)) - n++; occ |= c->tags; if(c->isurgent) urg |= c->tags; @@ -669,15 +669,10 @@ drawbar(Monitor *m) { occ & 1 << i, urg & 1 << i, col); dc.x += dc.w; } - if(blw > 0) { - dc.w = blw; - drawtext(m->lt[m->sellt]->symbol, dc.norm, False); - dc.x += dc.w; - } - snprintf(ntext, sizeof ntext, "%u", n); - dc.w = TEXTW(ntext); - drawtext(ntext, dc.norm, False); - x = (dc.x += dc.w); + dc.w = blw = TEXTW(m->ltsymbol); + drawtext(m->ltsymbol, dc.norm, False); + dc.x += dc.w; + x = dc.x; if(m == selmon) { /* status is only drawn on selected monitor */ dc.w = TEXTW(stext); dc.x = m->ww - dc.w; @@ -1039,8 +1034,15 @@ killclient(const Arg *arg) { ev.xclient.data.l[1] = CurrentTime; XSendEvent(dpy, selmon->sel->win, False, NoEventMask, &ev); } - else + else { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } } void @@ -1130,8 +1132,17 @@ 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; + } 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); } @@ -1235,8 +1246,8 @@ propertynotify(XEvent *e) { } if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); - if(c == selmon->sel) - drawbars(); + if(c == c->mon->sel) + drawbar(c->mon); } } } @@ -1424,8 +1435,6 @@ setmfact(const Arg *arg) { void setup(void) { - unsigned int i; - int w; XSetWindowAttributes wa; /* clean up any zombies immediately */ @@ -1462,10 +1471,6 @@ setup(void) { if(!dc.font.set) XSetFont(dpy, dc.gc, dc.font.xfont->fid); /* init bars */ - for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) { - w = TEXTW(layouts[i].symbol); - blw = MAX(blw, w); - } updatebars(); updatestatus(); /* EWMH support per view */ @@ -1595,23 +1600,23 @@ togglefloating(const Arg *arg) { void toggletag(const Arg *arg) { - unsigned int mask; + unsigned int newtags; if(!selmon->sel) return; - mask = selmon->sel->tags ^ (arg->ui & TAGMASK); - if(mask) { - selmon->sel->tags = mask; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if(newtags) { + selmon->sel->tags = newtags; arrange(); } } void toggleview(const Arg *arg) { - unsigned int mask = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - if(mask) { - selmon->tagset[selmon->seltags] = mask; + if(newtagset) { + selmon->tagset[selmon->seltags] = newtagset; arrange(); } } @@ -1626,22 +1631,24 @@ unfocus(Client *c) { } void -unmanage(Client *c) { +unmanage(Client *c, Bool destroyed) { XWindowChanges wc; - wc.border_width = c->oldbw; /* The server grab construct avoids race conditions. */ - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ detach(c); detachstack(c); - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); + if(!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } free(c); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); focus(NULL); arrange(); } @@ -1652,7 +1659,7 @@ unmapnotify(XEvent *e) { XUnmapEvent *ev = &e->xunmap; if((c = wintoclient(ev->window))) - unmanage(c); + unmanage(c, False); } void @@ -1743,6 +1750,7 @@ updategeom(void) { m->topbar = topbar; m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; + m->ltsymbol = layouts[0].symbol; updatebarpos(m); } /* reassign left over clients of disappeared monitors */