split screen.c into layout.c and tag.c (because the view is an implicit mixture of both)
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| 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} | ||||
|  | ||||
| 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 */ | ||||
| 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 */ | ||||
| extern void drawstatus(void);			/* draw the bar */ | ||||
| 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 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 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 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 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 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 */ | ||||
|  | ||||
| /* util.c */ | ||||
|   | ||||
| @@ -2,12 +2,6 @@ | ||||
|  * See LICENSE file for license details. | ||||
|  */ | ||||
| #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 nmaster = NMASTER; | ||||
| @@ -16,22 +10,6 @@ Layout *lt = NULL; | ||||
| 
 | ||||
| /* 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 void | ||||
| @@ -90,33 +68,6 @@ LAYOUTS | ||||
| 
 | ||||
| /* 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 | ||||
| incnmaster(Arg *arg) { | ||||
| 	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 | ||||
| resizemaster(Arg *arg) { | ||||
| 	if(lt->arrange != tile) | ||||
| @@ -212,68 +153,6 @@ setlayout(Arg *arg) { | ||||
| 		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 | ||||
| toggleversatile(Arg *arg) { | ||||
| 	if(!sel || lt->arrange == versatile) | ||||
| @@ -282,17 +161,6 @@ toggleversatile(Arg *arg) { | ||||
| 	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 | ||||
| versatile(void) { | ||||
| 	Client *c; | ||||
| @@ -315,14 +183,3 @@ versatile(void) { | ||||
| 	} | ||||
| 	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(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user