Sfoglia il codice sorgente

Fixed keyboard event handler for Raspberry Pi platform - have to translate native scancode to SDL scancode first for key modifiers to work.

Wei Tjong Yao 12 anni fa
parent
commit
309218444d
1 ha cambiato i file con 151 aggiunte e 24 eliminazioni
  1. 151 24
      Source/ThirdParty/SDL/src/video/raspi/SDL_raspievents.c

+ 151 - 24
Source/ThirdParty/SDL/src/video/raspi/SDL_raspievents.c

@@ -33,29 +33,154 @@
 
 static int event_fd[] = { -1, -1 };        /* assume two USB HID input devices */
 struct input_event event[64];
-#define NUM_INPUT_DEVICE sizeof(event_fd) / sizeof(int)
-
-static SDL_Keycode keymap[] = {
-    0/*KEY_RESERVED*/,
-    SDLK_ESCAPE,'1','2','3','4','5','6','7','8','9','0','-','=',SDLK_BACKSPACE,
-    SDLK_TAB,'q','w','e','r','t','y','u','i','o','p','[',']',SDLK_RETURN,
-    SDLK_LCTRL,'a','s','d','f','g','h','j','k','l',';','\'','`',
-    SDLK_LSHIFT,'\\','z','x','c','v','b','n','m',',','.','/',SDLK_RSHIFT,
-    SDLK_KP_MULTIPLY,SDLK_LALT,SDLK_SPACE,SDLK_CAPSLOCK,
-    SDLK_F1,SDLK_F2,SDLK_F3,SDLK_F4,SDLK_F5,SDLK_F6,SDLK_F7,SDLK_F8,SDLK_F9,SDLK_F10,
-    SDLK_NUMLOCKCLEAR,SDLK_SCROLLLOCK,
-    SDLK_KP_7,SDLK_KP_8,SDLK_KP_9,SDLK_KP_MINUS,SDLK_KP_4,SDLK_KP_5,SDLK_KP_6,
-    SDLK_KP_PLUS,SDLK_KP_1,SDLK_KP_2,SDLK_KP_3,SDLK_KP_0,SDLK_KP_PERIOD,
-    0/*UNKNOWN*/,0/*KEY_ZENKAKUHANKAKU*/,0/*KEY_102ND*/,SDLK_F11,SDLK_F12,0/*KEY_RO*/,
-    0/*KEY_KATAKANA*/,0/*KEY_HIRAGANA*/,0/*KEY_HENKAN*/,0/*KEY_KATAKANAHIRAGANA*/,0/*KEY_MUHENKAN*/,
-    0/*KEY_KPJPCOMMA*/,SDLK_KP_ENTER,SDLK_RCTRL,SDLK_KP_DIVIDE,SDLK_PRINTSCREEN,SDLK_RALT,0/*KEY_LINEFEED*/,
-    SDLK_HOME,SDLK_UP,SDLK_PAGEUP,SDLK_LEFT,SDLK_RIGHT,SDLK_END,SDLK_DOWN,SDLK_PAGEDOWN,SDLK_INSERT,SDLK_DELETE,
-    0/*KEY_MACRO*/,SDLK_MUTE,SDLK_VOLUMEDOWN,SDLK_VOLUMEUP,SDLK_POWER,SDLK_KP_EQUALS,SDLK_KP_PLUSMINUS,SDL_SCANCODE_PAUSE,
-    0/*KEY_SCALE*/,SDLK_KP_COMMA,0/*KEY_HANGEUL*/,0/*KEY_HANJA*/,0/*KEY_YEN*/,SDLK_LGUI,SDLK_RGUI,0/*KEY_COMPOSE*/,
+#define NUM_INPUT_DEVICE SDL_arraysize(event_fd)
+
+/* Raspberry Pi native scancode to SDL scancode mapping */
+static SDL_Scancode RASPI_scancodes[] = {
+    SDL_SCANCODE_UNKNOWN/*KEY_RESERVED*/,
+
+    SDL_SCANCODE_ESCAPE,
+    SDL_SCANCODE_1,
+    SDL_SCANCODE_2,
+    SDL_SCANCODE_3,
+    SDL_SCANCODE_4,
+    SDL_SCANCODE_5,
+    SDL_SCANCODE_6,
+    SDL_SCANCODE_7,
+    SDL_SCANCODE_8,
+    SDL_SCANCODE_9,
+    SDL_SCANCODE_0,
+    SDL_SCANCODE_MINUS,
+    SDL_SCANCODE_EQUALS,
+    SDL_SCANCODE_BACKSPACE,
+
+    SDL_SCANCODE_TAB,
+    SDL_SCANCODE_Q,
+    SDL_SCANCODE_W,
+    SDL_SCANCODE_E,
+    SDL_SCANCODE_R,
+    SDL_SCANCODE_T,
+    SDL_SCANCODE_Y,
+    SDL_SCANCODE_U,
+    SDL_SCANCODE_I,
+    SDL_SCANCODE_O,
+    SDL_SCANCODE_P,
+    SDL_SCANCODE_LEFTBRACKET,
+    SDL_SCANCODE_RIGHTBRACKET,
+    SDL_SCANCODE_RETURN,
+
+    SDL_SCANCODE_LCTRL,
+    SDL_SCANCODE_A,
+    SDL_SCANCODE_S,
+    SDL_SCANCODE_D,
+    SDL_SCANCODE_F,
+    SDL_SCANCODE_G,
+    SDL_SCANCODE_H,
+    SDL_SCANCODE_J,
+    SDL_SCANCODE_K,
+    SDL_SCANCODE_L,
+    SDL_SCANCODE_SEMICOLON,
+    SDL_SCANCODE_APOSTROPHE,
+    SDL_SCANCODE_GRAVE,
+
+    SDL_SCANCODE_LSHIFT,
+    SDL_SCANCODE_BACKSLASH,
+    SDL_SCANCODE_Z,
+    SDL_SCANCODE_X,
+    SDL_SCANCODE_C,
+    SDL_SCANCODE_V,
+    SDL_SCANCODE_B,
+    SDL_SCANCODE_N,
+    SDL_SCANCODE_M,
+    SDL_SCANCODE_COMMA,
+    SDL_SCANCODE_PERIOD,
+    SDL_SCANCODE_SLASH,
+    SDL_SCANCODE_RSHIFT,
+
+    SDL_SCANCODE_KP_MULTIPLY,
+    SDL_SCANCODE_LALT,
+    SDL_SCANCODE_SPACE,
+    SDL_SCANCODE_CAPSLOCK,
+    SDL_SCANCODE_F1,
+    SDL_SCANCODE_F2,
+    SDL_SCANCODE_F3,
+    SDL_SCANCODE_F4,
+    SDL_SCANCODE_F5,
+    SDL_SCANCODE_F6,
+    SDL_SCANCODE_F7,
+    SDL_SCANCODE_F8,
+    SDL_SCANCODE_F9,
+    SDL_SCANCODE_F10,
+
+    SDL_SCANCODE_NUMLOCKCLEAR,
+    SDL_SCANCODE_SCROLLLOCK,
+    SDL_SCANCODE_KP_7,
+    SDL_SCANCODE_KP_8,
+    SDL_SCANCODE_KP_9,
+    SDL_SCANCODE_KP_MINUS,
+    SDL_SCANCODE_KP_4,
+    SDL_SCANCODE_KP_5,
+    SDL_SCANCODE_KP_6,
+    SDL_SCANCODE_KP_PLUS,
+    SDL_SCANCODE_KP_1,
+    SDL_SCANCODE_KP_2,
+    SDL_SCANCODE_KP_3,
+    SDL_SCANCODE_KP_0,
+    SDL_SCANCODE_KP_PERIOD,
+
+    SDL_SCANCODE_UNKNOWN/*UNKNOWN*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_ZENKAKUHANKAKU*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_102ND*/,
+    SDL_SCANCODE_F11,
+    SDL_SCANCODE_F12,
+    SDL_SCANCODE_UNKNOWN/*KEY_RO*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_KATAKANA*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_HIRAGANA*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_HENKAN*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_KATAKANAHIRAGANA*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_MUHENKAN*/,
+
+    SDL_SCANCODE_KP_COMMA,
+    SDL_SCANCODE_KP_ENTER,
+    SDL_SCANCODE_RCTRL,
+    SDL_SCANCODE_KP_DIVIDE,
+    SDL_SCANCODE_PRINTSCREEN,
+    SDL_SCANCODE_RALT,
+    SDL_SCANCODE_UNKNOWN/*KEY_LINEFEED*/,
+
+    SDL_SCANCODE_HOME,
+    SDL_SCANCODE_UP,
+    SDL_SCANCODE_PAGEUP,
+    SDL_SCANCODE_LEFT,
+    SDL_SCANCODE_RIGHT,
+    SDL_SCANCODE_END,
+    SDL_SCANCODE_DOWN,
+    SDL_SCANCODE_PAGEDOWN,
+    SDL_SCANCODE_INSERT,
+    SDL_SCANCODE_DELETE,
+
+    SDL_SCANCODE_UNKNOWN/*KEY_MACRO*/,
+    SDL_SCANCODE_MUTE,
+    SDL_SCANCODE_VOLUMEDOWN,
+    SDL_SCANCODE_VOLUMEUP,
+    SDL_SCANCODE_POWER,
+    SDL_SCANCODE_KP_EQUALS,
+    SDL_SCANCODE_KP_PLUSMINUS,
+    SDL_SCANCODE_PAUSE,
+
+    SDL_SCANCODE_UNKNOWN/*KEY_SCALE*/,
+    SDL_SCANCODE_KP_COMMA,
+    SDL_SCANCODE_UNKNOWN/*KEY_HANGEUL*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_HANJA*/,
+    SDL_SCANCODE_UNKNOWN/*KEY_YEN*/,
+    SDL_SCANCODE_LGUI,
+    SDL_SCANCODE_RGUI,
+    SDL_SCANCODE_UNKNOWN/*KEY_COMPOSE*/,
 };
 
 static int
-TranslateMouseButton(__u16 code) {
+TranslateMouseButton(__u16 code)
+{
     switch (code) {
     case 272:
         return SDL_BUTTON_LEFT;
@@ -89,8 +214,8 @@ PropagateEvents(_THIS, int index)
     for (i = 0; i < count; ++i) {
         switch (event[i].type) {
         case EV_KEY:
-            if (event[i].code < sizeof(keymap) / sizeof(SDL_Keycode)) {
-                SDL_SendKeyboardKey(event[i].value, event[i].code);
+            if (event[i].code < SDL_arraysize(RASPI_scancodes)) {
+                SDL_SendKeyboardKey(event[i].value, RASPI_scancodes[event[i].code]);
             }
             else if ((button = TranslateMouseButton(event[i].code)) != -1) {
                 SDL_SendMouseButton(data->window, index, event[i].value, button);
@@ -164,8 +289,10 @@ RASPI_InitInput(_THIS)
         }
     }
 
-    /* Set Linux scancode to SDL key mapping */
-    SDL_SetKeymap(0, keymap, sizeof(keymap));
+    /* Use default SDL scancode to SDL keycode mapping */
+    SDL_Keycode keymap[SDL_NUM_SCANCODES];
+    SDL_GetDefaultKeymap(keymap);
+    SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
 
     return 0;
 }