Ken Thomases : winemac: Implement GetKeyNameText().

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


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

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

winemac: Implement GetKeyNameText().

---

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

diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
index ecd89fc..ae8df76 100644
--- a/dlls/winemac.drv/keyboard.c
+++ b/dlls/winemac.drv/keyboard.c
@@ -312,6 +312,88 @@ static const struct {
 };
 
 
+static const struct {
+    DWORD       vkey;
+    const char *name;
+} vkey_names[] = {
+    { VK_ADD,                   "Num +" },
+    { VK_BACK,                  "Backspace" },
+    { VK_CAPITAL,               "Caps Lock" },
+    { VK_CONTROL,               "Ctrl" },
+    { VK_DECIMAL,               "Num Del" },
+    { VK_DELETE | 0x100,        "Delete" },
+    { VK_DIVIDE | 0x100,        "Num /" },
+    { VK_DOWN | 0x100,          "Down" },
+    { VK_END | 0x100,           "End" },
+    { VK_ESCAPE,                "Esc" },
+    { VK_F1,                    "F1" },
+    { VK_F2,                    "F2" },
+    { VK_F3,                    "F3" },
+    { VK_F4,                    "F4" },
+    { VK_F5,                    "F5" },
+    { VK_F6,                    "F6" },
+    { VK_F7,                    "F7" },
+    { VK_F8,                    "F8" },
+    { VK_F9,                    "F9" },
+    { VK_F10,                   "F10" },
+    { VK_F11,                   "F11" },
+    { VK_F12,                   "F12" },
+    { VK_F13,                   "F13" },
+    { VK_F14,                   "F14" },
+    { VK_F15,                   "F15" },
+    { VK_F16,                   "F16" },
+    { VK_F17,                   "F17" },
+    { VK_F18,                   "F18" },
+    { VK_F19,                   "F19" },
+    { VK_F20,                   "F20" },
+    { VK_F21,                   "F21" },
+    { VK_F22,                   "F22" },
+    { VK_F23,                   "F23" },
+    { VK_F24,                   "F24" },
+    { VK_HELP | 0x100,          "Help" },
+    { VK_HOME | 0x100,          "Home" },
+    { VK_INSERT | 0x100,        "Insert" },
+    { VK_LCONTROL,              "Ctrl" },
+    { VK_LEFT | 0x100,          "Left" },
+    { VK_LMENU,                 "Alt" },
+    { VK_LSHIFT,                "Shift" },
+    { VK_LWIN | 0x100,          "Win" },
+    { VK_MENU,                  "Alt" },
+    { VK_MULTIPLY,              "Num *" },
+    { VK_NEXT | 0x100,          "Page Down" },
+    { VK_NUMLOCK | 0x100,       "Num Lock" },
+    { VK_NUMPAD0,               "Num 0" },
+    { VK_NUMPAD1,               "Num 1" },
+    { VK_NUMPAD2,               "Num 2" },
+    { VK_NUMPAD3,               "Num 3" },
+    { VK_NUMPAD4,               "Num 4" },
+    { VK_NUMPAD5,               "Num 5" },
+    { VK_NUMPAD6,               "Num 6" },
+    { VK_NUMPAD7,               "Num 7" },
+    { VK_NUMPAD8,               "Num 8" },
+    { VK_NUMPAD9,               "Num 9" },
+    { VK_OEM_CLEAR,             "Num Clear" },
+    { VK_OEM_NEC_EQUAL | 0x100, "Num =" },
+    { VK_PRIOR | 0x100,         "Page Up" },
+    { VK_RCONTROL | 0x100,      "Right Ctrl" },
+    { VK_RETURN,                "Return" },
+    { VK_RETURN | 0x100,        "Num Enter" },
+    { VK_RIGHT | 0x100,         "Right" },
+    { VK_RMENU | 0x100,         "Right Alt" },
+    { VK_RSHIFT,                "Right Shift" },
+    { VK_RWIN | 0x100,          "Right Win" },
+    { VK_SEPARATOR,             "Num ," },
+    { VK_SHIFT,                 "Shift" },
+    { VK_SPACE,                 "Space" },
+    { VK_SUBTRACT,              "Num -" },
+    { VK_TAB,                   "Tab" },
+    { VK_UP | 0x100,            "Up" },
+    { VK_VOLUME_DOWN | 0x100,   "Volume Down" },
+    { VK_VOLUME_MUTE | 0x100,   "Mute" },
+    { VK_VOLUME_UP | 0x100,     "Volume Up" },
+};
+
+
 static BOOL char_matches_string(WCHAR wchar, UniChar *string, BOOL ignore_diacritics)
 {
     BOOL ret;
@@ -774,6 +856,95 @@ void CDECL macdrv_Beep(void)
 
 
 /***********************************************************************
+ *              GetKeyNameText (MACDRV.@)
+ */
+INT CDECL macdrv_GetKeyNameText(LONG lparam, LPWSTR buffer, INT size)
+{
+    struct macdrv_thread_data *thread_data = macdrv_init_thread_data();
+    int scan, keyc;
+
+    scan = (lparam >> 16) & 0x1FF;
+    for (keyc = 0; keyc < sizeof(thread_data->keyc2scan)/sizeof(thread_data->keyc2scan[0]); keyc++)
+    {
+        if (thread_data->keyc2scan[keyc] == scan)
+        {
+            static const WCHAR dead[] = {' ','d','e','a','d',0};
+            const UCKeyboardLayout *uchr;
+            UInt32 deadKeyState = 0;
+            UniCharCount len;
+            OSStatus status;
+
+            uchr = (const UCKeyboardLayout*)CFDataGetBytePtr(thread_data->keyboard_layout_uchr);
+            status = UCKeyTranslate(uchr, keyc, kUCKeyActionDisplay, 0, thread_data->keyboard_type,
+                                    0, &deadKeyState, size - 1, &len, (UniChar*)buffer);
+            if (status != noErr)
+                len = 0;
+            if (len && isgraphW(buffer[0]))
+                buffer[len] = 0;
+            else
+            {
+                DWORD vkey = thread_data->keyc2vkey[keyc];
+                int i;
+
+                if (scan & 0x100) vkey |= 0x100;
+
+                if (lparam & (1 << 25))
+                {
+                    /* Caller doesn't care about distinctions between left and
+                       right keys. */
+                    switch (vkey)
+                    {
+                        case VK_LSHIFT:
+                        case VK_RSHIFT:
+                            vkey = VK_SHIFT; break;
+                        case VK_LCONTROL:
+                        case VK_RCONTROL:
+                            vkey = VK_CONTROL; break;
+                        case VK_LMENU:
+                        case VK_RMENU:
+                            vkey = VK_MENU; break;
+                    }
+                }
+
+                len = 0;
+                for (i = 0; i < sizeof(vkey_names) / sizeof(vkey_names[0]); i++)
+                {
+                    if (vkey_names[i].vkey == vkey)
+                    {
+                        len = MultiByteToWideChar(CP_UTF8, 0, vkey_names[i].name, -1, buffer, size);
+                        if (len) len--;
+                        break;
+                    }
+                }
+
+                if (!len)
+                {
+                    static const WCHAR format[] = {'K','e','y',' ','0','x','%','0','2','x',0};
+                    snprintfW(buffer, size, format, vkey);
+                    len = strlenW(buffer);
+                }
+            }
+
+            if (!len)
+                break;
+
+            if (status == noErr && deadKeyState)
+            {
+                lstrcpynW(buffer + len, dead, size - len);
+                len = strlenW(buffer);
+            }
+
+            TRACE("lparam 0x%08x -> %s\n", lparam, debugstr_w(buffer));
+            return len;
+        }
+    }
+
+    WARN("found no name for lparam 0x%08x\n", lparam);
+    return 0;
+}
+
+
+/***********************************************************************
  *              MapVirtualKeyEx (MACDRV.@)
  */
 UINT CDECL macdrv_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl)
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 754f697..1bb7d8c 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -9,6 +9,7 @@
 @ cdecl CreateWindow(long) macdrv_CreateWindow
 @ cdecl DestroyWindow(long) macdrv_DestroyWindow
 @ cdecl EnumDisplayMonitors(long ptr ptr long) macdrv_EnumDisplayMonitors
+@ cdecl GetKeyNameText(long ptr long) macdrv_GetKeyNameText
 @ cdecl GetMonitorInfo(long ptr) macdrv_GetMonitorInfo
 @ cdecl MapVirtualKeyEx(long long long) macdrv_MapVirtualKeyEx
 @ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) macdrv_MsgWaitForMultipleObjectsEx




More information about the wine-cvs mailing list