-/* 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;
- 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 */
-
-static void applyrules(Client *c);
-static void arrange(void);
-static void attach(Client *c);
-static void attachstack(Client *c);
-static void ban(Client *c);
-static void buttonpress(XEvent *e);
-static void cleanup(void);
-static void compileregs(void);
-static void configure(Client *c);
-static void configurenotify(XEvent *e);
-static void configurerequest(XEvent *e);
-static void destroynotify(XEvent *e);
-static void detach(Client *c);
-static void detachstack(Client *c);
-static void drawbar(void);
-static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
-static void drawtext(const char *text, unsigned long col[ColLast]);
-static void *emallocz(unsigned int size);
-static void enternotify(XEvent *e);
-static void eprint(const char *errstr, ...);
-static void expose(XEvent *e);
-static void floating(void); /* default floating layout */
-static void focus(Client *c);
-static void focusnext(const char *arg);
-static void focusprev(const char *arg);
-static Client *getclient(Window w);
-static long getstate(Window w);
-static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
-static void grabbuttons(Client *c, Bool focused);
-static unsigned int idxoftag(const char *tag);
-static void initbar(void);
-static unsigned long initcolor(const char *colstr);
-static void initfont(const char *fontstr);
-static void initlayouts(void);
-static void initstyle(void);
-static Bool isarrange(void (*func)());
-static Bool isfloating(void);
-static Bool isoccupied(unsigned int t);
-static Bool isprotodel(Client *c);
-static Bool isvisible(Client *c);
-static void keypress(XEvent *e);
-static void killclient(const char *arg);
-static void leavenotify(XEvent *e);
-static void manage(Window w, XWindowAttributes *wa);
-static void mappingnotify(XEvent *e);
-static void maprequest(XEvent *e);
-static void movemouse(Client *c);
-static Client *nexttiled(Client *c);
-static void propertynotify(XEvent *e);
-static void quit(const char *arg);
-static void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
-static void resizemouse(Client *c);
-static void restack(void);
-static void scan(void);
-static void setclientstate(Client *c, long state);
-static void setlayout(const char *arg);
-static void setmwfact(const char *arg);
-static void setup(void);
-static void spawn(const char *arg);
-static void tag(const char *arg);
-static unsigned int textnw(const char *text, unsigned int len);
-static unsigned int textw(const char *text);
-static void tile(void);
-static void togglebar(const char *arg);
-static void togglefloating(const char *arg);
-static void togglemax(const char *arg);
-static void toggletag(const char *arg);
-static void toggleview(const char *arg);
-static void unban(Client *c);
-static void unmanage(Client *c);
-static void unmapnotify(XEvent *e);
-static void updatebarpos(void);
-static void updatesizehints(Client *c);
-static void updatetitle(Client *c);
-static void view(const char *arg);
-static int xerror(Display *dpy, XErrorEvent *ee);
-static int xerrordummy(Display *dsply, XErrorEvent *ee);
-static int xerrorstart(Display *dsply, XErrorEvent *ee);
-static void zoom(const char *arg);
-
-/* variables */
-static char stext[256];
-static double mwfact;
-static int screen, sx, sy, sw, sh, wax, way, waw, wah;
-static int (*xerrorxlib)(Display *, XErrorEvent *);
-static unsigned int bh, bpos, ntags;
-static unsigned int blw = 0;
-static unsigned int ltidx = 0; /* default */
-static unsigned int nlayouts = 0;
-static unsigned int nrules = 0;
-static unsigned int numlockmask = 0;
-static 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
-};
-static Atom wmatom[WMLast], netatom[NetLast];
-static Bool otherwm, readin;
-static Bool running = True;
-static Bool *seltags;
-static Bool selscreen = True;
-static Client *clients = NULL;
-static Client *sel = NULL;
-static Client *stack = NULL;
-static Cursor cursor[CurLast];
-static Display *dpy;
-static DC dc = {0};
-static Window barwin, root;
-static Regs *regs = NULL;
-
-/* configuration, allows nested code to work on above variables */
-#include "config.h"
-
-static void
-eprint(const char *errstr, ...) {
- va_list ap;