| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -117,10 +117,9 @@ typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} Regs; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int id; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int screen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Window root; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Window barwin; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//TODO: Window root; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//TODO: int screen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int sx, sy, sw, sh, wax, way, wah, waw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						DC dc; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Bool *seltags; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -158,7 +157,7 @@ void focusin(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void focusnext(const char *arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void focusprev(const char *arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Client *getclient(Window w); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned long getcolor(const char *colstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned long getcolor(const char *colstr, int screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					long getstate(Window w); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void grabbuttons(Client *c, Bool focused); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -170,7 +169,6 @@ Bool isprotodel(Client *c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Bool isvisible(Client *c, Monitor *m); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					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); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -215,9 +213,8 @@ void selectmonitor(const char *arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* variables */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					char stext[256]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int mcount, screen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int mcount = 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//double mwfact; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//int screen, sx, sy, sw, sh, wax, way, waw, wah; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int (*xerrorxlib)(Display *, XErrorEvent *); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned int bh, bpos; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned int blw = 0; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -231,7 +228,6 @@ void (*handler[LASTEvent]) (XEvent *) = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[Expose] = expose, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[FocusIn] = focusin, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[KeyPress] = keypress, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[LeaveNotify] = leavenotify, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[MappingNotify] = mappingnotify, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[MapRequest] = maprequest, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[PropertyNotify] = propertynotify, | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -242,16 +238,12 @@ Bool domwfact = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Bool dozoom = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					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 root; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//Layout *layout = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//Window barwin, root; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Regs *regs = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Monitor *monitors; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int selmonitor = 0; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -402,7 +394,7 @@ checkotherwm(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSetErrorHandler(xerrorstart); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* this causes an error if some other window manager is running */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSelectInput(dpy, root, SubstructureRedirectMask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSync(dpy, False); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(otherwm) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("dwm: another window manager is already running\n"); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -426,7 +418,7 @@ cleanup(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XFreeFontSet(dpy, m->dc.font.set); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XFreeFont(dpy, m->dc.font.xfont); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUngrabKey(dpy, AnyKey, AnyModifier, root); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUngrabKey(dpy, AnyKey, AnyModifier, m->root); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreePixmap(dpy, m->dc.drawable); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreeGC(dpy, m->dc.gc); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XDestroyWindow(dpy, m->barwin); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -487,11 +479,11 @@ configurenotify(XEvent *e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XConfigureEvent *ev = &e->xconfigure; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[selmonitor]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(ev->window == root && (ev->width != m->sw || ev->height != m->sh)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(ev->window == m->root && (ev->width != m->sw || ev->height != m->sh)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->sw = ev->width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->sh = ev->height; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreePixmap(dpy, dc.drawable); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, screen)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							dc.drawable = XCreatePixmap(dpy, m->root, m->sw, bh, DefaultDepth(dpy, m->screen)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XResizeWindow(dpy, m->barwin, m->sw, bh); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							updatebarpos(m); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							arrange(); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -582,11 +574,11 @@ drawbar(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->dc.w = textw(m, tags[i]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(m->seltags[i]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawtext(m, tags[i], m->dc.sel); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawsquare(m, sel && sel->tags[i] && sel->monitor == m->id, isoccupied(m, i), m->dc.sel); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawsquare(m, sel && sel->tags[i] && sel->monitor == selmonitor, isoccupied(m, i), m->dc.sel); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawtext(m, tags[i], m->dc.norm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawsquare(m, sel && sel->tags[i] && sel->monitor == m->id, isoccupied(m, i), m->dc.norm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawsquare(m, sel && sel->tags[i] && sel->monitor == selmonitor, isoccupied(m, i), m->dc.norm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->dc.x += m->dc.w; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -602,7 +594,7 @@ drawbar(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							drawtext(m, stext, m->dc.norm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if((m->dc.w = m->dc.x - x) > bh) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->dc.x = x; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(sel && sel->monitor == m->id) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(sel && sel->monitor == selmonitor) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawtext(m, sel->name, m->dc.sel); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									drawsquare(m, False, sel->isfloating, m->dc.sel); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -686,6 +678,7 @@ emallocz(unsigned int size) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					enternotify(XEvent *e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Client *c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XCrossingEvent *ev = &e->xcrossing; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -693,9 +686,13 @@ enternotify(XEvent *e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if((c = getclient(ev->window))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							focus(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if(ev->window == root) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							selmonitor = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							focus(NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(i = 0; i < mcount; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(ev->window == monitors[i].root) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									selmonitor = i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									focus(NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -731,7 +728,7 @@ floating(void) { /* default floating layout */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					focus(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[monitorat(-1, -1)]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[c ? c->monitor : selmonitor]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!c || (c && !isvisible(c, m))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(c = stack; c && !isvisible(c, m); c = c->snext); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(sel && sel != c) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -746,13 +743,12 @@ focus(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						sel = c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						drawbar(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetWindowBorder(dpy, c->win, monitors[c->monitor].dc.sel[ColBorder]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetWindowBorder(dpy, c->win, m->dc.sel[ColBorder]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							selmonitor = monitorat(c->x, c->y); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							selmonitor = c->monitor; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							selmonitor = monitorat(-1, -1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetInputFocus(dpy, m->root, RevertToPointerRoot, CurrentTime); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -807,7 +803,7 @@ getclient(Window w) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned long | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					getcolor(const char *colstr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					getcolor(const char *colstr, int screen) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Colormap cmap = DefaultColormap(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XColor color; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -899,20 +895,33 @@ grabbuttons(Client *c, Bool focused) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					grabkeys(void)  { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i, j; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						KeyCode code; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XModifierKeymap *modmap; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XUngrabKey(dpy, AnyKey, AnyModifier, root); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < LENGTH(keys); i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							code = XKeysymToKeycode(dpy, keys[i].keysym); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XGrabKey(dpy, code, keys[i].mod, root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init modifier map */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						modmap = XGetModifierMapping(dpy); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < 8; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(j = 0; j < modmap->max_keypermod; j++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									numlockmask = (1 << i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XFreeModifiermap(modmap); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < mcount; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Monitor *m = &monitors[i]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUngrabKey(dpy, AnyKey, AnyModifier, m->root); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(j = 0; j < LENGTH(keys); j++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								code = XKeysymToKeycode(dpy, keys[j].keysym); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XGrabKey(dpy, code, keys[j].mod, m->root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XGrabKey(dpy, code, keys[j].mod | LockMask, m->root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XGrabKey(dpy, code, keys[j].mod | numlockmask, m->root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XGrabKey(dpy, code, keys[j].mod | numlockmask | LockMask, m->root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -971,7 +980,7 @@ isoccupied(Monitor *m, unsigned int t) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Client *c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(c = clients; c; c = c->next) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->tags[t] && c->monitor == m->id) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->tags[t] && c->monitor == selmonitor) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -996,7 +1005,7 @@ isvisible(Client *c, Monitor *m) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < LENGTH(tags); i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->tags[i] && monitors[c->monitor].seltags[i] && m->id == c->monitor) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->tags[i] && monitors[c->monitor].seltags[i] && c->monitor == selmonitor) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1037,21 +1046,12 @@ killclient(const char *arg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XKillClient(dpy, sel->win); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					leavenotify(XEvent *e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XCrossingEvent *ev = &e->xcrossing; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if((ev->window == root) && !ev->same_screen) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							selmonitor = False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							focus(NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					manage(Window w, XWindowAttributes *wa) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Client *c, *t = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Window trans; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[selmonitor]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Status rettrans; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Window trans; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWindowChanges wc; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c = emallocz(sizeof(Client)); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1059,10 +1059,9 @@ manage(Window w, XWindowAttributes *wa) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->win = w; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						applyrules(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[c->monitor]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->x = wa->x+m->sx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->y = wa->y+m->sy; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->x = wa->x + m->sx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->y = wa->y + m->sy; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->w = wa->width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->h = wa->height; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->oldborder = wa->border_width; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1142,10 +1141,10 @@ movemouse(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						ocx = nx = c->x; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						ocy = ny = c->y; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGrabPointer(dpy, monitors[selmonitor].root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								None, cursor[CurMove], CurrentTime) != GrabSuccess) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XQueryPointer(dpy, monitors[selmonitor].root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(;;) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							switch (ev.type) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1232,7 +1231,7 @@ void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWindowChanges wc; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor scr = monitors[monitorat(x, y)]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->monitor = scr.id; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->monitor = monitorat(x, y); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(sizehints) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* set minimum possible */ | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1305,7 +1304,7 @@ resizemouse(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						ocx = c->x; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						ocy = c->y; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGrabPointer(dpy, monitors[selmonitor].root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								None, cursor[CurResize], CurrentTime) != GrabSuccess) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1429,29 +1428,32 @@ run(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					scan(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i, num; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i, j, num; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Window *wins, d1, d2; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWindowAttributes wa; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wins = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(i = 0; i < num; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(!XGetWindowAttributes(dpy, wins[i], &wa) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								|| wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									continue; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									manage(wins[i], &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(i = 0; i < num; i++) { /* now the transients */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(!XGetWindowAttributes(dpy, wins[i], &wa)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									continue; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(XGetTransientForHint(dpy, wins[i], &d1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								&& (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									manage(wins[i], &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < mcount; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Monitor *m = &monitors[i]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wins = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(XQueryTree(dpy, m->root, &d1, &d2, &wins, &num)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								for(j = 0; j < num; j++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!XGetWindowAttributes(dpy, wins[j], &wa) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									|| wa.override_redirect || XGetTransientForHint(dpy, wins[j], &d1)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										continue; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(wa.map_state == IsViewable || getstate(wins[j]) == IconicState) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										manage(wins[j], &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								for(j = 0; j < num; j++) { /* now the transients */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!XGetWindowAttributes(dpy, wins[j], &wa)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										continue; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(XGetTransientForHint(dpy, wins[j], &d1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									&& (wa.map_state == IsViewable || getstate(wins[j]) == IconicState)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										manage(wins[j], &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(wins) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XFree(wins); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(wins) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFree(wins); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1513,10 +1515,8 @@ setmwfact(const char *arg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					setup(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i, j, k; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XModifierKeymap *modmap; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSetWindowAttributes wa; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int s = 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						GC g; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XineramaScreenInfo *info = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init atoms */ | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1526,106 +1526,100 @@ setup(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								PropModeReplace, (unsigned char *) netatom, NetLast); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init cursors */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wa.cursor = cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init modifier map */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						modmap = XGetModifierMapping(dpy); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < 8; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(j = 0; j < modmap->max_keypermod; j++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(modmap->modifiermap[i * modmap->max_keypermod + j] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								== XKeysymToKeycode(dpy, XK_Num_Lock)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									numlockmask = (1 << i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XFreeModifiermap(modmap); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* select for events */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							| EnterWindowMask | LeaveWindowMask | StructureNotifyMask; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wa.cursor = cursor[CurNormal]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSelectInput(dpy, root, wa.event_mask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* grab keys */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						grabkeys(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init tags */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						compileregs(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// init screens/monitors first | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (XineramaIsActive(dpy)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							info = XineramaQueryScreens(dpy, &s); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							info = XineramaQueryScreens(dpy, &mcount); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						mcount = 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						monitors = emallocz(mcount * sizeof(Monitor)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						monitors = emallocz(s*sizeof(Monitor)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						mcount = s; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < s; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < mcount; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* init geometry */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (mcount != 1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sx = info[i].x_org; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sy = info[i].y_org; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sw = info[i].width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sh = info[i].height; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m = &monitors[i]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->screen = i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->root = RootWindow(dpy, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (mcount != 1) { // TODO: Xinerama | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sx = info[i].x_org; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sy = info[i].y_org; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sw = info[i].width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sh = info[i].height; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sx = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sy = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sw = DisplayWidth(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								monitors[i].sh = DisplayHeight(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sx = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sy = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sw = DisplayWidth(dpy, m->screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								m->sh = DisplayHeight(dpy, m->screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].id = i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].seltags = emallocz(sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].prevtags = emallocz(sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->seltags = emallocz(sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->prevtags = emallocz(sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							memcpy(monitors[i].seltags, initags, sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							memcpy(monitors[i].prevtags, initags, sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							memcpy(m->seltags, initags, sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							memcpy(m->prevtags, initags, sizeof initags); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* init appearance */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.norm[ColBG] = getcolor(NORMBGCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.norm[ColFG] = getcolor(NORMFGCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.sel[ColBorder] = getcolor(SELBORDERCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.sel[ColBG] = getcolor(SELBGCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.sel[ColFG] = getcolor(SELFGCOLOR); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							initfont(&(monitors[i]), FONT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.h = bh = monitors[i].dc.font.height + 2; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.norm[ColBG] = getcolor(NORMBGCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.norm[ColFG] = getcolor(NORMFGCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.sel[ColBorder] = getcolor(SELBORDERCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.sel[ColBG] = getcolor(SELBGCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.sel[ColFG] = getcolor(SELFGCOLOR, i); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							initfont(m, FONT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.h = bh = m->dc.font.height + 2; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* init layouts */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].mwfact = MWFACT; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].layout = &layouts[0]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->mwfact = MWFACT; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->layout = &layouts[0]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(blw = k = 0; k < LENGTH(layouts); k++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								j = textw(&monitors[i], layouts[k].symbol); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								j = textw(m, layouts[k].symbol); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(j > blw) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									blw = j; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// TODO: bpos per screen? | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpos = BARPOS; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wa.override_redirect = 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wa.background_pixmap = ParentRelative; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wa.event_mask = ButtonPressMask | ExposureMask; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* init bars */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].barwin = XCreateWindow(dpy, root, monitors[i].sx, monitors[i].sy, monitors[i].sw, bh, 0, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->barwin = XCreateWindow(dpy, m->root, m->sx, m->sy, m->sw, bh, 0, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									DefaultDepth(dpy, m->screen), CopyFromParent, DefaultVisual(dpy, m->screen), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XDefineCursor(dpy, monitors[i].barwin, cursor[CurNormal]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							updatebarpos(&monitors[i]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XMapRaised(dpy, monitors[i].barwin); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XDefineCursor(dpy, m->barwin, cursor[CurNormal]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							updatebarpos(m); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XMapRaised(dpy, m->barwin); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							strcpy(stext, "dwm-"VERSION); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.drawable = XCreatePixmap(dpy, root, monitors[i].sw, bh, DefaultDepth(dpy, screen)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							g = XCreateGC(dpy, root, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							monitors[i].dc.gc = XCreateGC(dpy, root, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetLineAttributes(dpy, monitors[i].dc.gc, 1, LineSolid, CapButt, JoinMiter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(!monitors[i].dc.font.set) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XSetFont(dpy, monitors[i].dc.gc, monitors[i].dc.font.xfont->fid); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.drawable = XCreatePixmap(dpy, m->root, m->sw, bh, DefaultDepth(dpy, m->screen)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							m->dc.gc = XCreateGC(dpy, m->root, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetLineAttributes(dpy, m->dc.gc, 1, LineSolid, CapButt, JoinMiter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(!m->dc.font.set) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XSetFont(dpy, m->dc.gc, m->dc.font.xfont->fid); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* EWMH support per monitor */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XChangeProperty(dpy, m->root, netatom[NetSupported], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									PropModeReplace, (unsigned char *) netatom, NetLast); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* select for events */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									| EnterWindowMask | LeaveWindowMask | StructureNotifyMask; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XChangeWindowAttributes(dpy, m->root, CWEventMask | CWCursor, &wa); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSelectInput(dpy, m->root, wa.event_mask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* grab keys */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						grabkeys(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* init tags */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						compileregs(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1978,21 +1972,24 @@ int | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					monitorat(int x, int y) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!XineramaIsActive(dpy)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (x < 0 || y < 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Window win; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							unsigned int mask; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XQueryPointer(dpy, root, &win, &win, &x, &y, &i, &i, &mask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XQueryPointer(dpy, DefaultRootWindow(dpy), &win, &win, &x, &y, &i, &i, &mask); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < mcount; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if((x < 0 || (x >= monitors[i].sx && x < monitors[i].sx + monitors[i].sw)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									&& (y < 0 || (y >= monitors[i].sy && y < monitors[i].sy + monitors[i].sh))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < mcount; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Monitor *m = &monitors[i]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if((x < 0 || (x >= m->sx && x < m->sx + m->sw)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									&& (y < 0 || (y >= m->sy && y < m->sy + m->sh))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2011,7 +2008,7 @@ void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					selectmonitor(const char *arg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Monitor *m = &monitors[arg ? atoi(arg) : (monitorat(-1, -1)+1) % mcount]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWarpPointer(dpy, None, root, 0, 0, 0, 0, m->wax+m->waw/2, m->way+m->wah/2); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XWarpPointer(dpy, None, m->root, 0, 0, 0, 0, m->wax+m->waw/2, m->way+m->wah/2); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						focus(NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2020,15 +2017,13 @@ int | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(argc == 2 && !strcmp("-v", argv[1])) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("dwm-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk, " | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							       "Jukka Salmi, Premysl Hruby, Szabolcs Nagy\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							       "Jukka Salmi, Premysl Hruby, Szabolcs Nagy, Christof Musik\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if(argc != 1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("usage: dwm [-v]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						setlocale(LC_CTYPE, ""); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!(dpy = XOpenDisplay(0))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("dwm: cannot open display\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						screen = DefaultScreen(dpy); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						root = RootWindow(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						checkotherwm(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						setup(); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |