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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								client.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -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}\"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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 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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +117,33 @@ arrange(void) {
 | 
			
		|||
	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
 | 
			
		||||
focusnext(const char *arg) {
 | 
			
		||||
	Client *c;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,17 +182,6 @@ getsymbol(void)
 | 
			
		|||
	return layouts[ltidx].symbol;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
isfloating(void) {
 | 
			
		||||
	return layouts[ltidx].arrange == floating;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
isarrange(void (*func)())
 | 
			
		||||
{
 | 
			
		||||
	return func == layouts[ltidx].arrange;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
initlayouts(void) {
 | 
			
		||||
	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
 | 
			
		||||
loaddwmprops(void) {
 | 
			
		||||
getdwmprops(void) {
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
 | 
			
		||||
	if(gettextprop(root, dwmprops, prop, sizeof prop)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -155,19 +264,6 @@ restack(void) {
 | 
			
		|||
	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
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			@ -199,6 +310,18 @@ togglebar(const char *arg) {
 | 
			
		|||
	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
 | 
			
		||||
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();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										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…
	
		Reference in New Issue
	
	Block a user