simplified dwm
This commit is contained in:
		
							parent
							
								
									2bfd3fffbf
								
							
						
					
					
						commit
						d5178292ed
					
				| 
						 | 
				
			
			@ -15,8 +15,8 @@
 | 
			
		|||
const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
 | 
			
		||||
int initags[LENGTH(tags)]    = { [0] = 1 };
 | 
			
		||||
Rule rules[] = {
 | 
			
		||||
	/* class:instance:title regex	tags regex	isfloating */
 | 
			
		||||
	{ "Firefox",			"www",		False },
 | 
			
		||||
	/* class:instance:title substr	tags ref	isfloating */
 | 
			
		||||
	{ "Firefox",			tags[8],	False },
 | 
			
		||||
	{ "Gimp",			NULL,		True },
 | 
			
		||||
	{ "MPlayer",			NULL,		True },
 | 
			
		||||
	{ "Acroread",			NULL,		True },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama
 | 
			
		|||
# flags
 | 
			
		||||
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 | 
			
		||||
LDFLAGS = -s ${LIBS}
 | 
			
		||||
CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | 
			
		||||
CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"  -DAIM_XINERAMA
 | 
			
		||||
LDFLAGS = -g ${LIBS}
 | 
			
		||||
 | 
			
		||||
# Solaris
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										174
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										174
									
								
								dwm.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -106,15 +106,10 @@ typedef struct {
 | 
			
		|||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	const char *prop;
 | 
			
		||||
	const char *tags;
 | 
			
		||||
	const char *tag;
 | 
			
		||||
	Bool isfloating;
 | 
			
		||||
} Rule;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	regex_t *propregex;
 | 
			
		||||
	regex_t *tagregex;
 | 
			
		||||
} Regs;
 | 
			
		||||
 | 
			
		||||
struct View {
 | 
			
		||||
	int id;
 | 
			
		||||
	int x, y, w, h, wax, way, wah, waw;
 | 
			
		||||
| 
						 | 
				
			
			@ -132,7 +127,6 @@ void ban(Client *c);
 | 
			
		|||
void buttonpress(XEvent *e);
 | 
			
		||||
void checkotherwm(void);
 | 
			
		||||
void cleanup(void);
 | 
			
		||||
void compileregs(void);
 | 
			
		||||
void configure(Client *c);
 | 
			
		||||
void configurenotify(XEvent *e);
 | 
			
		||||
void configurerequest(XEvent *e);
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +204,7 @@ void zoom(const char *arg);
 | 
			
		|||
void selectview(const char *arg);
 | 
			
		||||
 | 
			
		||||
/* variables */
 | 
			
		||||
char stext[256];
 | 
			
		||||
char stext[256], buf[256];
 | 
			
		||||
int nviews = 1;
 | 
			
		||||
View *selview;
 | 
			
		||||
int screen;
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +240,6 @@ Client *stack = NULL;
 | 
			
		|||
Cursor cursor[CurLast];
 | 
			
		||||
Display *dpy;
 | 
			
		||||
DC dc = {0};
 | 
			
		||||
Regs *regs = NULL;
 | 
			
		||||
View *views;
 | 
			
		||||
Window root;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -256,10 +249,9 @@ Window root;
 | 
			
		|||
/* function implementations */
 | 
			
		||||
void
 | 
			
