diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index 96693dd1ee..1916bc71e2 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -405,7 +405,7 @@ bool x11_get_metrics(void *data, return true; } -static void x11_handle_key_event(XEvent *event, XIC ic, bool filter) +static void x11_handle_key_event(unsigned keycode, XEvent *event, XIC ic, bool filter) { int i; Status status; @@ -419,6 +419,7 @@ static void x11_handle_key_event(XEvent *event, XIC ic, bool filter) chars[0] = '\0'; + /* this code generates the localized chars using keysyms */ if (!filter) { if (down) @@ -454,8 +455,10 @@ static void x11_handle_key_event(XEvent *event, XIC ic, bool filter) * to feed it keysyms anyway, so here is a little hack... */ if (keysym >= XK_A && keysym <= XK_Z) keysym += XK_z - XK_Z; - - key = input_keymaps_translate_keysym_to_rk(keysym); + + /* Get the real keycode, + that correctly ignores international layouts as windows code does. */ + key = input_keymaps_translate_keysym_to_rk(keycode); if (state & ShiftMask) mod |= RETROKMOD_SHIFT; @@ -465,10 +468,10 @@ static void x11_handle_key_event(XEvent *event, XIC ic, bool filter) mod |= RETROKMOD_CTRL; if (state & Mod1Mask) mod |= RETROKMOD_ALT; + if (state & Mod2Mask) + mod |= RETROKMOD_NUMLOCK; if (state & Mod4Mask) mod |= RETROKMOD_META; - if (IsKeypadKey(keysym)) - mod |= RETROKMOD_NUMLOCK; input_keyboard_event(down, key, chars[0], mod, RETRO_DEVICE_KEYBOARD); @@ -483,9 +486,14 @@ bool x11_alive(void *data) { XEvent event; bool filter = false; + unsigned keycode = 0; /* Can get events from older windows. Check this. */ XNextEvent(g_x11_dpy, &event); + + /* IMPORTANT - Get keycode before XFilterEvent + because the event is localizated after the call */ + keycode = event.xkey.keycode; filter = XFilterEvent(&event, g_x11_win); switch (event.type) @@ -548,7 +556,7 @@ bool x11_alive(void *data) case KeyPress: case KeyRelease: if (event.xkey.window == g_x11_win) - x11_handle_key_event(&event, g_x11_xic, filter); + x11_handle_key_event(keycode, &event, g_x11_xic, filter); break; } } diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 77cd53438d..4672333e6f 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -75,7 +75,7 @@ static void *x_input_init(const char *joypad_driver) static bool x_keyboard_pressed(x11_input_t *x11, unsigned key) { - int keycode = XKeysymToKeycode(x11->display, rarch_keysym_lut[(enum retro_key)key]); + int keycode = rarch_keysym_lut[(enum retro_key)key]; return x11->state[keycode >> 3] & (1 << (keycode & 7)); } @@ -155,23 +155,20 @@ static int16_t x_pressed_analog(x11_input_t *x11, unsigned id_plus = 0; int id_minus_key = 0; int id_plus_key = 0; - unsigned sym = 0; - int keycode = 0; + unsigned keycode = 0; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); id_minus_key = binds[id_minus].key; id_plus_key = binds[id_plus].key; - sym = rarch_keysym_lut[(enum retro_key)id_minus_key]; - keycode = XKeysymToKeycode(x11->display, sym); + keycode = rarch_keysym_lut[(enum retro_key)id_minus_key]; if ( binds[id_minus].valid && (id_minus_key < RETROK_LAST) && (x11->state[keycode >> 3] & (1 << (keycode & 7)))) pressed_minus = -0x7fff; - sym = rarch_keysym_lut[(enum retro_key)id_plus_key]; - keycode = XKeysymToKeycode(x11->display, sym); + keycode = rarch_keysym_lut[(enum retro_key)id_plus_key]; if ( binds[id_plus].valid && (id_plus_key < RETROK_LAST) && (x11->state[keycode >> 3] & (1 << (keycode & 7)))) diff --git a/input/include/xfree86_keycodes.h b/input/include/xfree86_keycodes.h new file mode 100644 index 0000000000..827088f2ae --- /dev/null +++ b/input/include/xfree86_keycodes.h @@ -0,0 +1,176 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +/* generated from /usr/share/X11/xkb/keycodes/evdev */ + +#ifndef __XFREE86_KEYCODES__H +#define __XFREE86_KEYCODES__H + +enum xfvk_key +{ + XFVK_UNKNOWN = 0, + XFVK_FIRST = 0, + + XFVK_ESC = 9, + XFVK_FK01 = 67, + XFVK_FK02 = 68, + XFVK_FK03 = 69, + XFVK_FK04 = 70, + XFVK_FK05 = 71, + XFVK_FK06 = 72, + XFVK_FK07 = 73, + XFVK_FK08 = 74, + XFVK_FK09 = 75, + XFVK_FK10 = 76, + XFVK_FK11 = 95, + XFVK_FK12 = 96, + + // Added for pc105 compatibility + XFVK_LSGT = 94, + XFVK_TLDE = 49, + XFVK_AE01 = 10, + XFVK_AE02 = 11, + XFVK_AE03 = 12, + XFVK_AE04 = 13, + XFVK_AE05 = 14, + XFVK_AE06 = 15, + XFVK_AE07 = 16, + XFVK_AE08 = 17, + XFVK_AE09 = 18, + XFVK_AE10 = 19, + XFVK_AE11 = 20, + XFVK_AE12 = 21, + XFVK_BKSP = 22, + + XFVK_TAB = 23, + XFVK_AD01 = 24, + XFVK_AD02 = 25, + XFVK_AD03 = 26, + XFVK_AD04 = 27, + XFVK_AD05 = 28, + XFVK_AD06 = 29, + XFVK_AD07 = 30, + XFVK_AD08 = 31, + XFVK_AD09 = 32, + XFVK_AD10 = 33, + XFVK_AD11 = 34, + XFVK_AD12 = 35, + XFVK_BKSL = 51, + XFVK_AC12 = XFVK_BKSL, + XFVK_RTRN = 36, + + XFVK_CAPS = 66, + XFVK_AC01 = 38, + XFVK_AC02 = 39, + XFVK_AC03 = 40, + XFVK_AC04 = 41, + XFVK_AC05 = 42, + XFVK_AC06 = 43, + XFVK_AC07 = 44, + XFVK_AC08 = 45, + XFVK_AC09 = 46, + XFVK_AC10 = 47, + XFVK_AC11 = 48, + + XFVK_LFSH = 50, + XFVK_AB01 = 52, + XFVK_AB02 = 53, + XFVK_AB03 = 54, + XFVK_AB04 = 55, + XFVK_AB05 = 56, + XFVK_AB06 = 57, + XFVK_AB07 = 58, + XFVK_AB08 = 59, + XFVK_AB09 = 60, + XFVK_AB10 = 61, + XFVK_RTSH = 62, + + XFVK_LALT = 64, + XFVK_LCTL = 37, + XFVK_SPCE = 65, + XFVK_RCTL = 105, + XFVK_RALT = 108, + + XFVK_PRSC = 107, + // SYRQ = 107, + XFVK_SCLK = 78, + XFVK_PAUS = 127, + // BRK = 419, + + XFVK_INS = 118, + XFVK_HOME = 110, + XFVK_PGUP = 112, + XFVK_DELE = 119, + XFVK_END = 115, + XFVK_PGDN = 117, + + XFVK_UP = 111, + XFVK_LEFT = 113, + XFVK_DOWN = 116, + XFVK_RGHT = 114, + + XFVK_NMLK = 77, + XFVK_KPDV = 106, + XFVK_KPMU = 63, + XFVK_KPSU = 82, + + XFVK_KP7 = 79, + XFVK_KP8 = 80, + XFVK_KP9 = 81, + XFVK_KPAD = 86, + + XFVK_KP4 = 83, + XFVK_KP5 = 84, + XFVK_KP6 = 85, + + XFVK_KP1 = 87, + XFVK_KP2 = 88, + XFVK_KP3 = 89, + XFVK_KPEN = 104, + + XFVK_KP0 = 90, + XFVK_KPDL = 91, + XFVK_KPEQ = 125, + + + // Microsoft keyboard extra keys + XFVK_LWIN = 133, + XFVK_RWIN = 134, + XFVK_COMP = 135, + XFVK_MENU = XFVK_COMP, + + // Extended keys + XFVK_CALC = 148, + + XFVK_FK13 = 191, + XFVK_FK14 = 192, + XFVK_FK15 = 193, + XFVK_FK16 = 194, + XFVK_FK17 = 195, + XFVK_FK18 = 196, + XFVK_FK19 = 197, + XFVK_FK20 = 198, + XFVK_FK21 = 199, + XFVK_FK22 = 200, + XFVK_FK23 = 201, + XFVK_FK24 = 202, + + XFVK_LAST, + XFVK_DUMMY = 255 +}; + +#endif /* __XFREE86_KEYCODES__H */ + diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 522f77ae32..48d9855320 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -50,9 +50,7 @@ #endif #ifdef HAVE_X11 -#include -#include -#include +#include "input/include/xfree86_keycodes.h" #endif #ifdef HAVE_DINPUT @@ -693,156 +691,123 @@ const struct rarch_key_map rarch_key_map_wiiu[] = { #ifdef HAVE_X11 -#ifndef XF68XK_Calculator -#define XF86XK_Calculator 0x1008FF1D -#endif - const struct rarch_key_map rarch_key_map_x11[] = { - { XK_BackSpace, RETROK_BACKSPACE }, - { XK_Tab, RETROK_TAB }, - { XK_Clear, RETROK_CLEAR }, - { XK_Return, RETROK_RETURN }, - { XK_Pause, RETROK_PAUSE }, - { XK_Escape, RETROK_ESCAPE }, - { XK_space, RETROK_SPACE }, - { XK_exclam, RETROK_EXCLAIM }, - { XK_quotedbl, RETROK_QUOTEDBL }, - { XK_numbersign, RETROK_HASH }, - { XK_dollar, RETROK_DOLLAR }, - { XK_ampersand, RETROK_AMPERSAND }, - { XK_apostrophe, RETROK_QUOTE }, - { XK_parenleft, RETROK_LEFTPAREN }, - { XK_parenright, RETROK_RIGHTPAREN }, - { XK_asterisk, RETROK_ASTERISK }, - { XK_plus, RETROK_PLUS }, - { XK_comma, RETROK_COMMA }, - { XK_minus, RETROK_MINUS }, - { XK_period, RETROK_PERIOD }, - { XK_slash, RETROK_SLASH }, - { XK_0, RETROK_0 }, - { XK_1, RETROK_1 }, - { XK_2, RETROK_2 }, - { XK_3, RETROK_3 }, - { XK_4, RETROK_4 }, - { XK_5, RETROK_5 }, - { XK_6, RETROK_6 }, - { XK_7, RETROK_7 }, - { XK_8, RETROK_8 }, - { XK_9, RETROK_9 }, - { XK_colon, RETROK_COLON }, - { XK_semicolon, RETROK_SEMICOLON }, - { XK_less, RETROK_LESS }, - { XK_equal, RETROK_EQUALS }, - { XK_greater, RETROK_GREATER }, - { XK_question, RETROK_QUESTION }, - { XK_at, RETROK_AT }, - { XK_bracketleft, RETROK_LEFTBRACKET }, - { XK_backslash, RETROK_BACKSLASH }, - { XK_bracketright, RETROK_RIGHTBRACKET }, - { XK_dead_circumflex, RETROK_CARET }, - { XK_underscore, RETROK_UNDERSCORE }, - { XK_grave, RETROK_BACKQUOTE }, - { XK_a, RETROK_a }, - { XK_b, RETROK_b }, - { XK_c, RETROK_c }, - { XK_d, RETROK_d }, - { XK_e, RETROK_e }, - { XK_f, RETROK_f }, - { XK_g, RETROK_g }, - { XK_h, RETROK_h }, - { XK_i, RETROK_i }, - { XK_j, RETROK_j }, - { XK_k, RETROK_k }, - { XK_l, RETROK_l }, - { XK_m, RETROK_m }, - { XK_n, RETROK_n }, - { XK_o, RETROK_o }, - { XK_p, RETROK_p }, - { XK_q, RETROK_q }, - { XK_r, RETROK_r }, - { XK_s, RETROK_s }, - { XK_t, RETROK_t }, - { XK_u, RETROK_u }, - { XK_v, RETROK_v }, - { XK_w, RETROK_w }, - { XK_x, RETROK_x }, - { XK_y, RETROK_y }, - { XK_z, RETROK_z }, - { XK_Delete, RETROK_DELETE }, - { XK_KP_0, RETROK_KP0 }, - { XK_KP_1, RETROK_KP1 }, - { XK_KP_2, RETROK_KP2 }, - { XK_KP_3, RETROK_KP3 }, - { XK_KP_4, RETROK_KP4 }, - { XK_KP_5, RETROK_KP5 }, - { XK_KP_6, RETROK_KP6 }, - { XK_KP_7, RETROK_KP7 }, - { XK_KP_8, RETROK_KP8 }, - { XK_KP_9, RETROK_KP9 }, - { XK_KP_Decimal, RETROK_KP_PERIOD }, - { XK_KP_Divide, RETROK_KP_DIVIDE }, - { XK_KP_Multiply, RETROK_KP_MULTIPLY }, - { XK_KP_Subtract, RETROK_KP_MINUS }, - { XK_KP_Add, RETROK_KP_PLUS }, - { XK_KP_Enter, RETROK_KP_ENTER }, - { XK_KP_Equal, RETROK_KP_EQUALS }, - { XK_Up, RETROK_UP }, - { XK_Down, RETROK_DOWN }, - { XK_Right, RETROK_RIGHT }, - { XK_Left, RETROK_LEFT }, - { XK_Insert, RETROK_INSERT }, - { XK_Home, RETROK_HOME }, - { XK_End, RETROK_END }, - { XK_Page_Up, RETROK_PAGEUP }, - { XK_Page_Down, RETROK_PAGEDOWN }, - { XK_F1, RETROK_F1 }, - { XK_F2, RETROK_F2 }, - { XK_F3, RETROK_F3 }, - { XK_F4, RETROK_F4 }, - { XK_F5, RETROK_F5 }, - { XK_F6, RETROK_F6 }, - { XK_F7, RETROK_F7 }, - { XK_F8, RETROK_F8 }, - { XK_F9, RETROK_F9 }, - { XK_F10, RETROK_F10 }, - { XK_F11, RETROK_F11 }, - { XK_F12, RETROK_F12 }, - { XK_F13, RETROK_F13 }, - { XK_F14, RETROK_F14 }, - { XK_F15, RETROK_F15 }, - { XK_Num_Lock, RETROK_NUMLOCK }, - { XK_Caps_Lock, RETROK_CAPSLOCK }, - { XK_Scroll_Lock, RETROK_SCROLLOCK }, - { XK_Shift_R, RETROK_RSHIFT }, - { XK_Shift_L, RETROK_LSHIFT }, - { XK_Control_R, RETROK_RCTRL }, - { XK_Control_L, RETROK_LCTRL }, - { XK_Alt_R, RETROK_RALT }, - { XK_Alt_L, RETROK_LALT }, - { XK_Meta_R, RETROK_RMETA }, - { XK_Meta_L, RETROK_LMETA }, - { XK_Super_L, RETROK_LSUPER }, - { XK_Super_R, RETROK_RSUPER }, - { XK_Mode_switch, RETROK_MODE }, - { XK_Multi_key, RETROK_COMPOSE }, - { XK_Help, RETROK_HELP }, - { XK_Print, RETROK_PRINT }, - { XK_Sys_Req, RETROK_SYSREQ }, - { XK_Break, RETROK_BREAK }, - { XK_Menu, RETROK_MENU }, - /*{ ?, RETROK_POWER },*/ - { XK_EuroSign, RETROK_EURO }, - { XK_Undo, RETROK_UNDO }, - /*{ ?, RETROK_OEM_102 },*/ - /* FIXME(shizeeg): RetroArch can't handle these buttons atm. - * Do we really need RETROK_KP_INSERT, RETROK_KP_END, - * RETROK_KP_DOWN, RETROK_KP_PAGEDOWN ??? - * - { XK_KP_Insert, RETROK_KP0 }, - { XK_KP_End, RETROK_KP1 }, - { XK_KP_Down, RETROK_KP2 }, - { XK_KP_Page_Down, RETROK_KP3 },*/ - { XF86XK_Calculator, RETROK_HELP }, + + { XFVK_ESC, RETROK_ESCAPE }, + { XFVK_FK01, RETROK_F1 }, + { XFVK_FK02, RETROK_F2 }, + { XFVK_FK03, RETROK_F3 }, + { XFVK_FK04, RETROK_F4 }, + { XFVK_FK05, RETROK_F5 }, + { XFVK_FK06, RETROK_F6 }, + { XFVK_FK07, RETROK_F7 }, + { XFVK_FK08, RETROK_F8 }, + { XFVK_FK09, RETROK_F9 }, + { XFVK_FK10, RETROK_F10 }, + { XFVK_FK11, RETROK_F11 }, + { XFVK_FK12, RETROK_F12 }, + + { XFVK_TLDE, RETROK_BACKQUOTE }, + { XFVK_AE01, RETROK_1 }, + { XFVK_AE02, RETROK_2 }, + { XFVK_AE03, RETROK_3 }, + { XFVK_AE04, RETROK_4 }, + { XFVK_AE05, RETROK_5 }, + { XFVK_AE06, RETROK_6 }, + { XFVK_AE07, RETROK_7 }, + { XFVK_AE08, RETROK_8 }, + { XFVK_AE09, RETROK_9 }, + { XFVK_AE10, RETROK_0 }, + { XFVK_AE11, RETROK_MINUS }, + { XFVK_AE12, RETROK_EQUALS }, + { XFVK_BKSP, RETROK_BACKSPACE }, + + { XFVK_TAB, RETROK_TAB }, + { XFVK_AD01, RETROK_q }, + { XFVK_AD02, RETROK_w }, + { XFVK_AD03, RETROK_e }, + { XFVK_AD04, RETROK_r }, + { XFVK_AD05, RETROK_t }, + { XFVK_AD06, RETROK_y }, + { XFVK_AD07, RETROK_u }, + { XFVK_AD08, RETROK_i }, + { XFVK_AD09, RETROK_o }, + { XFVK_AD10, RETROK_p }, + { XFVK_AD11, RETROK_LEFTBRACKET }, + { XFVK_AD12, RETROK_RIGHTBRACKET }, + { XFVK_RTRN, RETROK_RETURN }, + + { XFVK_CAPS, RETROK_CAPSLOCK }, + { XFVK_AC01, RETROK_a }, + { XFVK_AC02, RETROK_s }, + { XFVK_AC03, RETROK_d }, + { XFVK_AC04, RETROK_f }, + { XFVK_AC05, RETROK_g }, + { XFVK_AC06, RETROK_h }, + { XFVK_AC07, RETROK_j }, + { XFVK_AC08, RETROK_k }, + { XFVK_AC09, RETROK_l }, + { XFVK_AC10, RETROK_SEMICOLON }, + { XFVK_AC11, RETROK_QUOTE }, + { XFVK_AC12, RETROK_BACKSLASH }, + + { XFVK_LFSH, RETROK_LSHIFT }, + { XFVK_AB01, RETROK_z }, + { XFVK_AB02, RETROK_x }, + { XFVK_AB03, RETROK_c }, + { XFVK_AB04, RETROK_v }, + { XFVK_AB05, RETROK_b }, + { XFVK_AB06, RETROK_n }, + { XFVK_AB07, RETROK_m }, + { XFVK_AB08, RETROK_COMMA }, + { XFVK_AB09, RETROK_PERIOD }, + { XFVK_AB10, RETROK_SLASH }, + { XFVK_RTSH, RETROK_RSHIFT }, + + { XFVK_LALT, RETROK_LALT }, + { XFVK_LCTL, RETROK_LCTRL }, + { XFVK_SPCE, RETROK_SPACE }, + { XFVK_RCTL, RETROK_RCTRL }, + { XFVK_RALT, RETROK_RALT }, + + { XFVK_LSGT, RETROK_OEM_102 }, + { XFVK_MENU, RETROK_MENU }, + { XFVK_LWIN, RETROK_LSUPER }, + { XFVK_RWIN, RETROK_RSUPER }, + { XFVK_CALC, RETROK_HELP }, + + { XFVK_PRSC, RETROK_PRINT }, + { XFVK_SCLK, RETROK_SCROLLOCK }, + { XFVK_PAUS, RETROK_PAUSE }, + { XFVK_INS, RETROK_INSERT }, + { XFVK_HOME, RETROK_HOME }, + { XFVK_PGUP, RETROK_PAGEUP }, + { XFVK_DELE, RETROK_DELETE }, + { XFVK_END, RETROK_END }, + { XFVK_PGDN, RETROK_PAGEDOWN }, + { XFVK_UP, RETROK_UP }, + { XFVK_LEFT, RETROK_LEFT }, + { XFVK_DOWN, RETROK_DOWN }, + { XFVK_RGHT, RETROK_RIGHT }, + + { XFVK_NMLK, RETROK_NUMLOCK }, + { XFVK_KPDV, RETROK_KP_DIVIDE }, + { XFVK_KPMU, RETROK_KP_MULTIPLY }, + { XFVK_KPSU, RETROK_KP_MINUS }, + { XFVK_KP7, RETROK_KP7 }, + { XFVK_KP8, RETROK_KP8 }, + { XFVK_KP9, RETROK_KP9 }, + { XFVK_KPAD, RETROK_KP_PLUS }, + { XFVK_KP4, RETROK_KP4 }, + { XFVK_KP5, RETROK_KP5 }, + { XFVK_KP6, RETROK_KP6 }, + { XFVK_KP1, RETROK_KP1 }, + { XFVK_KP2, RETROK_KP2 }, + { XFVK_KP3, RETROK_KP3 }, + { XFVK_KPEN, RETROK_KP_ENTER }, + { XFVK_KP0, RETROK_KP0 }, + { XFVK_KPDL, RETROK_KP_PERIOD }, + { XFVK_KPEQ, RETROK_KP_EQUALS }, { 0, RETROK_UNKNOWN }, };