user32: Added support for the magic WM_CHAR A->W conversions in Send/Post/DispatchMessage.
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index f580e6f..85039fd 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -168,6 +168,25 @@
 struct received_message_info;
 struct hook16_queue_info;
 
+/* type of message-sending functions that need special WM_CHAR handling */
+enum wm_char_mapping
+{
+    WMCHAR_MAP_POSTMESSAGE,
+    WMCHAR_MAP_SENDMESSAGE,
+    WMCHAR_MAP_SENDMESSAGETIMEOUT,
+    WMCHAR_MAP_RECVMESSAGE,
+    WMCHAR_MAP_DISPATCHMESSAGE,
+    WMCHAR_MAP_CALLWINDOWPROC,
+    WMCHAR_MAP_COUNT,
+    WMCHAR_MAP_NOMAPPING = WMCHAR_MAP_COUNT
+};
+
+/* data to store state for A/W mappings of WM_CHAR */
+struct wm_char_mapping_data
+{
+    BYTE lead_byte[WMCHAR_MAP_COUNT];
+};
+
 /* this is the structure stored in TEB->Win32ClientInfo */
 /* no attempt is made to keep the layout compatible with the Windows one */
 struct user_thread_info
@@ -178,6 +197,7 @@
     HHOOK                         hook;                   /* Current hook */
     struct received_message_info *receive_info;           /* Message being currently received */
     struct hook16_queue_info     *hook16_info;            /* Opaque pointer for 16-bit hook support */
+    struct wm_char_mapping_data  *wmchar_data;            /* Data for WM_CHAR mappings */
     DWORD                         GetMessageTimeVal;      /* Value for GetMessageTime */
     DWORD                         GetMessagePosVal;       /* Value for GetMessagePos */
     ULONG_PTR                     GetMessageExtraInfoVal; /* Value for GetMessageExtraInfo */
@@ -186,7 +206,7 @@
     UINT                          active_hooks;           /* Bitmap of active hooks */
     HWND                          desktop;                /* Desktop window */
 
-    ULONG                         pad[11];                /* Available for more data */
+    ULONG                         pad[10];                /* Available for more data */
 };
 
 struct hook_extra_info
@@ -215,6 +235,7 @@
 extern BOOL HOOK_IsHooked( INT id );
 extern void erase_now( HWND hwnd, UINT rdw_flags );
 extern LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam );
+extern BOOL map_wparam_AtoW( UINT message, WPARAM *wparam, enum wm_char_mapping mapping );
 extern LRESULT MSG_SendInternalMessageTimeout( DWORD dest_pid, DWORD dest_tid,
                                                UINT msg, WPARAM wparam, LPARAM lparam,
                                                UINT flags, UINT timeout, PDWORD_PTR res_ptr );
@@ -237,7 +258,8 @@
 extern BOOL WINPROC_IsUnicode( WNDPROC proc, BOOL def_val );
 
 extern LRESULT WINPROC_CallProcAtoW( winproc_callback_t callback, HWND hwnd, UINT msg,
-                                     WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg );
+                                     WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg,
+                                     enum wm_char_mapping mapping );
 extern LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT16 msg,
                                         WPARAM16 wParam, LPARAM lParam, LRESULT *result, void *arg );
 extern LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
@@ -247,7 +269,7 @@
 extern INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
 extern INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
 extern BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
-                                 LRESULT *result, BOOL unicode );
+                                 LRESULT *result, BOOL unicode, enum wm_char_mapping mapping );
 
 /* message spy definitions */