243 /* rule matching */ |
243 /* rule matching */ |
244 XGetClassHint(dpy, c->win, &ch); |
244 XGetClassHint(dpy, c->win, &ch); |
245 snprintf(buf, sizeof buf, "%s:%s:%s", |
245 snprintf(buf, sizeof buf, "%s:%s:%s", |
246 ch.res_class ? ch.res_class : "", |
246 ch.res_class ? ch.res_class : "", |
247 ch.res_name ? ch.res_name : "", c->name); |
247 ch.res_name ? ch.res_name : "", c->name); |
248 for(i = 0; i < NRULES; i++) |
248 for(i = 0; i < LENGTH(rules); i++) |
249 if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) { |
249 if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) { |
250 c->isfloating = rules[i].isfloating; |
250 c->isfloating = rules[i].isfloating; |
251 for(j = 0; regs[i].tagregex && j < NTAGS; j++) { |
251 for(j = 0; regs[i].tagregex && j < LENGTH(tags); j++) { |
252 if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { |
252 if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { |
253 matched = True; |
253 matched = True; |
254 c->tags[j] = True; |
254 c->tags[j] = True; |
255 } |
255 } |
256 } |
256 } |
305 Client *c; |
305 Client *c; |
306 XButtonPressedEvent *ev = &e->xbutton; |
306 XButtonPressedEvent *ev = &e->xbutton; |
307 |
307 |
308 if(barwin == ev->window) { |
308 if(barwin == ev->window) { |
309 x = 0; |
309 x = 0; |
310 for(i = 0; i < NTAGS; i++) { |
310 for(i = 0; i < LENGTH(tags); i++) { |
311 x += textw(tags[i]); |
311 x += textw(tags[i]); |
312 if(ev->x < x) { |
312 if(ev->x < x) { |
313 if(ev->button == Button1) { |
313 if(ev->button == Button1) { |
314 if(ev->state & MODKEY) |
314 if(ev->state & MODKEY) |
315 tag(tags[i]); |
315 tag(tags[i]); |
398 unsigned int i; |
398 unsigned int i; |
399 regex_t *reg; |
399 regex_t *reg; |
400 |
400 |
401 if(regs) |
401 if(regs) |
402 return; |
402 return; |
403 regs = emallocz(NRULES * sizeof(Regs)); |
403 regs = emallocz(LENGTH(rules) * sizeof(Regs)); |
404 for(i = 0; i < NRULES; i++) { |
404 for(i = 0; i < LENGTH(rules); i++) { |
405 if(rules[i].prop) { |
405 if(rules[i].prop) { |
406 reg = emallocz(sizeof(regex_t)); |
406 reg = emallocz(sizeof(regex_t)); |
407 if(regcomp(reg, rules[i].prop, REG_EXTENDED)) |
407 if(regcomp(reg, rules[i].prop, REG_EXTENDED)) |
408 free(reg); |
408 free(reg); |
409 else |
409 else |
528 void |
528 void |
529 drawbar(void) { |
529 drawbar(void) { |
530 int i, x; |
530 int i, x; |
531 |
531 |
532 dc.x = dc.y = 0; |
532 dc.x = dc.y = 0; |
533 for(i = 0; i < NTAGS; i++) { |
533 for(i = 0; i < LENGTH(tags); i++) { |
534 dc.w = textw(tags[i]); |
534 dc.w = textw(tags[i]); |
535 if(seltags[i]) { |
535 if(seltags[i]) { |
536 drawtext(tags[i], dc.sel); |
536 drawtext(tags[i], dc.sel); |
537 drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); |
537 drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); |
538 } |
538 } |
839 |
839 |
840 unsigned int |
840 unsigned int |
841 idxoftag(const char *tag) { |
841 idxoftag(const char *tag) { |
842 unsigned int i; |
842 unsigned int i; |
843 |
843 |
844 for(i = 0; (i < NTAGS) && (tags[i] != tag); i++); |
844 for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++); |
845 return (i < NTAGS) ? i : 0; |
845 return (i < LENGTH(tags)) ? i : 0; |
846 } |
846 } |
847 |
847 |
848 void |
848 void |
849 initfont(const char *fontstr) { |
849 initfont(const char *fontstr) { |
850 char *def, **missing; |
850 char *def, **missing; |
930 KeySym keysym; |
930 KeySym keysym; |
931 XKeyEvent *ev; |
931 XKeyEvent *ev; |
932 |
932 |
933 if(!e) { /* grabkeys */ |
933 if(!e) { /* grabkeys */ |
934 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
934 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
935 for(i = 0; i < NKEYS; i++) { |
935 for(i = 0; i < LENGTH(keys); i++) { |
936 code = XKeysymToKeycode(dpy, keys[i].keysym); |
936 code = XKeysymToKeycode(dpy, keys[i].keysym); |
937 XGrabKey(dpy, code, keys[i].mod, root, True, |
937 XGrabKey(dpy, code, keys[i].mod, root, True, |
938 GrabModeAsync, GrabModeAsync); |
938 GrabModeAsync, GrabModeAsync); |
939 XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, |
939 XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, |
940 GrabModeAsync, GrabModeAsync); |
940 GrabModeAsync, GrabModeAsync); |
945 } |
945 } |
946 return; |
946 return; |
947 } |
947 } |
948 ev = &e->xkey; |
948 ev = &e->xkey; |
949 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
949 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
950 for(i = 0; i < NKEYS; i++) |
950 for(i = 0; i < LENGTH(keys); i++) |
951 if(keysym == keys[i].keysym |
951 if(keysym == keys[i].keysym |
952 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)) |
952 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)) |
953 { |
953 { |
954 if(keys[i].func) |
954 if(keys[i].func) |
955 keys[i].func(keys[i].arg); |
955 keys[i].func(keys[i].arg); |
1364 void |
1364 void |
1365 setlayout(const char *arg) { |
1365 setlayout(const char *arg) { |
1366 unsigned int i; |
1366 unsigned int i; |
1367 |
1367 |
1368 if(!arg) { |
1368 if(!arg) { |
1369 if(++layout == &layouts[NLAYOUTS]) |
1369 if(++layout == &layouts[LENGTH(layouts)]) |
1370 layout = &layouts[0]; |
1370 layout = &layouts[0]; |
1371 } |
1371 } |
1372 else { |
1372 else { |
1373 for(i = 0; i < NLAYOUTS; i++) |
1373 for(i = 0; i < LENGTH(layouts); i++) |
1374 if(!strcmp(arg, layouts[i].symbol)) |
1374 if(!strcmp(arg, layouts[i].symbol)) |
1375 break; |
1375 break; |
1376 if(i == NLAYOUTS) |
1376 if(i == LENGTH(layouts)) |
1377 return; |
1377 return; |
1378 layout = &layouts[i]; |
1378 layout = &layouts[i]; |
1379 } |
1379 } |
1380 if(sel) |
1380 if(sel) |
1381 arrange(); |
1381 arrange(); |
1647 |
1647 |
1648 if(!sel) |
1648 if(!sel) |
1649 return; |
1649 return; |
1650 i = idxoftag(arg); |
1650 i = idxoftag(arg); |
1651 sel->tags[i] = !sel->tags[i]; |
1651 sel->tags[i] = !sel->tags[i]; |
1652 for(j = 0; j < NTAGS && !sel->tags[j]; j++); |
1652 for(j = 0; j < LENGTH(tags) && !sel->tags[j]; j++); |
1653 if(j == NTAGS) |
1653 if(j == LENGTH(tags)) |
1654 sel->tags[i] = True; /* at least one tag must be enabled */ |
1654 sel->tags[i] = True; /* at least one tag must be enabled */ |
1655 arrange(); |
1655 arrange(); |
1656 } |
1656 } |
1657 |
1657 |
1658 void |
1658 void |
1659 toggleview(const char *arg) { |
1659 toggleview(const char *arg) { |
1660 unsigned int i, j; |
1660 unsigned int i, j; |
1661 |
1661 |
1662 i = idxoftag(arg); |
1662 i = idxoftag(arg); |
1663 seltags[i] = !seltags[i]; |
1663 seltags[i] = !seltags[i]; |
1664 for(j = 0; j < NTAGS && !seltags[j]; j++); |
1664 for(j = 0; j < LENGTH(tags) && !seltags[j]; j++); |
1665 if(j == NTAGS) |
1665 if(j == LENGTH(tags)) |
1666 seltags[i] = True; /* at least one tag must be viewed */ |
1666 seltags[i] = True; /* at least one tag must be viewed */ |
1667 arrange(); |
1667 arrange(); |
1668 } |
1668 } |
1669 |
1669 |
1670 void |
1670 void |
1826 void |
1826 void |
1827 view(const char *arg) { |
1827 view(const char *arg) { |
1828 unsigned int i; |
1828 unsigned int i; |
1829 |
1829 |
1830 memcpy(prevtags, seltags, sizeof seltags); |
1830 memcpy(prevtags, seltags, sizeof seltags); |
1831 for(i = 0; i < NTAGS; i++) |
1831 for(i = 0; i < LENGTH(tags); i++) |
1832 seltags[i] = (NULL == arg); |
1832 seltags[i] = (NULL == arg); |
1833 seltags[idxoftag(arg)] = True; |
1833 seltags[idxoftag(arg)] = True; |
1834 arrange(); |
1834 arrange(); |
1835 } |
1835 } |
1836 |
1836 |