Index: tools/vulkan/win/Window_win.cpp |
diff --git a/tools/vulkan/win/Window_win.cpp b/tools/vulkan/win/Window_win.cpp |
index 20cf08480108a10257ba4143bd500fe05636e9d2..0c9e80227e01af4954ec1deeb3bb75eeb4493f3f 100644 |
--- a/tools/vulkan/win/Window_win.cpp |
+++ b/tools/vulkan/win/Window_win.cpp |
@@ -11,6 +11,7 @@ |
#include <windows.h> |
#include <windowsx.h> |
+#include "SkUtils.h" |
#include "VulkanTestContext_win.h" |
Window* Window::CreateNativeWindow(void* platformData) { |
@@ -85,6 +86,71 @@ bool Window_win::init(HINSTANCE hInstance) { |
return true; |
} |
+static Window::Key get_key(WPARAM vk) { |
+ static const struct { |
+ WPARAM fVK; |
+ Window::Key fKey; |
+ } gPair[] = { |
+ { VK_BACK, Window::kBack_Key }, |
+ { VK_CLEAR, Window::kBack_Key }, |
+ { VK_RETURN, Window::kOK_Key }, |
+ { VK_UP, Window::kUp_Key }, |
+ { VK_DOWN, Window::kDown_Key }, |
+ { VK_LEFT, Window::kLeft_Key }, |
+ { VK_RIGHT, Window::kRight_Key } |
+ }; |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gPair); i++) { |
+ if (gPair[i].fVK == vk) { |
+ return gPair[i].fKey; |
+ } |
+ } |
+ return Window::kNONE_Key; |
+} |
+ |
+static uint32_t get_modifiers(UINT message, WPARAM wParam, LPARAM lParam) { |
+ uint32_t modifiers = 0; |
+ |
+ switch (message) { |
+ case WM_UNICHAR: |
+ case WM_CHAR: |
+ if (0 == (lParam & (1 << 30))) { |
+ modifiers |= Window::kFirstPress_ModifierKey; |
+ } |
+ if (lParam & (1 << 29)) { |
+ modifiers |= Window::kOption_ModifierKey; |
+ } |
+ break; |
+ |
+ case WM_KEYDOWN: |
+ case WM_SYSKEYDOWN: |
+ if (0 == (lParam & (1 << 30))) { |
+ modifiers |= Window::kFirstPress_ModifierKey; |
+ } |
+ if (lParam & (1 << 29)) { |
+ modifiers |= Window::kOption_ModifierKey; |
+ } |
+ break; |
+ |
+ case WM_KEYUP: |
+ case WM_SYSKEYUP: |
+ if (lParam & (1 << 29)) { |
+ modifiers |= Window::kOption_ModifierKey; |
+ } |
+ break; |
+ |
+ case WM_LBUTTONDOWN: |
+ case WM_LBUTTONUP: |
+ case WM_MOUSEMOVE: |
+ if (wParam & MK_CONTROL) { |
+ modifiers |= Window::kControl_ModifierKey; |
+ } |
+ if (wParam & MK_SHIFT) { |
+ modifiers |= Window::kShift_ModifierKey; |
+ } |
+ } |
+ |
+ return modifiers; |
+} |
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) |
{ |
@@ -93,66 +159,59 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) |
Window_win* window = (Window_win*) GetWindowLongPtr(hWnd, GWLP_USERDATA); |
- switch (message) |
- { |
- case WM_PAINT: |
- hdc = BeginPaint(hWnd, &ps); |
- window->onPaint(); |
- EndPaint(hWnd, &ps); |
- break; |
- |
- case WM_CLOSE: |
- case WM_DESTROY: |
- PostQuitMessage(0); |
- break; |
- |
- case WM_ACTIVATE: |
- // disable/enable rendering here, depending on wParam != WA_INACTIVE |
- break; |
- |
- case WM_SIZE: |
- window->onSize(); |
- break; |
- |
- case WM_KEYDOWN: |
- case WM_SYSKEYDOWN: |
- { |
- DWORD dwMask = (1 << 29); |
- bool bAltDown = ((lParam & dwMask) != 0); |
- UINT theChar = MapVirtualKey((UINT)wParam, 2); |
- // Handle Extended ASCII only |
- if (theChar < 256) { |
- return window->onKeyboard(theChar, true, bAltDown); |
- } |
- } |
- break; |
- |
- case WM_KEYUP: |
- case WM_SYSKEYUP: |
- { |
- DWORD dwMask = (1 << 29); |
- bool bAltDown = ((lParam & dwMask) != 0); |
- UINT theChar = MapVirtualKey((UINT)wParam, 2); |
- // Handle Extended ASCII only |
- if (theChar < 256) { |
- return window->onKeyboard(theChar, false, bAltDown); |
- } |
- } |
- break; |
- |
- case WM_LBUTTONDOWN: |
- case WM_RBUTTONDOWN: |
- case WM_MBUTTONDOWN: |
- case WM_LBUTTONUP: |
- case WM_RBUTTONUP: |
- case WM_MBUTTONUP: |
- { |
- bool bLeftDown = ((wParam & MK_LBUTTON) != 0); |
- bool bRightDown = ((wParam & MK_RBUTTON) != 0); |
- bool bMiddleDown = ((wParam & MK_MBUTTON) != 0); |
- |
+ bool eventHandled = false; |
+ |
+ switch (message) { |
+ case WM_PAINT: |
+ hdc = BeginPaint(hWnd, &ps); |
+ window->onPaint(); |
+ EndPaint(hWnd, &ps); |
+ eventHandled = true; |
+ break; |
+ |
+ case WM_CLOSE: |
+ case WM_DESTROY: |
+ PostQuitMessage(0); |
+ eventHandled = true; |
+ break; |
+ |
+ case WM_ACTIVATE: |
+ // disable/enable rendering here, depending on wParam != WA_INACTIVE |
+ break; |
+ |
+ case WM_SIZE: |
+ window->onResize(LOWORD(lParam), HIWORD(lParam)); |
+ eventHandled = true; |
+ break; |
+ |
+ case WM_UNICHAR: |
+ eventHandled = window->onChar((SkUnichar)wParam, |
+ get_modifiers(message, wParam, lParam)); |
+ break; |
+ |
+ case WM_CHAR: { |
+ const uint16_t* c = reinterpret_cast<uint16_t*>(&wParam); |
+ eventHandled = window->onChar(SkUTF16_NextUnichar(&c), |
+ get_modifiers(message, wParam, lParam)); |
+ } break; |
+ |
+ case WM_KEYDOWN: |
+ case WM_SYSKEYDOWN: |
+ eventHandled = window->onKey(get_key(wParam), Window::kDown_InputState, |
+ get_modifiers(message, wParam, lParam)); |
+ break; |
+ |
+ case WM_KEYUP: |
+ case WM_SYSKEYUP: |
+ eventHandled = window->onKey(get_key(wParam), Window::kUp_InputState, |
+ get_modifiers(message, wParam, lParam)); |
+ break; |
+ |
+ case WM_LBUTTONDOWN: |
+ case WM_LBUTTONUP: { |
int xPos = GET_X_LPARAM(lParam); |
int yPos = GET_Y_LPARAM(lParam); |
+ |
//if (!gIsFullscreen) |
//{ |
// RECT rc = { 0, 0, 640, 480 }; |
@@ -161,25 +220,37 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) |
// yPos -= rc.top; |
//} |
- return window->onMouse(bLeftDown, bRightDown, bMiddleDown, false, false, 0, xPos, yPos); |
- } |
- break; |
+ Window::InputState istate = ((wParam & MK_LBUTTON) != 0) ? Window::kDown_InputState |
+ : Window::kUp_InputState; |
+ |
+ eventHandled = window->onMouse(xPos, yPos, istate, |
+ get_modifiers(message, wParam, lParam)); |
+ } break; |
+ |
+ case WM_MOUSEMOVE: |
+ // only track if left button is down |
+ if ((wParam & MK_LBUTTON) != 0) { |
+ int xPos = GET_X_LPARAM(lParam); |
+ int yPos = GET_Y_LPARAM(lParam); |
+ |
+ //if (!gIsFullscreen) |
+ //{ |
+ // RECT rc = { 0, 0, 640, 480 }; |
+ // AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); |
+ // xPos -= rc.left; |
+ // yPos -= rc.top; |
+ //} |
+ |
+ eventHandled = window->onMouse(xPos, yPos, Window::kMove_InputState, |
+ get_modifiers(message, wParam, lParam)); |
+ } |
+ break; |
- default: |
- return DefWindowProc(hWnd, message, wParam, lParam); |
+ default: |
+ return DefWindowProc(hWnd, message, wParam, lParam); |
} |
- return 0; |
-} |
- |
-bool Window_win::onKeyboard(UINT nChar, bool bKeyDown, bool bAltDown) { |
- return fKeyFunc(nChar, bKeyDown, fKeyUserData); |
-} |
- |
-bool Window_win::onMouse(bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, |
- bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, |
- int xPos, int yPos) { |
- return fMouseFunc(xPos, yPos, bLeftButtonDown, fMouseUserData); |
+ return eventHandled ? 0 : 1; |
} |
void Window_win::setTitle(const char* title) { |