From 078c6e5ab2acd70b448838189c81c7ff484a4ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Thu, 26 Jan 2023 15:40:43 +0100 Subject: [PATCH] comctl32: Skip restoring window proc if it has been modified. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=43073 --- dlls/comctl32/commctrl.c | 4 +++- dlls/comctl32/tests/subclass.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index eae64022d65..4c5900bc37f 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -1243,7 +1243,9 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u if (!stack->SubclassProcs && !stack->running) { TRACE("Last Subclass removed, cleaning up\n"); /* clean up our heap and reset the original window procedure */ - if (stack->is_unicode) + if ((WNDPROC)GetWindowLongPtrW (hWnd, GWLP_WNDPROC) != COMCTL32_SubclassProc) + WARN("Window procedure has been modified, skipping restore\n"); + else if (stack->is_unicode) SetWindowLongPtrW (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc); else SetWindowLongPtrA (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc); diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index 3c07a9d221c..bc3fc6f1d91 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -192,7 +192,7 @@ static void check_unicode_(int line, HWND hwnd, DWORD flags) else if (flags & EXPECT_WNDPROC_1) ok_(__FILE__, line)(proc == wnd_proc_1, "got proc %p\n", proc); else if (flags & EXPECT_WNDPROC_3) - todo_wine_if(proc == wnd_proc_1) ok_(__FILE__, line)(proc == wnd_proc_3, "got proc %p\n", proc); + ok_(__FILE__, line)(proc == wnd_proc_3, "got proc %p\n", proc); else ok_(__FILE__, line)(!IS_WNDPROC_HANDLE(proc), "got proc %p\n", proc); }