Make TranslateAcceleratorA handle national characters. Take 2

Dmitry Timoshkov dmitry at baikal.ru
Tue Oct 19 05:09:47 CDT 2004


Hello,

please use this patch instead of the previous one.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Make TranslateAcceleratorA handle national characters.

diff -u cvs/hq/wine/dlls/user/menu.c wine/dlls/user/menu.c
--- cvs/hq/wine/dlls/user/menu.c	2004-10-06 16:10:22.000000000 +0900
+++ wine/dlls/user/menu.c	2004-10-19 14:41:27.000000000 +0900
@@ -4678,33 +4678,88 @@ static BOOL translate_accelerator( HWND 
 /**********************************************************************
  *      TranslateAccelerator      (USER32.@)
  *      TranslateAcceleratorA     (USER32.@)
- *      TranslateAcceleratorW     (USER32.@)
  */
-INT WINAPI TranslateAcceleratorW( HWND hWnd, HACCEL hAccel, LPMSG msg )
+INT WINAPI TranslateAcceleratorA( HWND hWnd, HACCEL hAccel, LPMSG msg )
 {
     /* YES, Accel16! */
     LPACCEL16 lpAccelTbl;
     int i;
+    WPARAM wParam;
+
+    if (!hWnd || !msg) return 0;
 
-    if (msg == NULL)
+    if (!hAccel || !(lpAccelTbl = (LPACCEL16) LockResource16(HACCEL_16(hAccel))))
     {
-        WARN_(accel)("msg null; should hang here to be win compatible\n");
+        WARN_(accel)("invalid accel handle=%p\n", hAccel);
         return 0;
     }
+
+    wParam = msg->wParam;
+
+    switch (msg->message)
+    {
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+        break;
+
+    case WM_CHAR:
+    case WM_SYSCHAR:
+        {
+            char ch = LOWORD(wParam);
+            WCHAR wch;
+            MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1);
+            wParam = MAKEWPARAM(wch, HIWORD(wParam));
+        }
+        break;
+
+    default:
+        return 0;
+    }
+
+    TRACE_(accel)("hAccel %p, hWnd %p, msg->hwnd %p, msg->message %04x, wParam %08x, lParam %08lx\n",
+                  hAccel,hWnd,msg->hwnd,msg->message,msg->wParam,msg->lParam);
+    i = 0;
+    do
+    {
+        if (translate_accelerator( hWnd, msg->message, wParam, msg->lParam,
+                                   lpAccelTbl[i].fVirt, lpAccelTbl[i].key, lpAccelTbl[i].cmd))
+            return 1;
+    } while ((lpAccelTbl[i++].fVirt & 0x80) == 0);
+
+    return 0;
+}
+
+/**********************************************************************
+ *      TranslateAcceleratorW     (USER32.@)
+ */
+INT WINAPI TranslateAcceleratorW( HWND hWnd, HACCEL hAccel, LPMSG msg )
+{
+    /* YES, Accel16! */
+    LPACCEL16 lpAccelTbl;
+    int i;
+
+    if (!hWnd || !msg) return 0;
+
     if (!hAccel || !(lpAccelTbl = (LPACCEL16) LockResource16(HACCEL_16(hAccel))))
     {
         WARN_(accel)("invalid accel handle=%p\n", hAccel);
         return 0;
     }
-    if ( msg->message != WM_KEYDOWN &&
-         msg->message != WM_SYSKEYDOWN &&
-         msg->message != WM_SYSCHAR &&
-         msg->message != WM_CHAR ) return 0;
 
-    TRACE_(accel)("TranslateAccelerators hAccel=%p, hWnd=%p,"
-                  "msg->hwnd=%p, msg->message=%04x, wParam=%08x, lParam=%lx\n",
-                  hAccel,hWnd,msg->hwnd,msg->message,msg->wParam,msg->lParam);
+    switch (msg->message)
+    {
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+    case WM_CHAR:
+    case WM_SYSCHAR:
+        break;
 
+    default:
+        return 0;
+    }
+
+    TRACE_(accel)("hAccel %p, hWnd %p, msg->hwnd %p, msg->message %04x, wParam %08x, lParam %08lx\n",
+                  hAccel,hWnd,msg->hwnd,msg->message,msg->wParam,msg->lParam);
     i = 0;
     do
     {
@@ -4712,6 +4767,6 @@ INT WINAPI TranslateAcceleratorW( HWND h
                                    lpAccelTbl[i].fVirt, lpAccelTbl[i].key, lpAccelTbl[i].cmd))
             return 1;
     } while ((lpAccelTbl[i++].fVirt & 0x80) == 0);
-    WARN_(accel)("couldn't translate accelerator key\n");
+
     return 0;
 }
diff -u cvs/hq/wine/dlls/user/user32.spec wine/dlls/user/user32.spec
--- cvs/hq/wine/dlls/user/user32.spec	2004-09-16 13:00:08.000000000 +0900
+++ wine/dlls/user/user32.spec	2004-10-19 14:42:47.000000000 +0900
@@ -586,8 +586,8 @@
 @ stdcall ToUnicode(long long ptr wstr long long)
 @ stdcall TrackPopupMenu(long long long long long long ptr)
 @ stdcall TrackPopupMenuEx(long long long long long ptr)
-@ stdcall TranslateAccelerator(long long ptr) TranslateAcceleratorW
-@ stdcall TranslateAcceleratorA(long long ptr) TranslateAcceleratorW
+@ stdcall TranslateAccelerator(long long ptr) TranslateAcceleratorA
+@ stdcall TranslateAcceleratorA(long long ptr)
 @ stdcall TranslateAcceleratorW(long long ptr)
 @ stdcall TranslateMDISysAccel(long ptr)
 @ stdcall TranslateMessage(ptr)






More information about the wine-patches mailing list