Jacek Caban : win32u: Move NtUserTranslateMessage implementation from user32.

Alexandre Julliard julliard at winehq.org
Fri Apr 15 15:23:16 CDT 2022


Module: wine
Branch: master
Commit: 6ea417b2d5a6c2d589578f1e9f958af64eb6f0fd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6ea417b2d5a6c2d589578f1e9f958af64eb6f0fd

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr 15 14:52:36 2022 +0200

win32u: Move NtUserTranslateMessage implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/message.c        | 46 +----------------------------------
 dlls/user32/user_main.c      |  2 ++
 dlls/win32u/gdiobj.c         |  1 +
 dlls/win32u/message.c        | 57 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/win32u/ntuser_private.h |  1 +
 dlls/win32u/win32u.spec      |  2 +-
 dlls/win32u/win32u_private.h |  1 +
 dlls/win32u/wrappers.c       |  6 +++++
 include/ntuser.h             |  2 ++
 9 files changed, 72 insertions(+), 46 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 51f183fdbc0..611f603fc1e 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -45,7 +45,6 @@
 #include "wine/exception.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msg);
-WINE_DECLARE_DEBUG_CHANNEL(key);
 
 
 /* Message class descriptor */
@@ -848,50 +847,7 @@ BOOL WINAPI IsDialogMessageA( HWND hwndDlg, LPMSG pmsg )
  */
 BOOL WINAPI TranslateMessage( const MSG *msg )
 {
-    UINT message;
-    WCHAR wp[8];
-    BYTE state[256];
-    INT len;
-
-    if (msg->message < WM_KEYFIRST || msg->message > WM_KEYLAST) return FALSE;
-    if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) return TRUE;
-
-    TRACE_(key)("Translating key %s (%04lX), scancode %04x\n",
-                SPY_GetVKeyName(msg->wParam), msg->wParam, HIWORD(msg->lParam));
-
-    switch (msg->wParam)
-    {
-    case VK_PACKET:
-        message = (msg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR;
-        TRACE_(key)("PostMessageW(%p,%s,%04x,%08x)\n",
-                    msg->hwnd, SPY_GetMsgName(message, msg->hwnd), HIWORD(msg->lParam), LOWORD(msg->lParam));
-        PostMessageW( msg->hwnd, message, HIWORD(msg->lParam), LOWORD(msg->lParam));
-        return TRUE;
-
-    case VK_PROCESSKEY:
-        return ImmTranslateMessage(msg->hwnd, msg->message, msg->wParam, msg->lParam);
-    }
-
-    NtUserGetKeyboardState( state );
-    len = ToUnicode(msg->wParam, HIWORD(msg->lParam), state, wp, ARRAY_SIZE(wp), 0);
-    if (len == -1)
-    {
-        message = (msg->message == WM_KEYDOWN) ? WM_DEADCHAR : WM_SYSDEADCHAR;
-        TRACE_(key)("-1 -> PostMessageW(%p,%s,%04x,%08lx)\n",
-            msg->hwnd, SPY_GetMsgName(message, msg->hwnd), wp[0], msg->lParam);
-        PostMessageW( msg->hwnd, message, wp[0], msg->lParam );
-    }
-    else if (len > 0)
-    {
-        INT i;
-
-        message = (msg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR;
-        TRACE_(key)("%d -> PostMessageW(%p,%s,<x>,%08lx) for <x> in %s\n", len, msg->hwnd,
-            SPY_GetMsgName(message, msg->hwnd), msg->lParam, debugstr_wn(wp, len));
-        for (i = 0; i < len; i++)
-            PostMessageW( msg->hwnd, message, wp[i], msg->lParam );
-    }
-    return TRUE;
+    return NtUserTranslateMessage( msg, 0 );
 }
 
 
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index f99e773d6f4..c477d0325d3 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -26,6 +26,7 @@
 #include "wingdi.h"
 #include "winuser.h"
 #include "imm.h"
+#include "ddk/imm.h"
 
 #include "controls.h"
 #include "user_private.h"
@@ -164,6 +165,7 @@ static const struct user_callbacks user_funcs =
     EndMenu,
     HideCaret,
     ImmProcessKey,
+    ImmTranslateMessage,
     SetSystemMenu,
     ShowCaret,
     free_menu_items,
diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c
index d5538848a4f..b7b3d9d87b9 100644
--- a/dlls/win32u/gdiobj.c
+++ b/dlls/win32u/gdiobj.c
@@ -1209,6 +1209,7 @@ static struct unix_funcs unix_funcs =
     NtUserSystemParametersInfo,
     NtUserSystemParametersInfoForDpi,
     NtUserToUnicodeEx,
+    NtUserTranslateMessage,
     NtUserUnregisterClass,
     NtUserUnregisterHotKey,
     NtUserUpdateLayeredWindow,
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
index 36bafccc9a4..644e91aed4f 100644
--- a/dlls/win32u/message.c
+++ b/dlls/win32u/message.c
@@ -36,6 +36,7 @@
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msg);
+WINE_DECLARE_DEBUG_CHANNEL(key);
 WINE_DECLARE_DEBUG_CHANNEL(relay);
 
 #define MAX_WINPROC_RECURSION  64
