Changeset View
Changeset View
Standalone View
Standalone View
intern/ghost/intern/GHOST_SystemX11.cpp
| Context not available. | |||||
| case KeyRelease: | case KeyRelease: | ||||
| { | { | ||||
| XKeyEvent *xke = &(xe->xkey); | XKeyEvent *xke = &(xe->xkey); | ||||
| KeySym key_sym; | KeySym key_sym = 0; | ||||
| char ascii; | char ascii; | ||||
| #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) | #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) | ||||
| /* utf8_array[] is initial buffer used for Xutf8LookupString(). | /* utf8_array[] is initial buffer used for Xutf8LookupString(). | ||||
| Context not available. | |||||
| GHOST_TKey gkey; | GHOST_TKey gkey; | ||||
| /* In keyboards like latin ones, | GHOST_TEventType type = (xke->type == KeyPress) ? | ||||
| * numbers needs a 'Shift' to be accessed but key_sym | GHOST_kEventKeyDown : GHOST_kEventKeyUp; | ||||
| * is unmodified (or anyone swapping the keys with xmodmap). | |||||
| /* XXX Code below is kinda awfully convoluted... Issues are: | |||||
| * | |||||
| * - In keyboards like latin ones, numbers need a 'Shift' to be accessed but key_sym | |||||
| * is unmodified (or anyone swapping the keys with xmodmap). | |||||
| * | |||||
| * - XLookupKeysym seems to always use first defined keymap (see T47228), which generates | |||||
| * keycodes unusable by convertXKey for non-latin-compatible keymaps. | |||||
| * | * | ||||
| * Here we look at the 'Shifted' version of the key. | * To address this, we: | ||||
| * If it is a number, then we take it instead of the normal key. | |||||
| * | * | ||||
| * The modified key is sent in the 'ascii's variable anyway. | * - Try to get a 'number' key_sym using XLookupKeysym (with or without shift modifier). | ||||
| * - Fallback to XLookupString to get a key_sym from active user-defined keymap. | |||||
| * | |||||
| * Note that this enforces users to use an ascii-compatible keymap with Blender - but at least it gives | |||||
| * predictable and consistent results. | |||||
| */ | */ | ||||
| if ((xke->keycode >= 10 && xke->keycode < 20) && | if ((xke->keycode >= 10 && xke->keycode < 20)) { | ||||
| ((key_sym = XLookupKeysym(xke, ShiftMask)) >= XK_0) && (key_sym <= XK_9)) | key_sym = XLookupKeysym(xke, ShiftMask); | ||||
| { | if (!((key_sym >= XK_0) && (key_sym <= XK_9))) { | ||||
| /* pass (keep shift'ed key_sym) */ | key_sym = XLookupKeysym(xke, 0); | ||||
| } | |||||
| if (!((key_sym >= XK_0) && (key_sym <= XK_9))) { | |||||
| key_sym = 0; /* Get current-keymap valid key_sym. */ | |||||
| } | |||||
| } | } | ||||
| else { | |||||
| /* regular case */ | if (!XLookupString(xke, &ascii, 1, (key_sym == 0) ? &key_sym : NULL, NULL)) { | ||||
| key_sym = XLookupKeysym(xke, 0); | ascii = '\0'; | ||||
| } | } | ||||
| gkey = convertXKey(key_sym); | gkey = convertXKey(key_sym); | ||||
| GHOST_TEventType type = (xke->type == KeyPress) ? | |||||
| GHOST_kEventKeyDown : GHOST_kEventKeyUp; | |||||
| if (!XLookupString(xke, &ascii, 1, NULL, NULL)) { | |||||
| ascii = '\0'; | |||||
| } | |||||
| #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) | #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) | ||||
| /* getting unicode on key-up events gives XLookupNone status */ | /* getting unicode on key-up events gives XLookupNone status */ | ||||
| XIC xic = window->getX11_XIC(); | XIC xic = window->getX11_XIC(); | ||||
| Context not available. | |||||
| { | { | ||||
| GHOST_TKey type; | GHOST_TKey type; | ||||
| printf("%s: %lu\n", __func__, key); | |||||
| if ((key >= XK_A) && (key <= XK_Z)) { | if ((key >= XK_A) && (key <= XK_Z)) { | ||||
| type = GHOST_TKey(key - XK_A + int(GHOST_kKeyA)); | type = GHOST_TKey(key - XK_A + int(GHOST_kKeyA)); | ||||
| } | } | ||||
| Context not available. | |||||