split screen.c into layout.c and tag.c (because the view is an implicit mixture of both)
This commit is contained in:
		
							parent
							
								
									6bc4556ebd
								
							
						
					
					
						commit
						8012fcf333
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | |||||||
| 
 | 
 | ||||||
| include config.mk | include config.mk | ||||||
| 
 | 
 | ||||||
| SRC = client.c event.c main.c screen.c util.c | SRC = client.c event.c layout.c main.c tag.c util.c | ||||||
| OBJ = ${SRC:.c=.o} | OBJ = ${SRC:.c=.o} | ||||||
| 
 | 
 | ||||||
| all: options dwm | all: options dwm | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								dwm.h
									
									
									
									
									
								
							| @ -120,6 +120,15 @@ extern void zoom(Arg *arg);			/* zooms the focused client to master area, arg is | |||||||
| /* event.c */ | /* event.c */ | ||||||
| extern void grabkeys(void);			/* grab all keys defined in config.h */ | extern void grabkeys(void);			/* grab all keys defined in config.h */ | ||||||
| 
 | 
 | ||||||
|  | /* layout.c */ | ||||||
|  | extern void incnmaster(Arg *arg);		/* increments nmaster with arg's index value */ | ||||||
|  | extern void initlayouts(void);			/* initialize layout array */ | ||||||
|  | extern void resizemaster(Arg *arg);		/* resizes the master percent with arg's index value */ | ||||||
|  | extern void restack(void);			/* restores z layers of all clients */ | ||||||
|  | extern void setlayout(Arg *arg);		/* sets layout, -1 toggles */ | ||||||
|  | extern void toggleversatile(Arg *arg);		/* toggles focusesd client between versatile/and non-versatile state */ | ||||||
|  | extern void versatile(void);			/* arranges all windows versatile */ | ||||||
|  | 
 | ||||||
| /* main.c */ | /* main.c */ | ||||||
| extern void drawstatus(void);			/* draw the bar */ | extern void drawstatus(void);			/* draw the bar */ | ||||||
| extern unsigned int textw(const char *text);	/* return the width of text in px*/ | extern unsigned int textw(const char *text);	/* return the width of text in px*/ | ||||||
| @ -127,20 +136,13 @@ extern void quit(Arg *arg);			/* quit dwm nicely */ | |||||||
| extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */ | extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */ | ||||||
| extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ | extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ | ||||||
| 
 | 
 | ||||||
| /* screen.c */ | /* tag.c */ | ||||||
| extern void compileregs(void);			/* initialize regexps of rules defined in config.h */ | extern void compileregs(void);			/* initialize regexps of rules defined in config.h */ | ||||||
| extern void incnmaster(Arg *arg);		/* increments nmaster with arg's index value */ |  | ||||||
| extern void initlayouts(void);			/* initialize layout array */ |  | ||||||
| extern Bool isvisible(Client *c);		/* returns True if client is visible */ | extern Bool isvisible(Client *c);		/* returns True if client is visible */ | ||||||
| extern void resizemaster(Arg *arg);		/* resizes the master percent with arg's index value */ |  | ||||||
| extern void restack(void);			/* restores z layers of all clients */ |  | ||||||
| extern void setlayout(Arg *arg);		/* sets layout, -1 toggles */ |  | ||||||
| extern void settags(Client *c, Client *trans);	/* sets tags of c */ | extern void settags(Client *c, Client *trans);	/* sets tags of c */ | ||||||
| extern void tag(Arg *arg);			/* tags c with arg's index */ | extern void tag(Arg *arg);			/* tags c with arg's index */ | ||||||
| extern void toggleversatile(Arg *arg);		/* toggles focusesd client between versatile/and non-versatile state */ |  | ||||||
| extern void toggletag(Arg *arg);		/* toggles c tags with arg's index */ | extern void toggletag(Arg *arg);		/* toggles c tags with arg's index */ | ||||||
| extern void toggleview(Arg *arg);		/* toggles the tag with arg's index (in)visible */ | extern void toggleview(Arg *arg);		/* toggles the tag with arg's index (in)visible */ | ||||||
| extern void versatile(void);			/* arranges all windows versatile */ |  | ||||||
| extern void view(Arg *arg);			/* views the tag with arg's index */ | extern void view(Arg *arg);			/* views the tag with arg's index */ | ||||||
| 
 | 
 | ||||||
| /* util.c */ | /* util.c */ | ||||||
|  | |||||||
| @ -2,12 +2,6 @@ | |||||||
|  * See LICENSE file for license details. |  * See LICENSE file for license details. | ||||||
|  */ |  */ | ||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
| #include <regex.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <X11/Xutil.h> |  | ||||||
| 
 | 
 | ||||||