		||||
applyrules(Client *c) {
 | 
			
		||||
	static char buf[512];
 | 
			
		||||
	unsigned int i, j;
 | 
			
		||||
	regmatch_t tmp;
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	Bool matched_tag = False;
 | 
			
		||||
	Rule *r;
 | 
			
		||||
	XClassHint ch = { 0 };
 | 
			
		||||
 | 
			
		||||
	/* rule matching */
 | 
			
		||||
| 
						 | 
				
			
			@ -267,16 +259,19 @@ applyrules(Client *c) {
 | 
			
		|||
	snprintf(buf, sizeof buf, "%s:%s:%s",
 | 
			
		||||
			ch.res_class ? ch.res_class : "",
 | 
			
		||||
			ch.res_name ? ch.res_name : "", c->name);
 | 
			
		||||
	for(i = 0; i < LENGTH(rules); i++)
 | 
			
		||||
		if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) {
 | 
			
		||||
			c->isfloating = rules[i].isfloating;
 | 
			
		||||
			for(j = 0; regs[i].tagregex && j < LENGTH(tags); j++) {
 | 
			
		||||
				if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) {
 | 
			
		||||
					matched_tag = True;
 | 
			
		||||
					c->tags[j] = selview->id;
 | 
			
		||||
				}
 | 
			
		||||
	for(i = 0; i < LENGTH(rules); i++) {
 | 
			
		||||
		r = &rules[i];
 | 
			
		||||
		if(strstr(c->name, r->prop)
 | 
			
		||||
		|| (ch.res_class && strstr(ch.res_class, r->prop))
 | 
			
		||||
		|| (ch.res_name && strstr(ch.res_name, r->prop)))
 | 
			
		||||
		{
 | 
			
		||||
			c->isfloating = r->isfloating;
 | 
			
		||||
			if(r->tag) {
 | 
			
		||||
				matched_tag = True;
 | 
			
		||||
				c->tags[idxoftag(r->tag)] = selview->id;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ch.res_class)
 | 
			
		||||
		XFree(ch.res_class);
 | 
			
		||||
	if(ch.res_name)
 | 
			
		||||
| 
						 | 
				
			
			@ -420,32 +415,6 @@ cleanup(void) {
 | 
			
		|||
	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
compileregs(void) {
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	regex_t *reg;
 | 
			
		||||
 | 
			
		||||
	if(regs)
 | 
			
		||||
		return;
 | 
			
		||||
	regs = emallocz(LENGTH(rules) * sizeof(Regs));
 | 
			
		||||
	for(i = 0; i < LENGTH(rules); 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
 | 
			
		||||
configure(Client *c) {
 | 
			
		||||
	XConfigureEvent ce;
 | 
			
		||||
| 
						 | 
				
			
			@ -624,7 +593,6 @@ drawsquare(View *v, Bool filled, Bool empty, Bool invert, unsigned long col[ColL
 | 
			
		|||
void
 | 
			
		||||
drawtext(View *v, const char *text, unsigned long col[ColLast], Bool invert) {
 | 
			
		||||
	int x, y, w, h;
 | 
			
		||||
	static char buf[256];
 | 
			
		||||
	unsigned int len, olen;
 | 
			
		||||
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1147,21 +1115,6 @@ maprequest(XEvent *e) {
 | 
			
		|||
		manage(ev->window, &wa);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
View *
 | 
			
		||||
viewat() {
 | 
			
		||||
	int i, x, y;
 | 
			
		||||
	Window win;
 | 
			
		||||
	unsigned int mask;
 | 
			
		||||
 | 
			
		||||
	XQueryPointer(dpy, root, &win, &win, &x, &y, &i, &i, &mask);
 | 
			
		||||
	for(i = 0; i < nviews; i++) {
 | 
			
		||||
		if((x >= views[i].x && x < views[i].x + views[i].w)
 | 
			
		||||
		&& (y >= views[i].y && y < views[i].y + views[i].h))
 | 
			
		||||
			return &views[i];
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
movemouse(Client *c) {
 | 
			
		||||
	int x1, y1, ocx, ocy, di, nx, ny;
 | 
			
		||||
| 
						 | 
				
			
			@ -1406,7 +1359,7 @@ restack(View *v) {
 | 
			
		|||
void
 | 
			
		||||
run(void) {
 | 
			
		||||
	char *p;
 | 
			
		||||
	char buf[sizeof stext];
 | 
			
		||||
	char sbuf[sizeof stext];
 | 
			
		||||
	fd_set rd;
 | 
			
		||||
	int r, xfd;
 | 
			
		||||
	unsigned int len, offset;
 | 
			
		||||
| 
						 | 
				
			
			@ -1418,7 +1371,7 @@ run(void) {
 | 
			
		|||
	readin = True;
 | 
			
		||||
	offset = 0;
 | 
			
		||||
	len = sizeof stext - 1;
 | 
			
		||||
	buf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
 | 
			
		||||
	sbuf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
 | 
			
		||||
	while(running) {
 | 
			
		||||
		FD_ZERO(&rd);
 | 
			
		||||
		if(readin)
 | 
			
		||||
| 
						 | 
				
			
			@ -1430,7 +1383,7 @@ run(void) {
 | 
			
		|||
			eprint("select failed\n");
 | 
			
		||||
		}
 | 
			
		||||
		if(FD_ISSET(STDIN_FILENO, &rd)) {
 | 
			
		||||
			switch((r = read(STDIN_FILENO, buf + offset, len - offset))) {
 | 
			
		||||
			switch((r = read(STDIN_FILENO, sbuf + offset, len - offset))) {
 | 
			
		||||
			case -1:
 | 
			
		||||
				strncpy(stext, strerror(errno), len);
 | 
			
		||||
				readin = False;
 | 
			
		||||
| 
						 | 
				
			
			@ -1440,15 +1393,15 @@ run(void) {
 | 
			
		|||
				readin = False;
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				for(p = buf + offset; r > 0; p++, r--, offset++)
 | 
			
		||||
				for(p = sbuf + offset; r > 0; p++, r--, offset++)
 | 
			
		||||
					if(*p == '\n' || *p == '\0') {
 | 
			
		||||
						*p = '\0';
 | 
			
		||||
						strncpy(stext, buf, len);
 | 
			
		||||
						p += r - 1; /* p is buf + offset + r - 1 */
 | 
			
		||||
						strncpy(stext, sbuf, len);
 | 
			
		||||
						p += r - 1; /* p is sbuf + offset + r - 1 */
 | 
			
		||||
						for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
 | 
			
		||||
						offset = r;
 | 
			
		||||
						if(r)
 | 
			
		||||
							memmove(buf, p - r + 1, r);
 | 
			
		||||
							memmove(sbuf, p - r + 1, r);
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1666,9 +1619,6 @@ v->h = DisplayHeight(dpy, screen);
 | 
			
		|||
	/* grab keys */
 | 
			
		||||
	grabkeys();
 | 
			
		||||
 | 
			
		||||
	/* init tags */
 | 
			
		||||
	compileregs();
 | 
			
		||||
 | 
			
		||||
	selview = &views[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1950,6 +1900,46 @@ updatewmhints(Client *c) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
view(const char *arg) {
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	int tmp[LENGTH(tags)];
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < LENGTH(tags); i++)
 | 
			
		||||
		tmp[i] = (NULL == arg) ? selview->id : 0;
 | 
			
		||||
	tmp[idxoftag(arg)] = selview->id;
 | 
			
		||||
	if(memcmp(seltags, tmp, sizeof initags) != 0) {
 | 
			
		||||
		memcpy(prevtags, seltags, sizeof initags);
 | 
			
		||||
		memcpy(seltags, tmp, sizeof initags);
 | 
			
		||||
		arrange();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
View *
 | 
			
		||||
viewat() {
 | 
			
		||||
	int i, x, y;
 | 
			
		||||
	Window win;
 | 
			
		||||
	unsigned int mask;
 | 
			
		||||
 | 
			
		||||
	XQueryPointer(dpy, root, &win, &win, &x, &y, &i, &i, &mask);
 | 
			
		||||
	for(i = 0; i < nviews; i++) {
 | 
			
		||||
		if((x >= views[i].x && x < views[i].x + views[i].w)
 | 
			
		||||
		&& (y >= views[i].y && y < views[i].y + views[i].h))
 | 
			
		||||
			return &views[i];
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
viewprevtag(const char *arg) {
 | 
			
		||||
	static Bool tmp[LENGTH(tags)];
 | 
			
		||||
 | 
			
		||||
	memcpy(tmp, seltags, sizeof initags);
 | 
			
		||||
	memcpy(seltags, prevtags, sizeof initags);
 | 
			
		||||
	memcpy(prevtags, tmp, sizeof initags);
 | 
			
		||||
	arrange();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* There's no way to check accesses to destroyed windows, thus those cases are
 | 
			
		||||
 * ignored (especially on UnmapNotify's).  Other types of errors call Xlibs
 | 
			
		||||
 * default error handler, which may call exit.  */
 | 
			
		||||
| 
						 | 
				
			
			@ -1982,31 +1972,6 @@ xerrorstart(Display *dpy, XErrorEvent *ee) {
 | 
			
		|||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
view(const char *arg) {
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	int tmp[LENGTH(tags)];
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < LENGTH(tags); i++)
 | 
			
		||||
		tmp[i] = (NULL == arg) ? selview->id : 0;
 | 
			
		||||
	tmp[idxoftag(arg)] = selview->id;
 | 
			
		||||
	if(memcmp(seltags, tmp, sizeof initags) != 0) {
 | 
			
		||||
		memcpy(prevtags, seltags, sizeof initags);
 | 
			
		||||
		memcpy(seltags, tmp, sizeof initags);
 | 
			
		||||
		arrange();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
viewprevtag(const char *arg) {
 | 
			
		||||
	static Bool tmp[LENGTH(tags)];
 | 
			
		||||
 | 
			
		||||
	memcpy(tmp, seltags, sizeof initags);
 | 
			
		||||
	memcpy(seltags, prevtags, sizeof initags);
 | 
			
		||||
	memcpy(prevtags, tmp, sizeof initags);
 | 
			
		||||
	arrange();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
zoom(const char *arg) {
 | 
			
		||||
	Client *c = sel;
 | 
			
		||||
| 
						 | 
				
			
			@ -2022,21 +1987,6 @@ zoom(const char *arg) {
 | 
			
		|||
	arrange();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
selectview(const char *arg) {
 | 
			
		||||
	int i;
 | 
			
		||||
	View *v;
 | 
			
		||||
 | 
			
		||||
	if(!arg)
 | 
			
		||||
		return;
 | 
			
		||||
	if(arg)
 | 
			
		||||
		i = atoi(arg);
 | 
			
		||||
	v = &views[i % nviews];
 | 
			
		||||
	XWarpPointer(dpy, None, root, 0, 0, 0, 0, v->wax+v->waw/2, v->way+v->wah/2);
 | 
			
		||||
	focus(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char *argv[]) {
 | 
			
		||||
	if(argc == 2 && !strcmp("-v", argv[1]))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user