Piotr Caban : user32: Call window procedure even if we' re out of winproc handles.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 14 09:05:21 CDT 2016


Module: wine
Branch: master
Commit: c9ae38e4c77023eeb3e3bd49dd4506943e19d37e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c9ae38e4c77023eeb3e3bd49dd4506943e19d37e

Author: Piotr Caban <piotr at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 507a36a..aa71c8e 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;




More information about the wine-cvs mailing list