aboutsummaryrefslogtreecommitdiff
path: root/src/win
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-03-29 23:10:00 +0800
committercrupest <crupest@outlook.com>2020-03-29 23:10:00 +0800
commit85322feaa9f646bf9e6f35f57f6d08244b298a46 (patch)
treed41211c4f2913921b550e798f3ac05c45b3f4c1a /src/win
parent671860a02aa1ecc41eac1cf1e0f28c504bf9c37c (diff)
downloadcru-85322feaa9f646bf9e6f35f57f6d08244b298a46.tar.gz
cru-85322feaa9f646bf9e6f35f57f6d08244b298a46.tar.bz2
cru-85322feaa9f646bf9e6f35f57f6d08244b298a46.zip
...
Diffstat (limited to 'src/win')
-rw-r--r--src/win/native/CMakeLists.txt2
-rw-r--r--src/win/native/keyboard.cpp66
2 files changed, 68 insertions, 0 deletions
diff --git a/src/win/native/CMakeLists.txt b/src/win/native/CMakeLists.txt
index 979b54df..82994d67 100644
--- a/src/win/native/CMakeLists.txt
+++ b/src/win/native/CMakeLists.txt
@@ -9,6 +9,7 @@ add_library(cru_win_native STATIC
cursor.cpp
god_window.cpp
+ keyboard.cpp
timer.cpp
ui_application.cpp
window.cpp
@@ -21,6 +22,7 @@ target_sources(cru_win_native PUBLIC
${CRU_WIN_NATIVE_INCLUDE_DIR}/cursor.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/exception.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/god_window.hpp
+ ${CRU_WIN_NATIVE_INCLUDE_DIR}/keyboard.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/resource.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/ui_application.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/window.hpp
diff --git a/src/win/native/keyboard.cpp b/src/win/native/keyboard.cpp
new file mode 100644
index 00000000..b73d0ffb
--- /dev/null
+++ b/src/win/native/keyboard.cpp
@@ -0,0 +1,66 @@
+#include "cru/win/native/keyboard.hpp"
+
+namespace cru::platform::native::win {
+KeyCode VirtualKeyToKeyCode(int virtual_key) {
+ if (virtual_key >= 0x30 && virtual_key <= 0x39) {
+ return KeyCode{static_cast<int>(KeyCode::N0) + (virtual_key - 0x30)};
+ } else if (virtual_key >= 0x41 && virtual_key <= 0x5a) {
+ return KeyCode{static_cast<int>(KeyCode::A) + (virtual_key - 0x41)};
+ } else if (virtual_key >= VK_NUMPAD0 && virtual_key <= VK_NUMPAD9) {
+ return KeyCode{static_cast<int>(KeyCode::NumPad0) +
+ (virtual_key - VK_NUMPAD0)};
+ } else if (virtual_key >= VK_F1 && virtual_key <= VK_F12) {
+ return KeyCode{static_cast<int>(KeyCode::F1) + (virtual_key - VK_F1)};
+ } else {
+ switch (virtual_key) {
+#define CRU_MAP_KEY(virtual_key, keycode) \
+ case virtual_key: \
+ return KeyCode::keycode;
+
+ CRU_MAP_KEY(VK_LBUTTON, LeftButton)
+ 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_TAB, Tab)
+ CRU_MAP_KEY(VK_CAPITAL, CapsLock)
+ CRU_MAP_KEY(VK_LSHIFT, LeftShift)
+ CRU_MAP_KEY(VK_LCONTROL, LeftCtrl)
+ CRU_MAP_KEY(VK_LWIN, LeftSuper)
+ CRU_MAP_KEY(VK_LMENU, LeftAlt)
+ CRU_MAP_KEY(VK_OEM_MINUS, Minus)
+ CRU_MAP_KEY(VK_OEM_PLUS, Equal)
+ CRU_MAP_KEY(VK_BACK, Backspace)
+ CRU_MAP_KEY(VK_OEM_4, LeftSquareBracket)
+ CRU_MAP_KEY(VK_OEM_6, RightSquareBracket)
+ CRU_MAP_KEY(VK_OEM_5, BackSlash)
+ CRU_MAP_KEY(VK_OEM_1, Semicolon)
+ CRU_MAP_KEY(VK_OEM_7, Quote)
+ CRU_MAP_KEY(VK_OEM_COMMA, Comma)
+ CRU_MAP_KEY(VK_OEM_PERIOD, Period)
+ CRU_MAP_KEY(VK_OEM_2, Slash)
+ CRU_MAP_KEY(VK_RSHIFT, RightShift)
+ CRU_MAP_KEY(VK_RCONTROL, RightCtrl)
+ CRU_MAP_KEY(VK_RWIN, RightSuper)
+ CRU_MAP_KEY(VK_RMENU, RightAlt)
+ CRU_MAP_KEY(VK_INSERT, Insert)
+ CRU_MAP_KEY(VK_DELETE, Delete)
+ CRU_MAP_KEY(VK_HOME, Home)
+ CRU_MAP_KEY(VK_END, End)
+ CRU_MAP_KEY(VK_PRIOR, PageUp)
+ CRU_MAP_KEY(VK_NEXT, PageDown)
+ CRU_MAP_KEY(VK_UP, Up)
+ CRU_MAP_KEY(VK_LEFT, Left)
+ CRU_MAP_KEY(VK_DOWN, Down)
+ CRU_MAP_KEY(VK_RIGHT, Right)
+ CRU_MAP_KEY(VK_SNAPSHOT, PrintScreen)
+ CRU_MAP_KEY(VK_PAUSE, Pause)
+
+#undef CRU_MAP_KEY
+
+ default:
+ return KeyCode::Unknown;
+ }
+ }
+}
+} // namespace cru::platform::native::win