@@ -2879,3 +2880,59 @@ LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
     }
     return 0;
 }
+
+/***********************************************************************
+ *           NtUserTranslateMessage (win32u.@)
+ */
+BOOL WINAPI NtUserTranslateMessage( const MSG *msg, UINT flags )
+{
+    UINT message;
+    WCHAR wp[8];
+    BYTE state[256];
+    INT len;
+
+    if (flags) FIXME( "unsupported flags %x\n", flags );
+
+    if (msg->message < WM_KEYFIRST || msg->message > WM_KEYLAST) return FALSE;
+    if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) return TRUE;
+
+    TRACE_(key)( "Translating key %s (%04lX), scancode %04x\n",
+                 debugstr_vkey_name( msg->wParam ), msg->wParam, HIWORD(msg->lParam) );
+
+    switch (msg->wParam)
+    {
+    case VK_PACKET:
+        message = (msg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR;
+        TRACE_(key)( "PostMessageW(%p,%s,%04x,%08x)\n", msg->hwnd,
+                     debugstr_msg_name( message, msg->hwnd ),
+                     HIWORD(msg->lParam), LOWORD(msg->lParam) );
+        NtUserPostMessage( msg->hwnd, message, HIWORD(msg->lParam), LOWORD(msg->lParam) );
+        return TRUE;
+
+    case VK_PROCESSKEY:
+        return user_callbacks && user_callbacks->pImmTranslateMessage( msg->hwnd, msg->message,
+                                                                       msg->wParam, msg->lParam );
+    }
+
+    NtUserGetKeyboardState( state );
+    len = NtUserToUnicodeEx( msg->wParam, HIWORD(msg->lParam), state, wp, ARRAY_SIZE(wp), 0,
+                             NtUserGetKeyboardLayout(0) );
+    if (len == -1)
+    {
+        message = msg->message == WM_KEYDOWN ? WM_DEADCHAR : WM_SYSDEADCHAR;
+        TRACE_(key)( "-1 -> PostMessageW(%p,%s,%04x,%08lx)\n",
+                     msg->hwnd, debugstr_msg_name( message, msg->hwnd ), wp[0], msg->lParam );
+        NtUserPostMessage( msg->hwnd, message, wp[0], msg->lParam );
+    }
+    else if (len > 0)
+    {
+        INT i;
+
+        message = msg->message == WM_KEYDOWN ? WM_CHAR : WM_SYSCHAR;
+        TRACE_(key)( "%d -> PostMessageW(%p,%s,<x>,%08lx) for <x> in %s\n", len, msg->hwnd,
+                     debugstr_msg_name(message, msg->hwnd), msg->lParam, debugstr_wn(wp, len) );
+        for (i = 0; i < len; i++)
+            NtUserPostMessage( msg->hwnd, message, wp[i], msg->lParam );
+    }
+    return TRUE;
+}
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index 5aee58fa1e3..57cf60681e2 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -38,6 +38,7 @@ struct user_callbacks
     BOOL (WINAPI *pEndMenu)(void);
     BOOL (WINAPI *pHideCaret)( HWND hwnd );
     BOOL (WINAPI *pImmProcessKey)(HWND, HKL, UINT, LPARAM, DWORD);
