diff --git a/src/she/win/vk.cpp b/src/she/win/vk.cpp index b624202a1..f7f96af5a 100644 --- a/src/she/win/vk.cpp +++ b/src/she/win/vk.cpp @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2012-2015 David Capello +// Copyright (C) 2012-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -14,7 +14,8 @@ namespace she { -KeyScancode win32vk_to_scancode(int vk) { +KeyScancode win32vk_to_scancode(int vk) +{ static KeyScancode keymap[256] = { // 0x00 kKeyNil, // 0x00 @@ -34,9 +35,9 @@ KeyScancode win32vk_to_scancode(int vk) { kKeyNil, // 0x0E - Undefined kKeyNil, // 0x0F - Undefined // 0x10 - kKeyNil, // 0x10 - VK_SHIFT - kKeyNil, // 0x11 - VK_CONTROL - kKeyNil, // 0x12 - VK_MENU + kKeyLShift, // 0x10 - VK_SHIFT + kKeyLControl, // 0x11 - VK_CONTROL + kKeyAlt, // 0x12 - VK_MENU kKeyPause, // 0x13 - VK_PAUSE kKeyCapsLock, // 0x14 - VK_CAPITAL kKeyKana, // 0x15 - VK_KANA @@ -294,7 +295,25 @@ KeyScancode win32vk_to_scancode(int vk) { return keymap[vk]; } -static int scancode_to_win32vk(KeyScancode scancode) { +KeyModifiers get_modifiers_from_last_win32_message() +{ + int modifiers = kKeyNoneModifier; + if ((GetKeyState(VK_LSHIFT) & 0x8000) || + (GetKeyState(VK_RSHIFT) & 0x8000)) + modifiers |= kKeyShiftModifier; + if ((GetKeyState(VK_LCONTROL) & 0x8000) || + (GetKeyState(VK_RCONTROL) & 0x8000)) + modifiers |= kKeyCtrlModifier; + if ((GetKeyState(VK_LMENU) & 0x8000) || + (GetKeyState(VK_RMENU) & 0x8000)) + modifiers |= kKeyAltModifier; + if (GetKeyState(VK_SPACE) & 0x8000) + modifiers |= kKeySpaceModifier; + return (KeyModifiers)modifiers; +} + +static int scancode_to_win32vk(KeyScancode scancode) +{ static int initialized = false; static int keymap[kKeyScancodes]; @@ -319,7 +338,7 @@ bool is_key_pressed(KeyScancode scancode) { int vk = scancode_to_win32vk(scancode); if (vk) - return (GetKeyState(vk) & 0xf000 ? true: false); + return (GetAsyncKeyState(vk) & 0x8000 ? true: false); else return false; } diff --git a/src/she/win/window.h b/src/she/win/window.h index 174e125aa..a135544f5 100644 --- a/src/she/win/window.h +++ b/src/she/win/window.h @@ -27,6 +27,7 @@ namespace she { KeyScancode win32vk_to_scancode(int vk); + KeyModifiers get_modifiers_from_last_win32_message(); #define SHE_WND_CLASS_NAME L"Aseprite.Window" @@ -290,6 +291,7 @@ namespace she { } Event ev; + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point( GET_X_LPARAM(lparam) / m_scale, GET_Y_LPARAM(lparam) / m_scale)); @@ -320,6 +322,7 @@ namespace she { Event ev; ev.setType(Event::MouseLeave); + ev.setModifiers(get_modifiers_from_last_win32_message()); queueEvent(ev); } break; @@ -329,6 +332,7 @@ namespace she { case WM_MBUTTONDOWN: { Event ev; ev.setType(Event::MouseDown); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point( GET_X_LPARAM(lparam) / m_scale, GET_Y_LPARAM(lparam) / m_scale)); @@ -345,6 +349,7 @@ namespace she { case WM_MBUTTONUP: { Event ev; ev.setType(Event::MouseUp); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point( GET_X_LPARAM(lparam) / m_scale, GET_Y_LPARAM(lparam) / m_scale)); @@ -366,6 +371,7 @@ namespace she { case WM_RBUTTONDBLCLK: { Event ev; ev.setType(Event::MouseDoubleClick); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point( GET_X_LPARAM(lparam) / m_scale, GET_Y_LPARAM(lparam) / m_scale)); @@ -385,6 +391,7 @@ namespace she { Event ev; ev.setType(Event::MouseWheel); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point(pos.x, pos.y) / m_scale); int z = ((short)HIWORD(wparam)) / WHEEL_DELTA; @@ -407,6 +414,7 @@ namespace she { Event ev; ev.setType(Event::MouseWheel); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setPosition(gfx::Point(pos.x, pos.y) / m_scale); int bar = (msg == WM_HSCROLL ? SB_HORZ: SB_VERT); @@ -465,8 +473,9 @@ namespace she { Event ev; ev.setType(Event::KeyDown); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setScancode(win32vk_to_scancode(vk)); - ev.setRepeat(lparam & 0xffff); + ev.setRepeat(MAX(0, (lparam & 0xffff)-1)); if (charsInBuffer < 1) { ev.setUnicodeChar(0); @@ -485,9 +494,10 @@ namespace she { case WM_KEYUP: { Event ev; ev.setType(Event::KeyUp); + ev.setModifiers(get_modifiers_from_last_win32_message()); ev.setScancode(win32vk_to_scancode(wparam)); ev.setUnicodeChar(0); - ev.setRepeat(lparam & 0xffff); + ev.setRepeat(MAX(0, (lparam & 0xffff)-1)); queueEvent(ev); // TODO If we use native menus, this message should be given