| unsigned int master = MASTER; | unsigned int master = MASTER; | ||||||
| unsigned int nmaster = NMASTER; | unsigned int nmaster = NMASTER; | ||||||
| @ -16,22 +10,6 @@ Layout *lt = NULL; | |||||||
| 
 | 
 | ||||||
| /* static */ | /* static */ | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
| 	const char *prop; |  | ||||||
| 	const char *tags; |  | ||||||
| 	Bool isversatile; |  | ||||||
| } Rule; |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
| 	regex_t *propregex; |  | ||||||
| 	regex_t *tagregex; |  | ||||||
| } Regs; |  | ||||||
| 
 |  | ||||||
| TAGS |  | ||||||
| RULES |  | ||||||
| 
 |  | ||||||
| static Regs *regs = NULL; |  | ||||||
| static unsigned int nrules = 0; |  | ||||||
| static unsigned int nlayouts = 0; | static unsigned int nlayouts = 0; | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| @ -90,33 +68,6 @@ LAYOUTS | |||||||
| 
 | 
 | ||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| compileregs(void) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 	regex_t *reg; |  | ||||||
| 
 |  | ||||||
| 	if(regs) |  | ||||||
| 		return; |  | ||||||
| 	nrules = sizeof rule / sizeof rule[0]; |  | ||||||
| 	regs = emallocz(nrules * sizeof(Regs)); |  | ||||||
| 	for(i = 0; i < nrules; i++) { |  | ||||||
| 		if(rule[i].prop) { |  | ||||||
| 			reg = emallocz(sizeof(regex_t)); |  | ||||||
| 			if(regcomp(reg, rule[i].prop, REG_EXTENDED)) |  | ||||||
| 				free(reg); |  | ||||||
| 			else |  | ||||||
| 				regs[i].propregex = reg; |  | ||||||
| 		} |  | ||||||
| 		if(rule[i].tags) { |  | ||||||
| 			reg = emallocz(sizeof(regex_t)); |  | ||||||
| 			if(regcomp(reg, rule[i].tags, REG_EXTENDED)) |  | ||||||
| 				free(reg); |  | ||||||
| 			else |  | ||||||
| 				regs[i].tagregex = reg; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| incnmaster(Arg *arg) { | incnmaster(Arg *arg) { | ||||||
| 	if((lt->arrange != tile) || (nmaster + arg->i < 1) | 	if((lt->arrange != tile) || (nmaster + arg->i < 1) | ||||||
| @ -142,16 +93,6 @@ initlayouts(void) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Bool |  | ||||||
| isvisible(Client *c) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		if(c->tags[i] && seltag[i]) |  | ||||||
| 			return True; |  | ||||||
| 	return False; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| resizemaster(Arg *arg) { | resizemaster(Arg *arg) { | ||||||
| 	if(lt->arrange != tile) | 	if(lt->arrange != tile) | ||||||
| @ -212,68 +153,6 @@ setlayout(Arg *arg) { | |||||||
| 		drawstatus(); | 		drawstatus(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| settags(Client *c, Client *trans) { |  | ||||||
| 	char prop[512]; |  | ||||||
| 	unsigned int i, j; |  | ||||||
| 	regmatch_t tmp; |  | ||||||
| 	Bool matched = trans != NULL; |  | ||||||
| 	XClassHint ch = { 0 }; |  | ||||||
| 
 |  | ||||||
| 	if(matched) |  | ||||||
| 		for(i = 0; i < ntags; i++) |  | ||||||
| 			c->tags[i] = trans->tags[i]; |  | ||||||
| 	else { |  | ||||||
| 		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->isversatile = rule[i].isversatile; |  | ||||||
| 				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] = seltag[i]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| tag(Arg *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	if(!sel) |  | ||||||
| 		return; |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		sel->tags[i] = (arg->i == -1) ? True : False; |  | ||||||
| 	if(arg->i >= 0 && arg->i < ntags) |  | ||||||
| 		sel->tags[arg->i] = True; |  | ||||||
| 	lt->arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| toggletag(Arg *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	if(!sel) |  | ||||||
| 		return; |  | ||||||
| 	sel->tags[arg->i] = !sel->tags[arg->i]; |  | ||||||
| 	for(i = 0; i < ntags && !sel->tags[i]; i++); |  | ||||||
| 	if(i == ntags) |  | ||||||
| 		sel->tags[arg->i] = True; |  | ||||||
| 	lt->arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| toggleversatile(Arg *arg) { | toggleversatile(Arg *arg) { | ||||||
| 	if(!sel || lt->arrange == versatile) | 	if(!sel || lt->arrange == versatile) | ||||||
| @ -282,17 +161,6 @@ toggleversatile(Arg *arg) { | |||||||
| 	lt->arrange(); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| toggleview(Arg *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	seltag[arg->i] = !seltag[arg->i]; |  | ||||||
| 	for(i = 0; i < ntags && !seltag[i]; i++); |  | ||||||
| 	if(i == ntags) |  | ||||||
| 		seltag[arg->i] = True; /* cannot toggle last view */ |  | ||||||
| 	lt->arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| versatile(void) { | versatile(void) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| @ -315,14 +183,3 @@ versatile(void) { | |||||||
| 	} | 	} | ||||||
| 	restack(); | 	restack(); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| void |  | ||||||
| view(Arg *arg) { |  | ||||||
| 	unsigned int i; |  | ||||||
| 
 |  | ||||||
| 	for(i = 0; i < ntags; i++) |  | ||||||
| 		seltag[i] = (arg->i == -1) ? True : False; |  | ||||||
| 	if(arg->i >= 0 && arg->i < ntags) |  | ||||||
| 		seltag[arg->i] = True; |  | ||||||
| 	lt->arrange(); |  | ||||||
| } |  | ||||||
							
								
								
									
										149
									
								
								tag.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								tag.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | |||||||
|  | /* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
 | ||||||
|  |  * See LICENSE file for license details. | ||||||
|  |  */ | ||||||
|  | #include "dwm.h" | ||||||
|  | #include <regex.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <X11/Xutil.h> | ||||||
|  | 
 | ||||||
|  | /* static */ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	const char *prop; | ||||||
|  | 	const char *tags; | ||||||
|  | 	Bool isversatile; | ||||||
|  | } Rule; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	regex_t *propregex; | ||||||
|  | 	regex_t *tagregex; | ||||||
|  | } Regs; | ||||||
|  | 
 | ||||||
|  | TAGS | ||||||
|  | RULES | ||||||
|  | 
 | ||||||
|  | static Regs *regs = NULL; | ||||||
|  | static unsigned int nrules = 0; | ||||||
|  | 
 | ||||||
|  | /* extern */ | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | compileregs(void) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 	regex_t *reg; | ||||||
|  | 
 | ||||||
|  | 	if(regs) | ||||||
|  | 		return; | ||||||
|  | 	nrules = sizeof rule / sizeof rule[0]; | ||||||
|  | 	regs = emallocz(nrules * sizeof(Regs)); | ||||||
|  | 	for(i = 0; i < nrules; i++) { | ||||||
|  | 		if(rule[i].prop) { | ||||||
|  | 			reg = emallocz(sizeof(regex_t)); | ||||||
|  | 			if(regcomp(reg, rule[i].prop, REG_EXTENDED)) | ||||||
|  | 				free(reg); | ||||||
|  | 			else | ||||||
|  | 				regs[i].propregex = reg; | ||||||
|  | 		} | ||||||
|  | 		if(rule[i].tags) { | ||||||
|  | 			reg = emallocz(sizeof(regex_t)); | ||||||
|  | 			if(regcomp(reg, rule[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] && seltag[i]) | ||||||
|  | 			return True; | ||||||
|  | 	return False; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | settags(Client *c, Client *trans) { | ||||||
|  | 	char prop[512]; | ||||||
|  | 	unsigned int i, j; | ||||||
|  | 	regmatch_t tmp; | ||||||
|  | 	Bool matched = trans != NULL; | ||||||
|  | 	XClassHint ch = { 0 }; | ||||||
|  | 
 | ||||||
|  | 	if(matched) | ||||||
|  | 		for(i = 0; i < ntags; i++) | ||||||
|  | 			c->tags[i] = trans->tags[i]; | ||||||
|  | 	else { | ||||||
|  | 		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->isversatile = rule[i].isversatile; | ||||||
|  | 				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] = seltag[i]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | tag(Arg *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	if(!sel) | ||||||
|  | 		return; | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		sel->tags[i] = (arg->i == -1) ? True : False; | ||||||
|  | 	if(arg->i >= 0 && arg->i < ntags) | ||||||
|  | 		sel->tags[arg->i] = True; | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | toggletag(Arg *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	if(!sel) | ||||||
|  | 		return; | ||||||
|  | 	sel->tags[arg->i] = !sel->tags[arg->i]; | ||||||
|  | 	for(i = 0; i < ntags && !sel->tags[i]; i++); | ||||||
|  | 	if(i == ntags) | ||||||
|  | 		sel->tags[arg->i] = True; | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | toggleview(Arg *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	seltag[arg->i] = !seltag[arg->i]; | ||||||
|  | 	for(i = 0; i < ntags && !seltag[i]; i++); | ||||||
|  | 	if(i == ntags) | ||||||
|  | 		seltag[arg->i] = True; /* cannot toggle last view */ | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | view(Arg *arg) { | ||||||
|  | 	unsigned int i; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < ntags; i++) | ||||||
|  | 		seltag[i] = (arg->i == -1) ? True : False; | ||||||
|  | 	if(arg->i >= 0 && arg->i < ntags) | ||||||
|  | 		seltag[arg->i] = True; | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R. Garbe
						Anselm R. Garbe