1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:37:45 +00:00

Ports: Update SDL2 scancode mapping

This was broken since c8f27d7cb8 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.
This commit is contained in:
Jelle Raaijmakers 2024-01-14 18:25:08 +01:00 committed by Andrew Kaster
parent 015622bc22
commit 055f78f528

View file

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