]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/windows/keyboard.cpp
Generate synthetic key release events for repeated keys on Windows
[libs/gui.git] / source / input / windows / keyboard.cpp
index cbba914dd451fd133043e1f70f356a7f76c83b39..690ba3a05e7b0e657f59d278dd3c3feee3ddd844 100644 (file)
@@ -4,7 +4,9 @@
 #include "keys.h"
 #include "keys_private.h"
 
+#ifndef MAPVK_VK_TO_VSC
 #define MAPVK_VK_TO_VSC 0
+#endif
 
 namespace Msp {
 namespace Input {
@@ -14,10 +16,14 @@ std::string Keyboard::get_button_name(unsigned btn) const
        if(btn==KEY_NONE)
                return "None";
 
+       unsigned vkey = key_to_sys(btn);
+       unsigned scan = MapVirtualKey(vkey&0xFF, MAPVK_VK_TO_VSC);
+       scan |= vkey&0x100;
+
        char buf[128];
-       unsigned scan = MapVirtualKey(key_to_sys(btn), MAPVK_VK_TO_VSC);
        if(!GetKeyNameText(scan<<16, buf, sizeof(buf)))
                return Device::get_button_name(btn);
+
        return buf;
 }
 
@@ -27,7 +33,21 @@ void Keyboard::input_event(const Graphics::Window::Event &event)
        {
        case WM_KEYDOWN:
        case WM_KEYUP:
-               set_button_state(key_from_sys(event.wparam), event.msg==WM_KEYDOWN, true);
+       case WM_SYSKEYDOWN:
+       case WM_SYSKEYUP:
+               {
+                       unsigned key = event.wparam | ((event.lparam>>16)&0x100);
+                       if(key==VK_SHIFT)
+                       {
+                               if(((event.lparam>>16)&0xFF)==MapVirtualKey(VK_RSHIFT, MAPVK_VK_TO_VSC))
+                                       key = VK_RSHIFT;
+                               else
+                                       key = VK_LSHIFT;
+                       }
+                       set_button_state(key_from_sys(key), false, true);
+                       if(event.msg==WM_KEYDOWN || event.msg==WM_SYSKEYDOWN)
+                               set_button_state(key_from_sys(key), true, true);
+               }
                break;
        case WM_CHAR:
                signal_character.emit(event.wparam);