PATCH: [Bug 671] Valve Hammer Editor does not run - recursion in buddySupperClassWndProc

Dimitrie O. Paun dimi at bigfoot.com
Tue Jul 16 07:29:47 CDT 2002


On June 5, 2002 08:45 pm, Guy L. Albertelli wrote:

> You probably are correct, Dimi. What I did is model the builtin actions on
> what the +relay,+message trace of the native showed. The basic problem was
> that the GetWindowLong never returned the builtin wndproc address, so we
> always did the SetWindowLong again. This disabled the application's own
> wndproc and eventually caused the loop. Since the native control never did
> the GetWindowLong and did the SetWindowLong only once, that was how I
> changed the code. It sounds like you have a much better understanding of
> UpDown (and probably some better test cases). 

Hi Guy,

Sorry for my very late reply, but I was away on vacation for over a 
month now. I've included my version of the fix. Can you please give 
it a small test run, as I have no test cases for the situation you 
discovered.

TIA,
Dimi.

Index: dlls/comctl32/updown.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/updown.c,v
retrieving revision 1.41
diff -u -r1.41 updown.c
--- dlls/comctl32/updown.c	31 May 2002 23:25:44 -0000	1.41
+++ dlls/comctl32/updown.c	16 Jul 2002 12:13:16 -0000
@@ -447,7 +447,7 @@
     DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);
     RECT  budRect;  /* new coord for the buddy */
     int   x, width;  /* new x position and width for the up-down */
-    WNDPROC baseWndProc, currWndProc;
+    WNDPROC baseWndProc;
     CHAR buddyClass[40];
 
     /* Is it a valid bud? */
@@ -477,8 +477,7 @@
         /* Note that I don't clear the BUDDY_SUPERCLASS_WNDPROC property
            when we reset the upDown ctrl buddy to another buddy because it is not
            good to break the window proc chain. */
-	currWndProc = (WNDPROC) GetWindowLongW(bud, GWL_WNDPROC);
-	if (currWndProc != UPDOWN_Buddy_SubclassProc) {
+	if (!GetPropA(bud, BUDDY_SUPERCLASS_WNDPROC)) {
 	    baseWndProc = (WNDPROC)SetWindowLongW(bud, GWL_WNDPROC, (LPARAM)UPDOWN_Buddy_SubclassProc);
  	    SetPropA(bud, BUDDY_SUPERCLASS_WNDPROC, (HANDLE)baseWndProc);
 	}
@@ -939,7 +938,7 @@
 	    return temp;
 
 	default:
-	    if (message >= WM_USER)
+	    if ((message >= WM_USER) && (message < WM_APP))
 	     	ERR("unknown msg %04x wp=%04x lp=%08lx\n", message, wParam, lParam);
 	    return DefWindowProcW (hwnd, message, wParam, lParam);
     }




More information about the wine-devel mailing list