|  | @@ -43,13 +43,199 @@
 | 
	
		
			
				|  |  |  #include <X11/Xproto.h>
 | 
	
		
			
				|  |  |  #include <X11/Xutil.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#include "dwm.h"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /* macros */
 | 
	
		
			
				|  |  |  #define BUTTONMASK		(ButtonPressMask | ButtonReleaseMask)
 | 
	
		
			
				|  |  |  #define CLEANMASK(mask)		(mask & ~(numlockmask | LockMask))
 | 
	
		
			
				|  |  |  #define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/* enums */
 | 
	
		
			
				|  |  | +enum { BarTop, BarBot, BarOff };			/* bar position */
 | 
	
		
			
				|  |  | +enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */
 | 
	
		
			
				|  |  | +enum { ColBorder, ColFG, ColBG, ColLast };		/* color */
 | 
	
		
			
				|  |  | +enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
 | 
	
		
			
				|  |  | +enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* typedefs */
 | 
	
		
			
				|  |  | +typedef struct Client Client;
 | 
	
		
			
				|  |  | +struct Client {
 | 
	
		
			
				|  |  | +	char name[256];
 | 
	
		
			
				|  |  | +	int x, y, w, h;
 | 
	
		
			
				|  |  | +	int rx, ry, rw, rh; /* revert geometry */
 | 
	
		
			
				|  |  | +	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 | 
	
		
			
				|  |  | +	int minax, maxax, minay, maxay;
 | 
	
		
			
				|  |  | +	long flags;
 | 
	
		
			
				|  |  | +	unsigned int border, oldborder;
 | 
	
		
			
				|  |  | +	Bool isbanned, isfixed, ismax, isfloating, wasfloating;
 | 
	
		
			
				|  |  | +	Bool *tags;
 | 
	
		
			
				|  |  | +	Client *next;
 | 
	
		
			
				|  |  | +	Client *prev;
 | 
	
		
			
				|  |  | +	Client *snext;
 | 
	
		
			
				|  |  | +	Window win;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +typedef struct {
 | 
	
		
			
				|  |  | +	int x, y, w, h;
 | 
	
		
			
				|  |  | +	unsigned long norm[ColLast];
 | 
	
		
			
				|  |  | +	unsigned long sel[ColLast];
 | 
	
		
			
				|  |  | +	Drawable drawable;
 | 
	
		
			
				|  |  | +	GC gc;
 | 
	
		
			
				|  |  | +	struct {
 | 
	
		
			
				|  |  | +		int ascent;
 | 
	
		
			
				|  |  | +		int descent;
 | 
	
		
			
				|  |  | +		int height;
 | 
	
		
			
				|  |  | +		XFontSet set;
 | 
	
		
			
				|  |  | +		XFontStruct *xfont;
 | 
	
		
			
				|  |  | +	} font;
 | 
	
		
			
				|  |  | +} DC; /* draw context */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +typedef struct {
 | 
	
		
			
				|  |  | +	unsigned long mod;
 | 
	
		
			
				|  |  | +	KeySym keysym;
 | 
	
		
			
				|  |  | +	void (*func)(const char *arg);
 | 
	
		
			
				|  |  | +	const char *arg;
 | 
	
		
			
				|  |  | +} Key;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +typedef struct {
 | 
	
		
			
				|  |  | +	const char *symbol;
 | 
	
		
			
				|  |  | +	void (*arrange)(void);
 | 
	
		
			
				|  |  | +} Layout;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +typedef struct {
 | 
	
		
			
				|  |  | +	const char *prop;
 | 
	
		
			
				|  |  | +	const char *tags;
 | 
	
		
			
				|  |  | +	Bool isfloating;
 | 
	
		
			
				|  |  | +} Rule;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +typedef struct {
 | 
	
		
			
				|  |  | +	regex_t *propregex;
 | 
	
		
			
				|  |  | +	regex_t *tagregex;
 | 
	
		
			
				|  |  | +} Regs;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* functions */
 | 
	
		
			
				|  |  | +void applyrules(Client *c);
 | 
	
		
			
				|  |  | +void arrange(void);
 | 
	
		
			
				|  |  | +void attach(Client *c);
 | 
	
		
			
				|  |  | +void attachstack(Client *c);
 | 
	
		
			
				|  |  | +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);
 | 
	
		
			
				|  |  | +void destroynotify(XEvent *e);
 | 
	
		
			
				|  |  | +void detach(Client *c);
 | 
	
		
			
				|  |  | +void detachstack(Client *c);
 | 
	
		
			
				|  |  | +void drawbar(void);
 | 
	
		
			
				|  |  | +void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
 | 
	
		
			
				|  |  | +void drawtext(const char *text, unsigned long col[ColLast]);
 | 
	
		
			
				|  |  | +void *emallocz(unsigned int size);
 | 
	
		
			
				|  |  | +void enternotify(XEvent *e);
 | 
	
		
			
				|  |  | +void eprint(const char *errstr, ...);
 | 
	
		
			
				|  |  | +void expose(XEvent *e);
 | 
	
		
			
				|  |  | +void floating(void); /* default floating layout */
 | 
	
		
			
				|  |  | +void focus(Client *c);
 | 
	
		
			
				|  |  | +void focusnext(const char *arg);
 | 
	
		
			
				|  |  | +void focusprev(const char *arg);
 | 
	
		
			
				|  |  | +Client *getclient(Window w);
 | 
	
		
			
				|  |  | +unsigned long getcolor(const char *colstr);
 | 
	
		
			
				|  |  | +long getstate(Window w);
 | 
	
		
			
				|  |  | +Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 | 
	
		
			
				|  |  | +void grabbuttons(Client *c, Bool focused);
 | 
	
		
			
				|  |  | +unsigned int idxoftag(const char *tag);
 | 
	
		
			
				|  |  | +void initfont(const char *fontstr);
 | 
	
		
			
				|  |  | +Bool isarrange(void (*func)());
 | 
	
		
			
				|  |  | +Bool isoccupied(unsigned int t);
 | 
	
		
			
				|  |  | +Bool isprotodel(Client *c);
 | 
	
		
			
				|  |  | +Bool isvisible(Client *c);
 | 
	
		
			
				|  |  | +void keypress(XEvent *e);
 | 
	
		
			
				|  |  | +void killclient(const char *arg);
 | 
	
		
			
				|  |  | +void leavenotify(XEvent *e);
 | 
	
		
			
				|  |  | +void manage(Window w, XWindowAttributes *wa);
 | 
	
		
			
				|  |  | +void mappingnotify(XEvent *e);
 | 
	
		
			
				|  |  | +void maprequest(XEvent *e);
 | 
	
		
			
				|  |  | +void movemouse(Client *c);
 | 
	
		
			
				|  |  | +Client *nexttiled(Client *c);
 | 
	
		
			
				|  |  | +void propertynotify(XEvent *e);
 | 
	
		
			
				|  |  | +void quit(const char *arg);
 | 
	
		
			
				|  |  | +void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
 | 
	
		
			
				|  |  | +void resizemouse(Client *c);
 | 
	
		
			
				|  |  | +void restack(void);
 | 
	
		
			
				|  |  | +void run(void);
 | 
	
		
			
				|  |  | +void scan(void);
 | 
	
		
			
				|  |  | +void setclientstate(Client *c, long state);
 | 
	
		
			
				|  |  | +void setlayout(const char *arg);
 | 
	
		
			
				|  |  | +void setmwfact(const char *arg);
 | 
	
		
			
				|  |  | +void setup(void);
 | 
	
		
			
				|  |  | +void spawn(const char *arg);
 | 
	
		
			
				|  |  | +void tag(const char *arg);
 | 
	
		
			
				|  |  | +unsigned int textnw(const char *text, unsigned int len);
 | 
	
		
			
				|  |  | +unsigned int textw(const char *text);
 | 
	
		
			
				|  |  | +void tile(void);
 | 
	
		
			
				|  |  | +void togglebar(const char *arg);
 | 
	
		
			
				|  |  | +void togglefloating(const char *arg);
 | 
	
		
			
				|  |  | +void togglemax(const char *arg);
 | 
	
		
			
				|  |  | +void toggletag(const char *arg);
 | 
	
		
			
				|  |  | +void toggleview(const char *arg);
 | 
	
		
			
				|  |  | +void unban(Client *c);
 | 
	
		
			
				|  |  | +void unmanage(Client *c);
 | 
	
		
			
				|  |  | +void unmapnotify(XEvent *e);
 | 
	
		
			
				|  |  | +void updatebarpos(void);
 | 
	
		
			
				|  |  | +void updatesizehints(Client *c);
 | 
	
		
			
				|  |  | +void updatetitle(Client *c);
 | 
	
		
			
				|  |  | +void view(const char *arg);
 | 
	
		
			
				|  |  | +void viewprevtag(const char *arg);	/* views previous selected tags */
 | 
	
		
			
				|  |  | +int xerror(Display *dpy, XErrorEvent *ee);
 | 
	
		
			
				|  |  | +int xerrordummy(Display *dsply, XErrorEvent *ee);
 | 
	
		
			
				|  |  | +int xerrorstart(Display *dsply, XErrorEvent *ee);
 | 
	
		
			
				|  |  | +void zoom(const char *arg);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* variables */
 | 
	
		
			
				|  |  | +char stext[256];
 | 
	
		
			
				|  |  | +double mwfact;
 | 
	
		
			
				|  |  | +int screen, sx, sy, sw, sh, wax, way, waw, wah;
 | 
	
		
			
				|  |  | +int (*xerrorxlib)(Display *, XErrorEvent *);
 | 
	
		
			
				|  |  | +unsigned int bh, bpos;
 | 
	
		
			
				|  |  | +unsigned int blw = 0;
 | 
	
		
			
				|  |  | +unsigned int ltidx = 0; /* default */
 | 
	
		
			
				|  |  | +unsigned int nlayouts = 0;
 | 
	
		
			
				|  |  | +unsigned int nrules = 0;
 | 
	
		
			
				|  |  | +unsigned int numlockmask = 0;
 | 
	
		
			
				|  |  | +void (*handler[LASTEvent]) (XEvent *) = {
 | 
	
		
			
				|  |  | +	[ButtonPress] = buttonpress,
 | 
	
		
			
				|  |  | +	[ConfigureRequest] = configurerequest,
 | 
	
		
			
				|  |  | +	[ConfigureNotify] = configurenotify,
 | 
	
		
			
				|  |  | +	[DestroyNotify] = destroynotify,
 | 
	
		
			
				|  |  | +	[EnterNotify] = enternotify,
 | 
	
		
			
				|  |  | +	[LeaveNotify] = leavenotify,
 | 
	
		
			
				|  |  | +	[Expose] = expose,
 | 
	
		
			
				|  |  | +	[KeyPress] = keypress,
 | 
	
		
			
				|  |  | +	[MappingNotify] = mappingnotify,
 | 
	
		
			
				|  |  | +	[MapRequest] = maprequest,
 | 
	
		
			
				|  |  | +	[PropertyNotify] = propertynotify,
 | 
	
		
			
				|  |  | +	[UnmapNotify] = unmapnotify
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +Atom wmatom[WMLast], netatom[NetLast];
 | 
	
		
			
				|  |  | +Bool otherwm, readin;
 | 
	
		
			
				|  |  | +Bool running = True;
 | 
	
		
			
				|  |  | +Bool selscreen = True;
 | 
	
		
			
				|  |  | +Client *clients = NULL;
 | 
	
		
			
				|  |  | +Client *sel = NULL;
 | 
	
		
			
				|  |  | +Client *stack = NULL;
 | 
	
		
			
				|  |  | +Cursor cursor[CurLast];
 | 
	
		
			
				|  |  | +Display *dpy;
 | 
	
		
			
				|  |  | +DC dc = {0};
 | 
	
		
			
				|  |  | +Window barwin, root;
 | 
	
		
			
				|  |  | +Regs *regs = NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* configuration, allows nested code to access above variables */
 | 
	
		
			
				|  |  | +#include "config.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* statically define the number of tags. */
 | 
	
		
			
				|  |  | +unsigned int ntags = sizeof tags / sizeof tags[0];
 | 
	
		
			
				|  |  | +Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
 | 
	
		
			
				|  |  | +Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  applyrules(Client *c) {
 | 
	
		
			
				|  |  |  	static char buf[512];
 |