diff options
| -rw-r--r-- | dwm.c | 24 | 
1 files changed, 17 insertions, 7 deletions
| @@ -955,16 +955,26 @@ grabkeys(void)  {  	updatenumlockmask();  	{ -		unsigned int i, j; +		unsigned int i, j, k;  		unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; -		KeyCode code; +		int start, end, skip; +		KeySym *syms;  		XUngrabKey(dpy, AnyKey, AnyModifier, root); -		for (i = 0; i < LENGTH(keys); i++) -			if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) -				for (j = 0; j < LENGTH(modifiers); j++) -					XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, -						True, GrabModeAsync, GrabModeAsync); +		XDisplayKeycodes(dpy, &start, &end); +		syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); +		if (!syms) +			return; +		for (k = start; k <= end; k++) +			for (i = 0; i < LENGTH(keys); i++) +				/* skip modifier codes, we do that ourselves */ +				if (keys[i].keysym == syms[(k - start) * skip]) +					for (j = 0; j < LENGTH(modifiers); j++) +						XGrabKey(dpy, k, +							 keys[i].mod | modifiers[j], +							 root, True, +							 GrabModeAsync, GrabModeAsync); +		XFree(syms);  	}  } | 
