aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-28 15:43:52 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-28 18:20:17 +0800
commit9e596ff10782455615f69b9b54ce22176145b020 (patch)
treee910b6d6ac2037a9c2c4cd50d15005c71690665b /src
parent0ef919c18108112d6c35c5a4f6a00440059cbc1a (diff)
downloadcru-9e596ff10782455615f69b9b54ce22176145b020.tar.gz
cru-9e596ff10782455615f69b9b54ce22176145b020.tar.bz2
cru-9e596ff10782455615f69b9b54ce22176145b020.zip
Impl key event handling of sdl native window.
Diffstat (limited to 'src')
-rw-r--r--src/platform/gui/Input.cpp2
-rw-r--r--src/platform/gui/osx/Keyboard.mm6
-rw-r--r--src/platform/gui/osx/Window.mm2
-rw-r--r--src/platform/gui/sdl/Input.cpp111
-rw-r--r--src/platform/gui/sdl/Window.cpp19
-rw-r--r--src/platform/gui/win/Keyboard.cpp2
6 files changed, 132 insertions, 10 deletions
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)