about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h1
-rw-r--r--xutil.c20
2 files changed, 18 insertions, 3 deletions
diff --git a/calmwm.h b/calmwm.h
index f00cc0b..93d99f7 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -391,6 +391,7 @@ void			 xu_ptr_ungrab(void);
 void			 xu_ptr_setpos(Window, int, int);
 void			 xu_ptr_getpos(Window, int *, int *);
 void			 xu_key_grab(Window, int, int);
+void			 xu_key_ungrab(Window, int, int);
 void			 xu_sendmsg(struct client_ctx *, Atom, long);
 int			 xu_getprop(struct client_ctx *, Atom, Atom, long,
 			     u_char **);
diff --git a/xutil.c b/xutil.c
index 2c6ad65..11cde2f 100644
--- a/xutil.c
+++ b/xutil.c
@@ -90,9 +90,23 @@ xu_key_grab(Window win, int mask, int keysym)
 		mask |= ShiftMask;
 
 	for (i = 0; i < sizeof(ign_mods)/sizeof(*ign_mods); i++)
-		XGrabKey(X_Dpy, XKeysymToKeycode(X_Dpy, keysym),
-		    (mask | ign_mods[i]), win, True, GrabModeAsync,
-		    GrabModeAsync);
+		XGrabKey(X_Dpy, code, (mask | ign_mods[i]), win,
+		    True, GrabModeAsync, GrabModeAsync);
+}
+
+void
+xu_key_ungrab(Window win, int mask, int keysym)
+{
+	KeyCode	 code;
+	int	 i;
+
+	code = XKeysymToKeycode(X_Dpy, keysym);
+	if ((XKeycodeToKeysym(X_Dpy, code, 0) != keysym) &&
+	    (XKeycodeToKeysym(X_Dpy, code, 1) == keysym))
+		mask |= ShiftMask;
+
+	for (i = 0; i < sizeof(ign_mods)/sizeof(*ign_mods); i++)
+		XUngrabKey(X_Dpy, code, (mask | ign_mods[i]), win);
 }
 
 void