+#define MAX(a, b) ((a)>(b)?(a):(b))
+#define MIN(a, b) ((a)<(b)?(a):(b))
+#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
+#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask))
+#define LENGTH(x) (sizeof x / sizeof x[0])
+#define MAXTAGLEN 16
+#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
+#define DEFGEOM(GEONAME,BX,BY,BW,WX,WY,WW,WH,MX,MY,MW,MH,TX,TY,TW,TH,MOX,MOY,MOW,MOH) \
+void GEONAME(void) { \
+ bx = (BX); by = (BY); bw = (BW); \
+ wx = (WX); wy = (WY); ww = (WW); wh = (WH); \
+ mx = (MX); my = (MY); mw = (MW); mh = (MH); \
+ tx = (TX); ty = (TY); tw = (TW); th = (TH); \
+ mox = (MOX); moy = (MOY); mow = (MOW); moh = (MOH); \
+}
+
+/* enums */
+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 fx, fy, fw, fh;
+ int basew, baseh, incw, inch, maxw, maxh, minw, minh;
+ int minax, maxax, minay, maxay;
+ long flags;
+ unsigned int bw, oldbw;
+ Bool isbanned, isfixed, isfloating, isurgent;
+ 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 {
+ const char *symbol;
+ void (*apply)(void);
+} Geom;
+
+typedef struct {
+ unsigned long mod;
+ KeySym keysym;
+ void (*func)(const char *arg);
+ const char *arg;
+} Key;
+
+typedef struct {
+ const char *symbol;
+ void (*arrange)(void);
+ Bool isfloating;
+} Layout;
+
+typedef struct {
+ const char *class;
+ const char *instance;
+ const char *title;
+ const char *tag;
+ Bool isfloating;
+} Rule;
+
+/* function declarations */
+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 configure(Client *c);
+void configurenotify(XEvent *e);
+void configurerequest(XEvent *e);
+unsigned int counttiled(void);
+void destroynotify(XEvent *e);
+void detach(Client *c);
+void detachstack(Client *c);
+void drawbar(void);
+void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
+void *emallocz(unsigned int size);
+void enternotify(XEvent *e);
+void eprint(const char *errstr, ...);
+void expose(XEvent *e);
+void focus(Client *c);
+void focusin(XEvent *e);
+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);
+void grabkeys(void);
+unsigned int idxoftag(const char *t);
+void initfont(const char *fontstr);
+Bool isoccupied(unsigned int t);
+Bool isprotodel(Client *c);
+Bool isurgent(unsigned int t);
+Bool isvisible(Client *c);
+void keypress(XEvent *e);
+void killclient(const char *arg);
+void manage(Window w, XWindowAttributes *wa);
+void mappingnotify(XEvent *e);
+void maprequest(XEvent *e);
+void monocle(void);
+void movemouse(Client *c);
+Client *nexttiled(Client *c);
+void propertynotify(XEvent *e);
+void quit(const char *arg);
+void reapply(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 setgeom(const char *arg);
+void setlayout(const char *arg);
+void setmfact(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 tileh(void);
+void tilehstack(unsigned int n);
+Client *tilemaster(unsigned int n);
+void tileresize(Client *c, int x, int y, int w, int h);
+void tilev(void);
+void tilevstack(unsigned int n);
+void togglefloating(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 updatewmhints(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 *dpy, XErrorEvent *ee);
+int xerrorstart(Display *dpy, XErrorEvent *ee);
+void zoom(const char *arg);
+
+/* variables */
+char stext[256];
+int screen, sx, sy, sw, sh;
+int (*xerrorxlib)(Display *, XErrorEvent *);
+int bx, by, bw, bh, blw, bgw, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh;
+int seltags = 0;
+double mfact;
+unsigned int numlockmask = 0;
+void (*handler[LASTEvent]) (XEvent *) = {
+ [ButtonPress] = buttonpress,
+ [ConfigureRequest] = configurerequest,
+ [ConfigureNotify] = configurenotify,
+ [DestroyNotify] = destroynotify,
+ [EnterNotify] = enternotify,
+ [Expose] = expose,
+ [FocusIn] = focusin,
+ [KeyPress] = keypress,
+ [MappingNotify] = mappingnotify,
+ [MapRequest] = maprequest,
+ [PropertyNotify] = propertynotify,
+ [UnmapNotify] = unmapnotify
+};
+Atom wmatom[WMLast], netatom[NetLast];
+Bool otherwm, readin;
+Bool running = True;
+Bool *tagset[2];
+Client *clients = NULL;
+Client *sel = NULL;
+Client *stack = NULL;
+Cursor cursor[CurLast];
+Display *dpy;
+DC dc = {0};
+Geom geoms[];
+Geom *geom = geoms;
+Layout layouts[];
+Layout *lt = layouts;
+Window root, barwin;
+
+/* configuration, allows nested code to access above variables */
+#include "config.h"
+#define TAGSZ (LENGTH(tags) * sizeof(Bool))
+
+/* function implementations */