Josh DuBois : wineandroid: Implement MapVirtualKeyEx.

Alexandre Julliard julliard at winehq.org
Fri Jun 9 12:43:58 CDT 2017


Module: wine
Branch: master
Commit: 0d565d0118af1989c57fa27e831ac7815a05fe19
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d565d0118af1989c57fa27e831ac7815a05fe19

Author: Josh DuBois <duboisj at codeweavers.com>
Date:   Fri Jun  9 09:20:20 2017 +0200

wineandroid: Implement MapVirtualKeyEx.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineandroid.drv/keyboard.c           | 64 +++++++++++++++++++++++++++++++
 dlls/wineandroid.drv/wineandroid.drv.spec |  1 +
 2 files changed, 65 insertions(+)

diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c
index 9afb73a..fb70445 100644
--- a/dlls/wineandroid.drv/keyboard.c
+++ b/dlls/wineandroid.drv/keyboard.c
@@ -36,6 +36,7 @@
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(keyboard);
+WINE_DECLARE_DEBUG_CHANNEL(key);
 
 static const UINT keycode_to_vkey[] =
 {
@@ -821,3 +822,66 @@ INT CDECL ANDROID_GetKeyNameText( LONG lparam, LPWSTR buffer, INT size )
     TRACE( "lparam 0x%08x -> %s\n", lparam, debugstr_w( buffer ));
     return len;
 }
+
+
+/***********************************************************************
+ *           ANDROID_MapVirtualKeyEx
+ */
+UINT CDECL ANDROID_MapVirtualKeyEx( UINT code, UINT maptype, HKL hkl )
+{
+    UINT ret = 0;
+    const char *s;
+
+    TRACE_(key)( "code=0x%x, maptype=%d, hkl %p\n", code, maptype, hkl );
+
+    switch (maptype)
+    {
+    case MAPVK_VK_TO_VSC_EX:
+    case MAPVK_VK_TO_VSC:
+        /* vkey to scancode */
+        switch (code)
+        {
+        case VK_SHIFT:
+            code = VK_LSHIFT;
+            break;
+        case VK_CONTROL:
+            code = VK_LCONTROL;
+            break;
+        case VK_MENU:
+            code = VK_LMENU;
+            break;
+        }
+        if (code < sizeof(vkey_to_scancode) / sizeof(vkey_to_scancode[0])) ret = vkey_to_scancode[code];
+        break;
+    case MAPVK_VSC_TO_VK:
+    case MAPVK_VSC_TO_VK_EX:
+        /* scancode to vkey */
+        ret = scancode_to_vkey( code );
+        if (maptype == MAPVK_VSC_TO_VK)
+            switch (ret)
+            {
+            case VK_LSHIFT:
+            case VK_RSHIFT:
+                ret = VK_SHIFT; break;
+            case VK_LCONTROL:
+            case VK_RCONTROL:
+                ret = VK_CONTROL; break;
+            case VK_LMENU:
+            case VK_RMENU:
+                ret = VK_MENU; break;
+            }
+        break;
+    case MAPVK_VK_TO_CHAR:
+        s = vkey_to_name( code );
+        if (s && (strlen( s ) == 1))
+            ret = s[0];
+        else
+            ret = 0;
+        break;
+    default:
+        FIXME( "Unknown maptype %d\n", maptype );
+        break;
+    }
+    TRACE_(key)( "returning 0x%04x\n", ret );
+    return ret;
+}
diff --git a/dlls/wineandroid.drv/wineandroid.drv.spec b/dlls/wineandroid.drv/wineandroid.drv.spec
index 4e7815a..89ec528 100644
--- a/dlls/wineandroid.drv/wineandroid.drv.spec
+++ b/dlls/wineandroid.drv/wineandroid.drv.spec
@@ -5,6 +5,7 @@
 # USER driver
 
 @ cdecl GetKeyNameText(long ptr long) ANDROID_GetKeyNameText
+@ cdecl MapVirtualKeyEx(long long long) ANDROID_MapVirtualKeyEx
 @ cdecl ToUnicodeEx(long long ptr ptr long long long) ANDROID_ToUnicodeEx
 @ cdecl EnumDisplayMonitors(long ptr ptr long) ANDROID_EnumDisplayMonitors
 @ cdecl GetMonitorInfo(long ptr) ANDROID_GetMonitorInfo




More information about the wine-cvs mailing list