Prechádzať zdrojové kódy

Ports: Update SDL2 scancode mapping

This was broken since c8f27d7cb8bd introduced a new enum value in
between existing values. Since the Serenity platform support in SDL2
relied on a sequential array index, a lot of keys were now incorrectly
mapped.

This introduces a new way to map Serenity `KeyCode` to SDL2's scancode
constants that is less prone to breaking in the future.
Jelle Raaijmakers 1 rok pred
rodič
commit
055f78f528

+ 152 - 114
Ports/SDL2/patches/0001-Add-SerenityOS-platform-support.patch

@@ -31,19 +31,19 @@ Co-Authored-By: Tim Ledbetter <timledbetter@gmail.com>
  src/audio/SDL_audio.c                         |   3 +
  src/audio/SDL_sysaudio.h                      |   1 +
  src/audio/serenity/SDL_serenityaudio.cpp      | 166 +++++
- src/audio/serenity/SDL_serenityaudio.h        |  38 ++
+ src/audio/serenity/SDL_serenityaudio.h        |  38 +
  src/stdlib/SDL_stdlib.c                       |   2 +-
  src/video/SDL_sysvideo.h                      |   1 +
  src/video/SDL_video.c                         |  13 +
  src/video/serenity/SDL_serenityevents.cpp     |  52 ++
  src/video/serenity/SDL_serenityevents_c.h     |  33 +
  src/video/serenity/SDL_serenitymessagebox.cpp |  40 ++
- src/video/serenity/SDL_serenitymessagebox.h   |  38 ++
+ src/video/serenity/SDL_serenitymessagebox.h   |  38 +
  src/video/serenity/SDL_serenitymouse.cpp      | 142 ++++
  src/video/serenity/SDL_serenitymouse.h        |  39 ++
- src/video/serenity/SDL_serenityvideo.cpp      | 617 ++++++++++++++++++
+ src/video/serenity/SDL_serenityvideo.cpp      | 655 ++++++++++++++++++
  src/video/serenity/SDL_serenityvideo.h        | 101 +++
- 21 files changed, 1320 insertions(+), 26 deletions(-)
+ 21 files changed, 1358 insertions(+), 26 deletions(-)
  create mode 100644 src/audio/serenity/SDL_serenityaudio.cpp
  create mode 100644 src/audio/serenity/SDL_serenityaudio.h
  create mode 100644 src/video/serenity/SDL_serenityevents.cpp
@@ -889,10 +889,10 @@ index 0000000000000000000000000000000000000000..039f0361b3d1b248e218ea69495f58e5
 +/* vi: set ts=4 sw=4 expandtab: */
 diff --git a/src/video/serenity/SDL_serenityvideo.cpp b/src/video/serenity/SDL_serenityvideo.cpp
 new file mode 100644
-index 0000000000000000000000000000000000000000..411deb26028567d753b8335e606d59d05e004caa
+index 0000000000000000000000000000000000000000..26ff18b1c878f7a14c32554859bd088522806b91
 --- /dev/null
 +++ b/src/video/serenity/SDL_serenityvideo.cpp
