about summary refs log tree commit diff stats
path: root/dwm.c
diff options
context:
space:
mode:
authorarg@suckless.org <unknown>2007-09-17 16:42:37 +0200
committerarg@suckless.org <unknown>2007-09-17 16:42:37 +0200
commitfe2775a15ba2d4900788c57194da2bad3d19cfaf (patch)
treea668f514f4169a26568a8c5d209f3fb510e2b177 /dwm.c
parent01022b95d65612462972bdd009896ba6fdd3063a (diff)
downloaddwm-fe2775a15ba2d4900788c57194da2bad3d19cfaf.tar.gz
made all stuff non-static - so you can choose wether to use dwm the static or the extern way when extending it
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c361
1 files changed, 179 insertions, 182 deletions
diff --git a/dwm.c b/dwm.c
index 2602ed2..726e797 100644
--- a/dwm.c
+++ b/dwm.c
@@ -21,10 +21,7 @@
  * creates a small title window, which is resized whenever the (_NET_)WM_NAME
  * properties are updated or the client is moved/resized.
  *
- * Keys and tagging rules are organized as arrays and defined in the config.h
- * file. These arrays are kept static in event.o and tag.o respectively,
- * because no other part of dwm needs access to them.  The current layout is
- * represented by the lt pointer.
+ * Keys and tagging rules are organized as arrays and defined in config.h.
  *
  * To understand everything else, start reading main().
  */
@@ -114,96 +111,96 @@ typedef struct {
 } Regs;
 
 /* forward declarations */
