diff options
author | Jérémie Courrèges-Anglas <jca@wxcvbn.org> | 2014-03-29 18:46:40 +0100 |
---|---|---|
committer | Jérémie Courrèges-Anglas <jca@wxcvbn.org> | 2014-03-29 18:46:40 +0100 |
commit | bde541308ee998fd3185500b4362bb404f51ee4c (patch) | |
tree | 5eee0a9d8e7d44df5b15dd6a1c72326013bab091 /src | |
parent | 8204551023d9b77294947a5170f3428fb5a4a225 (diff) | |
download | ratpoison-bde541308ee998fd3185500b4362bb404f51ee4c.zip |
Detect XKB support at build and runtime.
Diffstat (limited to 'src')
-rw-r--r-- | src/input.c | 52 | ||||
-rw-r--r-- | src/input.h | 2 | ||||
-rw-r--r-- | src/main.c | 1 |
3 files changed, 50 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) diff --git a/src/input.h b/src/input.h index 5beb96e..7abb652 100644 --- a/src/input.h +++ b/src/input.h @@ -36,4 +36,6 @@ void grab_key (KeySym keysym, unsigned int modifiers, Window grab_window); void ring_bell (void); +void init_xkb (void); + #endif /* ! _RATPOISON_INPUT_H */ @@ -751,6 +751,7 @@ main (int argc, char *argv[]) /* Setup ratpoison's internal structures */ init_defaults (); + init_xkb (); init_groups (); init_window_stuff (); init_xinerama (); |