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
 | 
					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}
 | 
					OBJ = ${SRC:.c=.o}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: options dwm
 | 
					all: options dwm
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								client.c
								
								
								
								
							
							
						
						
									
										8
									
								
								client.c
								
								
								
								
							| 
						 | 
					@ -182,7 +182,7 @@ killclient(const char *arg) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					Bool
 | 
				
			||||||
loadprops(Client *c) {
 | 
					getprops(Client *c) {
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
	Bool result = False;
 | 
						Bool result = False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -242,11 +242,11 @@ manage(Window w, XWindowAttributes *wa) {
 | 
				
			||||||
	if(t)
 | 
						if(t)
 | 
				
			||||||
		for(i = 0; i < ntags; i++)
 | 
							for(i = 0; i < ntags; i++)
 | 
				
			||||||
			c->tags[i] = t->tags[i];
 | 
								c->tags[i] = t->tags[i];
 | 
				
			||||||
	if(!loadprops(c))
 | 
						if(!getprops(c))
 | 
				
			||||||
		applyrules(c);
 | 
							applyrules(c);
 | 
				
			||||||
	if(!c->isfloating)
 | 
						if(!c->isfloating)
 | 
				
			||||||
		c->isfloating = (rettrans == Success) || c->isfixed;
 | 
							c->isfloating = (rettrans == Success) || c->isfixed;
 | 
				
			||||||
	saveprops(c);
 | 
						setprops(c);
 | 
				
			||||||
	attach(c);
 | 
						attach(c);
 | 
				
			||||||
	attachstack(c);
 | 
						attachstack(c);
 | 
				
			||||||
	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */
 | 
						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
 | 
					void
 | 
				
			||||||
saveprops(Client *c) {
 | 
					setprops(Client *c) {
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(i = 0; i < ntags && i < sizeof prop - 1; i++)
 | 
						for(i = 0; i < ntags && i < sizeof prop - 1; i++)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
 | 
				
			||||||
# flags
 | 
					# flags
 | 
				
			||||||
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 | 
					CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 | 
				
			||||||
LDFLAGS = -s ${LIBS}
 | 
					LDFLAGS = -s ${LIBS}
 | 
				
			||||||
CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | 
					#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | 
				
			||||||
LDFLAGS = -g ${LIBS}
 | 
					#LDFLAGS = -g ${LIBS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Solaris
 | 
					# Solaris
 | 
				
			||||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | 
					#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 detach(Client *c);			/* detaches c from global client list */
 | 
				
			||||||
void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */
 | 
					void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */
 | 
				
			||||||
void killclient(const char *arg);	/* kill sel  nicely */
 | 
					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 manage(Window w, XWindowAttributes *wa);	/* manage new client */
 | 
				
			||||||
void resize(Client *c, int x, int y,
 | 
					void resize(Client *c, int x, int y,
 | 
				
			||||||
		int w, int h, Bool sizehints);	/* resize with given coordinates c*/
 | 
							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 unban(Client *c);			/* unbans c */
 | 
				
			||||||
void unmanage(Client *c, long state);	/* unmanage c */
 | 
					void unmanage(Client *c, long state);	/* unmanage c */
 | 
				
			||||||
void updatesizehints(Client *c);	/* update the size hint variables of 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 */
 | 
					/* event.c */
 | 
				
			||||||
void grabkeys(void);			/* grab all keys defined in config.h */
 | 
					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 */
 | 
					/* main.c */
 | 
				
			||||||
Bool gettextprop(Window w, Atom atom,
 | 
					Bool gettextprop(Window w, Atom atom,
 | 
				
			||||||
		char *text, unsigned int size); /* return text property, UTF-8 compliant */
 | 
							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 */
 | 
					void quit(const char *arg);		/* quit dwm nicely */
 | 
				
			||||||
int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */
 | 
					int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* tag.c */
 | 
					/* screen.c */
 | 
				
			||||||
void applyrules(Client *c);		/* applies rules to 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 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 */
 | 
					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 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 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 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 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 */
 | 
					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);
 | 
							XSetFont(dpy, dc.gc, dc.font.xfont->fid);
 | 
				
			||||||
	/* multihead support */
 | 
						/* multihead support */
 | 
				
			||||||
	selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
 | 
						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. */
 | 
					/* See LICENSE file for copyright and license details. */
 | 
				
			||||||
#include "dwm.h"
 | 
					#include "dwm.h"
 | 
				
			||||||
 | 
					#include <regex.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <X11/Xatom.h>
 | 
					#include <X11/Xatom.h>
 | 
				
			||||||
| 
						 | 
					@ -12,9 +14,35 @@ typedef struct {
 | 
				
			||||||
	void (*arrange)(void);
 | 
						void (*arrange)(void);
 | 
				
			||||||
} Layout;
 | 
					} Layout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned int blw = 0;
 | 
					typedef struct {
 | 
				
			||||||
static char prop[128];
 | 
						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 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
 | 
					static void
 | 
				
			||||||
floating(void) { /* default floating layout */
 | 
					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);
 | 
								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
 | 
					LAYOUTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* extern */
 | 
					/* 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
 | 
					void
 | 
				
			||||||
arrange(void) {
 | 
					arrange(void) {
 | 
				
			||||||
	Client *c;
 | 
						Client *c;
 | 
				
			||||||
| 
						 | 
					@ -45,6 +117,33 @@ arrange(void) {
 | 
				
			||||||
	restack();
 | 
						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
 | 
					void
 | 
				
			||||||
focusnext(const char *arg) {
 | 
					focusnext(const char *arg) {
 | 
				
			||||||
	Client *c;
 | 
						Client *c;
 | 
				
			||||||
| 
						 | 
					@ -83,17 +182,6 @@ getsymbol(void)
 | 
				
			||||||
	return layouts[ltidx].symbol;
 | 
						return layouts[ltidx].symbol;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
isfloating(void) {
 | 
					 | 
				
			||||||
	return layouts[ltidx].arrange == floating;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
isarrange(void (*func)())
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return func == layouts[ltidx].arrange;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
initlayouts(void) {
 | 
					initlayouts(void) {
 | 
				
			||||||
	unsigned int i, w;
 | 
						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
 | 
					void
 | 
				
			||||||
loaddwmprops(void) {
 | 
					getdwmprops(void) {
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(gettextprop(root, dwmprops, prop, sizeof prop)) {
 | 
						if(gettextprop(root, dwmprops, prop, sizeof prop)) {
 | 
				
			||||||
| 
						 | 
					@ -155,19 +264,6 @@ restack(void) {
 | 
				
			||||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						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
 | 
					void
 | 
				
			||||||
setlayout(const char *arg) {
 | 
					setlayout(const char *arg) {
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
| 
						 | 
					@ -186,7 +282,22 @@ setlayout(const char *arg) {
 | 
				
			||||||
		arrange();
 | 
							arrange();
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		drawstatus();
 | 
							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
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -199,6 +310,18 @@ togglebar(const char *arg) {
 | 
				
			||||||
	arrange();
 | 
						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
 | 
					void
 | 
				
			||||||
togglemax(const char *arg) {
 | 
					togglemax(const char *arg) {
 | 
				
			||||||
	XEvent ev;
 | 
						XEvent ev;
 | 
				
			||||||
| 
						 | 
					@ -217,3 +340,44 @@ togglemax(const char *arg) {
 | 
				
			||||||
	drawstatus();
 | 
						drawstatus();
 | 
				
			||||||
	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						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