Module: wine Branch: stable Commit: b4de8a5fbd569cb70ea82f9d30dcc39ec045e841 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4de8a5fbd569cb70ea82f9d30...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Mar 9 13:51:37 2016 +0100
user32: Call window procedure even if we're out of winproc handles.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit c9ae38e4c77023eeb3e3bd49dd4506943e19d37e) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/user32/winproc.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 3642109..c74fdda 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -876,6 +876,7 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, WND *wndPtr; WNDPROC func; WINDOWPROC *proc; + BOOL unicode_win;
if (!(wndPtr = WIN_GetPtr( hwnd ))) return FALSE; if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE; @@ -886,10 +887,9 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, } func = wndPtr->winproc; proc = handle_to_proc( wndPtr->winproc ); + unicode_win = wndPtr->flags & WIN_ISUNICODE; WIN_ReleasePtr( wndPtr );
- if (!proc) return TRUE; - if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return FALSE; thread_info->recursion_count++;
@@ -897,19 +897,27 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, { if (proc == WINPROC_PROC16) WINPROC_CallProcWtoA( wow_handlers.call_window_proc, hwnd, msg, wParam, lParam, result, func ); - else if (proc->procW) + else if (proc && proc->procW) call_window_proc( hwnd, msg, wParam, lParam, result, proc->procW ); - else + else if (proc) WINPROC_CallProcWtoA( call_window_proc, hwnd, msg, wParam, lParam, result, proc->procA ); + else if (unicode_win) + call_window_proc( hwnd, msg, wParam, lParam, result, func ); + else + WINPROC_CallProcWtoA( call_window_proc, hwnd, msg, wParam, lParam, result, func ); } else { if (proc == WINPROC_PROC16) wow_handlers.call_window_proc( hwnd, msg, wParam, lParam, result, func ); - else if (proc->procA) + else if (proc && proc->procA) call_window_proc( hwnd, msg, wParam, lParam, result, proc->procA ); - else + else if (proc) WINPROC_CallProcAtoW( call_window_proc, hwnd, msg, wParam, lParam, result, proc->procW, mapping ); + else if (unicode_win) + WINPROC_CallProcAtoW( call_window_proc, hwnd, msg, wParam, lParam, result, func, mapping ); + else + call_window_proc( hwnd, msg, wParam, lParam, result, func ); } thread_info->recursion_count--; return TRUE;