-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 checkotherwm(void);
-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 unsigned long getcolor(const char *colstr);
-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 initfont(const char *fontstr);
-static Bool isarrange(void (*func)());
-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 run(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);
+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);
+int xerror(Display *dpy, XErrorEvent *ee);
+int xerrordummy(Display *dsply, XErrorEvent *ee);
+int xerrorstart(Display *dsply, XErrorEvent *ee);
+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 *) = {
+char stext[256];
+double mwfact;
+int screen, sx, sy, sw, sh, wax, way, waw, wah;
+int (*xerrorxlib)(Display *, XErrorEvent *);
+unsigned int bh, bpos, ntags;
+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,
@@ -217,25 +214,25 @@ static void (*handler[LASTEvent]) (XEvent *) = {
 	[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;
+Atom wmatom[WMLast], netatom[NetLast];
+Bool otherwm, readin;
+Bool running = True;
+Bool *seltags;
+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"
 
 /* functions*/
-static void
+void
 applyrules(Client *c) {
 	static char buf[512];
 	unsigned int i, j;
@@ -267,7 +264,7 @@ applyrules(Client *c) {
 			c->tags[i] = seltags[i];
 }
 
-static void
+void
 arrange(void) {
 	Client *c;
 
@@ -281,7 +278,7 @@ arrange(void) {
 	restack();
 }
 
-static void
+void
 attach(Client *c) {
 	if(clients)
 		clients->prev = c;
@@ -289,13 +286,13 @@ attach(Client *c) {
 	clients = c;
 }
 
-static void
+void
 attachstack(Client *c) {
 	c->snext = stack;
 	stack = c;
 }
 
-static void
+void
 ban(Client *c) {
 	if(c->isbanned)
 		return;
@@ -303,7 +300,7 @@ ban(Client *c) {
 	c->isbanned = True;
 }
 
-static void
+void
 buttonpress(XEvent *e) {
 	unsigned int i, x;
 	Client *c;
@@ -359,7 +356,7 @@ buttonpress(XEvent *e) {
 	}
 }
 
-static void
+void
 checkotherwm(void) {
 	otherwm = False;
 	XSetErrorHandler(xerrorstart);
@@ -375,7 +372,7 @@ checkotherwm(void) {
 	XSync(dpy, False);
 }
 
-static void
+void
 cleanup(void) {
 	close(STDIN_FILENO);
 	while(stack) {
@@ -398,7 +395,7 @@ cleanup(void) {
 	free(seltags);
 }
 
-static void
+void
 compileregs(void) {
 	unsigned int i;
 	regex_t *reg;
@@ -425,7 +422,7 @@ compileregs(void) {
 	}
 }
 
-static void
+void
 configure(Client *c) {
 	XConfigureEvent ce;
 
@@ -443,7 +440,7 @@ configure(Client *c) {
 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
 }
 
-static void
+void
 configurenotify(XEvent *e) {
 	XConfigureEvent *ev = &e->xconfigure;
 
@@ -458,7 +455,7 @@ configurenotify(XEvent *e) {
 	}
 }
 
-static void
+void
 configurerequest(XEvent *e) {
 	Client *c;
 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
@@ -503,7 +500,7 @@ configurerequest(XEvent *e) {
 	XSync(dpy, False);
 }
 
-static void
+void
 destroynotify(XEvent *e) {
 	Client *c;
 	XDestroyWindowEvent *ev = &e->xdestroywindow;
@@ -512,7 +509,7 @@ destroynotify(XEvent *e) {
 		unmanage(c);
 }
 
-static void
+void
 detach(Client *c) {
 	if(c->prev)
 		c->prev->next = c->next;
@@ -523,7 +520,7 @@ detach(Client *c) {
 	c->next = c->prev = NULL;
 }
 
-static void
+void
 detachstack(Client *c) {
 	Client **tc;
 
@@ -531,7 +528,7 @@ detachstack(Client *c) {
 	*tc = c->snext;
 }
 
-static void
+void
 drawbar(void) {
 	int i, x;
 
@@ -571,7 +568,7 @@ drawbar(void) {
 	XSync(dpy, False);
 }
 
-static void
+void
 drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
 	int x;
 	XGCValues gcv;
@@ -592,7 +589,7 @@ drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
 	}
 }
 
-static void
+void
 drawtext(const char *text, unsigned long col[ColLast]) {
 	int x, y, w, h;
 	static char buf[256];
@@ -632,7 +629,7 @@ drawtext(const char *text, unsigned long col[ColLast]) {
 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
 }
 
-static void *
+void *
 emallocz(unsigned int size) {
 	void *res = calloc(1, size);
 
@@ -641,7 +638,7 @@ emallocz(unsigned int size) {
 	return res;
 }
 
-static void
+void
 enternotify(XEvent *e) {
 	Client *c;
 	XCrossingEvent *ev = &e->xcrossing;
@@ -656,7 +653,7 @@ enternotify(XEvent *e) {
 	}
 }
 
-static void
+void
 eprint(const char *errstr, ...) {
 	va_list ap;
 
@@ -666,7 +663,7 @@ eprint(const char *errstr, ...) {
 	exit(EXIT_FAILURE);
 }
 
-static void
+void
 expose(XEvent *e) {
 	XExposeEvent *ev = &e->xexpose;
 
@@ -676,7 +673,7 @@ expose(XEvent *e) {
 	}
 }
 
-static void
+void
 floating(void) { /* default floating layout */
 	Client *c;
 
@@ -685,7 +682,7 @@ floating(void) { /* default floating layout */
 			resize(c, c->x, c->y, c->w, c->h, True);
 }
 
-static void
+void
 focus(Client *c) {
 	if((!c && selscreen) || (c && !isvisible(c)))
 		for(c = stack; c && !isvisible(c); c = c->snext);
@@ -710,7 +707,7 @@ focus(Client *c) {
 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 }
 
-static void
+void
 focusnext(const char *arg) {
 	Client *c;
 
@@ -725,7 +722,7 @@ focusnext(const char *arg) {
 	}
 }
 
-static void
+void
 focusprev(const char *arg) {
 	Client *c;
 
@@ -742,7 +739,7 @@ focusprev(const char *arg) {
 	}
 }
 
-static Client *
+Client *
 getclient(Window w) {
 	Client *c;
 
@@ -750,7 +747,7 @@ getclient(Window w) {
 	return c;
 }
 
-static unsigned long
+unsigned long
 getcolor(const char *colstr) {
 	Colormap cmap = DefaultColormap(dpy, screen);
 	XColor color;
@@ -760,7 +757,7 @@ getcolor(const char *colstr) {
 	return color.pixel;
 }
 
-static long
+long
 getstate(Window w) {
 	int format, status;
 	long result = -1;
@@ -778,7 +775,7 @@ getstate(Window w) {
 	return result;
 }
 
-static Bool
+Bool
 gettextprop(Window w, Atom atom, char *text, unsigned int size) {
 	char **list = NULL;
 	int n;
@@ -805,7 +802,7 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
 	return True;
 }
 
-static void
+void
 grabbuttons(Client *c, Bool focused) {
 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
 
@@ -842,7 +839,7 @@ grabbuttons(Client *c, Bool focused) {
 				GrabModeAsync, GrabModeSync, None, None);
 }
 
-static unsigned int
+unsigned int
 idxoftag(const char *tag) {
 	unsigned int i;
 
@@ -852,7 +849,7 @@ idxoftag(const char *tag) {
 	return 0;
 }
 
-static void
+void
 initfont(const char *fontstr) {
 	char *def, **missing;
 	int i, n;
@@ -894,13 +891,13 @@ initfont(const char *fontstr) {
 	dc.font.height = dc.font.ascent + dc.font.descent;
 }
 
-static Bool
+Bool
 isarrange(void (*func)())
 {
 	return func == layouts[ltidx].arrange;
 }
 
-static Bool
+Bool
 isoccupied(unsigned int t) {
 	Client *c;
 
@@ -910,7 +907,7 @@ isoccupied(unsigned int t) {
 	return False;
 }
 
-static Bool
+Bool
 isprotodel(Client *c) {
 	int i, n;
 	Atom *protocols;
@@ -925,7 +922,7 @@ isprotodel(Client *c) {
 	return ret;
 }
 
-static Bool
+Bool
 isvisible(Client *c) {
 	unsigned int i;
 
@@ -935,7 +932,7 @@ isvisible(Client *c) {
 	return False;
 }
 
-static void
+void
 keypress(XEvent *e) {
 	KEYS
 	unsigned int len = sizeof keys / sizeof keys[0];
@@ -970,7 +967,7 @@ keypress(XEvent *e) {
 		}
 }
 
-static void
+void
 killclient(const char *arg) {
 	XEvent ev;
 
@@ -989,7 +986,7 @@ killclient(const char *arg) {
 		XKillClient(dpy, sel->win);
 }
 
-static void
+void
 leavenotify(XEvent *e) {
 	XCrossingEvent *ev = &e->xcrossing;
 
@@ -999,7 +996,7 @@ leavenotify(XEvent *e) {
 	}
 }
 
-static void
+void
 manage(Window w, XWindowAttributes *wa) {
 	unsigned int i;
 	Client *c, *t = NULL;
@@ -1057,7 +1054,7 @@ manage(Window w, XWindowAttributes *wa) {
 	arrange();
 }
 
-static void
+void
 mappingnotify(XEvent *e) {
 	XMappingEvent *ev = &e->xmapping;
 
@@ -1066,7 +1063,7 @@ mappingnotify(XEvent *e) {
 		keypress(NULL);
 }
 
-static void
+void
 maprequest(XEvent *e) {
 	static XWindowAttributes wa;
 	XMapRequestEvent *ev = &e->xmaprequest;
@@ -1079,7 +1076,7 @@ maprequest(XEvent *e) {
 		manage(ev->window, &wa);
 }
 
-static void
+void
 movemouse(Client *c) {
 	int x1, y1, ocx, ocy, di, nx, ny;
 	unsigned int dui;
@@ -1122,13 +1119,13 @@ movemouse(Client *c) {
 	}
 }
 
-static Client *
+Client *
 nexttiled(Client *c) {
 	for(; c && (c->isfloating || !isvisible(c)); c = c->next);
 	return c;
 }
 
-static void
+void
 propertynotify(XEvent *e) {
 	Client *c;
 	Window trans;
@@ -1156,12 +1153,12 @@ propertynotify(XEvent *e) {
 	}
 }
 
-static void
+void
 quit(const char *arg) {
 	readin = running = False;
 }
 
-static void
+void
 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
 	double dx, dy, max, min, ratio;
 	XWindowChanges wc; 
@@ -1224,7 +1221,7 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
 	}
 }
 
-static void
+void
 resizemouse(Client *c) {
 	int ocx, ocy;
 	int nw, nh;
@@ -1263,7 +1260,7 @@ resizemouse(Client *c) {
 	}
 }
 
-static void
+void
 restack(void) {
 	Client *c;
 	XEvent ev;
@@ -1292,7 +1289,7 @@ restack(void) {
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
-static void
+void
 run(void) {
 	char *p;
 	int r, xfd;
@@ -1340,7 +1337,7 @@ run(void) {
 	}
 }
 
-static void
+void
 scan(void) {
 	unsigned int i, num;
 	Window *wins, d1, d2;
@@ -1367,7 +1364,7 @@ scan(void) {
 		XFree(wins);
 }
 
-static void
+void
 setclientstate(Client *c, long state) {
 	long data[] = {state, None};
 
@@ -1375,7 +1372,7 @@ setclientstate(Client *c, long state) {
 			PropModeReplace, (unsigned char *)data, 2);
 }
 
-static void
+void
 setlayout(const char *arg) {
 	unsigned int i;
 
@@ -1397,7 +1394,7 @@ setlayout(const char *arg) {
 		drawbar();
 }
 
-static void
+void
 setmwfact(const char *arg) {
 	double delta;
 
@@ -1419,7 +1416,7 @@ setmwfact(const char *arg) {
 	arrange();
 }
 
-static void
+void
 setup(void) {
 	unsigned int i, j, mask;
 	Window w;
@@ -1513,7 +1510,7 @@ setup(void) {
 	selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
 }
 
-static void
+void
 spawn(const char *arg) {
 	static char *shell = NULL;
 
@@ -1537,7 +1534,7 @@ spawn(const char *arg) {
 	wait(0);
 }
 
-static void
+void
 tag(const char *arg) {
 	unsigned int i;
 
@@ -1551,7 +1548,7 @@ tag(const char *arg) {
 	arrange();
 }
 
-static unsigned int
+unsigned int
 textnw(const char *text, unsigned int len) {
 	XRectangle r;
 
@@ -1562,12 +1559,12 @@ textnw(const char *text, unsigned int len) {
 	return XTextWidth(dc.font.xfont, text, len);
 }
 
-static unsigned int
+unsigned int
 textw(const char *text) {
 	return textnw(text, strlen(text)) + dc.font.height;
 }
 
-static void
+void
 tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, th;
 	Client *c;
@@ -1606,7 +1603,7 @@ tile(void) {
 	}
 }
 
-static void
+void
 togglebar(const char *arg) {
 	if(bpos == BarOff)
 		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
@@ -1616,7 +1613,7 @@ togglebar(const char *arg) {
 	arrange();
 }
 
-static void
+void
 togglefloating(const char *arg) {
 	if(!sel)
 		return;
@@ -1626,7 +1623,7 @@ togglefloating(const char *arg) {
 	arrange();
 }
 
-static void
+void
 togglemax(const char *arg) {
 	XEvent ev;
 
@@ -1645,7 +1642,7 @@ togglemax(const char *arg) {
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
-static void
+void
 toggletag(const char *arg) {
 	unsigned int i, j;
 
@@ -1659,7 +1656,7 @@ toggletag(const char *arg) {
 	arrange();
 }
 
-static void
+void
 toggleview(const char *arg) {
 	unsigned int i, j;
 
@@ -1671,7 +1668,7 @@ toggleview(const char *arg) {
 	arrange();
 }
 
-static void
+void
 unban(Client *c) {
 	if(!c->isbanned)
 		return;
@@ -1679,7 +1676,7 @@ unban(Client *c) {
 	c->isbanned = False;
 }
 
-static void
+void
 unmanage(Client *c) {
 	XWindowChanges wc;
 
@@ -1702,7 +1699,7 @@ unmanage(Client *c) {
 	arrange();
 }
 
-static void
+void
 unmapnotify(XEvent *e) {
 	Client *c;
 	XUnmapEvent *ev = &e->xunmap;
@@ -1711,7 +1708,7 @@ unmapnotify(XEvent *e) {
 		unmanage(c);
 }
 
-static void
+void
 updatebarpos(void) {
 	XEvent ev;
 
@@ -1737,7 +1734,7 @@ updatebarpos(void) {
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
-static void
+void
 updatesizehints(Client *c) {
 	long msize;
 	XSizeHints size;
@@ -1789,7 +1786,7 @@ updatesizehints(Client *c) {
 			&& c->maxw == c->minw && c->maxh == c->minh);
 }
 
-static void
+void
 updatetitle(Client *c) {
 	if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
 		gettextprop(c->win, wmatom[WMName], c->name, sizeof c->name);
@@ -1798,7 +1795,7 @@ updatetitle(Client *c) {
 /* There's no way to check accesses to destroyed windows, thus those cases are
  * ignored (especially on UnmapNotify's).  Other types of errors call Xlibs
  * default error handler, which may call exit.  */
-static int
+int
 xerror(Display *dpy, XErrorEvent *ee) {
 	if(ee->error_code == BadWindow
 	|| (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
@@ -1814,20 +1811,20 @@ xerror(Display *dpy, XErrorEvent *ee) {
 	return xerrorxlib(dpy, ee); /* may call exit */
 }
 
-static int
+int
 xerrordummy(Display *dsply, XErrorEvent *ee) {
 	return 0;
 }
 
 /* Startup Error handler to check if another window manager
  * is already running. */
-static int
+int
 xerrorstart(Display *dsply, XErrorEvent *ee) {
 	otherwm = True;
 	return -1;
 }
 
-static void
+void
 view(const char *arg) {
 	unsigned int i;
 
@@ -1839,7 +1836,7 @@ view(const char *arg) {
 	arrange();
 }
 
-static void
+void
 zoom(const char *arg) {
 	Client *c;
 
 

                                                                                                                                                                                                                                                                            
 





                                                                                                                                                                                                                                        




                                                                                                             

                                                                                                                                                                                                               
          

                                                                                                                         










                                                                                                            
                                                                                                                            


                                    
t/event.c?h=5.7&id=cdbc84b9a87c427b3d0a202475b0f5aae315fb90'>cdbc84b ^
6538265 ^

825b7c3 ^
6538265 ^
6538265 ^
29355bd ^
6458d72 ^
7b5638f ^
d800ec0 ^
2272df9 ^
338c083 ^
6b25d06 ^
6d22782 ^


2c477cf ^
e256afe ^
338c083 ^
7a095d0 ^
6b25d06 ^
6d22782 ^
b9da4b0 ^




ca65478 ^
dc5d967 ^
439e15d ^

439e15d ^
b9da4b0 ^
7d7cde0 ^
64cfebc ^

338c083 ^
b61f913 ^







e256afe ^

7a095d0 ^
39ed54a ^
b61f913 ^
14d05e7 ^
7a095d0 ^

95e8d12 ^
22d8c6f ^









71857b8 ^
439e15d ^


ca65478 ^
439e15d ^


26e134b ^

439e15d ^


ca65478 ^
439e15d ^
dc5d967 ^
439e15d ^
b79b5fa ^
439e15d ^
6c5dc70 ^
3399650 ^
fde45eb ^
87836d7 ^
b233089 ^

fde45eb ^
439e15d ^


ca65478 ^
dc5d967 ^
439e15d ^

59b4a5e ^
c0705ee ^
439e15d ^



ca65478 ^
61a1910 ^
19dcbc5 ^
adaa28a ^
dc5d967 ^
adaa28a ^

e256afe ^
ca65478 ^
e256afe ^
2ffdc19 ^
19dcbc5 ^
352cae4 ^
adaa28a ^



ca65478 ^
adaa28a ^

96e1b25 ^
87836d7 ^
373b11d ^
96e1b25 ^
adaa28a ^


ca65478 ^
0f3acce ^







ca65478 ^
439e15d ^
dc5d967 ^
439e15d ^


35e65ea ^
439e15d ^
0053620 ^

439e15d ^


ca65478 ^
439e15d ^
dc5d967 ^

439e15d ^


3399650 ^



66da153 ^
338c083 ^
cdbc84b ^
3399650 ^

ebd17e4 ^
3399650 ^

c09bf8d ^
d2d394e ^
f8181f6 ^

3399650 ^

439e15d ^


ca65478 ^
439e15d ^


0053620 ^

439e15d ^
adaa28a ^
bf35794 ^
adaa28a ^








0f3acce ^
adaa28a ^





6b25d06 ^
61a1910 ^
adaa28a ^


0f3acce ^
adaa28a ^

adaa28a ^

3af6434 ^

ee31e38 ^
a73a882 ^
ee31e38 ^
a73a882 ^
adaa28a ^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
                                                                    

                                        
                
                  
                   
                       
                      
 
            



                          

                                      

      
    
 
                                                          
                                                                
 







                                                        
           
                      
                                         

                         
                  
 
                        
                        
                                                                                  
                                                                           
                       
                         

                                                                           
                                                                                          
                                  


                                                         
                                      
                            

                                              

                                  
                                          










                                                                                      
                              




                 
                        
                     
                   
                  
 

                   
                                                                                  
                                                                             
                       
                         
                                                                                                
                 
                                                                                           
                                 
                                   

                                                                                    
                                                         
                                                                          
                               
                                      
                            

                                              

                                  
                                          




                                                                              
                              


                 

           
                        

                            
                  
                                              
 
                   
                                  
                      

                                            
                                       
                                                                   
                                                           
                                                              
                                                         
                                            
                                                          

                                                                
                                                              
                                                               
                                            
                                                                
                                 
                                       

                         
                                   

                                            
                                                
                                      
                         
         
                                              
                         
                                                  
                               
                                                                                         
                                  


                                              
                                   
                                             
                                                                             
                 
                                  
                                       




                 
                             
                  

                                                           
 
                                         
                                 

                                                     
                                                                              







                                                     

                                                                    
                                             
                                        
                                                                                       
                 

                                     
         









                                                                       
                          


           
                          


                                                     

                                       


           
                        
                  
                                           
 
                                                                    
                       
                                                       
                         
                                     
                                 

                                                                 
         


           
                   
                                       

                            
                                        
                                     



           
                     
                                                             
                       
                      
                                 

                                                                
                                
                                          
                                                                 
                 
                                       
                                                        



                 
                        

                                           
                                                      
                                  
                            
         


           
                          







                                          
                       
                                    
                                               


                                                       
                                
                       

                                        


           
                           
                  

                                           


                                       



                                                 
                                                                          
                                                                                                  
                                                      

                                                
                                                   

                                      
                                                                              
                                       

                                             

                 


           
                        


                                     

                                       
 
 
            








                                              
                                        





                                          
                
                                                             


                       
                                                   

                                                            

                                                              

                                                                      
                                                                         
                                                              
                                                                                    
                                                              

         
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 */
#include "dwm.h"
#include <stdio.h>
#include <stdlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>

/* static */

typedef struct {
	unsigned long mod;
	KeySym keysym;
	void (*func)(const char *arg);
	const char *arg;
} Key;

KEYS

#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
#define MOUSEMASK		(BUTTONMASK | PointerMotionMask)

static Client *
getclient(Window w) {
	Client *c;

	for(c = clients; c && c->win != w; c = c->next);
	return c;
}

static void
movemouse(Client *c) {
	int x1, y1, ocx, ocy, di, nx, ny;
	unsigned int dui;
	Window dummy;
	XEvent ev;

	ocx = nx = c->x;
	ocy = ny = c->y;
	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
			None, cursor[CurMove], CurrentTime) != GrabSuccess)
		return;
	c->ismax = False;
	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
	for(;;) {
		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
		switch (ev.type) {
		case ButtonRelease:
			XUngrabPointer(dpy, CurrentTime);
			return;
		case ConfigureRequest:
		case Expose:
		case MapRequest:
			handler[ev.type](&ev);
			break;
		case MotionNotify:
			XSync(dpy, False);
			nx = ocx + (ev.xmotion.x - x1);
			ny = ocy + (ev.xmotion.y - y1);
			if(abs(wax + nx) < SNAP)
				nx = wax;
			else if(abs((wax + waw) - (nx + c->w + 2 * c->border)) < SNAP)
				nx = wax + waw - c->w - 2 * c->border;
			if(abs(way - ny) < SNAP)
				ny = way;
			else if(abs((way + wah) - (ny + c->h + 2 * c->border)) < SNAP)
				ny = way + wah - c->h - 2 * c->border;
			resize(c, nx, ny, c->w, c->h, False);
			break;
		}
	}
}

static void
resizemouse(Client *c) {
	int ocx, ocy;
	int nw, nh;
	XEvent ev;

	ocx = c->x;
	ocy = c->y;
	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
			None, cursor[CurResize], CurrentTime) != GrabSuccess)
		return;
	c->ismax = False;
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
	for(;;) {
		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
		switch(ev.type) {
		case ButtonRelease:
			XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
					c->w + c->border - 1, c->h + c->border - 1);
			XUngrabPointer(dpy, CurrentTime);
			while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
			return;
		case ConfigureRequest:
		case Expose:
		case MapRequest:
			handler[ev.type](&ev);
			break;
		case MotionNotify:
			XSync(dpy, False);
			if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
				nw = 1;
			if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
				nh = 1;
			resize(c, c->x, c->y, nw, nh, True);
			break;
		}
	}
}

static void
buttonpress(XEvent *e) {
	static char buf[32];
	unsigned int i, x;
	Client *c;
	XButtonPressedEvent *ev = &e->xbutton;

	buf[0] = 0;
	if(barwin == ev->window) {
		x = 0;
		for(i = 0; i < ntags; i++) {
			x += textw(tags[i]);
			if(ev->x < x) {
				snprintf(buf, sizeof buf, "%d", i);
				if(ev->button == Button1) {
					if(ev->state & MODKEY)
						tag(buf);
					else
						view(buf);
				}
				else if(ev->button == Button3) {
					if(ev->state & MODKEY)
						toggletag(buf);
					else
						toggleview(buf);
				}
				return;
			}
		}
		if(ev->x < x + blw)
			switch(ev->button) {
			case Button1:
				setlayout(NULL);
				break;
			}
	}
	else if((c = getclient(ev->window))) {
		focus(c);
		if(CLEANMASK(ev->state) != MODKEY)
			return;
		if(ev->button == Button1 && (lt->arrange == floating || c->isfloating)) {
			restack();
			movemouse(c);
		}
		else if(ev->button == Button2)
			zoom(NULL);
		else if(ev->button == Button3
		&& (lt->arrange == floating || c->isfloating) && !c->isfixed)
		{
			restack();
			resizemouse(c);
		}
	}
}

static void
configurerequest(XEvent *e) {
	Client *c;
	XConfigureRequestEvent *ev = &e->xconfigurerequest;
	XWindowChanges wc;

	if((c = getclient(ev->window))) {
		c->ismax = False;
		if(ev->value_mask & CWBorderWidth)
			c->border = ev->border_width;
		if(c->isfixed || c->isfloating || (lt->arrange == floating)) {
			if(ev->value_mask & CWX)
				c->x = ev->x;
			if(ev->value_mask & CWY)
				c->y = ev->y;
			if(ev->value_mask & CWWidth)
				c->w = ev->width;
			if(ev->value_mask & CWHeight)
				c->h = ev->height;
			if((ev->value_mask & (CWX | CWY))
			&& !(ev->value_mask & (CWWidth | CWHeight)))
				configure(c);
			if(isvisible(c))
				XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
		}
		else
			configure(c);
	}
	else {
		wc.x = ev->x;
		wc.y = ev->y;
		wc.width = ev->width;
		wc.height = ev->height;
		wc.border_width = ev->border_width;
		wc.sibling = ev->above;
		wc.stack_mode = ev->detail;
		XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
	}
	XSync(dpy, False);
}

static void
destroynotify(XEvent *e) {
	Client *c;
	XDestroyWindowEvent *ev = &e->xdestroywindow;

	if((c = getclient(ev->window)))
		unmanage(c);
}

static void
enternotify(XEvent *e) {
	Client *c;
	XCrossingEvent *ev = &e->xcrossing;

	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
		return;
	if((c = getclient(ev->window)) && isvisible(c))
		focus(c);
	else if(ev->window == root) {
		selscreen = True;
		for(c = stack; c && !isvisible(c); c = c->snext);
		focus(c);
	}
}

static void
expose(XEvent *e) {
	XExposeEvent *ev = &e->xexpose;

	if(ev->count == 0) {
		if(barwin == ev->window)
			drawstatus();
	}
}

static void
keypress(XEvent *e) {
	static unsigned int len = sizeof key / sizeof key[0];
	unsigned int i;
	KeySym keysym;
	XKeyEvent *ev = &e->xkey;

	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
	for(i = 0; i < len; i++)
		if(keysym == key[i].keysym
		&& CLEANMASK(key[i].mod) == CLEANMASK(ev->state))
		{
			if(key[i].func)
				key[i].func(key[i].arg);
		}
}

static void
leavenotify(XEvent *e) {
	XCrossingEvent *ev = &e->xcrossing;

	if((ev->window == root) && !ev->same_screen) {
		selscreen = False;
		focus(NULL);
	}
}

static void
mappingnotify(XEvent *e) {
	XMappingEvent *ev = &e->xmapping;

	XRefreshKeyboardMapping(ev);
	if(ev->request == MappingKeyboard)
		grabkeys();
}

static void
maprequest(XEvent *e) {
	static XWindowAttributes wa;
	XMapRequestEvent *ev = &e->xmaprequest;

	if(!XGetWindowAttributes(dpy, ev->window, &wa))
		return;
	if(wa.override_redirect)
		return;
	if(!getclient(ev->window))
		manage(ev->window, &wa);
}

static void
propertynotify(XEvent *e) {
	Client *c;
	Window trans;
	XPropertyEvent *ev = &e->xproperty;

	if(ev->state == PropertyDelete)
		return; /* ignore */
	if((c = getclient(ev->window))) {
		switch (ev->atom) {
			default: break;
			case XA_WM_TRANSIENT_FOR:
				XGetTransientForHint(dpy, c->win, &trans);
				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL)))
					lt->arrange();
				break;
			case XA_WM_NORMAL_HINTS:
				updatesizehints(c);
				break;
		}
		if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
			updatetitle(c);
			if(c == sel)
				drawstatus();
		}
	}
}

static void
unmapnotify(XEvent *e) {
	Client *c;
	XUnmapEvent *ev = &e->xunmap;

	if((c = getclient(ev->window)))
		unmanage(c);
}

/* extern */

void (*handler[LASTEvent]) (XEvent *) = {
	[ButtonPress] = buttonpress,
	[ConfigureRequest] = configurerequest,
	[DestroyNotify] = destroynotify,
	[EnterNotify] = enternotify,
	[LeaveNotify] = leavenotify,
	[Expose] = expose,
	[KeyPress] = keypress,
	[MappingNotify] = mappingnotify,
	[MapRequest] = maprequest,
	[PropertyNotify] = propertynotify,
	[UnmapNotify] = unmapnotify
};

void
grabkeys(void) {
	static unsigned int len = sizeof key / sizeof key[0];
	unsigned int i;
	KeyCode code;

	XUngrabKey(dpy, AnyKey, AnyModifier, root);
	for(i = 0; i < len; i++) {
		code = XKeysymToKeycode(dpy, key[i].keysym);
		XGrabKey(dpy, code, key[i].mod, root, True,
				GrabModeAsync, GrabModeAsync);
		XGrabKey(dpy, code, key[i].mod | LockMask, root, True,
				GrabModeAsync, GrabModeAsync);
		XGrabKey(dpy, code, key[i].mod | numlockmask, root, True,
				GrabModeAsync, GrabModeAsync);
		XGrabKey(dpy, code, key[i].mod | numlockmask | LockMask, root, True,
				GrabModeAsync, GrabModeAsync);
	}
}