+    BOOL (WINAPI *pImmTranslateMessage)(HWND, UINT, WPARAM, LPARAM);
     BOOL (WINAPI *pSetSystemMenu)( HWND hwnd, HMENU menu );
     BOOL (WINAPI *pShowCaret)( HWND hwnd );
     void (CDECL *free_menu_items)( void *ptr );
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index cf419668789..ee9dc094ab6 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -1282,7 +1282,7 @@
 @ stub NtUserTransformPoint
 @ stub NtUserTransformRect
 @ stub NtUserTranslateAccelerator
-@ stub NtUserTranslateMessage
+@ stdcall NtUserTranslateMessage(ptr long)
 @ stub NtUserUndelegateInput
 @ stdcall -syscall NtUserUnhookWinEvent(long)
 @ stdcall -syscall NtUserUnhookWindowsHookEx(long)
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 69ddcc83c47..20d0e4ac5b1 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -283,6 +283,7 @@ struct unix_funcs
                                                          UINT winini, UINT dpi );
     INT      (WINAPI *pNtUserToUnicodeEx)( UINT virt, UINT scan, const BYTE *state,
                                            WCHAR *str, int size, UINT flags, HKL layout );
+    BOOL     (WINAPI *pNtUserTranslateMessage)( const MSG *msg, UINT flags );
     BOOL     (WINAPI *pNtUserUnregisterClass)( UNICODE_STRING *name, HINSTANCE instance,
                                                struct client_menu_name *client_menu_name );
     BOOL     (WINAPI *pNtUserUnregisterHotKey)( HWND hwnd, INT id );
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index b5c2b49ce79..77120efd0b3 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -1186,6 +1186,12 @@ INT WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state,
     return unix_funcs->pNtUserToUnicodeEx( virt, scan, state, str, size, flags, layout );
 }
 
+BOOL WINAPI NtUserTranslateMessage( const MSG *msg, UINT flags )
+{
+    if (!unix_funcs) return 0;
+    return unix_funcs->pNtUserTranslateMessage( msg, flags );
+}
+
 BOOL WINAPI NtUserUnregisterClass( UNICODE_STRING *name, HINSTANCE instance,
                                    struct client_menu_name *client_menu_name )
 {
diff --git a/include/ntuser.h b/include/ntuser.h
index 5cf82043a2e..34b4462f7fe 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -559,6 +559,8 @@ BOOL    WINAPI NtUserSystemParametersInfo( UINT action, UINT val, void *ptr, UIN
 BOOL    WINAPI NtUserSystemParametersInfoForDpi( UINT action, UINT val, PVOID ptr, UINT winini, UINT dpi );
 INT     WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state,
                                   WCHAR *str, int size, UINT flags, HKL layout );
+INT     WINAPI NtUserTranslateAccelerator( HWND hwnd, HACCEL accel, MSG *msg );
+BOOL    WINAPI NtUserTranslateMessage( const MSG *msg, UINT flags );
 BOOL    WINAPI NtUserUnhookWinEvent( HWINEVENTHOOK hEventHook );
 BOOL    WINAPI NtUserUnhookWindowsHookEx( HHOOK handle );
 BOOL    WINAPI NtUserUnregisterClass( UNICODE_STRING *name, HINSTANCE instance,




More information about the wine-cvs mailing list