Ken Thomases : winemac: Implement VkKeyScanEx().

Alexandre Julliard julliard at winehq.org
Wed Feb 6 13:38:12 CST 2013


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Feb  6 04:36:57 2013 -0600

winemac: Implement VkKeyScanEx().

---

 dlls/winemac.drv/keyboard.c       |   73 +++++++++++++++++++++++++++++++++++++
 dlls/winemac.drv/winemac.drv.spec |    1 +
 2 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
index e969359..ecd89fc 100644
--- a/dlls/winemac.drv/keyboard.c
+++ b/dlls/winemac.drv/keyboard.c
@@ -1087,3 +1087,76 @@ done:
     TRACE_(key)("returning %d / %s\n", ret, debugstr_wn(bufW, abs(ret)));
     return ret;
 }
+
+
+/***********************************************************************
+ *              VkKeyScanEx (MACDRV.@)
+ *
+ * Note: Windows ignores HKL parameter and uses current active layout instead
+ */
+SHORT CDECL macdrv_VkKeyScanEx(WCHAR wChar, HKL hkl)
+{
+    struct macdrv_thread_data *thread_data = macdrv_init_thread_data();
+    SHORT ret = -1;
+    int state;
+    const UCKeyboardLayout *uchr;
+
+    TRACE("%04x, %p\n", wChar, hkl);
+
+    uchr = (const UCKeyboardLayout*)CFDataGetBytePtr(thread_data->keyboard_layout_uchr);
+    if (!uchr)
+    {
+        TRACE("no keyboard layout UCHR data; returning -1\n");
+        return -1;
+    }
+
+    for (state = 0; state < 8; state++)
+    {
+        UInt32 modifierKeyState = 0;
+        int keyc;
+
+        if (state & 1)
+            modifierKeyState |= (shiftKey >> 8);
+        if ((state & 6) == 6)
+            modifierKeyState |= (optionKey >> 8);
+        else
+        {
+            if (state & 2)
+                modifierKeyState |= (controlKey >> 8);
+            if (state & 4)
+                modifierKeyState |= (cmdKey >> 8);
+        }
+
+        for (keyc = 0; keyc < sizeof(thread_data->keyc2vkey) / sizeof(thread_data->keyc2vkey[0]); keyc++)
+        {
+            UInt32 deadKeyState = 0;
+            UniChar uchar;
+            UniCharCount len;
+            OSStatus status;
+
+            if (!thread_data->keyc2vkey[keyc]) continue;
+
+            status = UCKeyTranslate(uchr, keyc, kUCKeyActionDown, modifierKeyState,
+                                    thread_data->keyboard_type, 0, &deadKeyState,
+                                    1, &len, &uchar);
+            if (status == noErr && len == 1 && uchar == wChar)
+            {
+                WORD vkey = thread_data->keyc2vkey[keyc];
+
+                ret = vkey | (state << 8);
+                if ((VK_NUMPAD0 <= vkey && vkey <= VK_DIVIDE) ||
+                    keyc == kVK_ANSI_KeypadClear || keyc == kVK_ANSI_KeypadEnter ||
+                    keyc == kVK_ANSI_KeypadEquals)
+                {
+                    /* Keep searching for a non-numpad match, which is preferred. */
+                }
+                else
+                    goto done;
+            }
+        }
+    }
+
+done:
+    TRACE(" -> 0x%04x\n", ret);
+    return ret;
+}
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 0d91bd8..754f697 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -22,6 +22,7 @@
 @ cdecl ShowWindow(long long ptr long) macdrv_ShowWindow
 @ cdecl ToUnicodeEx(long long ptr ptr long long long) macdrv_ToUnicodeEx
 @ cdecl UpdateLayeredWindow(long ptr ptr) macdrv_UpdateLayeredWindow
+@ cdecl VkKeyScanEx(long long) macdrv_VkKeyScanEx
 @ cdecl WindowMessage(long long long long) macdrv_WindowMessage
 @ cdecl WindowPosChanged(long long long ptr ptr ptr ptr ptr) macdrv_WindowPosChanged
 @ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) macdrv_WindowPosChanging




More information about the wine-cvs mailing list