From cf4c3348bb6bd1ba4532b51196a46be3544484d2 Mon Sep 17 00:00:00 2001 From: Robert Shearman Date: Thu, 11 Mar 2004 22:38:22 +0000 Subject: [PATCH] Fix subclassing to support nested messages. --- dlls/comctl32/commctrl.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index e46729fe38..ad242dfdd9 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -114,6 +114,7 @@ extern void TREEVIEW_Unregister(void); extern void UPDOWN_Register(void); extern void UPDOWN_Unregister(void); +static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LPSTR COMCTL32_aSubclass = NULL; HMODULE COMCTL32_hModule = 0; @@ -1108,10 +1109,10 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, /* set window procedure to our own and save the current one */ if (IsWindowUnicode (hWnd)) stack->origproc = (WNDPROC)SetWindowLongW (hWnd, GWL_WNDPROC, - (LONG)DefSubclassProc); + (LONG)SubclassWndProc); else stack->origproc = (WNDPROC)SetWindowLongA (hWnd, GWL_WNDPROC, - (LONG)DefSubclassProc); + (LONG)SubclassWndProc); } else { WNDPROC current; if (IsWindowUnicode (hWnd)) @@ -1119,7 +1120,7 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, else current = (WNDPROC)GetWindowLongA (hWnd, GWL_WNDPROC); - if (current != DefSubclassProc) { + if (current != SubclassWndProc) { ERR ("Application has subclassed with our procedure, then manually, then with us again. The current implementation can't handle this.\n"); return FALSE; } @@ -1262,6 +1263,33 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u } +/*********************************************************************** + * SubclassWndProc (internal) + * + * Window procedure for all subclassed windows. + * Saves the current subclassing stack position to support nested messages + */ + +static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LPSUBCLASS_INFO stack; + int stackpos; + LRESULT ret; + + /* retrieve our little stack from the Properties */ + stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass); + if (!stack) { + ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd); + return 0; + } + stackpos = stack->stackpos; + stack->stackpos = stack->stacknum; + ret = DefSubclassProc(hWnd,uMsg,wParam,lParam); + stack->stackpos = stackpos; + return ret; +} + + /*********************************************************************** * DefSubclassProc [COMCTL32.413] * -- 2.32.0.93.g670b81a890