X11: Fix function keys mapped to GLFW_KEY_UNKNOWN
This fixes the issue where function keys would be reported as GLFW_KEY_UNKNOWN if XKB was available and one of the configured keyboard layouts was Arabic. This is only part of #1598, because the full patch removed parts of the fallback path for when XKB is unavailable. Closes #1598.
This commit is contained in:
parent
e65de2941c
commit
a41a58a95e
110
src/x11_init.c
110
src/x11_init.c
@ -47,37 +47,6 @@ static int translateKeyCode(int scancode)
|
|||||||
if (scancode < 8 || scancode > 255)
|
if (scancode < 8 || scancode > 255)
|
||||||
return GLFW_KEY_UNKNOWN;
|
return GLFW_KEY_UNKNOWN;
|
||||||
|
|
||||||
if (_glfw.x11.xkb.available)
|
|
||||||
{
|
|
||||||
// Try secondary keysym, for numeric keypad keys
|
|
||||||
// Note: This way we always force "NumLock = ON", which is intentional
|
|
||||||
// since the returned key code should correspond to a physical
|
|
||||||
// location.
|
|
||||||
keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, _glfw.x11.xkb.group, 1);
|
|
||||||
switch (keySym)
|
|
||||||
{
|
|
||||||
case XK_KP_0: return GLFW_KEY_KP_0;
|
|
||||||
case XK_KP_1: return GLFW_KEY_KP_1;
|
|
||||||
case XK_KP_2: return GLFW_KEY_KP_2;
|
|
||||||
case XK_KP_3: return GLFW_KEY_KP_3;
|
|
||||||
case XK_KP_4: return GLFW_KEY_KP_4;
|
|
||||||
case XK_KP_5: return GLFW_KEY_KP_5;
|
|
||||||
case XK_KP_6: return GLFW_KEY_KP_6;
|
|
||||||
case XK_KP_7: return GLFW_KEY_KP_7;
|
|
||||||
case XK_KP_8: return GLFW_KEY_KP_8;
|
|
||||||
case XK_KP_9: return GLFW_KEY_KP_9;
|
|
||||||
case XK_KP_Separator:
|
|
||||||
case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL;
|
|
||||||
case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;
|
|
||||||
case XK_KP_Enter: return GLFW_KEY_KP_ENTER;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now try primary keysym for function keys (non-printable keys)
|
|
||||||
// These should not depend on the current keyboard layout
|
|
||||||
keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, _glfw.x11.xkb.group, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
int dummy;
|
int dummy;
|
||||||
KeySym* keySyms;
|
KeySym* keySyms;
|
||||||
@ -251,10 +220,10 @@ static void createKeyTables(void)
|
|||||||
memcpy(name, desc->names->keys[scancode].name, XkbKeyNameLength);
|
memcpy(name, desc->names->keys[scancode].name, XkbKeyNameLength);
|
||||||
name[XkbKeyNameLength] = '\0';
|
name[XkbKeyNameLength] = '\0';
|
||||||
|
|
||||||
// Map the key name to a GLFW key code. Note: We only map printable
|
// Map the key name to a GLFW key code. Note: We use the US
|
||||||
// keys here, and we use the US keyboard layout. The rest of the
|
// keyboard layout. Because function keys aren't mapped correctly
|
||||||
// keys (function keys) are mapped using traditional KeySym
|
// when using traditional KeySym translations, they are mapped
|
||||||
// translations.
|
// here instead.
|
||||||
if (strcmp(name, "TLDE") == 0) key = GLFW_KEY_GRAVE_ACCENT;
|
if (strcmp(name, "TLDE") == 0) key = GLFW_KEY_GRAVE_ACCENT;
|
||||||
else if (strcmp(name, "AE01") == 0) key = GLFW_KEY_1;
|
else if (strcmp(name, "AE01") == 0) key = GLFW_KEY_1;
|
||||||
else if (strcmp(name, "AE02") == 0) key = GLFW_KEY_2;
|
else if (strcmp(name, "AE02") == 0) key = GLFW_KEY_2;
|
||||||
@ -303,6 +272,77 @@ static void createKeyTables(void)
|
|||||||
else if (strcmp(name, "AB10") == 0) key = GLFW_KEY_SLASH;
|
else if (strcmp(name, "AB10") == 0) key = GLFW_KEY_SLASH;
|
||||||
else if (strcmp(name, "BKSL") == 0) key = GLFW_KEY_BACKSLASH;
|
else if (strcmp(name, "BKSL") == 0) key = GLFW_KEY_BACKSLASH;
|
||||||
else if (strcmp(name, "LSGT") == 0) key = GLFW_KEY_WORLD_1;
|
else if (strcmp(name, "LSGT") == 0) key = GLFW_KEY_WORLD_1;
|
||||||
|
else if (strcmp(name, "SPCE") == 0) key = GLFW_KEY_SPACE;
|
||||||
|
else if (strcmp(name, "ESC") == 0) key = GLFW_KEY_ESCAPE;
|
||||||
|
else if (strcmp(name, "RTRN") == 0) key = GLFW_KEY_ENTER;
|
||||||
|
else if (strcmp(name, "TAB") == 0) key = GLFW_KEY_TAB;
|
||||||
|
else if (strcmp(name, "BKSP") == 0) key = GLFW_KEY_BACKSPACE;
|
||||||
|
else if (strcmp(name, "INS") == 0) key = GLFW_KEY_INSERT;
|
||||||
|
else if (strcmp(name, "DELE") == 0) key = GLFW_KEY_DELETE;
|
||||||
|
else if (strcmp(name, "RGHT") == 0) key = GLFW_KEY_RIGHT;
|
||||||
|
else if (strcmp(name, "LEFT") == 0) key = GLFW_KEY_LEFT;
|
||||||
|
else if (strcmp(name, "DOWN") == 0) key = GLFW_KEY_DOWN;
|
||||||
|
else if (strcmp(name, "UP") == 0) key = GLFW_KEY_UP;
|
||||||
|
else if (strcmp(name, "PGUP") == 0) key = GLFW_KEY_PAGE_UP;
|
||||||
|
else if (strcmp(name, "PGDN") == 0) key = GLFW_KEY_PAGE_DOWN;
|
||||||
|
else if (strcmp(name, "HOME") == 0) key = GLFW_KEY_HOME;
|
||||||
|
else if (strcmp(name, "END") == 0) key = GLFW_KEY_END;
|
||||||
|
else if (strcmp(name, "CAPS") == 0) key = GLFW_KEY_CAPS_LOCK;
|
||||||
|
else if (strcmp(name, "SCLK") == 0) key = GLFW_KEY_SCROLL_LOCK;
|
||||||
|
else if (strcmp(name, "NMLK") == 0) key = GLFW_KEY_NUM_LOCK;
|
||||||
|
else if (strcmp(name, "PRSC") == 0) key = GLFW_KEY_PRINT_SCREEN;
|
||||||
|
else if (strcmp(name, "PAUS") == 0) key = GLFW_KEY_PAUSE;
|
||||||
|
else if (strcmp(name, "FK01") == 0) key = GLFW_KEY_F1;
|
||||||
|
else if (strcmp(name, "FK02") == 0) key = GLFW_KEY_F2;
|
||||||
|
else if (strcmp(name, "FK03") == 0) key = GLFW_KEY_F3;
|
||||||
|
else if (strcmp(name, "FK04") == 0) key = GLFW_KEY_F4;
|
||||||
|
else if (strcmp(name, "FK05") == 0) key = GLFW_KEY_F5;
|
||||||
|
else if (strcmp(name, "FK06") == 0) key = GLFW_KEY_F6;
|
||||||
|
else if (strcmp(name, "FK07") == 0) key = GLFW_KEY_F7;
|
||||||
|
else if (strcmp(name, "FK08") == 0) key = GLFW_KEY_F8;
|
||||||
|
else if (strcmp(name, "FK09") == 0) key = GLFW_KEY_F9;
|
||||||
|
else if (strcmp(name, "FK10") == 0) key = GLFW_KEY_F10;
|
||||||
|
else if (strcmp(name, "FK11") == 0) key = GLFW_KEY_F11;
|
||||||
|
else if (strcmp(name, "FK12") == 0) key = GLFW_KEY_F12;
|
||||||
|
else if (strcmp(name, "FK13") == 0) key = GLFW_KEY_F13;
|
||||||
|
else if (strcmp(name, "FK14") == 0) key = GLFW_KEY_F14;
|
||||||
|
else if (strcmp(name, "FK15") == 0) key = GLFW_KEY_F15;
|
||||||
|
else if (strcmp(name, "FK16") == 0) key = GLFW_KEY_F16;
|
||||||
|
else if (strcmp(name, "FK17") == 0) key = GLFW_KEY_F17;
|
||||||
|
else if (strcmp(name, "FK18") == 0) key = GLFW_KEY_F18;
|
||||||
|
else if (strcmp(name, "FK19") == 0) key = GLFW_KEY_F19;
|
||||||
|
else if (strcmp(name, "FK20") == 0) key = GLFW_KEY_F20;
|
||||||
|
else if (strcmp(name, "FK21") == 0) key = GLFW_KEY_F21;
|
||||||
|
else if (strcmp(name, "FK22") == 0) key = GLFW_KEY_F22;
|
||||||
|
else if (strcmp(name, "FK23") == 0) key = GLFW_KEY_F23;
|
||||||
|
else if (strcmp(name, "FK24") == 0) key = GLFW_KEY_F24;
|
||||||
|
else if (strcmp(name, "FK25") == 0) key = GLFW_KEY_F25;
|
||||||
|
else if (strcmp(name, "KP0") == 0) key = GLFW_KEY_KP_0;
|
||||||
|
else if (strcmp(name, "KP1") == 0) key = GLFW_KEY_KP_1;
|
||||||
|
else if (strcmp(name, "KP2") == 0) key = GLFW_KEY_KP_2;
|
||||||
|
else if (strcmp(name, "KP3") == 0) key = GLFW_KEY_KP_3;
|
||||||
|
else if (strcmp(name, "KP4") == 0) key = GLFW_KEY_KP_4;
|
||||||
|
else if (strcmp(name, "KP5") == 0) key = GLFW_KEY_KP_5;
|
||||||
|
else if (strcmp(name, "KP6") == 0) key = GLFW_KEY_KP_6;
|
||||||
|
else if (strcmp(name, "KP7") == 0) key = GLFW_KEY_KP_7;
|
||||||
|
else if (strcmp(name, "KP8") == 0) key = GLFW_KEY_KP_8;
|
||||||
|
else if (strcmp(name, "KP9") == 0) key = GLFW_KEY_KP_9;
|
||||||
|
else if (strcmp(name, "KPDL") == 0) key = GLFW_KEY_KP_DECIMAL;
|
||||||
|
else if (strcmp(name, "KPDV") == 0) key = GLFW_KEY_KP_DIVIDE;
|
||||||
|
else if (strcmp(name, "KPMU") == 0) key = GLFW_KEY_KP_MULTIPLY;
|
||||||
|
else if (strcmp(name, "KPSU") == 0) key = GLFW_KEY_KP_SUBTRACT;
|
||||||
|
else if (strcmp(name, "KPAD") == 0) key = GLFW_KEY_KP_ADD;
|
||||||
|
else if (strcmp(name, "KPEN") == 0) key = GLFW_KEY_KP_ENTER;
|
||||||
|
else if (strcmp(name, "KPEQ") == 0) key = GLFW_KEY_KP_EQUAL;
|
||||||
|
else if (strcmp(name, "LFSH") == 0) key = GLFW_KEY_LEFT_SHIFT;
|
||||||
|
else if (strcmp(name, "LCTL") == 0) key = GLFW_KEY_LEFT_CONTROL;
|
||||||
|
else if (strcmp(name, "LALT") == 0) key = GLFW_KEY_LEFT_ALT;
|
||||||
|
else if (strcmp(name, "LWIN") == 0) key = GLFW_KEY_LEFT_SUPER;
|
||||||
|
else if (strcmp(name, "RTSH") == 0) key = GLFW_KEY_RIGHT_SHIFT;
|
||||||
|
else if (strcmp(name, "RCTL") == 0) key = GLFW_KEY_RIGHT_CONTROL;
|
||||||
|
else if (strcmp(name, "RALT") == 0) key = GLFW_KEY_RIGHT_ALT;
|
||||||
|
else if (strcmp(name, "RWIN") == 0) key = GLFW_KEY_RIGHT_SUPER;
|
||||||
|
else if (strcmp(name, "COMP") == 0) key = GLFW_KEY_MENU;
|
||||||
else key = GLFW_KEY_UNKNOWN;
|
else key = GLFW_KEY_UNKNOWN;
|
||||||
|
|
||||||
if ((scancode >= 0) && (scancode < 256))
|
if ((scancode >= 0) && (scancode < 256))
|
||||||
|
Loading…
Reference in New Issue
Block a user