|  | @@ -129,7 +129,6 @@ static void mappingnotify(XEvent *e);
 | 
	
		
			
				|  |  |  static void maprequest(XEvent *e);
 | 
	
		
			
				|  |  |  static void propertynotify(XEvent *e);
 | 
	
		
			
				|  |  |  static void unmapnotify(XEvent *e);
 | 
	
		
			
				|  |  | -static void grabkeys(void);
 | 
	
		
			
				|  |  |  static unsigned int idxoftag(const char *tag);
 | 
	
		
			
				|  |  |  static void floating(void); /* default floating layout */
 | 
	
		
			
				|  |  |  static void applyrules(Client *c);
 | 
	
	
		
			
				|  | @@ -1070,9 +1069,26 @@ keypress(XEvent *e) {
 | 
	
		
			
				|  |  |  	KEYS
 | 
	
		
			
				|  |  |  	unsigned int len = sizeof keys / sizeof keys[0];
 | 
	
		
			
				|  |  |  	unsigned int i;
 | 
	
		
			
				|  |  | +	KeyCode code;
 | 
	
		
			
				|  |  |  	KeySym keysym;
 | 
	
		
			
				|  |  | -	XKeyEvent *ev = &e->xkey;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +	XKeyEvent *ev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(!e) { /* grabkeys */
 | 
	
		
			
				|  |  | +		XUngrabKey(dpy, AnyKey, AnyModifier, root);
 | 
	
		
			
				|  |  | +		for(i = 0; i < len; 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);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ev = &e->xkey;
 | 
	
		
			
				|  |  |  	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
 | 
	
		
			
				|  |  |  	for(i = 0; i < len; i++)
 | 
	
		
			
				|  |  |  		if(keysym == keys[i].keysym
 | 
	
	
		
			
				|  | @@ -1099,7 +1115,7 @@ mappingnotify(XEvent *e) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	XRefreshKeyboardMapping(ev);
 | 
	
		
			
				|  |  |  	if(ev->request == MappingKeyboard)
 | 
	
		
			
				|  |  | -		grabkeys();
 | 
	
		
			
				|  |  | +		keypress(NULL);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void
 | 
	
	
		
			
				|  | @@ -1152,27 +1168,6 @@ unmapnotify(XEvent *e) {
 | 
	
		
			
				|  |  |  		unmanage(c);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void
 | 
	
		
			
				|  |  | -grabkeys(void) {
 | 
	
		
			
				|  |  | -	KEYS
 | 
	
		
			
				|  |  | -	unsigned int len = sizeof keys / sizeof keys[0];
 | 
	
		
			
				|  |  | -	unsigned int i;
 | 
	
		
			
				|  |  | -	KeyCode code;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	XUngrabKey(dpy, AnyKey, AnyModifier, root);
 | 
	
		
			
				|  |  | -	for(i = 0; i < len; 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);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  static unsigned int
 | 
	
		
			
				|  |  |  idxoftag(const char *tag) {
 | 
	
		
			
				|  |  |  	unsigned int i;
 | 
	
	
		
			
				|  | @@ -1546,7 +1541,7 @@ setup(void) {
 | 
	
		
			
				|  |  |  	wa.cursor = cursor[CurNormal];
 | 
	
		
			
				|  |  |  	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
 | 
	
		
			
				|  |  |  	XSelectInput(dpy, root, wa.event_mask);
 | 
	
		
			
				|  |  | -	grabkeys();
 | 
	
		
			
				|  |  | +	keypress(NULL); /* grabkeys */
 | 
	
		
			
				|  |  |  	compileregs();
 | 
	
		
			
				|  |  |  	for(ntags = 0; tags[ntags]; ntags++);
 | 
	
		
			
				|  |  |  	seltags = emallocz(sizeof(Bool) * ntags);
 |