summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
authorJérémie Courrèges-Anglas <jca@wxcvbn.org>2014-03-29 18:46:40 +0100
committerJérémie Courrèges-Anglas <jca@wxcvbn.org>2014-03-29 18:46:40 +0100
commitbde541308ee998fd3185500b4362bb404f51ee4c (patch)
tree5eee0a9d8e7d44df5b15dd6a1c72326013bab091 /src/input.c
parent8204551023d9b77294947a5170f3428fb5a4a225 (diff)
downloadratpoison-bde541308ee998fd3185500b4362bb404f51ee4c.zip
Detect XKB support at build and runtime.
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c52
1 files changed, 47 insertions, 5 deletions
diff --git a/src/input.c b/src/input.c
index 894b260..2bd4f14 100644
--- a/src/input.c
+++ b/src/input.c
@@ -26,10 +26,13 @@
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xutil.h>
-#include <X11/XKBlib.h>
#include "ratpoison.h"
+#ifdef HAVE_X11_XKBLIB_H
+#include <X11/XKBlib.h>
+#endif
+
/* Convert an X11 modifier mask to the rp modifier mask equivalent, as
best it can (the X server may not have a hyper key defined, for
instance). */
@@ -74,6 +77,45 @@ rp_mask_to_x11_mask (unsigned int mask)
return result;
}
+static Bool use_xkb;
+
+void
+init_xkb (void)
+{
+#if defined (WANT_XKB) && defined (HAVE_X11_XKBLIB_H) && defined (HAVE_XKBKEYCODETOKEYSYM)
+ int error, event, major, minor, opcode;
+
+ major = XkbMajorVersion;
+ minor = XkbMajorVersion;
+
+ use_xkb = XkbLibraryVersion (&major, &minor);
+ if (!use_xkb)
+ {
+ PRINT_ERROR (("Not using XKB, compile and load time version mismatch:"));
+ PRINT_ERROR ((" (%d, %d) vs. (%d, %d)\n", XkbMajorVersion,
+ XkbMajorVersion, major, minor));
+ return;
+ }
+
+ use_xkb = XkbQueryExtension (dpy, &opcode, &event, &error, &major, &minor);
+ if (!use_xkb)
+ PRINT_DEBUG (("Not using XKB, XkbQueryExtension failed\n"));
+#else
+ PRINT_DEBUG (("Built with no XKB support."));
+ use_xkb = False;
+#endif
+}
+
+KeySym
+keycode_to_keysym(Display *dpy, KeyCode kc, int group, int level)
+{
+#if defined (WANT_XKB) && defined (HAVE_X11_XKBLIB_H) && defined (HAVE_XKBKEYCODETOKEYSYM)
+ if (use_xkb)
+ return XkbKeycodeToKeysym (dpy, kc, group, level);
+#endif
+ (void) group;
+ return XKeycodeToKeysym (dpy, kc, level);
+}
/* /\* The caller is responsible for freeing the keycodes. *\/ */
/* KeyCode * */
@@ -252,8 +294,8 @@ keysym_to_keycode_mod (KeySym keysym, KeyCode *code, unsigned int *mod)
*mod = 0;
*code = XKeysymToKeycode (dpy, keysym);
- lower = XkbKeycodeToKeysym (dpy, *code, 0, 0);
- upper = XkbKeycodeToKeysym (dpy, *code, 0, 1);
+ lower = keycode_to_keysym (dpy, *code, 0, 0);
+ upper = keycode_to_keysym (dpy, *code, 0, 1);
/* If you need to press shift to get the keysym, add the shift
mask. */
if (upper == keysym && lower != keysym)
@@ -358,8 +400,8 @@ cook_keycode (XKeyEvent *ev, KeySym *keysym, unsigned int *mod, char *keysym_nam
/* Find out if XLookupString gobbled the shift modifier */
if (ev->state & ShiftMask)
{
- lower = XkbKeycodeToKeysym (dpy, ev->keycode, 0, 0);
- upper = XkbKeycodeToKeysym (dpy, ev->keycode, 0, 1);
+ lower = keycode_to_keysym (dpy, ev->keycode, 0, 0);
+ upper = keycode_to_keysym (dpy, ev->keycode, 0, 1);
/* If the keysym isn't affected by the shift key, then keep the
shift modifier. */
if (lower == upper)