diff options
| author | Anselm R. Garbe <garbeam@gmail.com> | 2007-08-19 10:57:02 +0200 | 
|---|---|---|
| committer | Anselm R. Garbe <garbeam@gmail.com> | 2007-08-19 10:57:02 +0200 | 
| commit | 47765f728614c348aa7dfc2eed6f754efc376922 (patch) | |
| tree | 47f8667ef723767ec41df2403bdce1ee80dccd17 | |
| parent | 96d7fe16eaf6b656800f08da3156bacd75ca3b08 (diff) | |
| download | dwm-47765f728614c348aa7dfc2eed6f754efc376922.tar.gz dwm-47765f728614c348aa7dfc2eed6f754efc376922.zip | |
added screen.c, removed layout.c and tag.c
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | client.c | 8 | ||||
| -rw-r--r-- | config.mk | 4 | ||||
| -rw-r--r-- | dwm.h | 35 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | screen.c (renamed from layout.c) | 218 | ||||
| -rw-r--r-- | tag.c | 174 | 
7 files changed, 215 insertions, 228 deletions
| @@ -3,7 +3,7 @@  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}  all: options dwm @@ -182,7 +182,7 @@ killclient(const char *arg) {  }  Bool -loadprops(Client *c) { +getprops(Client *c) {  	unsigned int i;  	Bool result = False; @@ -242,11 +242,11 @@ manage(Window w, XWindowAttributes *wa) {  	if(t)  		for(i = 0; i < ntags; i++)  			c->tags[i] = t->tags[i]; -	if(!loadprops(c)) +	if(!getprops(c))  		applyrules(c);  	if(!c->isfloating)  		c->isfloating = (rettrans == Success) || c->isfixed; -	saveprops(c); +	setprops(c);  	attach(c);  	attachstack(c);  	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 -saveprops(Client *c) { +setprops(Client *c) {  	unsigned int i;  	for(i = 0; i < ntags && i < sizeof prop - 1; i++) @@ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11  # flags  CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"  LDFLAGS = -s ${LIBS} -CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" -LDFLAGS = -g ${LIBS} +#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" +#LDFLAGS = -g ${LIBS}  # Solaris  #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" @@ -96,11 +96,11 @@ void configure(Client *c);		/* send synthetic configure event */  void detach(Client *c);			/* detaches c from global client list */  void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */  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 resize(Client *c, int x, int y,  		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 unmanage(Client *c, long state);	/* unmanage 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 */  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 */  Bool gettextprop(Window w, Atom atom,  		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 */  int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ -/* tag.c */ +/* screen.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 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 */ +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 togglebar(const char *arg);	/* shows/hides the bar */  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 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 */ @@ -206,7 +206,7 @@ setup(void) {  		XSetFont(dpy, dc.gc, dc.font.xfont->fid);  	/* multihead support */  	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. */  #include "dwm.h" +#include <regex.h> +#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <X11/Xatom.h> @@ -12,9 +14,35 @@ typedef struct {  	void (*arrange)(void);  } Layout; -unsigned int blw = 0; -static char prop[128]; +typedef struct { +	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 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  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);  } -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  /* 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  arrange(void) {  	Client *c; @@ -46,6 +118,33 @@ arrange(void) {  }  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  focusnext(const char *arg) {  	Client *c; @@ -83,6 +182,18 @@ getsymbol(void)  	return layouts[ltidx].symbol;  } +void +initlayouts(void) { +	unsigned int i, w; + +	nlayouts = sizeof layouts / sizeof layouts[0]; +	for(blw = i = 0; i < nlayouts; i++) { +		w = textw(layouts[i].symbol); +		if(w > blw) +			blw = w; +	} +} +  Bool  isfloating(void) {  	return layouts[ltidx].arrange == floating; @@ -94,20 +205,18 @@ isarrange(void (*func)())  	return func == layouts[ltidx].arrange;  } -void -initlayouts(void) { -	unsigned int i, w; +Bool +isvisible(Client *c) { +	unsigned int i; -	nlayouts = sizeof layouts / sizeof layouts[0]; -	for(blw = i = 0; i < nlayouts; i++) { -		w = textw(layouts[i].symbol); -		if(w > blw) -			blw = w; -	} +	for(i = 0; i < ntags; i++) +		if(c->tags[i] && seltags[i]) +			return True; +	return False;  }  void -loaddwmprops(void) { +getdwmprops(void) {  	unsigned int i;  	if(gettextprop(root, dwmprops, prop, sizeof prop)) { @@ -156,19 +265,6 @@ restack(void) {  }  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  setlayout(const char *arg) {  	int i; @@ -186,7 +282,22 @@ setlayout(const char *arg) {  		arrange();  	else  		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 @@ -200,6 +311,18 @@ togglebar(const char *arg) {  }  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  togglemax(const char *arg) {  	XEvent ev; @@ -217,3 +340,44 @@ togglemax(const char *arg) {  	drawstatus();  	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(); +} @@ -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(); -} | 
