dwm.c
changeset 1048 98fc0d3c583a
parent 1047 ef0b927bf16c
child 1049 a2dae7badb92
equal deleted inserted replaced
1047:ef0b927bf16c 1048:98fc0d3c583a
   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;
   914 
   914 
   915 Bool
   915 Bool
   916 isvisible(Client *c) {
   916 isvisible(Client *c) {
   917 	unsigned int i;
   917 	unsigned int i;
   918 
   918 
   919 	for(i = 0; i < NTAGS; i++)
   919 	for(i = 0; i < LENGTH(tags); i++)
   920 		if(c->tags[i] && seltags[i])
   920 		if(c->tags[i] && seltags[i])
   921 			return True;
   921 			return True;
   922 	return False;
   922 	return False;
   923 }
   923 }
   924 
   924 
   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();
  1467 	dc.h = bh = dc.font.height + 2;
  1467 	dc.h = bh = dc.font.height + 2;
  1468 
  1468 
  1469 	/* init layouts */
  1469 	/* init layouts */
  1470 	mwfact = MWFACT;
  1470 	mwfact = MWFACT;
  1471 	layout = &layouts[0];
  1471 	layout = &layouts[0];
  1472 	for(blw = i = 0; i < NLAYOUTS; i++) {
  1472 	for(blw = i = 0; i < LENGTH(layouts); i++) {
  1473 		j = textw(layouts[i].symbol);
  1473 		j = textw(layouts[i].symbol);
  1474 		if(j > blw)
  1474 		if(j > blw)
  1475 			blw = j;
  1475 			blw = j;
  1476 	}
  1476 	}
  1477 
  1477 
  1525 tag(const char *arg) {
  1525 tag(const char *arg) {
  1526 	unsigned int i;
  1526 	unsigned int i;
  1527 
  1527 
  1528 	if(!sel)
  1528 	if(!sel)
  1529 		return;
  1529 		return;
  1530 	for(i = 0; i < NTAGS; i++)
  1530 	for(i = 0; i < LENGTH(tags); i++)
  1531 		sel->tags[i] = (NULL == arg);
  1531 		sel->tags[i] = (NULL == arg);
  1532 	sel->tags[idxoftag(arg)] = True;
  1532 	sel->tags[idxoftag(arg)] = True;
  1533 	arrange();
  1533 	arrange();
  1534 }
  1534 }
  1535 
  1535 
  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