Make TranslateAcceleratorA handle national characters

Dmitry Timoshkov dmitry at baikal.ru
Mon Oct 18 09:04:50 CDT 2004


Hello,

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-18 22:52:28.000000000 +0900
@@ -4678,6 +4678,35 @@ static BOOL translate_accelerator( HWND 
 /**********************************************************************
  *      TranslateAccelerator      (USER32.@)
  *      TranslateAcceleratorA     (USER32.@)
+ */
+INT WINAPI TranslateAcceleratorA( HWND hWnd, HACCEL hAccel, LPMSG msg )
+{
+    if (!hWnd || !msg || !hAccel) return 0;
+
+    switch (msg->message)
+    {
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+        break;
+
+    case WM_CHAR:
+    case WM_SYSCHAR:
+        {
+            char ch = LOWORD(msg->wParam);
+            WCHAR wch;
+            MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1);
+            msg->wParam = MAKEWPARAM(wch, HIWORD(msg->wParam));
+        }
+        break;
+
+    default:
+        return 0;
+    }
+
+    return TranslateAcceleratorW(hWnd, hAccel, msg);
+}
+
+/**********************************************************************
  *      TranslateAcceleratorW     (USER32.@)
  */
 INT WINAPI TranslateAcceleratorW( HWND hWnd, HACCEL hAccel, LPMSG msg )
@@ -4686,25 +4715,29 @@ INT WINAPI TranslateAcceleratorW( HWND h
     LPACCEL16 lpAccelTbl;
     int i;
 
-    if (msg == NULL)
+    if (!hWnd || !msg) return 0;
+
+    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;
     }
-    if (!hAccel || !(lpAccelTbl = (LPACCEL16) LockResource16(HACCEL_16(hAccel))))
+
+    switch (msg->message)
     {
-        WARN_(accel)("invalid accel handle=%p\n", hAccel);
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+    case WM_CHAR:
+    case WM_SYSCHAR:
+        break;
+
+    default:
         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);
-
     i = 0;
     do
     {
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-18 22:54:38.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) TranslateAcceleratorA
 @ stdcall TranslateAcceleratorW(long long ptr)
 @ stdcall TranslateMDISysAccel(long ptr)
 @ stdcall TranslateMessage(ptr)






More information about the wine-patches mailing list