-@@ -0,0 +1,617 @@
+@@ -0,0 +1,655 @@
 +/*
 +  Simple DirectMedia Layer
 +  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
@@ -932,6 +932,8 @@ index 0000000000000000000000000000000000000000..411deb26028567d753b8335e606d59d0
 +#    include "SDL_serenitymouse.h"
 +#    include "SDL_serenityvideo.h"
 +
++#    include <AK/Array.h>
++#    include <Kernel/API/KeyCode.h>
 +#    include <LibCore/EventLoop.h>
 +#    include <LibGUI/Application.h>
 +#    include <LibGUI/Desktop.h>
@@ -942,114 +944,150 @@ index 0000000000000000000000000000000000000000..411deb26028567d753b8335e606d59d0
 +#    include <LibMain/Main.h>
 +#    include <dlfcn.h>
 +
-+static SDL_Scancode scancode_map[] = {
-+    SDL_SCANCODE_UNKNOWN,
-+    SDL_SCANCODE_ESCAPE,
-+    SDL_SCANCODE_TAB,
-+    SDL_SCANCODE_BACKSPACE,
-+    SDL_SCANCODE_RETURN,
-+    SDL_SCANCODE_INSERT,
-+    SDL_SCANCODE_DELETE,
-+    SDL_SCANCODE_PRINTSCREEN,
-+    SDL_SCANCODE_SYSREQ,
-+    SDL_SCANCODE_HOME,
-+    SDL_SCANCODE_END,
-+    SDL_SCANCODE_LEFT,
-+    SDL_SCANCODE_UP,
-+    SDL_SCANCODE_RIGHT,
-+    SDL_SCANCODE_DOWN,
-+    SDL_SCANCODE_PAGEUP,
-+    SDL_SCANCODE_PAGEDOWN,
-+    SDL_SCANCODE_LSHIFT,
-+    SDL_SCANCODE_RSHIFT,
-+    SDL_SCANCODE_LCTRL,
-+    SDL_SCANCODE_LALT,
-+    SDL_SCANCODE_CAPSLOCK,
-+    SDL_SCANCODE_NUMLOCKCLEAR,
-+    SDL_SCANCODE_SCROLLLOCK,
-+    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_F11,
-+    SDL_SCANCODE_F12,
-+    SDL_SCANCODE_SPACE,
-+    SDL_SCANCODE_1,
-+    SDL_SCANCODE_APOSTROPHE,
-+    SDL_SCANCODE_3,
-+    SDL_SCANCODE_4,
-+    SDL_SCANCODE_5,
-+    SDL_SCANCODE_7,
-+    SDL_SCANCODE_APOSTROPHE,
-+    SDL_SCANCODE_9,
-+    SDL_SCANCODE_0,
-+    SDL_SCANCODE_8,
-+    SDL_SCANCODE_EQUALS,
-+    SDL_SCANCODE_COMMA,
-+    SDL_SCANCODE_MINUS,
-+    SDL_SCANCODE_PERIOD,
-+    SDL_SCANCODE_SLASH,
-+    SDL_SCANCODE_0,
-+    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_SEMICOLON,
-+    SDL_SCANCODE_SEMICOLON,
-+    SDL_SCANCODE_COMMA,
-+    SDL_SCANCODE_EQUALS,
-+    SDL_SCANCODE_PERIOD,
-+    SDL_SCANCODE_SLASH,
-+    SDL_SCANCODE_2,
-+    SDL_SCANCODE_A,
-+    SDL_SCANCODE_B,
-+    SDL_SCANCODE_C,
-+    SDL_SCANCODE_D,
-+    SDL_SCANCODE_E,
-+    SDL_SCANCODE_F,
-+    SDL_SCANCODE_G,
-+    SDL_SCANCODE_H,
-+    SDL_SCANCODE_I,
-+    SDL_SCANCODE_J,
-+    SDL_SCANCODE_K,
-+    SDL_SCANCODE_L,
-+    SDL_SCANCODE_M,
-+    SDL_SCANCODE_N,
-+    SDL_SCANCODE_O,
-+    SDL_SCANCODE_P,
-+    SDL_SCANCODE_Q,
-+    SDL_SCANCODE_R,
-+    SDL_SCANCODE_S,
-+    SDL_SCANCODE_T,
-+    SDL_SCANCODE_U,
-+    SDL_SCANCODE_V,
-+    SDL_SCANCODE_W,
-+    SDL_SCANCODE_X,
-+    SDL_SCANCODE_Y,
-+    SDL_SCANCODE_Z,
-+    SDL_SCANCODE_LEFTBRACKET,
-+    SDL_SCANCODE_RIGHTBRACKET,
-+    SDL_SCANCODE_BACKSLASH,
-+    SDL_SCANCODE_6,
-+    SDL_SCANCODE_MINUS,
-+    SDL_SCANCODE_LEFTBRACKET,
-+    SDL_SCANCODE_RIGHTBRACKET,
-+    SDL_SCANCODE_BACKSLASH,
-+    SDL_SCANCODE_GRAVE,
-+    SDL_SCANCODE_GRAVE,
-+    SDL_SCANCODE_UNKNOWN,
-+};
++static consteval AK::Array<SDL_Scancode, key_code_count> generate_scancode_map()
++{
++    auto map = AK::Array<SDL_Scancode, key_code_count>::from_repeated_value(SDL_SCANCODE_UNKNOWN);
++
++    // Below list is in order of Kernel/API/KeyCode.h; the shift modifier is applied by SDL
++    // and as such, unshifted scancodes must be used (e.g. dollar sign => 4).
++#   define MAP_KEYCODE(A,B) map[to_underlying(KeyCode::Key_##A)] = SDL_SCANCODE_##B;
++    MAP_KEYCODE(Escape, ESCAPE);
++    MAP_KEYCODE(Tab, TAB);
++    MAP_KEYCODE(Backspace, BACKSPACE);
++    MAP_KEYCODE(Return, RETURN);
++    MAP_KEYCODE(Insert, INSERT);
++    MAP_KEYCODE(Delete, DELETE);
++    MAP_KEYCODE(PrintScreen, PRINTSCREEN);
++    MAP_KEYCODE(PauseBreak, PAUSE);
++    MAP_KEYCODE(SysRq, SYSREQ);
++    MAP_KEYCODE(Home, HOME);
++    MAP_KEYCODE(End, END);
++    MAP_KEYCODE(Left, LEFT);
++    MAP_KEYCODE(Up, UP);
++    MAP_KEYCODE(Right, RIGHT);
++    MAP_KEYCODE(Down, DOWN);
++    MAP_KEYCODE(PageUp, PAGEUP);
++    MAP_KEYCODE(PageDown, PAGEDOWN);
++    MAP_KEYCODE(LeftShift, LSHIFT);
++    MAP_KEYCODE(RightShift, RSHIFT);
++    MAP_KEYCODE(Control, LCTRL);
++    MAP_KEYCODE(RightControl, RCTRL);
++    MAP_KEYCODE(Alt, LALT);
++    MAP_KEYCODE(RightAlt, RALT);
++    MAP_KEYCODE(CapsLock, CAPSLOCK);
++    MAP_KEYCODE(NumLock, NUMLOCKCLEAR);
++    MAP_KEYCODE(ScrollLock, SCROLLLOCK);
++    MAP_KEYCODE(F1, F1);
++    MAP_KEYCODE(F2, F2);
++    MAP_KEYCODE(F3, F3);
++    MAP_KEYCODE(F4, F4);
++    MAP_KEYCODE(F5, F5);
++    MAP_KEYCODE(F6, F6);
++    MAP_KEYCODE(F7, F7);
++    MAP_KEYCODE(F8, F8);
++    MAP_KEYCODE(F9, F9);
++    MAP_KEYCODE(F10, F10);
++    MAP_KEYCODE(F11, F11);
++    MAP_KEYCODE(F12, F12);
++    MAP_KEYCODE(Space, SPACE);
++    MAP_KEYCODE(ExclamationPoint, 1);
++    MAP_KEYCODE(DoubleQuote, APOSTROPHE);
++    MAP_KEYCODE(Hashtag, 3);
++    MAP_KEYCODE(Dollar, 4);
++    MAP_KEYCODE(Percent, 5);
++    MAP_KEYCODE(Ampersand, 7);
++    MAP_KEYCODE(Apostrophe, APOSTROPHE);
++    MAP_KEYCODE(LeftParen, 9);
++    MAP_KEYCODE(RightParen, 0);
++    MAP_KEYCODE(Asterisk, 8);
++    MAP_KEYCODE(Plus, EQUALS);
++    MAP_KEYCODE(Comma, COMMA);
++    MAP_KEYCODE(Minus, MINUS);
++    MAP_KEYCODE(Period, PERIOD);
++    MAP_KEYCODE(Slash, SLASH);
++    MAP_KEYCODE(0, 0);
++    MAP_KEYCODE(1, 1);
++    MAP_KEYCODE(2, 2);
++    MAP_KEYCODE(3, 3);
++    MAP_KEYCODE(4, 4);
++    MAP_KEYCODE(5, 5);
++    MAP_KEYCODE(6, 6);
++    MAP_KEYCODE(7, 7);
++    MAP_KEYCODE(8, 8);
++    MAP_KEYCODE(9, 9);
++    MAP_KEYCODE(Colon, SEMICOLON);
++    MAP_KEYCODE(Semicolon, SEMICOLON);
++    MAP_KEYCODE(LessThan, COMMA);
++    MAP_KEYCODE(Equal, EQUALS);
++    MAP_KEYCODE(GreaterThan, PERIOD);
++    MAP_KEYCODE(QuestionMark, SLASH);
++    MAP_KEYCODE(A, A);
++    MAP_KEYCODE(B, B);
++    MAP_KEYCODE(C, C);
++    MAP_KEYCODE(D, D);
++    MAP_KEYCODE(E, E);
++    MAP_KEYCODE(F, F);
++    MAP_KEYCODE(G, G);
++    MAP_KEYCODE(H, H);
++    MAP_KEYCODE(I, I);
++    MAP_KEYCODE(J, J);
++    MAP_KEYCODE(K, K);
++    MAP_KEYCODE(L, L);
++    MAP_KEYCODE(M, M);
++    MAP_KEYCODE(N, N);
++    MAP_KEYCODE(O, O);
++    MAP_KEYCODE(P, P);
++    MAP_KEYCODE(Q, Q);
++    MAP_KEYCODE(R, R);
++    MAP_KEYCODE(S, S);
++    MAP_KEYCODE(T, T);
++    MAP_KEYCODE(U, U);
++    MAP_KEYCODE(V, V);
++    MAP_KEYCODE(W, W);
++    MAP_KEYCODE(X, X);
++    MAP_KEYCODE(Y, Y);
++    MAP_KEYCODE(Z, Z);
++    MAP_KEYCODE(LeftBracket, LEFTBRACKET);
++    MAP_KEYCODE(RightBracket, RIGHTBRACKET);
++    MAP_KEYCODE(Backslash, BACKSLASH);
++    MAP_KEYCODE(Circumflex, 6);
++    MAP_KEYCODE(Underscore, MINUS);
++    MAP_KEYCODE(LeftBrace, LEFTBRACKET);
++    MAP_KEYCODE(RightBrace, RIGHTBRACKET);
++    MAP_KEYCODE(Pipe, BACKSLASH);
++    MAP_KEYCODE(Tilde, GRAVE);
++    MAP_KEYCODE(Backtick, GRAVE);
++    MAP_KEYCODE(Super, LGUI);
++    MAP_KEYCODE(BrowserSearch, AC_SEARCH);
++    MAP_KEYCODE(BrowserFavorites, AC_BOOKMARKS);
++    MAP_KEYCODE(BrowserHome, AC_HOME);
++    MAP_KEYCODE(PreviousTrack, AUDIOPREV);
++    MAP_KEYCODE(BrowserBack, AC_BACK);
++    MAP_KEYCODE(BrowserForward, AC_FORWARD);
++    MAP_KEYCODE(BrowserRefresh, AC_REFRESH);
++    MAP_KEYCODE(BrowserStop, AC_STOP);
++    MAP_KEYCODE(VolumeDown, VOLUMEDOWN);
++    MAP_KEYCODE(VolumeUp, VOLUMEUP);
++    // Unmapped: Wake
++    MAP_KEYCODE(Sleep, SLEEP);
++    MAP_KEYCODE(NextTrack, AUDIONEXT);
++    MAP_KEYCODE(MediaSelect, MEDIASELECT);
++    MAP_KEYCODE(Email, MAIL);
++    MAP_KEYCODE(MyComputer, COMPUTER);
++    MAP_KEYCODE(Power, POWER);
++    MAP_KEYCODE(Stop, STOP);
++    MAP_KEYCODE(LeftGUI, LGUI);
++    MAP_KEYCODE(Mute, MUTE);
++    MAP_KEYCODE(RightGUI, RGUI);
++    MAP_KEYCODE(Calculator, CALCULATOR);
++    // Unmapped: Apps
++    MAP_KEYCODE(PlayPause, AUDIOPLAY);
++    MAP_KEYCODE(Menu, APPLICATION);
++
++    return map;
++}
++
++static constexpr auto scancode_map = generate_scancode_map();
 +
 +/* Initialization/Query functions */
 +static int SERENITY_VideoInit(_THIS);