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); }