diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-11-28 15:43:52 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-11-28 18:20:17 +0800 |
| commit | 9e596ff10782455615f69b9b54ce22176145b020 (patch) | |
| tree | e910b6d6ac2037a9c2c4cd50d15005c71690665b | |
| parent | 0ef919c18108112d6c35c5a4f6a00440059cbc1a (diff) | |
| download | cru-9e596ff10782455615f69b9b54ce22176145b020.tar.gz cru-9e596ff10782455615f69b9b54ce22176145b020.tar.bz2 cru-9e596ff10782455615f69b9b54ce22176145b020.zip | |
Impl key event handling of sdl native window.
| -rw-r--r-- | include/cru/platform/gui/Input.h | 2 | ||||
| -rw-r--r-- | include/cru/platform/gui/sdl/Input.h | 4 | ||||
| -rw-r--r-- | src/platform/gui/Input.cpp | 2 | ||||
| -rw-r--r-- | src/platform/gui/osx/Keyboard.mm | 6 | ||||
| -rw-r--r-- | src/platform/gui/osx/Window.mm | 2 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Input.cpp | 111 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 19 | ||||
| -rw-r--r-- | src/platform/gui/win/Keyboard.cpp | 2 |
8 files changed, 136 insertions, 12 deletions
diff --git a/include/cru/platform/gui/Input.h b/include/cru/platform/gui/Input.h index d731cefa..a29a9bba 100644 --- a/include/cru/platform/gui/Input.h +++ b/include/cru/platform/gui/Input.h @@ -76,7 +76,7 @@ enum class KeyCode { X, Y, Z, - GraveAccent, + Grave, // TODO: fix this key mapping on Windows and Xorg. Tab, CapsLock, LeftShift, diff --git a/include/cru/platform/gui/sdl/Input.h b/include/cru/platform/gui/sdl/Input.h index c6b97727..3e7d4a55 100644 --- a/include/cru/platform/gui/sdl/Input.h +++ b/include/cru/platform/gui/sdl/Input.h @@ -2,11 +2,13 @@ #include <cru/platform/gui/Input.h> -#include <SDL3/SDL_mouse.h> #include <SDL3/SDL_keyboard.h> +#include <SDL3/SDL_keycode.h> +#include <SDL3/SDL_mouse.h> namespace cru::platform::gui::sdl { MouseButton ConvertMouseButton(Uint8 button); +KeyCode ConvertKeyCode(SDL_Keycode keycode); KeyModifier ConvertKeyModifier(SDL_Keymod keymod); KeyModifier GetKeyModifier(); } // namespace cru::platform::gui::sdl diff --git a/src/platform/gui/Input.cpp b/src/platform/gui/Input.cpp index a5e25dc8..3e1f8f4e 100644 --- a/src/platform/gui/Input.cpp +++ b/src/platform/gui/Input.cpp @@ -59,7 +59,7 @@ const std::array<std::string_view, static_cast<int>(KeyCode::NumPad9) + 1> "X", "Y", "Z", - "GraveAccent", + "Grave", "Tab", "CapsLock", "LeftShift", diff --git a/src/platform/gui/osx/Keyboard.mm b/src/platform/gui/osx/Keyboard.mm index e8d22045..5a56a821 100644 --- a/src/platform/gui/osx/Keyboard.mm +++ b/src/platform/gui/osx/Keyboard.mm @@ -56,7 +56,7 @@ KeyCode KeyCodeFromOsxToCru(unsigned short n) { CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Minus, KeyCode::Minus) CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Equal, KeyCode::Equal) CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Backslash, KeyCode::BackSlash) - CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Grave, KeyCode::GraveAccent) + CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Grave, KeyCode::Grave) CRU_DEFINE_KEYCODE_MAP(kVK_Escape, KeyCode::Escape) CRU_DEFINE_KEYCODE_MAP(kVK_Tab, KeyCode::Tab) CRU_DEFINE_KEYCODE_MAP(kVK_CapsLock, KeyCode::CapsLock) @@ -148,7 +148,7 @@ unsigned short KeyCodeFromCruToOsx(KeyCode k) { CRU_DEFINE_KEYCODE_MAP(KeyCode::Minus, kVK_ANSI_Minus) CRU_DEFINE_KEYCODE_MAP(KeyCode::Equal, kVK_ANSI_Equal) CRU_DEFINE_KEYCODE_MAP(KeyCode::BackSlash, kVK_ANSI_Backslash) - CRU_DEFINE_KEYCODE_MAP(KeyCode::GraveAccent, kVK_ANSI_Grave) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Grave, kVK_ANSI_Grave) CRU_DEFINE_KEYCODE_MAP(KeyCode::Escape, kVK_Escape) CRU_DEFINE_KEYCODE_MAP(KeyCode::Tab, kVK_Tab) CRU_DEFINE_KEYCODE_MAP(KeyCode::CapsLock, kVK_CapsLock) @@ -252,7 +252,7 @@ NSString* ConvertKeyCodeToKeyEquivalent(KeyCode key_code) { CRU_DEFINE_KEYCODE_MAP(KeyCode::LeftSquareBracket, @"[") CRU_DEFINE_KEYCODE_MAP(KeyCode::RightSquareBracket, @"]") CRU_DEFINE_KEYCODE_MAP(KeyCode::BackSlash, @"\\") - CRU_DEFINE_KEYCODE_MAP(KeyCode::GraveAccent, @"`") + CRU_DEFINE_KEYCODE_MAP(KeyCode::Grave, @"`") CRU_DEFINE_KEYCODE_MAP(KeyCode::Return, @"\n") CRU_DEFINE_KEYCODE_MAP(KeyCode::Escape, @"\e") CRU_DEFINE_KEYCODE_MAP(KeyCode::Tab, @"\t") diff --git a/src/platform/gui/osx/Window.mm b/src/platform/gui/osx/Window.mm index c9c097fe..8ce25b0f 100644 --- a/src/platform/gui/osx/Window.mm +++ b/src/platform/gui/osx/Window.mm @@ -603,7 +603,7 @@ const std::unordered_set<KeyCode> input_context_handle_codes{ KeyCode::BackSlash, KeyCode::Minus, KeyCode::Equal, - KeyCode::GraveAccent, + KeyCode::Grave, }; } // namespace diff --git a/src/platform/gui/sdl/Input.cpp b/src/platform/gui/sdl/Input.cpp index 1c7b4475..c985928c 100644 --- a/src/platform/gui/sdl/Input.cpp +++ b/src/platform/gui/sdl/Input.cpp @@ -1,4 +1,5 @@ #include "cru/platform/gui/sdl/Input.h" +#include "cru/platform/gui/Input.h" namespace cru::platform::gui::sdl { MouseButton ConvertMouseButton(Uint8 button) { @@ -13,6 +14,114 @@ MouseButton ConvertMouseButton(Uint8 button) { return MouseButtons::Unknown; } +KeyCode ConvertKeyCode(SDL_Keycode keycode) { + switch (keycode) { +#define CRU_SDL_DEFINE_KEY_CODE_CONVERT(cru_key_code, sdl_key_code) \ + case SDLK_##sdl_key_code: \ + return KeyCode::cru_key_code; + + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Grave, GRAVE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Escape, ESCAPE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F1, F1) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F2, F2) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F3, F3) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F4, F4) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F5, F5) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F6, F6) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F7, F7) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F8, F8) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F9, F9) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F10, F10) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F11, F11) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F12, F12) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N0, 0) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N1, 1) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N2, 2) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N3, 3) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N4, 4) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N5, 5) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N6, 6) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N7, 7) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N8, 8) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N9, 9) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(A, A) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(B, B) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(C, C) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(D, D) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(E, E) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(F, F) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(G, G) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(H, H) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(I, I) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(J, J) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(K, K) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(L, L) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(M, M) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(N, N) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(O, O) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(P, P) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Q, Q) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(R, R) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(S, S) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(T, T) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(U, U) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(V, V) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(W, W) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(X, X) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Y, Y) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Z, Z) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Tab, TAB) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(CapsLock, CAPSLOCK) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(LeftShift, LSHIFT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(LeftCtrl, LCTRL) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(LeftSuper, LGUI) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(LeftAlt, LALT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Minus, MINUS) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Equal, EQUALS) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Backspace, BACKSPACE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(LeftSquareBracket, LEFTBRACKET) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(RightSquareBracket, RIGHTBRACKET) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(BackSlash, BACKSLASH) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Semicolon, SEMICOLON) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Quote, APOSTROPHE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Comma, COMMA) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Period, PERIOD) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Slash, SLASH) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(RightShift, RSHIFT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(RightCtrl, RCTRL) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(RightSuper, RGUI) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(RightAlt, RALT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Insert, INSERT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Delete, DELETE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Home, HOME) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(End, END) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(PageUp, PAGEUP) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(PageDown, PAGEDOWN) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Up, UP) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Left, LEFT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Down, DOWN) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Right, RIGHT) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(PrintScreen, PRINTSCREEN) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(ScrollLock, SCROLLLOCK) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Pause, PAUSE) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad0, KP_0) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad1, KP_1) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad2, KP_2) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad3, KP_3) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad4, KP_4) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad5, KP_5) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad6, KP_6) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad7, KP_7) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad8, KP_8) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(NumPad9, KP_9) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Return, RETURN) + CRU_SDL_DEFINE_KEY_CODE_CONVERT(Space, SPACE) +#undef CRU_SDL_DEFINE_KEY_CODE_CONVERT + default: + return KeyCode::Unknown; + } +} + KeyModifier ConvertKeyModifier(SDL_Keymod keymod) { KeyModifier result; if (keymod & SDL_KMOD_SHIFT) result |= KeyModifiers::Shift; @@ -22,4 +131,4 @@ KeyModifier ConvertKeyModifier(SDL_Keymod keymod) { } KeyModifier GetKeyModifier() { return ConvertKeyModifier(SDL_GetModState()); } -} // namespace cru::cru::platform::gui::sdl +} // namespace cru::platform::gui::sdl diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index 93c89cbd..b0fcded4 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -258,6 +258,10 @@ NativeMouseButtonEventArgs ConvertMouseButtonEvent( return { ConvertMouseButton(event.button), {event.x, event.y}, GetKeyModifier()}; } + +NativeKeyEventArgs ConvertKeyEvent(const SDL_KeyboardEvent& event) { + return {ConvertKeyCode(event.key), ConvertKeyModifier(event.mod)}; +} } // namespace bool SdlWindow::HandleEvent(const SDL_Event* event) { @@ -318,14 +322,23 @@ bool SdlWindow::HandleEvent(const SDL_Event* event) { case SDL_EVENT_MOUSE_WHEEL: { const auto& we = event->wheel; if (we.x != 0) { - MouseWheelEvent_.Raise({we.x, {we.mouse_x, we.mouse_y}, GetKeyModifier(), true}); + MouseWheelEvent_.Raise( + {we.x, {we.mouse_x, we.mouse_y}, GetKeyModifier(), true}); } if (we.y != 0) { - MouseWheelEvent_.Raise({we.y, {we.mouse_x, we.mouse_y}, GetKeyModifier(), false}); + MouseWheelEvent_.Raise( + {we.y, {we.mouse_x, we.mouse_y}, GetKeyModifier(), false}); } return true; } - // TODO: Keyboard event. + case SDL_EVENT_KEY_DOWN: { + KeyDownEvent_.Raise(ConvertKeyEvent(event->key)); + return true; + } + case SDL_EVENT_KEY_UP: { + KeyUpEvent_.Raise(ConvertKeyEvent(event->key)); + return true; + } } return false; } diff --git a/src/platform/gui/win/Keyboard.cpp b/src/platform/gui/win/Keyboard.cpp index 29932ff3..9b9a2135 100644 --- a/src/platform/gui/win/Keyboard.cpp +++ b/src/platform/gui/win/Keyboard.cpp @@ -21,7 +21,7 @@ KeyCode VirtualKeyToKeyCode(int virtual_key) { CRU_MAP_KEY(VK_MBUTTON, MiddleButton) CRU_MAP_KEY(VK_RBUTTON, RightButton) CRU_MAP_KEY(VK_ESCAPE, Escape) - CRU_MAP_KEY(VK_OEM_3, GraveAccent) + CRU_MAP_KEY(VK_OEM_3, Grave) CRU_MAP_KEY(VK_TAB, Tab) CRU_MAP_KEY(VK_CAPITAL, CapsLock) CRU_MAP_KEY(VK_LSHIFT, LeftShift) |
