Jacek Caban : user32: Merge WINPROC_call_window into call_window_proc.
Alexandre Julliard
julliard at winehq.org
Wed Mar 23 17:03:55 CDT 2022
Module: wine
Branch: master
Commit: 0cfc7c445810c52622afa2b2635e0a23861df386
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0cfc7c445810c52622afa2b2635e0a23861df386
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 23 14:02:09 2022 +0100
user32: Merge WINPROC_call_window into call_window_proc.
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 | 62 ++++++++++++++++++++++++++++++++++++++--------
dlls/user32/user_private.h | 3 +--
dlls/user32/winproc.c | 55 +++++-----------------------------------
3 files changed, 59 insertions(+), 61 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 1e7ec2b0615..426352da584 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -53,6 +53,8 @@ WINE_DECLARE_DEBUG_CHANNEL(key);
#define MAX_PACK_COUNT 4
+#define MAX_WINPROC_RECURSION 64
+
/* the various structures that can be sent in messages, in platform-independent layout */
struct packed_CREATESTRUCTW
{
@@ -2162,6 +2164,38 @@ static BOOL unpack_dde_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM
return TRUE;
}
+static BOOL init_window_call_params( struct win_proc_params *params, HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam, LRESULT *result, BOOL ansi,
+ enum wm_char_mapping mapping )
+{
+ WND *win;
+
+ USER_CheckNotLock();
+
+ if (!(win = WIN_GetPtr( hwnd ))) return FALSE;
+ if (win == WND_OTHER_PROCESS || win == WND_DESKTOP) return FALSE;
+ if (win->tid != GetCurrentThreadId())
+ {
+ WIN_ReleasePtr( win );
+ return FALSE;
+ }
+ params->func = win->winproc;
+ params->ansi_dst = !(win->flags & WIN_ISUNICODE);
+ params->is_dialog = win->dlgInfo != NULL;
+ WIN_ReleasePtr( win );
+
+ params->hwnd = WIN_GetFullHandle( hwnd );
+ get_winproc_params( params );
+ params->msg = msg;
+ params->wparam = wParam;
+ params->lparam = lParam;
+ params->result = result;
+ params->ansi = ansi;
+ params->mapping = mapping;
+ params->dpi_awareness = GetWindowDpiAwarenessContext( params->hwnd );
+ return TRUE;
+}
+
/***********************************************************************
* call_window_proc
*
@@ -2170,35 +2204,43 @@ static BOOL unpack_dde_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM
static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
BOOL unicode, BOOL same_thread, enum wm_char_mapping mapping )
{
+ struct user_thread_info *thread_info = get_user_thread_info();
+ struct win_proc_params params;
LRESULT result = 0;
CWPSTRUCT cwp;
CWPRETSTRUCT cwpret;
if (msg & 0x80000000)
- {
- result = handle_internal_message( hwnd, msg, wparam, lparam );
- goto done;
- }
+ return handle_internal_message( hwnd, msg, wparam, lparam );
+
+ if (!WIN_IsCurrentThread( hwnd )) return 0;
+ if (!init_window_call_params( ¶ms, hwnd, msg, wparam, lparam, &result, !unicode, mapping ))
+ return 0;
/* first the WH_CALLWNDPROC hook */
- hwnd = WIN_GetFullHandle( hwnd );
cwp.lParam = lparam;
cwp.wParam = wparam;
cwp.message = msg;
- cwp.hwnd = hwnd;
+ cwp.hwnd = params.hwnd;
HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, same_thread, (LPARAM)&cwp, unicode );
- /* now call the window procedure */
- if (!WINPROC_call_window( hwnd, msg, wparam, lparam, &result, unicode, mapping )) goto done;
+ if (thread_info->recursion_count <= MAX_WINPROC_RECURSION)
+ {
+ thread_info->recursion_count++;
+
+ /* now call the window procedure */
+ User32CallWindowProc( ¶ms, sizeof(params) );
+
+ thread_info->recursion_count--;
+ }
/* and finally the WH_CALLWNDPROCRET hook */
cwpret.lResult = result;
cwpret.lParam = lparam;
cwpret.wParam = wparam;
cwpret.message = msg;
- cwpret.hwnd = hwnd;
+ cwpret.hwnd = params.hwnd;
HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, same_thread, (LPARAM)&cwpret, unicode );
- done:
return result;
}
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index bf798457fc6..4e114a31fa7 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -115,9 +115,8 @@ extern LRESULT WINPROC_CallProcAtoW( winproc_callback_t callback, HWND hwnd, UIN
extern INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
extern INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
-extern BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
- LRESULT *result, BOOL unicode, enum wm_char_mapping mapping ) DECLSPEC_HIDDEN;
extern void winproc_init(void) DECLSPEC_HIDDEN;
+extern void get_winproc_params( struct win_proc_params *params ) DECLSPEC_HIDDEN;
extern ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info,
UNICODE_STRING *name_str, BOOL ansi ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index 46b5fedde3f..c26a765f689 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -36,7 +36,6 @@
WINE_DECLARE_DEBUG_CHANNEL(msg);
WINE_DECLARE_DEBUG_CHANNEL(relay);
-#define MAX_WINPROC_RECURSION 64
#define WINPROC_PROC16 ((void *)1) /* placeholder for 16-bit window procs */
static inline void *get_buffer( void *static_buffer, size_t size, size_t need )
@@ -795,67 +794,25 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size )
return TRUE;
}
-/**********************************************************************
- * WINPROC_call_window
- *
- * Call the window procedure of the specified window.
- */
-BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
- LRESULT *result, BOOL unicode, enum wm_char_mapping mapping )
+void get_winproc_params( struct win_proc_params *params )
{
- struct user_thread_info *thread_info = get_user_thread_info();
- struct win_proc_params params;
- WINDOWPROC *proc;
- WND *wndPtr;
-
- USER_CheckNotLock();
-
- if (!(wndPtr = WIN_GetPtr( hwnd ))) return FALSE;
- if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE;
- if (wndPtr->tid != GetCurrentThreadId())
- {
- WIN_ReleasePtr( wndPtr );
- return FALSE;
- }
- params.func = wndPtr->winproc;
- proc = handle_to_proc( wndPtr->winproc );
- params.ansi_dst = !(wndPtr->flags & WIN_ISUNICODE);
- params.is_dialog = wndPtr->dlgInfo != NULL;
- WIN_ReleasePtr( wndPtr );
-
- params.hwnd = WIN_GetFullHandle( hwnd );
- params.msg = msg;
- params.wparam = wParam;
- params.lparam = lParam;
- params.result = result;
- params.ansi = !unicode;
- params.mapping = mapping;
- params.dpi_awareness = GetWindowDpiAwarenessContext( params.hwnd );
+ WINDOWPROC *proc = handle_to_proc( params->func );
if (!proc)
{
- params.procW = params.procA = NULL;
+ params->procW = params->procA = NULL;
}
else if (proc == WINPROC_PROC16)
{
- params.procW = params.procA = WINPROC_PROC16;
+ params->procW = params->procA = WINPROC_PROC16;
}
else
{
- params.procA = proc->procA;
- params.procW = proc->procW;
+ params->procA = proc->procA;
+ params->procW = proc->procW;
}
-
- if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return FALSE;
- thread_info->recursion_count++;
-
- dispatch_win_proc_params( ¶ms );
-
- thread_info->recursion_count--;
- return TRUE;
}
-
/**********************************************************************
* CallWindowProcA (USER32.@)
*
More information about the wine-cvs
mailing list