added screen.c, removed layout.c and tag.c
This commit is contained in:
		
							parent
							
								
									96d7fe16ea
								
							
						
					
					
						commit
						47765f7286
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | |||||||
| 
 | 
 | ||||||
| include config.mk | include config.mk | ||||||
| 
 | 
 | ||||||
| SRC += client.c draw.c event.c layout.c main.c tag.c util.c | SRC += client.c draw.c event.c main.c screen.c util.c | ||||||
| OBJ = ${SRC:.c=.o} | OBJ = ${SRC:.c=.o} | ||||||
| 
 | 
 | ||||||
| all: options dwm | all: options dwm | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								client.c
									
									
									
									
									
								
							| @ -182,7 +182,7 @@ killclient(const char *arg) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Bool | Bool | ||||||
| loadprops(Client *c) { | getprops(Client *c) { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 	Bool result = False; | 	Bool result = False; | ||||||
| 
 | 
 | ||||||
| @ -242,11 +242,11 @@ manage(Window w, XWindowAttributes *wa) { | |||||||
| 	if(t) | 	if(t) | ||||||
| 		for(i = 0; i < ntags; i++) | 		for(i = 0; i < ntags; i++) | ||||||
| 			c->tags[i] = t->tags[i]; | 			c->tags[i] = t->tags[i]; | ||||||
| 	if(!loadprops(c)) | 	if(!getprops(c)) | ||||||
| 		applyrules(c); | 		applyrules(c); | ||||||
| 	if(!c->isfloating) | 	if(!c->isfloating) | ||||||
| 		c->isfloating = (rettrans == Success) || c->isfixed; | 		c->isfloating = (rettrans == Success) || c->isfixed; | ||||||
| 	saveprops(c); | 	setprops(c); | ||||||
| 	attach(c); | 	attach(c); | ||||||
| 	attachstack(c); | 	attachstack(c); | ||||||
| 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ | 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ | ||||||
| @ -318,7 +318,7 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| saveprops(Client *c) { | setprops(Client *c) { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 
 | 
 | ||||||
| 	for(i = 0; i < ntags && i < sizeof prop - 1; i++) | 	for(i = 0; i < ntags && i < sizeof prop - 1; i++) | ||||||
|  | |||||||
| @ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 | |||||||
| # flags
 | # flags
 | ||||||
| CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | ||||||
| LDFLAGS = -s ${LIBS} | LDFLAGS = -s ${LIBS} | ||||||
| CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" | #CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | ||||||
| LDFLAGS = -g ${LIBS} | #LDFLAGS = -g ${LIBS}
 | ||||||
| 
 | 
 | ||||||
| # Solaris
 | # Solaris
 | ||||||
| #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								dwm.h
									
									
									
									
									
								
							| @ -96,11 +96,11 @@ void configure(Client *c);		/* send synthetic configure event */ | |||||||
| void detach(Client *c);			/* detaches c from global client list */ | void detach(Client *c);			/* detaches c from global client list */ | ||||||
| void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */ | void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */ | ||||||
| void killclient(const char *arg);	/* kill sel  nicely */ | void killclient(const char *arg);	/* kill sel  nicely */ | ||||||
| Bool loadprops(Client *c);		/* loads client properties */ | Bool getprops(Client *c);		/* gets client properties */ | ||||||
| void manage(Window w, XWindowAttributes *wa);	/* manage new client */ | void manage(Window w, XWindowAttributes *wa);	/* manage new client */ | ||||||
| void resize(Client *c, int x, int y, | void resize(Client *c, int x, int y, | ||||||
| 		int w, int h, Bool sizehints);	/* resize with given coordinates c*/ | 		int w, int h, Bool sizehints);	/* resize with given coordinates c*/ | ||||||
| void saveprops(Client *c);		/* saves client properties */ | void setprops(Client *c);		/* sets client properties */ | ||||||
| void unban(Client *c);			/* unbans c */ | void unban(Client *c);			/* unbans c */ | ||||||
| void unmanage(Client *c, long state);	/* unmanage c */ | void unmanage(Client *c, long state);	/* unmanage c */ | ||||||
| void updatesizehints(Client *c);	/* update the size hint variables of c */ | void updatesizehints(Client *c);	/* update the size hint variables of c */ | ||||||
| @ -114,22 +114,6 @@ unsigned int textw(const char *text);	/* return the width of text in px*/ | |||||||
| /* event.c */ | /* event.c */ | ||||||
| void grabkeys(void);			/* grab all keys defined in config.h */ | void grabkeys(void);			/* grab all keys defined in config.h */ | ||||||
| 
 | 
 | ||||||
| /* layout.c */ |  | ||||||
| void arrange(void);			/* arranges all windows depending on the layout in use */ |  | ||||||
| void focusnext(const char *arg);	/* focuses next visible client */ |  | ||||||
| void focusprev(const char *arg);	/* focuses prev visible client */ |  | ||||||
| const char *getsymbol(void);		/* returns symbol of enabled layout */ |  | ||||||
| Bool isfloating(void);			/* returns True if floating layout is enabled */ |  | ||||||
| Bool isarrange(void (*func)());		/* returns True if func is the layout function in use */ |  | ||||||
| void initlayouts(void);			/* initialize layout array */ |  | ||||||
| void loaddwmprops(void);		/* loads dwm properties */ |  | ||||||
| Client *nexttiled(Client *c);		/* returns tiled successor of c */ |  | ||||||
| void restack(void);			/* restores z layers of all clients */ |  | ||||||
| void savedwmprops(void);		/* saves dwm properties */ |  | ||||||
| void setlayout(const char *arg);	/* sets layout, NULL means next layout */ |  | ||||||
| void togglebar(const char *arg);	/* shows/hides the bar */ |  | ||||||
| void togglemax(const char *arg);	/* toggles maximization of floating client */ |  | ||||||
| 
 |  | ||||||
| /* main.c */ | /* main.c */ | ||||||
| Bool gettextprop(Window w, Atom atom, | Bool gettextprop(Window w, Atom atom, | ||||||
| 		char *text, unsigned int size); /* return text property, UTF-8 compliant */ | 		char *text, unsigned int size); /* return text property, UTF-8 compliant */ | ||||||
| @ -137,12 +121,25 @@ void updatebarpos(void);		/* updates the bar position */ | |||||||
| void quit(const char *arg);		/* quit dwm nicely */ | void quit(const char *arg);		/* quit dwm nicely */ | ||||||
| int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ | int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ | ||||||
| 
 | 
 | ||||||
| /* tag.c */ | /* screen.c */ | ||||||
| void applyrules(Client *c);		/* applies rules to c */ | void applyrules(Client *c);		/* applies rules to c */ | ||||||
|  | void arrange(void);			/* arranges all windows depending on the layout in use */ | ||||||
| void compileregs(void);			/* initialize regexps of rules defined in config.h */ | void compileregs(void);			/* initialize regexps of rules defined in config.h */ | ||||||
|  | void focusnext(const char *arg);	/* focuses next visible client */ | ||||||
|  | void focusprev(const char *arg);	/* focuses prev visible client */ | ||||||
|  | const char *getsymbol(void);		/* returns symbol of enabled layout */ | ||||||
|  | void initlayouts(void);			/* initialize layout array */ | ||||||
|  | Bool isarrange(void (*func)());		/* returns True if func is the layout function in use */ | ||||||
|  | Bool isfloating(void);			/* returns True if floating layout is enabled */ | ||||||
| Bool isvisible(Client *c);		/* returns True if client is visible */ | Bool isvisible(Client *c);		/* returns True if client is visible */ | ||||||
|  | void getdwmprops(void);			/* gets dwm properties */ | ||||||
|  | Client *nexttiled(Client *c);		/* returns tiled successor of c */ | ||||||
|  | void restack(void);			/* restores z layers of all clients */ | ||||||
|  | void setlayout(const char *arg);	/* sets layout, NULL means next layout */ | ||||||
| void tag(const char *arg);		/* tags sel with arg's index */ | void tag(const char *arg);		/* tags sel with arg's index */ | ||||||
|  | void togglebar(const char *arg);	/* shows/hides the bar */ | ||||||
| void togglefloating(const char *arg);	/* toggles sel between floating/tiled state */ | void togglefloating(const char *arg);	/* toggles sel between floating/tiled state */ | ||||||
|  | void togglemax(const char *arg);	/* toggles maximization of floating client */ | ||||||
| void toggletag(const char *arg);	/* toggles sel tags with arg's index */ | void toggletag(const char *arg);	/* toggles sel tags with arg's index */ | ||||||
| void toggleview(const char *arg);	/* toggles the tag with arg's index (in)visible */ | void toggleview(const char *arg);	/* toggles the tag with arg's index (in)visible */ | ||||||
| void view(const char *arg);		/* views the tag with arg's index */ | void view(const char *arg);		/* views the tag with arg's index */ | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.c
									
									
									
									
									
								
							| @ -206,7 +206,7 @@ setup(void) { | |||||||
| 		XSetFont(dpy, dc.gc, dc.font.xfont->fid); | 		XSetFont(dpy, dc.gc, dc.font.xfont->fid); | ||||||
| 	/* multihead support */ | 	/* multihead support */ | ||||||
| 	selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | 	selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | ||||||
| 	loaddwmprops(); | 	getdwmprops(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| /* See LICENSE file for copyright and license details. */ | /* See LICENSE file for copyright and license details. */ | ||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
|  | #include <regex.h> | ||||||
|  | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <X11/Xatom.h> | #include <X11/Xatom.h> | ||||||
| @ -12,9 +14,35 @@ typedef struct { | |||||||
| 	void (*arrange)(void); | 	void (*arrange)(void); | ||||||
| } Layout; | } Layout; | ||||||
| 
 | 
 | ||||||
| unsigned int blw = 0; | typedef struct { | ||||||
| static char prop[128]; | 	const char *prop; | ||||||
|  | 	const char *tags; | ||||||
|  | 	Bool isfloating; | ||||||
|  | } Rule; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	regex_t *propregex; | ||||||
|  | 	regex_t *tagregex; | ||||||
|  | } Regs; | ||||||
|  | 
 | ||||||
|  | TAGS | ||||||
|  | RULES | ||||||
|  | 
 | ||||||
|  | static char prop[512]; | ||||||
|  | static unsigned int nrules = 0; | ||||||
|  | static unsigned int nlayouts = 0; | ||||||
| static unsigned int ltidx = 0; /* default */ | static unsigned int ltidx = 0; /* default */ | ||||||
|  | static Regs *regs = NULL; | ||||||
|  | 
 | ||||||
|  | static unsigned int | ||||||
|  | idxoftag(const char *tag) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		if(tags[i] == tag) | ||||||
|  | 			return i; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| floating(void) { /* default floating layout */ | floating(void) { /* default floating layout */ | ||||||
| @ -25,12 +53,56 @@ floating(void) { /* default floating layout */ | |||||||
| 			resize(c, c->x, c->y, c->w, c->h, True); | 			resize(c, c->x, c->y, c->w, c->h, True); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int nlayouts = 0; | static void | ||||||
|  | setdwmprops(void) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags && i < sizeof prop - 1; i++) | ||||||
|  | 		prop[i] = seltags[i] ? '1' : '0'; | ||||||
|  | 	if(i < sizeof prop - 1) | ||||||
|  | 		prop[i++] = (char)ltidx; | ||||||
|  | 	prop[i] = '\0'; | ||||||
|  | 	XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, | ||||||
|  | 			PropModeReplace, (unsigned char *)prop, i); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| LAYOUTS | LAYOUTS | ||||||
| 
 | 
 | ||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
|  | unsigned int blw = 0; | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | applyrules(Client *c) { | ||||||
|  | 	unsigned int i, j; | ||||||
|  | 	regmatch_t tmp; | ||||||
|  | 	Bool matched = False; | ||||||
|  | 	XClassHint ch = { 0 }; | ||||||
|  | 
 | ||||||
|  | 	/* rule matching */ | ||||||
|  | 	XGetClassHint(dpy, c->win, &ch); | ||||||
|  | 	snprintf(prop, sizeof prop, "%s:%s:%s", | ||||||
|  | 			ch.res_class ? ch.res_class : "", | ||||||
|  | 			ch.res_name ? ch.res_name : "", c->name); | ||||||
|  | 	for(i = 0; i < nrules; i++) | ||||||
|  | 		if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { | ||||||
|  | 			c->isfloating = rules[i].isfloating; | ||||||
|  | 			for(j = 0; regs[i].tagregex && j < ntags; j++) { | ||||||
|  | 				if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { | ||||||
|  | 					matched = True; | ||||||
|  | 					c->tags[j] = True; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	if(ch.res_class) | ||||||
|  | 		XFree(ch.res_class); | ||||||
|  | 	if(ch.res_name) | ||||||
|  | 		XFree(ch.res_name); | ||||||
|  | 	if(!matched) | ||||||
|  | 		for(i = 0; i < ntags; i++) | ||||||
|  | 			c->tags[i] = seltags[i]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| arrange(void) { | arrange(void) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| @ -45,6 +117,33 @@ arrange(void) { | |||||||
| 	restack(); | 	restack(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | compileregs(void) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 	regex_t *reg; | ||||||
|  | 
 | ||||||
|  | 	if(regs) | ||||||
|  | 		return; | ||||||
|  | 	nrules = sizeof rules / sizeof rules[0]; | ||||||
|  | 	regs = emallocz(nrules * sizeof(Regs)); | ||||||
|  | 	for(i = 0; i < nrules; i++) { | ||||||
|  | 		if(rules[i].prop) { | ||||||
|  | 			reg = emallocz(sizeof(regex_t)); | ||||||
|  | 			if(regcomp(reg, rules[i].prop, REG_EXTENDED)) | ||||||
|  | 				free(reg); | ||||||
|  | 			else | ||||||
|  | 				regs[i].propregex = reg; | ||||||
|  | 		} | ||||||
|  | 		if(rules[i].tags) { | ||||||
|  | 			reg = emallocz(sizeof(regex_t)); | ||||||
|  | 			if(regcomp(reg, rules[i].tags, REG_EXTENDED)) | ||||||
|  | 				free(reg); | ||||||
|  | 			else | ||||||
|  | 				regs[i].tagregex = reg; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| focusnext(const char *arg) { | focusnext(const char *arg) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| @ -83,17 +182,6 @@ getsymbol(void) | |||||||
| 	return layouts[ltidx].symbol; | 	return layouts[ltidx].symbol; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Bool |  | ||||||
| isfloating(void) { |  | ||||||
| 	return layouts[ltidx].arrange == floating; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Bool |  | ||||||
| isarrange(void (*func)()) |  | ||||||
| { |  | ||||||
| 	return func == layouts[ltidx].arrange; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| initlayouts(void) { | initlayouts(void) { | ||||||
| 	unsigned int i, w; | 	unsigned int i, w; | ||||||
| @ -106,8 +194,29 @@ initlayouts(void) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Bool | ||||||
|  | isfloating(void) { | ||||||
|  | 	return layouts[ltidx].arrange == floating; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Bool | ||||||
|  | isarrange(void (*func)()) | ||||||
|  | { | ||||||
|  | 	return func == layouts[ltidx].arrange; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Bool | ||||||
|  | isvisible(Client *c) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		if(c->tags[i] && seltags[i]) | ||||||
|  | 			return True; | ||||||
|  | 	return False; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| loaddwmprops(void) { | getdwmprops(void) { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 
 | 
 | ||||||
| 	if(gettextprop(root, dwmprops, prop, sizeof prop)) { | 	if(gettextprop(root, dwmprops, prop, sizeof prop)) { | ||||||
| @ -155,19 +264,6 @@ restack(void) { | |||||||
| 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| savedwmprops(void) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags && i < sizeof prop - 1; i++) |  | ||||||
| 		prop[i] = seltags[i] ? '1' : '0'; |  | ||||||
| 	if(i < sizeof prop - 1) |  | ||||||
| 		prop[i++] = (char)ltidx; |  | ||||||
| 	prop[i] = '\0'; |  | ||||||
| 	XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, |  | ||||||
| 			PropModeReplace, (unsigned char *)prop, i); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| setlayout(const char *arg) { | setlayout(const char *arg) { | ||||||
| 	int i; | 	int i; | ||||||
| @ -186,7 +282,22 @@ setlayout(const char *arg) { | |||||||
| 		arrange(); | 		arrange(); | ||||||
| 	else | 	else | ||||||
| 		drawstatus(); | 		drawstatus(); | ||||||
| 	savedwmprops(); | 	setdwmprops(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | tag(const char *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	if(!sel) | ||||||
|  | 		return; | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		sel->tags[i] = arg == NULL; | ||||||
|  | 	i = idxoftag(arg); | ||||||
|  | 	if(i >= 0 && i < ntags) | ||||||
|  | 		sel->tags[i] = True; | ||||||
|  | 	setprops(sel); | ||||||
|  | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -199,6 +310,18 @@ togglebar(const char *arg) { | |||||||
| 	arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | togglefloating(const char *arg) { | ||||||
|  | 	if(!sel || isfloating()) | ||||||
|  | 		return; | ||||||
|  | 	sel->isfloating = !sel->isfloating; | ||||||
|  | 	if(sel->isfloating) { | ||||||
|  | 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | ||||||
|  | 		setprops(sel); | ||||||
|  | 	} | ||||||
|  | 	arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| togglemax(const char *arg) { | togglemax(const char *arg) { | ||||||
| 	XEvent ev; | 	XEvent ev; | ||||||
| @ -217,3 +340,44 @@ togglemax(const char *arg) { | |||||||
| 	drawstatus(); | 	drawstatus(); | ||||||
| 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | toggletag(const char *arg) { | ||||||
|  | 	unsigned int i, j; | ||||||
|  | 
 | ||||||
|  | 	if(!sel) | ||||||
|  | 		return; | ||||||
|  | 	i = idxoftag(arg); | ||||||
|  | 	sel->tags[i] = !sel->tags[i]; | ||||||
|  | 	for(j = 0; j < ntags && !sel->tags[j]; j++); | ||||||
|  | 	if(j == ntags) | ||||||
|  | 		sel->tags[i] = True; | ||||||
|  | 	setprops(sel); | ||||||
|  | 	arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | toggleview(const char *arg) { | ||||||
|  | 	unsigned int i, j; | ||||||
|  | 
 | ||||||
|  | 	i = idxoftag(arg); | ||||||
|  | 	seltags[i] = !seltags[i]; | ||||||
|  | 	for(j = 0; j < ntags && !seltags[j]; j++); | ||||||
|  | 	if(j == ntags) | ||||||
|  | 		seltags[i] = True; /* cannot toggle last view */ | ||||||
|  | 	setdwmprops(); | ||||||
|  | 	arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | view(const char *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		seltags[i] = arg == NULL; | ||||||
|  | 	i = idxoftag(arg); | ||||||
|  | 	if(i >= 0 && i < ntags) | ||||||
|  | 		seltags[i] = True; | ||||||
|  | 	setdwmprops(); | ||||||
|  | 	arrange(); | ||||||
|  | } | ||||||
							
								
								
									
										174
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										174
									
								
								tag.c
									
									
									
									
									
								
							| @ -1,174 +0,0 @@ | |||||||
| /* See LICENSE file for copyright and license details. */ |  | ||||||
| #include "dwm.h" |  | ||||||
| #include <regex.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <X11/Xutil.h> |  | ||||||
| 
 |  | ||||||
| /* static */ |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
| 	const char *prop; |  | ||||||
| 	const char *tags; |  | ||||||
| 	Bool isfloating; |  | ||||||
| } Rule; |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
| 	regex_t *propregex; |  | ||||||
| 	regex_t *tagregex; |  | ||||||
| } Regs; |  | ||||||
| 
 |  | ||||||
| TAGS |  | ||||||
| RULES |  | ||||||
| 
 |  | ||||||
| static Regs *regs = NULL; |  | ||||||
| static unsigned int nrules = 0; |  | ||||||
| static char prop[512]; |  | ||||||
| 
 |  | ||||||
| static unsigned int |  | ||||||
| idxoftag(const char *tag) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		if(tags[i] == tag) |  | ||||||
| 			return i; |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* extern */ |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| applyrules(Client *c) { |  | ||||||
| 	unsigned int i, j; |  | ||||||
| 	regmatch_t tmp; |  | ||||||
| 	Bool matched = False; |  | ||||||
| 	XClassHint ch = { 0 }; |  | ||||||
| 
 |  | ||||||
| 	/* rule matching */ |  | ||||||
| 	XGetClassHint(dpy, c->win, &ch); |  | ||||||
| 	snprintf(prop, sizeof prop, "%s:%s:%s", |  | ||||||
| 			ch.res_class ? ch.res_class : "", |  | ||||||
| 			ch.res_name ? ch.res_name : "", c->name); |  | ||||||
| 	for(i = 0; i < nrules; i++) |  | ||||||
| 		if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { |  | ||||||
| 			c->isfloating = rules[i].isfloating; |  | ||||||
| 			for(j = 0; regs[i].tagregex && j < ntags; j++) { |  | ||||||
| 				if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { |  | ||||||
| 					matched = True; |  | ||||||
| 					c->tags[j] = True; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	if(ch.res_class) |  | ||||||
| 		XFree(ch.res_class); |  | ||||||
| 	if(ch.res_name) |  | ||||||
| 		XFree(ch.res_name); |  | ||||||
| 	if(!matched) |  | ||||||
| 		for(i = 0; i < ntags; i++) |  | ||||||
| 			c->tags[i] = seltags[i]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| compileregs(void) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 	regex_t *reg; |  | ||||||
| 
 |  | ||||||
| 	if(regs) |  | ||||||
| 		return; |  | ||||||
| 	nrules = sizeof rules / sizeof rules[0]; |  | ||||||
| 	regs = emallocz(nrules * sizeof(Regs)); |  | ||||||
| 	for(i = 0; i < nrules; i++) { |  | ||||||
| 		if(rules[i].prop) { |  | ||||||
| 			reg = emallocz(sizeof(regex_t)); |  | ||||||
| 			if(regcomp(reg, rules[i].prop, REG_EXTENDED)) |  | ||||||
| 				free(reg); |  | ||||||
| 			else |  | ||||||
| 				regs[i].propregex = reg; |  | ||||||
| 		} |  | ||||||
| 		if(rules[i].tags) { |  | ||||||
| 			reg = emallocz(sizeof(regex_t)); |  | ||||||
| 			if(regcomp(reg, rules[i].tags, REG_EXTENDED)) |  | ||||||
| 				free(reg); |  | ||||||
| 			else |  | ||||||
| 				regs[i].tagregex = reg; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Bool |  | ||||||
| isvisible(Client *c) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		if(c->tags[i] && seltags[i]) |  | ||||||
| 			return True; |  | ||||||
| 	return False; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| tag(const char *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	if(!sel) |  | ||||||
| 		return; |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		sel->tags[i] = arg == NULL; |  | ||||||
| 	i = idxoftag(arg); |  | ||||||
| 	if(i >= 0 && i < ntags) |  | ||||||
| 		sel->tags[i] = True; |  | ||||||
| 	saveprops(sel); |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| togglefloating(const char *arg) { |  | ||||||
| 	if(!sel || isfloating()) |  | ||||||
| 		return; |  | ||||||
| 	sel->isfloating = !sel->isfloating; |  | ||||||
| 	if(sel->isfloating) { |  | ||||||
| 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); |  | ||||||
| 		saveprops(sel); |  | ||||||
| 	} |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| toggletag(const char *arg) { |  | ||||||
| 	unsigned int i, j; |  | ||||||
| 
 |  | ||||||
| 	if(!sel) |  | ||||||
| 		return; |  | ||||||
| 	i = idxoftag(arg); |  | ||||||
| 	sel->tags[i] = !sel->tags[i]; |  | ||||||
| 	for(j = 0; j < ntags && !sel->tags[j]; j++); |  | ||||||
| 	if(j == ntags) |  | ||||||
| 		sel->tags[i] = True; |  | ||||||
| 	saveprops(sel); |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| toggleview(const char *arg) { |  | ||||||
| 	unsigned int i, j; |  | ||||||
| 
 |  | ||||||
| 	i = idxoftag(arg); |  | ||||||
| 	seltags[i] = !seltags[i]; |  | ||||||
| 	for(j = 0; j < ntags && !seltags[j]; j++); |  | ||||||
| 	if(j == ntags) |  | ||||||
| 		seltags[i] = True; /* cannot toggle last view */ |  | ||||||
| 	savedwmprops(); |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| view(const char *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		seltags[i] = arg == NULL; |  | ||||||
| 	i = idxoftag(arg); |  | ||||||
| 	if(i >= 0 && i < ntags) |  | ||||||
| 		seltags[i] = True; |  | ||||||
| 	savedwmprops(); |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R. Garbe
						Anselm R. Garbe