X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=044177d3696b981c00edf8a23721effd80cfb2f5;hb=0e98090d653457488d74103dc44a1e2aba071895;hp=b8fc56a4d7619ef2c506cf3a013e45fde1b994a7;hpb=29f2b15ddc3a1462780340a10738a98a5e9280eb;p=dwm.git diff --git a/dwm.c b/dwm.c index b8fc56a..044177d 100644 --- a/dwm.c +++ b/dwm.c @@ -145,7 +145,6 @@ Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); void grabbuttons(Client *c, Bool focused); unsigned int idxoftag(const char *tag); void initfont(const char *fontstr); -Bool isarrange(void (*func)()); Bool isoccupied(unsigned int t); Bool isprotodel(Client *c); Bool isvisible(Client *c); @@ -198,9 +197,6 @@ int screen, sx, sy, sw, sh, wax, way, waw, wah; int (*xerrorxlib)(Display *, XErrorEvent *); unsigned int bh, bpos; unsigned int blw = 0; -unsigned int ltidx = 0; /* default */ -unsigned int nlayouts = 0; -unsigned int nrules = 0; unsigned int numlockmask = 0; void (*handler[LASTEvent]) (XEvent *) = { [ButtonPress] = buttonpress, @@ -217,6 +213,8 @@ void (*handler[LASTEvent]) (XEvent *) = { [UnmapNotify] = unmapnotify }; Atom wmatom[WMLast], netatom[NetLast]; +Bool domwfact = True; +Bool dozoom = True; Bool otherwm, readin; Bool running = True; Bool selscreen = True; @@ -226,16 +224,13 @@ Client *stack = NULL; Cursor cursor[CurLast]; Display *dpy; DC dc = {0}; +Layout *layout = NULL; Window barwin, root; Regs *regs = NULL; /* configuration, allows nested code to access above variables */ #include "config.h" -#define NTAGS (sizeof tags / sizeof tags[0]) -Bool seltags[NTAGS] = {[0] = True}; -Bool prevtags[NTAGS] = {[0] = True}; - /* function implementations */ void applyrules(Client *c) { @@ -250,10 +245,10 @@ applyrules(Client *c) { snprintf(buf, sizeof buf, "%s:%s:%s", ch.res_class ? ch.res_class : "", ch.res_name ? ch.res_name : "", c->name); - for(i = 0; i < nrules; i++) + for(i = 0; i < LENGTH(rules); i++) if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) { c->isfloating = rules[i].isfloating; - for(j = 0; regs[i].tagregex && j < NTAGS; j++) { + for(j = 0; regs[i].tagregex && j < LENGTH(tags); j++) { if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { matched = True; c->tags[j] = True; @@ -277,7 +272,7 @@ arrange(void) { unban(c); else ban(c); - layouts[ltidx].arrange(); + layout->arrange(); focus(NULL); restack(); } @@ -312,7 +307,7 @@ buttonpress(XEvent *e) { if(barwin == ev->window) { x = 0; - for(i = 0; i < NTAGS; i++) { + for(i = 0; i < LENGTH(tags); i++) { x += textw(tags[i]); if(ev->x < x) { if(ev->button == Button1) { @@ -338,20 +333,20 @@ buttonpress(XEvent *e) { if(CLEANMASK(ev->state) != MODKEY) return; if(ev->button == Button1) { - if(isarrange(floating) || c->isfloating) + if((floating == layout->arrange) || c->isfloating) restack(); else togglefloating(NULL); movemouse(c); } else if(ev->button == Button2) { - if((ISTILE) && !c->isfixed && c->isfloating) + if((floating != layout->arrange) && c->isfloating) togglefloating(NULL); else zoom(NULL); } else if(ev->button == Button3 && !c->isfixed) { - if(isarrange(floating) || c->isfloating) + if((floating == layout->arrange) || c->isfloating) restack(); else togglefloating(NULL); @@ -405,9 +400,8 @@ compileregs(void) { if(regs) return; - nrules = sizeof rules / sizeof rules[0]; - regs = emallocz(nrules * sizeof(Regs)); - for(i = 0; i < nrules; i++) { + regs = emallocz(LENGTH(rules) * sizeof(Regs)); + for(i = 0; i < LENGTH(rules); i++) { if(rules[i].prop) { reg = emallocz(sizeof(regex_t)); if(regcomp(reg, rules[i].prop, REG_EXTENDED)) @@ -468,7 +462,7 @@ configurerequest(XEvent *e) { c->ismax = False; if(ev->value_mask & CWBorderWidth) c->border = ev->border_width; - if(c->isfixed || c->isfloating || isarrange(floating)) { + if(c->isfixed || c->isfloating || (floating == layout->arrange)) { if(ev->value_mask & CWX) c->x = ev->x; if(ev->value_mask & CWY) @@ -536,7 +530,7 @@ drawbar(void) { int i, x; dc.x = dc.y = 0; - for(i = 0; i < NTAGS; i++) { + for(i = 0; i < LENGTH(tags); i++) { dc.w = textw(tags[i]); if(seltags[i]) { drawtext(tags[i], dc.sel); @@ -549,7 +543,7 @@ drawbar(void) { dc.x += dc.w; } dc.w = blw; - drawtext(layouts[ltidx].symbol, dc.norm); + drawtext(layout->symbol, dc.norm); x = dc.x + dc.w; dc.w = textw(stext); dc.x = sw - dc.w; @@ -670,7 +664,7 @@ void expose(XEvent *e) { XExposeEvent *ev = &e->xexpose; - if(ev->count == 0) { + if(0 == ev->count) { if(barwin == ev->window) drawbar(); } @@ -680,6 +674,7 @@ void floating(void) { /* default floating layout */ Client *c; + domwfact = dozoom = False; for(c = clients; c; c = c->next) if(isvisible(c)) resize(c, c->x, c->y, c->w, c->h, True); @@ -784,7 +779,7 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { int n; XTextProperty name; - if(!text || size == 0) + if(!text || 0 == size) return False; text[0] = '\0'; XGetTextProperty(dpy, w, &name, atom); @@ -846,8 +841,8 @@ unsigned int idxoftag(const char *tag) { unsigned int i; - for(i = 0; (i < NTAGS) && (tags[i] != tag); i++); - return (i < NTAGS) ? i : 0; + for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++); + return (i < LENGTH(tags)) ? i : 0; } void @@ -893,12 +888,6 @@ initfont(const char *fontstr) { } Bool -isarrange(void (*func)()) -{ - return func == layouts[ltidx].arrange; -} - -Bool isoccupied(unsigned int t) { Client *c; @@ -927,7 +916,7 @@ Bool isvisible(Client *c) { unsigned int i; - for(i = 0; i < NTAGS; i++) + for(i = 0; i < LENGTH(tags); i++) if(c->tags[i] && seltags[i]) return True; return False; @@ -936,7 +925,6 @@ isvisible(Client *c) { void keypress(XEvent *e) { KEYS - unsigned int len = sizeof keys / sizeof keys[0]; unsigned int i; KeyCode code; KeySym keysym; @@ -944,7 +932,7 @@ keypress(XEvent *e) { if(!e) { /* grabkeys */ XUngrabKey(dpy, AnyKey, AnyModifier, root); - for(i = 0; i < len; i++) { + for(i = 0; i < LENGTH(keys); i++) { code = XKeysymToKeycode(dpy, keys[i].keysym); XGrabKey(dpy, code, keys[i].mod, root, True, GrabModeAsync, GrabModeAsync); @@ -959,7 +947,7 @@ keypress(XEvent *e) { } ev = &e->xkey; keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for(i = 0; i < len; i++) + for(i = 0; i < LENGTH(keys); i++) if(keysym == keys[i].keysym && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)) { @@ -1157,6 +1145,7 @@ quit(const char *arg) { readin = running = False; } + void resize(Client *c, int x, int y, int w, int h, Bool sizehints) { XWindowChanges wc; @@ -1270,9 +1259,9 @@ restack(void) { drawbar(); if(!sel) return; - if(sel->isfloating || isarrange(floating)) + if(sel->isfloating || (floating == layout->arrange)) XRaiseWindow(dpy, sel->win); - if(!isarrange(floating)) { + if(floating != layout->arrange) { wc.stack_mode = Below; wc.sibling = barwin; if(!sel->isfloating) { @@ -1293,14 +1282,18 @@ restack(void) { void run(void) { char *p; - int r, xfd; fd_set rd; + int r, xfd; + unsigned int len, offset; XEvent ev; /* main event loop, also reads status text from stdin */ XSync(dpy, False); xfd = ConnectionNumber(dpy); readin = True; + offset = 0; + len = sizeof stext - 1; + stext[len] = '\0'; /* 0-terminator is never touched */ while(running) { FD_ZERO(&rd); if(readin) @@ -1312,10 +1305,9 @@ run(void) { eprint("select failed\n"); } if(FD_ISSET(STDIN_FILENO, &rd)) { - switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)) { + switch((r = read(STDIN_FILENO, stext + offset, len - offset))) { case -1: - strncpy(stext, strerror(errno), sizeof stext - 1); - stext[sizeof stext - 1] = '\0'; + strncpy(stext, strerror(errno), len); readin = False; break; case 0: @@ -1323,10 +1315,16 @@ run(void) { readin = False; break; default: - for(stext[r] = '\0', p = stext + strlen(stext) - 1; p >= stext && *p == '\n'; *p-- = '\0'); - for(; p >= stext && *p != '\n'; --p); - if(p > stext) - strncpy(stext, p + 1, sizeof stext); + stext[offset + r] = '\0'; + for(p = stext; *p && *p != '\n'; p++); + if(*p == '\n') { + *p = '\0'; + offset = 0; + } + else if(offset + r < len - 1) + offset += r; + else + offset = 0; } drawbar(); } @@ -1378,16 +1376,16 @@ setlayout(const char *arg) { unsigned int i; if(!arg) { - if(++ltidx == nlayouts) - ltidx = 0;; + if(++layout == &layouts[LENGTH(layouts)]) + layout = &layouts[0]; } else { - for(i = 0; i < nlayouts; i++) + for(i = 0; i < LENGTH(layouts); i++) if(!strcmp(arg, layouts[i].symbol)) break; - if(i == nlayouts) + if(i == LENGTH(layouts)) return; - ltidx = i; + layout = &layouts[i]; } if(sel) arrange(); @@ -1399,10 +1397,10 @@ void setmwfact(const char *arg) { double delta; - if(!(ISTILE)) + if(!domwfact) return; /* arg handling, manipulate mwfact */ - if(arg == NULL) + if(NULL == arg) mwfact = MWFACT; else if(1 == sscanf(arg, "%lf", &delta)) { if(arg[0] == '+' || arg[0] == '-') @@ -1480,8 +1478,8 @@ setup(void) { /* init layouts */ mwfact = MWFACT; - nlayouts = sizeof layouts / sizeof layouts[0]; - for(blw = i = 0; i < nlayouts; i++) { + layout = &layouts[0]; + for(blw = i = 0; i < LENGTH(layouts); i++) { j = textw(layouts[i].symbol); if(j > blw) blw = j; @@ -1519,8 +1517,8 @@ spawn(const char *arg) { return; /* The double-fork construct avoids zombie processes and keeps the code * clean from stupid signal handlers. */ - if(fork() == 0) { - if(fork() == 0) { + if(0 == fork()) { + if(0 == fork()) { if(dpy) close(ConnectionNumber(dpy)); setsid(); @@ -1539,7 +1537,7 @@ tag(const char *arg) { if(!sel) return; - for(i = 0; i < NTAGS; i++) + for(i = 0; i < LENGTH(tags); i++) sel->tags[i] = (NULL == arg); sel->tags[idxoftag(arg)] = True; arrange(); @@ -1566,6 +1564,7 @@ tile(void) { unsigned int i, n, nx, ny, nw, nh, mw, th; Client *c, *mc; + domwfact = dozoom = True; for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) n++; @@ -1580,7 +1579,7 @@ tile(void) { nw = 0; /* gcc stupidity requires this */ for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) { c->ismax = False; - if(i == 0) { /* master */ + if(0 == i) { /* master */ nw = mw - 2 * c->border; nh = wah - 2 * c->border; } @@ -1596,6 +1595,9 @@ tile(void) { nh = th - 2 * c->border; } resize(c, nx, ny, nw, nh, RESIZEHINTS); + if((RESIZEHINTS) && ((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw))) + /* client doesn't accept size constraints */ + resize(c, nx, ny, nw, nh, False); if(n > 1 && th != wah) ny = c->y + c->h + 2 * c->border; } @@ -1628,7 +1630,7 @@ togglemax(const char *arg) { if(!sel || sel->isfixed) return; if((sel->ismax = !sel->ismax)) { - if(isarrange(floating) || sel->isfloating) + if((floating == layout->arrange) || sel->isfloating) sel->wasfloating = True; else { togglefloating(NULL); @@ -1657,8 +1659,8 @@ toggletag(const char *arg) { return; i = idxoftag(arg); sel->tags[i] = !sel->tags[i]; - for(j = 0; j < NTAGS && !sel->tags[j]; j++); - if(j == NTAGS) + for(j = 0; j < LENGTH(tags) && !sel->tags[j]; j++); + if(j == LENGTH(tags)) sel->tags[i] = True; /* at least one tag must be enabled */ arrange(); } @@ -1669,8 +1671,8 @@ toggleview(const char *arg) { i = idxoftag(arg); seltags[i] = !seltags[i]; - for(j = 0; j < NTAGS && !seltags[j]; j++); - if(j == NTAGS) + for(j = 0; j < LENGTH(tags) && !seltags[j]; j++); + if(j == LENGTH(tags)) seltags[i] = True; /* at least one tag must be viewed */ arrange(); } @@ -1836,8 +1838,8 @@ view(const char *arg) { unsigned int i; memcpy(prevtags, seltags, sizeof seltags); - for(i = 0; i < NTAGS; i++) - seltags[i] = arg == NULL; + for(i = 0; i < LENGTH(tags); i++) + seltags[i] = (NULL == arg); seltags[idxoftag(arg)] = True; arrange(); } @@ -1856,7 +1858,7 @@ void zoom(const char *arg) { Client *c; - if(!sel || !(ISTILE) || sel->isfloating) + if(!sel || !dozoom || sel->isfloating) return; if((c = sel) == nexttiled(clients)) if(!(c = nexttiled(c->next)))