[retro-gtk/wip/aplazas/kbd: 2/2] keyboard: Map keycode directly



commit 84984e66943a33413f6b9baca7b9f6ee92ce7d0b
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Tue Apr 7 21:52:06 2020 +0500

    keyboard: Map keycode directly
    
    Don't try to guess it from keyval. The mapping is based on RetroArch.

 retro-gtk/retro-core.c             |   2 +-
 retro-gtk/retro-keyboard-private.h |   2 +-
 retro-gtk/retro-keyboard.c         | 398 ++++++++++++++++++++++++-------------
 3 files changed, 267 insertions(+), 135 deletions(-)
---
diff --git a/retro-gtk/retro-core.c b/retro-gtk/retro-core.c
index e44719d..04e2284 100644
--- a/retro-gtk/retro-core.c
+++ b/retro-gtk/retro-core.c
@@ -645,7 +645,7 @@ key_event_cb (GtkWidget   *widget,
     return FALSE;
 
   pressed = event->type == GDK_KEY_PRESS;
-  retro_key = retro_keyboard_key_converter (event->keyval);
+  retro_key = retro_keyboard_key_converter (event->hardware_keycode);
   retro_modifier_key = retro_keyboard_modifier_key_converter (event->keyval, event->state);
   character = gdk_keyval_to_unicode (event->keyval);
 
diff --git a/retro-gtk/retro-keyboard-private.h b/retro-gtk/retro-keyboard-private.h
index d69c90b..cf34ba3 100644
--- a/retro-gtk/retro-keyboard-private.h
+++ b/retro-gtk/retro-keyboard-private.h
@@ -13,7 +13,7 @@ G_BEGIN_DECLS
 
 RetroKeyboardModifierKey retro_keyboard_modifier_key_converter (guint keyval,
                                                                 GdkModifierType modifiers);
-RetroKeyboardKey retro_keyboard_key_converter (guint keyval);
+RetroKeyboardKey retro_keyboard_key_converter (guint16 keycode);
 guint retro_keyboard_key_to_val_converter (RetroKeyboardKey key);
 
 G_END_DECLS
diff --git a/retro-gtk/retro-keyboard.c b/retro-gtk/retro-keyboard.c
index 41b022c..9bff3d2 100644
--- a/retro-gtk/retro-keyboard.c
+++ b/retro-gtk/retro-keyboard.c
@@ -2,6 +2,8 @@
 
 #include "retro-keyboard-private.h"
 
+#include <linux/input-event-codes.h>
+
 RetroKeyboardModifierKey
 retro_keyboard_modifier_key_converter (guint           keyval,
                                        GdkModifierType modifiers)
@@ -26,145 +28,275 @@ retro_keyboard_modifier_key_converter (guint           keyval,
   return retro_modifiers;
 }
 
+/* Mappings of the 0x100 first Linux input event key codes to the corresponding
+ * Libretro keyboard code.
+ */
+static RetroKeyboardKey keycode_mappings[] = {
+  RETRO_KEYBOARD_KEY_FIRST, /* KEY_RESERVED */
+  RETRO_KEYBOARD_KEY_ESCAPE, /* KEY_ESC */
+  RETRO_KEYBOARD_KEY_ONE, /* KEY_1 */
+  RETRO_KEYBOARD_KEY_TWO, /* KEY_2 */
+  RETRO_KEYBOARD_KEY_THREE, /* KEY_3 */
+  RETRO_KEYBOARD_KEY_FOUR, /* KEY_4 */
+  RETRO_KEYBOARD_KEY_FIVE, /* KEY_5 */
+  RETRO_KEYBOARD_KEY_SIX, /* KEY_6 */
+  RETRO_KEYBOARD_KEY_SEVEN, /* KEY_7 */
+  RETRO_KEYBOARD_KEY_EIGHT, /* KEY_8 */
+  RETRO_KEYBOARD_KEY_NINE, /* KEY_9 */
+  RETRO_KEYBOARD_KEY_ZERO, /* KEY_0 */
+  RETRO_KEYBOARD_KEY_MINUS, /* KEY_MINUS */
+  RETRO_KEYBOARD_KEY_EQUALS, /* KEY_EQUAL */
+  RETRO_KEYBOARD_KEY_BACKSPACE, /* KEY_BACKSPACE */
+  RETRO_KEYBOARD_KEY_TAB, /* KEY_TAB */
+  RETRO_KEYBOARD_KEY_q, /* KEY_Q */
+  RETRO_KEYBOARD_KEY_w, /* KEY_W */
+  RETRO_KEYBOARD_KEY_e, /* KEY_E */
+  RETRO_KEYBOARD_KEY_r, /* KEY_R */
+  RETRO_KEYBOARD_KEY_t, /* KEY_T */
+  RETRO_KEYBOARD_KEY_y, /* KEY_Y */
+  RETRO_KEYBOARD_KEY_u, /* KEY_U */
+  RETRO_KEYBOARD_KEY_i, /* KEY_I */
+  RETRO_KEYBOARD_KEY_o, /* KEY_O */
+  RETRO_KEYBOARD_KEY_p, /* KEY_P */
+  RETRO_KEYBOARD_KEY_LEFTBRACE, /* KEY_LEFTBRACE */
+  RETRO_KEYBOARD_KEY_RIGHTBRACE, /* KEY_RIGHTBRACE */
+  RETRO_KEYBOARD_KEY_RETURN, /* KEY_ENTER */
+  RETRO_KEYBOARD_KEY_LCTRL, /* KEY_LEFTCTRL */
+  RETRO_KEYBOARD_KEY_a, /* KEY_A */
+  RETRO_KEYBOARD_KEY_s, /* KEY_S */
+  RETRO_KEYBOARD_KEY_d, /* KEY_D */
+  RETRO_KEYBOARD_KEY_f, /* KEY_F */
+  RETRO_KEYBOARD_KEY_g, /* KEY_G */
+  RETRO_KEYBOARD_KEY_h, /* KEY_H */
+  RETRO_KEYBOARD_KEY_j, /* KEY_J */
+  RETRO_KEYBOARD_KEY_k, /* KEY_K */
+  RETRO_KEYBOARD_KEY_l, /* KEY_L */
+  RETRO_KEYBOARD_KEY_SEMICOLON, /* KEY_SEMICOLON */
+  RETRO_KEYBOARD_KEY_QUOTE, /* KEY_APOSTROPHE */
+  RETRO_KEYBOARD_KEY_BACKQUOTE, /* KEY_GRAVE */
+  RETRO_KEYBOARD_KEY_LSHIFT, /* KEY_LEFTSHIFT */
+  RETRO_KEYBOARD_KEY_BACKSLASH, /* KEY_BACKSLASH */
+  RETRO_KEYBOARD_KEY_z, /* KEY_Z */
+  RETRO_KEYBOARD_KEY_x, /* KEY_X */
+  RETRO_KEYBOARD_KEY_c, /* KEY_C */
+  RETRO_KEYBOARD_KEY_v, /* KEY_V */
+  RETRO_KEYBOARD_KEY_b, /* KEY_B */
+  RETRO_KEYBOARD_KEY_n, /* KEY_N */
+  RETRO_KEYBOARD_KEY_m, /* KEY_M */
+  RETRO_KEYBOARD_KEY_COMMA, /* KEY_COMMA */
+  RETRO_KEYBOARD_KEY_PERIOD, /* KEY_DOT */
+  RETRO_KEYBOARD_KEY_SLASH, /* KEY_SLASH */
+  RETRO_KEYBOARD_KEY_RSHIFT, /* KEY_RIGHTSHIFT */
+  RETRO_KEYBOARD_KEY_KP_MULTIPLY, /* KEY_KPASTERISK */
+  RETRO_KEYBOARD_KEY_LALT, /* KEY_LEFTALT */
+  RETRO_KEYBOARD_KEY_SPACE, /* KEY_SPACE */
+  RETRO_KEYBOARD_KEY_CAPSLOCK, /* KEY_CAPSLOCK */
+  RETRO_KEYBOARD_KEY_F1, /* KEY_F1 */
+  RETRO_KEYBOARD_KEY_F2, /* KEY_F2 */
+  RETRO_KEYBOARD_KEY_F3, /* KEY_F3 */
+  RETRO_KEYBOARD_KEY_F4, /* KEY_F4 */
+  RETRO_KEYBOARD_KEY_F5, /* KEY_F5 */
+  RETRO_KEYBOARD_KEY_F6, /* KEY_F6 */
+  RETRO_KEYBOARD_KEY_F7, /* KEY_F7 */
+  RETRO_KEYBOARD_KEY_F8, /* KEY_F8 */
+  RETRO_KEYBOARD_KEY_F9, /* KEY_F9 */
+  RETRO_KEYBOARD_KEY_F10, /* KEY_F10 */
+  RETRO_KEYBOARD_KEY_NUMLOCK, /* KEY_NUMLOCK */
+  RETRO_KEYBOARD_KEY_SCROLLOCK, /* KEY_SCROLLLOCK */
+  RETRO_KEYBOARD_KEY_KP7, /* KEY_KP7 */
+  RETRO_KEYBOARD_KEY_KP8, /* KEY_KP8 */
+  RETRO_KEYBOARD_KEY_KP9, /* KEY_KP9 */
+  RETRO_KEYBOARD_KEY_KP_MINUS, /* KEY_KPMINUS */
+  RETRO_KEYBOARD_KEY_KP4, /* KEY_KP4 */
+  RETRO_KEYBOARD_KEY_KP5, /* KEY_KP5 */
+  RETRO_KEYBOARD_KEY_KP6, /* KEY_KP6 */
+  RETRO_KEYBOARD_KEY_KP_PLUS, /* KEY_KPPLUS */
+  RETRO_KEYBOARD_KEY_KP1, /* KEY_KP1 */
+  RETRO_KEYBOARD_KEY_KP2, /* KEY_KP2 */
+  RETRO_KEYBOARD_KEY_KP3, /* KEY_KP3 */
+  RETRO_KEYBOARD_KEY_KP0, /* KEY_KP0 */
+  RETRO_KEYBOARD_KEY_KP_PERIOD, /* KEY_KPDOT */
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_ZENKAKUHANKAKU */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_102ND */
+  RETRO_KEYBOARD_KEY_F11, /* KEY_F11 */
+  RETRO_KEYBOARD_KEY_F12, /* KEY_F12 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_RO */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KATAKANA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HIRAGANA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HENKAN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KATAKANAHIRAGANA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MUHENKAN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KPJPCOMMA */
+  RETRO_KEYBOARD_KEY_KP_ENTER, /* KEY_KPENTER */
+  RETRO_KEYBOARD_KEY_RCTRL, /* KEY_RIGHTCTRL */
+  RETRO_KEYBOARD_KEY_KP_DIVIDE, /* KEY_KPSLASH */
+  RETRO_KEYBOARD_KEY_SYSREQ, /* KEY_SYSRQ */
+  RETRO_KEYBOARD_KEY_RALT, /* KEY_RIGHTALT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_LINEFEED */
+  RETRO_KEYBOARD_KEY_HOME, /* KEY_HOME */
+  RETRO_KEYBOARD_KEY_UP, /* KEY_UP */
+  RETRO_KEYBOARD_KEY_PAGEUP, /* KEY_PAGEUP */
+  RETRO_KEYBOARD_KEY_LEFT, /* KEY_LEFT */
+  RETRO_KEYBOARD_KEY_RIGHT, /* KEY_RIGHT */
+  RETRO_KEYBOARD_KEY_END, /* KEY_END */
+  RETRO_KEYBOARD_KEY_DOWN, /* KEY_DOWN */
+  RETRO_KEYBOARD_KEY_PAGEDOWN, /* KEY_PAGEDOWN */
+  RETRO_KEYBOARD_KEY_INSERT, /* KEY_INSERT */
+  RETRO_KEYBOARD_KEY_DELETE, /* KEY_DELETE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MACRO */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MUTE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_VOLUMEDOWN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_VOLUMEUP */
+  RETRO_KEYBOARD_KEY_POWER, /* KEY_POWER */
+  RETRO_KEYBOARD_KEY_KP_EQUALS, /* KEY_KPEQUAL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KPPLUSMINUS */
+  RETRO_KEYBOARD_KEY_PAUSE, /* KEY_PAUSE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SCALE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KPCOMMA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HANGEUL, KEY_HANGUEL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HANJA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_YEN */
+  RETRO_KEYBOARD_KEY_LSUPER, /* KEY_LEFTMETA */
+  RETRO_KEYBOARD_KEY_RSUPER, /* KEY_RIGHTMETA */
+  RETRO_KEYBOARD_KEY_COMPOSE, /* KEY_COMPOSE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_STOP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_AGAIN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PROPS */
+  RETRO_KEYBOARD_KEY_UNDO, /* KEY_UNDO */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FRONT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_COPY */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_OPEN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PASTE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FIND */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CUT */
+  RETRO_KEYBOARD_KEY_HELP, /* KEY_HELP */
+  RETRO_KEYBOARD_KEY_MENU, /* KEY_MENU */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CALC */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SETUP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SLEEP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_WAKEUP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FILE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SENDFILE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_DELETEFILE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_XFER */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PROG1 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PROG2 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_WWW */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MSDOS */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_COFFEE, KEY_SCREENLOCK */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_ROTATE_DISPLAY, KEY_DIRECTION */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CYCLEWINDOWS */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MAIL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BOOKMARKS */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_COMPUTER */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BACK */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FORWARD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CLOSECD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_EJECTCD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_EJECTCLOSECD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_NEXTSONG */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PLAYPAUSE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PREVIOUSSONG */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_STOPCD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_RECORD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_REWIND */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PHONE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_ISO */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CONFIG */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HOMEPAGE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_REFRESH */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_EXIT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MOVE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_EDIT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SCROLLUP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SCROLLDOWN */
+  /* FIXME Check the values for KEY_KPLEFTPAREN and KEY_KPRIGHTPAREN are correct. */
+  RETRO_KEYBOARD_KEY_LEFTPAREN, /* KEY_KPLEFTPAREN */
+  RETRO_KEYBOARD_KEY_RIGHTPAREN, /* KEY_KPRIGHTPAREN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_NEW */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_REDO */
+  RETRO_KEYBOARD_KEY_F13, /* KEY_F13 */
+  RETRO_KEYBOARD_KEY_F14, /* KEY_F14 */
+  RETRO_KEYBOARD_KEY_F15, /* KEY_F15 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F16 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F17 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F18 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F19 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F20 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F21 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F22 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F23 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_F24 */
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN,
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PLAYCD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PAUSECD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PROG3 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PROG4 */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_DASHBOARD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SUSPEND */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CLOSE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_PLAY */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FASTFORWARD */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BASSBOOST */
+  RETRO_KEYBOARD_KEY_PRINT, /* KEY_PRINT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_HP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CAMERA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SOUND */
+  RETRO_KEYBOARD_KEY_QUESTION, /* KEY_QUESTION */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_EMAIL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CHAT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SEARCH */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CONNECT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FINANCE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SPORT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SHOP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_ALTERASE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_CANCEL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BRIGHTNESSDOWN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BRIGHTNESSUP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MEDIA */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SWITCHVIDEOMODE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KBDILLUMTOGGLE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KBDILLUMDOWN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_KBDILLUMUP */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SEND */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_REPLY */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_FORWARDMAIL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_SAVE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_DOCUMENTS */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BATTERY */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BLUETOOTH */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_WLAN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_UWB */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_UNKNOWN */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_VIDEO_NEXT */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_VIDEO_PREV */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BRIGHTNESS_CYCLE */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_BRIGHTNESS_AUTO, KEY_BRIGHTNESS_ZERO */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_DISPLAY_OFF */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_WWAN, KEY_WIMAX */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_RFKILL */
+  RETRO_KEYBOARD_KEY_UNKNOWN, /* KEY_MICMUTE */
+};
+
 RetroKeyboardKey
-retro_keyboard_key_converter (guint keyval)
+retro_keyboard_key_converter (guint16 keycode)
 {
-  /*
-   * US-ASCII codes
-   *
-   * Both GDK_KEY_* and RETRO_KEYBOARD_KEY_* start with the US-ASCII codes,
-   * implementing common letters, digits and symbols.
-   *
-   * If the key is uppercase, turn it lower case as Libretro doesn't make a
-   * distinction between these.
-   */
-  if (keyval < 0x80)
-    return (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z) ?
-      keyval + (GDK_KEY_a - GDK_KEY_A) : keyval;
+  /* GDK adds 8 to the Linux input event codes to create the hardware keycode.*/
 
-  /*
-   * Function keys
-   *
-   * Both GDK_KEY_F* and RETRO_KEYBOARD_KEY_F* implement function keys 1—15 in a
-   * consecutive manner. GDK_KEY_F* actually implements more function keys but
-   * RETRO_KEYBOARD_KEY_F* doesn't.
-   */
-  if (keyval >= GDK_KEY_F1 && keyval <= GDK_KEY_F15)
-    return RETRO_KEYBOARD_KEY_F1 + (keyval - GDK_KEY_F1);
+  g_return_val_if_fail (keycode < 8, RETRO_KEYBOARD_KEY_UNKNOWN);
 
-  /*
-   * Keypad digits
-   *
-   * Both GDK_KEY_KP_* and RETRO_KEYBOARD_KEY_KP* implement keypad digits 0–9 in
-   * a consecutive manner.
-   */
-  if (keyval >= GDK_KEY_KP_0 && keyval <= GDK_KEY_KP_9)
-    return RETRO_KEYBOARD_KEY_KP0 + (keyval - GDK_KEY_KP_0);
+  keycode -= 8;
 
-  /*
-   * Various keys
-   *
-   * FIXME: The following keys are unimplemented because I couldn't find the
-   * right GDK_KEY_* equivalent:
-   * - RETRO_KEYBOARD_KEY_MODE
-   * - RETRO_KEYBOARD_KEY_COMPOSE
-   * - RETRO_KEYBOARD_KEY_POWER
-   */
-  switch (keyval) {
-  case GDK_KEY_BackSpace:
-    return RETRO_KEYBOARD_KEY_BACKSPACE;
-  case GDK_KEY_Tab:
-    return RETRO_KEYBOARD_KEY_TAB;
-  case GDK_KEY_Clear:
-    return RETRO_KEYBOARD_KEY_CLEAR;
-  case GDK_KEY_Return:
-    return RETRO_KEYBOARD_KEY_RETURN;
-  case GDK_KEY_Pause:
-    return RETRO_KEYBOARD_KEY_PAUSE;
-  case GDK_KEY_Escape:
-    return RETRO_KEYBOARD_KEY_ESCAPE;
-  case GDK_KEY_Delete:
-    return RETRO_KEYBOARD_KEY_DELETE;
-
-  case GDK_KEY_Up:
-    return RETRO_KEYBOARD_KEY_UP;
-  case GDK_KEY_Down:
-    return RETRO_KEYBOARD_KEY_DOWN;
-  case GDK_KEY_Left:
-    return RETRO_KEYBOARD_KEY_LEFT;
-  case GDK_KEY_Right:
-    return RETRO_KEYBOARD_KEY_RIGHT;
-  case GDK_KEY_Insert:
-    return RETRO_KEYBOARD_KEY_INSERT;
-  case GDK_KEY_Home:
-    return RETRO_KEYBOARD_KEY_HOME;
-  case GDK_KEY_End:
-    return RETRO_KEYBOARD_KEY_END;
-  case GDK_KEY_Page_Up:
-    return RETRO_KEYBOARD_KEY_PAGEUP;
-  case GDK_KEY_Page_Down:
-    return RETRO_KEYBOARD_KEY_PAGEDOWN;
-
-  case GDK_KEY_KP_Decimal:
-    return RETRO_KEYBOARD_KEY_KP_PERIOD;
-  case GDK_KEY_KP_Divide:
-    return RETRO_KEYBOARD_KEY_KP_DIVIDE;
-  case GDK_KEY_KP_Multiply:
-    return RETRO_KEYBOARD_KEY_KP_MULTIPLY;
-  case GDK_KEY_KP_Subtract:
-    return RETRO_KEYBOARD_KEY_KP_MINUS;
-  case GDK_KEY_KP_Add:
-    return RETRO_KEYBOARD_KEY_KP_PLUS;
-  case GDK_KEY_KP_Enter:
-    return RETRO_KEYBOARD_KEY_KP_ENTER;
-  case GDK_KEY_KP_Equal:
-    return RETRO_KEYBOARD_KEY_KP_EQUALS;
-
-  case GDK_KEY_Num_Lock:
-    return RETRO_KEYBOARD_KEY_NUMLOCK;
-  case GDK_KEY_Caps_Lock:
-    return RETRO_KEYBOARD_KEY_CAPSLOCK;
-  case GDK_KEY_Scroll_Lock:
-    return RETRO_KEYBOARD_KEY_SCROLLOCK;
-  case GDK_KEY_Shift_R:
-    return RETRO_KEYBOARD_KEY_RSHIFT;
-  case GDK_KEY_Shift_L:
-    return RETRO_KEYBOARD_KEY_LSHIFT;
-  case GDK_KEY_Control_R:
-    return RETRO_KEYBOARD_KEY_RCTRL;
-  case GDK_KEY_Control_L:
-    return RETRO_KEYBOARD_KEY_LCTRL;
-  case GDK_KEY_Alt_R:
-    return RETRO_KEYBOARD_KEY_RALT;
-  case GDK_KEY_Alt_L:
-    return RETRO_KEYBOARD_KEY_LALT;
-  case GDK_KEY_Meta_R:
-    return RETRO_KEYBOARD_KEY_RMETA;
-  case GDK_KEY_Meta_L:
-    return RETRO_KEYBOARD_KEY_LMETA;
-  case GDK_KEY_Super_R:
-    return RETRO_KEYBOARD_KEY_RSUPER;
-  case GDK_KEY_Super_L:
-    return RETRO_KEYBOARD_KEY_LSUPER;
-
-  case GDK_KEY_Help:
-    return RETRO_KEYBOARD_KEY_HELP;
-  case GDK_KEY_Print:
-    return RETRO_KEYBOARD_KEY_PRINT;
-  case GDK_KEY_Sys_Req:
-    return RETRO_KEYBOARD_KEY_SYSREQ;
-  case GDK_KEY_Break:
-    return RETRO_KEYBOARD_KEY_BREAK;
-  case GDK_KEY_Menu:
-    return RETRO_KEYBOARD_KEY_MENU;
-  case GDK_KEY_EuroSign:
-    return RETRO_KEYBOARD_KEY_EURO;
-  case GDK_KEY_Undo:
-    return RETRO_KEYBOARD_KEY_UNDO;
-
-  default:
+  if (keycode >= G_N_ELEMENTS (keycode_mappings))
     return RETRO_KEYBOARD_KEY_UNKNOWN;
-  }
+
+  return keycode_mappings[keycode];
 }
 
 guint


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]