diff options
author | dgp <dgp@noemail.net> | 2013-04-01 16:27:46 (GMT) |
---|---|---|
committer | dgp <dgp@noemail.net> | 2013-04-01 16:27:46 (GMT) |
commit | ee1e88701fe489d5b1b8cdd8aa4b95c49c99a5c3 (patch) | |
tree | d12c1e95bed377052206be8cb843b79169a061e5 /unix/tkUnixKey.c | |
parent | 0ed42e582f05fb0f4527750cc46a446c0d57fd11 (diff) | |
download | tk-ee1e88701fe489d5b1b8cdd8aa4b95c49c99a5c3.zip tk-ee1e88701fe489d5b1b8cdd8aa4b95c49c99a5c3.tar.gz tk-ee1e88701fe489d5b1b8cdd8aa4b95c49c99a5c3.tar.bz2 |
Runtime check for Xkb support in X server.
Contributed patch from Brian Griffin.
FossilOrigin-Name: 1f3d84d85d2ebb0511cf7f6e528631e22e899cef
Diffstat (limited to 'unix/tkUnixKey.c')
-rw-r--r-- | unix/tkUnixKey.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/unix/tkUnixKey.c b/unix/tkUnixKey.c index b7fc97f..27425ff 100644 --- a/unix/tkUnixKey.c +++ b/unix/tkUnixKey.c @@ -11,7 +11,17 @@ */ #include "tkInt.h" + +/* +** Bug [3607830]: Before using Xkb, it must be initialized. TkpOpenDisplay +** does this and sets the USE_XKB flag if xkb is supported. +** (should this be function ptr?) +*/ #include <X11/XKBlib.h> +#define TkKeycodeToKeysym(D,K,G,L) \ + ((D)->flags & TK_DISPLAY_USE_XKB) ? \ + XkbKeycodeToKeysym((D)->display,K,G,L) : \ + XKeycodeToKeysym((D)->display,K,L) /* * Prototypes for local functions defined in this file: @@ -212,7 +222,7 @@ TkpGetString( /* * When mapping from a keysym to a keycode, need information about the - * modifier state to be used so that when they call XkbKeycodeToKeysym taking + * modifier state to be used so that when they call TkKeycodeToKeysym taking * into account the xkey.state, they will get back the original keysym. */ @@ -222,27 +232,23 @@ TkpSetKeycodeAndState( KeySym keySym, XEvent *eventPtr) { - Display *display; + TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; int state; KeyCode keycode; - display = Tk_Display(tkwin); - if (keySym == NoSymbol) { keycode = 0; } else { - keycode = XKeysymToKeycode(display, keySym); + keycode = XKeysymToKeycode(dispPtr->display, keySym); } + eventPtr->xkey.keycode = keycode; if (keycode != 0) { for (state = 0; state < 4; state++) { - if (XkbKeycodeToKeysym(display, keycode, 0, state) == keySym) { + if (XLookupKeysym(&eventPtr->xkey, state) == keySym) { if (state & 1) { eventPtr->xkey.state |= ShiftMask; } if (state & 2) { - TkDisplay *dispPtr; - - dispPtr = ((TkWindow *) tkwin)->dispPtr; eventPtr->xkey.state |= dispPtr->modeModMask; } break; @@ -325,7 +331,7 @@ TkpGetKeySym( && (eventPtr->xkey.state & LockMask))) { index += 1; } - sym = XkbKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, 0, + sym = TkKeycodeToKeysym(dispPtr, eventPtr->xkey.keycode, 0, index); /* @@ -340,7 +346,7 @@ TkpGetKeySym( || ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) || ((sym >= XK_Ooblique) && (sym <= XK_Thorn)))) { index &= ~1; - sym = XkbKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, + sym = TkKeycodeToKeysym(dispPtr, eventPtr->xkey.keycode, 0, index); } } @@ -351,7 +357,7 @@ TkpGetKeySym( */ if ((index & 1) && (sym == NoSymbol)) { - sym = XkbKeycodeToKeysym(dispPtr->display, eventPtr->xkey.keycode, + sym = TkKeycodeToKeysym(dispPtr, eventPtr->xkey.keycode, 0, index & ~1); } return sym; @@ -401,7 +407,7 @@ TkpInitKeymapInfo( if (*codePtr == 0) { continue; } - keysym = XkbKeycodeToKeysym(dispPtr->display, *codePtr, 0, 0); + keysym = TkKeycodeToKeysym(dispPtr, *codePtr, 0, 0); if (keysym == XK_Shift_Lock) { dispPtr->lockUsage = LU_SHIFT; break; @@ -427,7 +433,7 @@ TkpInitKeymapInfo( if (*codePtr == 0) { continue; } - keysym = XkbKeycodeToKeysym(dispPtr->display, *codePtr, 0, 0); + keysym = TkKeycodeToKeysym(dispPtr, *codePtr, 0, 0); if (keysym == XK_Mode_switch) { dispPtr->modeModMask |= ShiftMask << (i/modMapPtr->max_keypermod); } |