|  |  | @ -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]; | 
			
		
	
	
		
			
				
					|  |  | 
 |