event.c
changeset 160 c8db0a825775
parent 159 a5eab6aaf859
child 161 f381e34158d9
equal deleted inserted replaced
159:a5eab6aaf859 160:c8db0a825775
    17 	Arg arg;
    17 	Arg arg;
    18 } Key;
    18 } Key;
    19 
    19 
    20 KEYS
    20 KEYS
    21 
    21 
    22 static unsigned int valid_mask =  255 &  ~(NUMLOCKMASK | LockMask);
    22 #define CLEANMASK(mask) (mask & ~(NUMLOCKMASK | LockMask))
    23 
    23 
    24 static void
    24 static void
    25 movemouse(Client *c)
    25 movemouse(Client *c)
    26 {
    26 {
    27 	int x1, y1, ocx, ocy, di;
    27 	int x1, y1, ocx, ocy, di;
   227 {
   227 {
   228 	static unsigned int len = sizeof(key) / sizeof(key[0]);
   228 	static unsigned int len = sizeof(key) / sizeof(key[0]);
   229 	unsigned int i;
   229 	unsigned int i;
   230 	KeySym keysym;
   230 	KeySym keysym;
   231 	XKeyEvent *ev = &e->xkey;
   231 	XKeyEvent *ev = &e->xkey;
   232 	ev->state &= valid_mask;
       
   233 
   232 
   234 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
   233 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
   235 	for(i = 0; i < len; i++)
   234 	for(i = 0; i < len; i++)
   236 		if((keysym == key[i].keysym) && ((key[i].mod & valid_mask) == ev->state)) {
   235 		if(keysym == key[i].keysym &&
       
   236 				CLEANMASK(key[i].mod) == CLEANMASK(ev->state)) {
   237 			if(key[i].func)
   237 			if(key[i].func)
   238 				key[i].func(&key[i].arg);
   238 				key[i].func(&key[i].arg);
   239 			return;
   239 			return;
   240 		}
   240 		}
   241 }
   241 }
   333 	unsigned int i;
   333 	unsigned int i;
   334 	KeyCode code;
   334 	KeyCode code;
   335 
   335 
   336 	for(i = 0; i < len; i++) {
   336 	for(i = 0; i < len; i++) {
   337 		code = XKeysymToKeycode(dpy, key[i].keysym);
   337 		code = XKeysymToKeycode(dpy, key[i].keysym);
       
   338 		/* normal */
   338 		XUngrabKey(dpy, code, key[i].mod, root);
   339 		XUngrabKey(dpy, code, key[i].mod, root);
   339 		XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root);
       
   340 		XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root);
       
   341 		XGrabKey(dpy, code, key[i].mod, root, True,
   340 		XGrabKey(dpy, code, key[i].mod, root, True,
   342 				GrabModeAsync, GrabModeAsync);
   341 				GrabModeAsync, GrabModeAsync);
       
   342 		/* capslock */
       
   343 		XUngrabKey(dpy, code, key[i].mod | LockMask, root);
       
   344 		XGrabKey(dpy, code, key[i].mod | LockMask, root, True,
       
   345 				GrabModeAsync, GrabModeAsync);
       
   346 		/* numlock */
       
   347 		XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root);
   343 		XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root, True,
   348 		XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root, True,
   344 				GrabModeAsync, GrabModeAsync);
   349 				GrabModeAsync, GrabModeAsync);
       
   350 		/* capslock & numlock */
       
   351 		XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root);
   345 		XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root, True,
   352 		XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root, True,
   346 				GrabModeAsync, GrabModeAsync);
   353 				GrabModeAsync, GrabModeAsync);
   347 	}
   354 	}
   348 }
   355 }