From 43402e3bd1fc80f7528ed28aa6ab61bd62c3fec7 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 18 Mar 2023 17:10:01 -0500 Subject: [PATCH] feat(event): handle key down and key up events for windows --- src/event/Input.hpp | 2 + src/event/linux/Input.cpp | 5 ++ src/event/mac/Input.cpp | 5 ++ src/event/win/Input.cpp | 135 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+) diff --git a/src/event/Input.hpp b/src/event/Input.hpp index 865b02a..381f2c3 100644 --- a/src/event/Input.hpp +++ b/src/event/Input.hpp @@ -54,6 +54,8 @@ void IEvtInputSetMouseMode(EvtContext* context, MOUSEMODE mode, uint32_t holdBut const char* KeyCodeToString(KEY key); +bool OsGuiIsModifierKeyDown(int32_t key); + int32_t OsGuiProcessMessage(void* message); int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param2, int32_t* param3); diff --git a/src/event/linux/Input.cpp b/src/event/linux/Input.cpp index 3a019a2..1d746a5 100644 --- a/src/event/linux/Input.cpp +++ b/src/event/linux/Input.cpp @@ -1,5 +1,10 @@ #include "event/Input.hpp" +bool OsGuiIsModifierKeyDown(int32_t key) { + // TODO + return false; +} + int32_t OsGuiProcessMessage(void* message) { return 0; } diff --git a/src/event/mac/Input.cpp b/src/event/mac/Input.cpp index 3a635bd..0fb3bde 100644 --- a/src/event/mac/Input.cpp +++ b/src/event/mac/Input.cpp @@ -1,6 +1,11 @@ #include "event/Input.hpp" #include +bool OsGuiIsModifierKeyDown(int32_t key) { + // TODO + return false; +} + int32_t OsGuiProcessMessage(void* message) { return 0; } diff --git a/src/event/win/Input.cpp b/src/event/win/Input.cpp index 66b8939..5a09455 100644 --- a/src/event/win/Input.cpp +++ b/src/event/win/Input.cpp @@ -68,6 +68,107 @@ int32_t ConvertButton(uint32_t message, uintptr_t wparam, MOUSEBUTTON* button) { } } +int32_t ConvertKeyCode(uint32_t vkey, KEY* key) { + if (vkey >= VK_F1 && vkey <= VK_F12) { + *key = static_cast(KEY_F1 + (vkey - VK_F1)); + return 1; + } + + if (vkey >= 0x30 && vkey <= 0x39) { + *key = static_cast(KEY_0 + (vkey - 0x30)); + return 1; + } + + switch (vkey) { + case VK_BACK: { + *key = KEY_BACKSPACE; + return 1; + } + + case VK_TAB: { + *key = KEY_TAB; + return 1; + } + + case VK_RETURN: { + *key = KEY_ENTER; + return 1; + } + + case VK_PAUSE: { + *key = KEY_PAUSE; + return 1; + } + + case VK_CAPITAL: { + *key = KEY_CAPSLOCK; + return 1; + } + + case VK_ESCAPE: { + *key = KEY_ESCAPE; + return 1; + } + + case VK_SPACE: { + *key = KEY_SPACE; + return 1; + } + + case VK_PRIOR: { + *key = KEY_PAGEUP; + return 1; + } + + case VK_NEXT: { + *key = KEY_PAGEDOWN; + return 1; + } + + case VK_END: { + *key = KEY_END; + return 1; + } + + case VK_HOME: { + *key = KEY_HOME; + return 1; + } + + case VK_LEFT: { + *key = KEY_LEFT; + return 1; + } + + case VK_UP: { + *key = KEY_UP; + return 1; + } + + case VK_RIGHT: { + *key = KEY_RIGHT; + return 1; + } + + case VK_DOWN: { + *key = KEY_DOWN; + return 1; + } + + // TODO remaining vkeys + + default: { + auto character = MapVirtualKey(vkey, MAPVK_VK_TO_CHAR); + *key = static_cast(character); + if (character && character <= 0xFF) { + return 1; + } else { + return 0; + } + } + } +} + bool ProcessMouseEvent(MOUSEBUTTON button, uint32_t message, HWND hwnd, OSINPUT id) { POINT mousePos; @@ -130,6 +231,11 @@ int32_t HandleMouseUp(uint32_t message, uintptr_t wparam, bool* xbutton, HWND hw return 1; } +bool OsGuiIsModifierKeyDown(int32_t key) { + // TODO + return false; +} + int32_t OsGuiProcessMessage(void* message) { // TODO return 0; @@ -226,6 +332,35 @@ int32_t OsWindowProc(void* window, uint32_t message, uintptr_t wparam, intptr_t return 0; } + case WM_KEYDOWN: + case WM_KEYUP: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: { + auto keyDown = message == WM_KEYDOWN || message == WM_SYSKEYDOWN; + + if (wparam == VK_SHIFT) { + // TODO + } else if (wparam == VK_CONTROL) { + // TODO + } else if (wparam == VK_MENU) { + // TODO + } + + KEY key; + if (ConvertKeyCode(wparam, &key)) { + OsQueuePut(keyDown ? OS_INPUT_KEY_DOWN : OS_INPUT_KEY_UP, key, LOWORD(lparam), 0, 0); + + // Alt + F4 + if (key == KEY_F4 && OsGuiIsModifierKeyDown(2)) { + break; + } + + return 0; + } + + break; + } + case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: