Alexandre, anything wrong with this patch? This is the prelude to the unicodification of the control, but I wanted to separate the non-functional changes first. ChangeLog: Various Up-Down Common Control Cleanups -- get rid of the static data member -- pass the infoPtr around instead of the hwnd -- fix indentatin/style a bit to make it consistent with the rest of the file. -- Dimi. Index: dlls/comctl32/updown.c =================================================================== RCS file: /var/cvs/wine/dlls/comctl32/updown.c,v retrieving revision 1.32 diff -u -r1.32 updown.c --- dlls/comctl32/updown.c 26 Nov 2000 22:35:01 -0000 1.32 +++ dlls/comctl32/updown.c 29 Jan 2002 03:05:41 -0000 @@ -39,8 +39,10 @@ typedef struct { + HWND Self; /* Handle to this up-down control */ UINT AccelCount; /* Number of elements in AccelVect */ UDACCEL* AccelVect; /* Vector containing AccelCount elements */ + INT AccelIndex; /* Current accel index, -1 if not accelerating */ INT Base; /* Base to display nr in the buddy window */ INT CurVal; /* Current up-down value */ INT MinVal; /* Minimum up-down value */ @@ -74,8 +76,6 @@ #define BUDDY_UPDOWN_HWND "buddyUpDownHWND" #define BUDDY_SUPERCLASS_WNDPROC "buddySupperClassWndProc" -static int accelIndex = -1; - #define UNKNOWN_PARAM(msg, wParam, lParam) WARN(\ "Unknown parameter(s) for message " #msg \ "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); @@ -89,10 +89,8 @@ * UPDOWN_InBounds * Tests if a given value 'val' is between the Min&Max limits */ -static BOOL UPDOWN_InBounds(HWND hwnd, int val) +static BOOL UPDOWN_InBounds(UPDOWN_INFO *infoPtr, int val) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - if(infoPtr->MaxVal > infoPtr->MinVal) return (infoPtr->MinVal <= val) && (val <= infoPtr->MaxVal); else @@ -104,13 +102,11 @@ * Tests if we can change the current value by delta. If so, it changes * it and returns TRUE. Else, it leaves it unchanged and returns FALSE. */ -static BOOL UPDOWN_OffsetVal(HWND hwnd, int delta) +static BOOL UPDOWN_OffsetVal(UPDOWN_INFO *infoPtr, int delta) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - /* check if we can do the modification first */ - if(!UPDOWN_InBounds (hwnd, infoPtr->CurVal+delta)){ - if (GetWindowLongA (hwnd, GWL_STYLE) & UDS_WRAP) + if(!UPDOWN_InBounds (infoPtr, infoPtr->CurVal+delta)){ + if (GetWindowLongW (infoPtr->Self, GWL_STYLE) & UDS_WRAP) { delta += (delta < 0 ? -1 : 1) * (infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1) * @@ -131,13 +127,12 @@ * When we have a buddy set and that we are aligned on our buddy, we * want to draw a sunken edge to make like we are part of that control. */ -static BOOL UPDOWN_HasBuddyBorder(HWND hwnd) +static BOOL UPDOWN_HasBuddyBorder(UPDOWN_INFO* infoPtr) { - UPDOWN_INFO* infoPtr = UPDOWN_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); return ( ((dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)) != 0) && - (SendMessageA(hwnd, UDM_GETBUDDY, 0, 0) != 0) && + (SendMessageW(infoPtr->Self, UDM_GETBUDDY, 0, 0) != 0) && (lstrcmpiA(infoPtr->szBuddyClass, "EDIT") == 0 ) ); } @@ -147,25 +142,23 @@ * rect - will hold the rectangle * incr - TRUE get the "increment" rect (up or right) * FALSE get the "decrement" rect (down or left) - * */ -static void UPDOWN_GetArrowRect (HWND hwnd, RECT *rect, BOOL incr) +static void UPDOWN_GetArrowRect (UPDOWN_INFO* infoPtr, RECT *rect, BOOL incr) { - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); int len; /* will hold the width or height */ - GetClientRect (hwnd, rect); + GetClientRect (infoPtr->Self, rect); /* * Make sure we calculate the rectangle to fit even if we draw the * border. */ - if (UPDOWN_HasBuddyBorder(hwnd)) - { + if (UPDOWN_HasBuddyBorder(infoPtr)) { if (dwStyle & UDS_ALIGNLEFT) - rect->left+=DEFAULT_BUDDYBORDER; + rect->left += DEFAULT_BUDDYBORDER; else - rect->right-=DEFAULT_BUDDYBORDER; + rect->right -= DEFAULT_BUDDYBORDER; InflateRect(rect, 0, -DEFAULT_BUDDYBORDER); } @@ -181,8 +174,7 @@ rect->left = rect->left + len/2; else rect->right = rect->left + len/2; - } - else { + } else { len = rect->bottom - rect->top + 1; /* compute the height */ if (incr) rect->bottom = rect->top + len/2; @@ -197,14 +189,12 @@ * If it returns the up rect, it returns TRUE. * If it returns the down rect, it returns FALSE. */ -static BOOL -UPDOWN_GetArrowFromPoint (HWND hwnd, RECT *rect, POINT pt) +static BOOL UPDOWN_GetArrowFromPoint (UPDOWN_INFO* infoPtr, RECT *rect, POINT pt) { - UPDOWN_GetArrowRect (hwnd, rect, TRUE); - if(PtInRect(rect, pt)) - return TRUE; + UPDOWN_GetArrowRect (infoPtr, rect, TRUE); + if(PtInRect(rect, pt)) return TRUE; - UPDOWN_GetArrowRect (hwnd, rect, FALSE); + UPDOWN_GetArrowRect (infoPtr, rect, FALSE); return FALSE; } @@ -213,12 +203,11 @@ * UPDOWN_GetThousandSep * Returns the thousand sep. If an error occurs, it returns ','. */ -static char UPDOWN_GetThousandSep() +static CHAR UPDOWN_GetThousandSep() { - char sep[2]; + CHAR sep[2]; - if(GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, - sep, sizeof(sep)) != 1) + if(GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, sep, 2) != 1) return ','; return sep[0]; @@ -232,9 +221,8 @@ * TRUE - if it read the integer from the buddy successfully * FALSE - if an error occured */ -static BOOL UPDOWN_GetBuddyInt (HWND hwnd) +static BOOL UPDOWN_GetBuddyInt (UPDOWN_INFO *infoPtr) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); char txt[20], sep, *src, *dst; int newVal; @@ -256,17 +244,15 @@ /* now get rid of the separators */ for(src = dst = txt; *src; src++) - if(*src != sep) - *dst++ = *src; + if(*src != sep) *dst++ = *src; *dst = 0; /* try to convert the number and validate it */ newVal = strtol(txt, &src, infoPtr->Base); - if(*src || !UPDOWN_InBounds (hwnd, newVal)) + if(*src || !UPDOWN_InBounds (infoPtr, newVal)) return FALSE; - TRACE("new value(%d) read from buddy (old=%d)\n", - newVal, infoPtr->CurVal); + TRACE("new value(%d) from buddy (old=%d)\n", newVal, infoPtr->CurVal); } infoPtr->CurVal = newVal; @@ -281,17 +267,15 @@ * TRUE - if it set the caption of the buddy successfully * FALSE - if an error occured */ -static BOOL UPDOWN_SetBuddyInt (HWND hwnd) +static BOOL UPDOWN_SetBuddyInt (UPDOWN_INFO *infoPtr) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); char txt1[20], sep; int len; if (!IsWindow(infoPtr->Buddy)) return FALSE; - TRACE("set new value(%d) to buddy.\n", - infoPtr->CurVal); + TRACE("set new value(%d) to buddy.\n", infoPtr->CurVal); /*if the buddy is a list window, we must set curr index */ if(!lstrcmpA (infoPtr->szBuddyClass, "ListBox")){ @@ -303,16 +287,15 @@ sep = UPDOWN_GetThousandSep(); /* Do thousands seperation if necessary */ - if (!(GetWindowLongA (hwnd, GWL_STYLE) & UDS_NOTHOUSANDS) && (len > 3)) { + if (!(GetWindowLongA (infoPtr->Self, GWL_STYLE) & UDS_NOTHOUSANDS) && (len > 3)) { char txt2[20], *src = txt1, *dst = txt2; - if(len%3 > 0){ + if(len % 3 > 0) { lstrcpynA (dst, src, len%3 + 1); /* need to include the null */ dst += len%3; src += len%3; } - for(len=0; *src; len++){ - if(len%3==0) - *dst++ = sep; + for(len=0; *src; len++) { + if(len%3==0) *dst++ = sep; *dst++ = *src++; } *dst = 0; /* null terminate it */ @@ -330,12 +313,12 @@ * When we have a buddy set and that we are aligned on our buddy, we * want to draw a sunken edge to make like we are part of that control. */ -static void UPDOWN_DrawBuddyBorder (HWND hwnd, HDC hdc) +static void UPDOWN_DrawBuddyBorder (UPDOWN_INFO *infoPtr, HDC hdc) { - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongA (infoPtr->Self, GWL_STYLE); RECT clientRect; - GetClientRect(hwnd, &clientRect); + GetClientRect(infoPtr->Self, &clientRect); if (dwStyle & UDS_ALIGNLEFT) DrawEdge(hdc, &clientRect, EDGE_SUNKEN, BF_BOTTOM | BF_LEFT | BF_TOP); @@ -348,21 +331,20 @@ * * Draw the arrows. The background need not be erased. */ -static void UPDOWN_Draw (HWND hwnd, HDC hdc) +static void UPDOWN_Draw (UPDOWN_INFO *infoPtr, HDC hdc) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongA (infoPtr->Self, GWL_STYLE); BOOL prssed; RECT rect; /* * Draw the common border between ourselves and our buddy. */ - if (UPDOWN_HasBuddyBorder(hwnd)) - UPDOWN_DrawBuddyBorder(hwnd, hdc); + if (UPDOWN_HasBuddyBorder(infoPtr)) + UPDOWN_DrawBuddyBorder(infoPtr, hdc); /* Draw the incr button */ - UPDOWN_GetArrowRect (hwnd, &rect, TRUE); + UPDOWN_GetArrowRect (infoPtr, &rect, TRUE); prssed = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN); DrawFrameControl(hdc, &rect, DFC_SCROLL, (dwStyle & UDS_HORZ ? DFCS_SCROLLRIGHT : DFCS_SCROLLUP) | @@ -374,7 +356,7 @@ DrawEdge(hdc, &rect, 0, BF_MIDDLE); /* Draw the decr button */ - UPDOWN_GetArrowRect(hwnd, &rect, FALSE); + UPDOWN_GetArrowRect(infoPtr, &rect, FALSE); prssed = (infoPtr->Flags & FLAG_DECR) && (infoPtr->Flags & FLAG_MOUSEIN); DrawFrameControl(hdc, &rect, DFC_SCROLL, (dwStyle & UDS_HORZ ? DFCS_SCROLLLEFT : DFCS_SCROLLDOWN) | @@ -388,13 +370,11 @@ * Synchronous drawing (must NOT be used in WM_PAINT). * Calls UPDOWN_Draw. */ -static void UPDOWN_Refresh (HWND hwnd) +static void UPDOWN_Refresh (UPDOWN_INFO *infoPtr) { - HDC hdc; - - hdc = GetDC (hwnd); - UPDOWN_Draw (hwnd, hdc); - ReleaseDC (hwnd, hdc); + HDC hdc = GetDC (infoPtr->Self); + UPDOWN_Draw (infoPtr, hdc); + ReleaseDC (infoPtr->Self, hdc); } @@ -404,23 +384,22 @@ * Asynchronous drawing (must ONLY be used in WM_PAINT). * Calls UPDOWN_Draw. */ -static void UPDOWN_Paint (HWND hwnd, HDC passedDC) +static void UPDOWN_Paint (UPDOWN_INFO *infoPtr, HDC hdc) { - PAINTSTRUCT ps; - HDC hdc = passedDC; - - if (passedDC == 0) - hdc = BeginPaint (hwnd, &ps); - - UPDOWN_Draw (hwnd, hdc); - - if (passedDC == 0) - EndPaint (hwnd, &ps); + if (hdc) { + UPDOWN_Draw (infoPtr, hdc); + } else { + PAINTSTRUCT ps; + + hdc = BeginPaint (infoPtr->Self, &ps); + UPDOWN_Draw (infoPtr, hdc); + EndPaint (infoPtr->Self, &ps); + } } /*********************************************************************** * UPDOWN_SetBuddy - * Tests if 'hwndBud' is a valid window handle. If not, returns FALSE. + * Tests if 'bud' is a valid window handle. If not, returns FALSE. * Else, sets it as a new Buddy. * Then, it should subclass the buddy * If window has the UDS_ARROWKEYS, it subcalsses the buddy window to @@ -428,45 +407,43 @@ * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style * the size/pos of the buddy and the control are adjusted accordingly. */ -static BOOL UPDOWN_SetBuddy (HWND hwnd, HWND hwndBud) +static BOOL UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) { - UPDOWN_INFO* infoPtr = UPDOWN_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongA (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; /* Is it a valid bud? */ - if(!IsWindow(hwndBud)) - return FALSE; + if(!IsWindow(bud)) return FALSE; /* there is already a body assigned */ if ( infoPtr->Buddy ) RemovePropA(infoPtr->Buddy, BUDDY_UPDOWN_HWND); /* Store buddy window handle */ - infoPtr->Buddy = hwndBud; + infoPtr->Buddy = bud; /* keep upDown ctrl hwnd in a buddy property */ - SetPropA( hwndBud, BUDDY_UPDOWN_HWND, hwnd); + SetPropA( bud, BUDDY_UPDOWN_HWND, infoPtr->Self); /* Store buddy window clas name */ memset(infoPtr->szBuddyClass, 0, UPDOWN_BUDDYCLASSNAMELEN); - GetClassNameA (hwndBud, infoPtr->szBuddyClass, UPDOWN_BUDDYCLASSNAMELEN-1); + GetClassNameA (bud, infoPtr->szBuddyClass, UPDOWN_BUDDYCLASSNAMELEN-1); if(dwStyle & UDS_ARROWKEYS){ /* 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) GetWindowLongA(hwndBud, GWL_WNDPROC); + currWndProc = (WNDPROC) GetWindowLongA(bud, GWL_WNDPROC); if (currWndProc != UPDOWN_Buddy_SubclassProc) { // replace the buddy's WndProc with ours - baseWndProc = (WNDPROC)SetWindowLongA(hwndBud, GWL_WNDPROC, + baseWndProc = (WNDPROC)SetWindowLongA(bud, GWL_WNDPROC, (LPARAM)UPDOWN_Buddy_SubclassProc); // and save the base class' WndProc - SetPropA(hwndBud, BUDDY_SUPERCLASS_WNDPROC, (HANDLE)baseWndProc); + SetPropA(bud, BUDDY_SUPERCLASS_WNDPROC, (HANDLE)baseWndProc); } // else // its already been subclassed, don't overwrite BUDDY_SUPERCLASS_WNDPROC @@ -505,7 +482,7 @@ * to look as if it is integrated with the buddy control. * We nudge the control or change it size to overlap. */ - if (UPDOWN_HasBuddyBorder(hwnd)) + if (UPDOWN_HasBuddyBorder(infoPtr)) { if(dwStyle & UDS_ALIGNLEFT) width+=DEFAULT_BUDDYBORDER; @@ -513,7 +490,7 @@ x-=DEFAULT_BUDDYBORDER; } - SetWindowPos (hwnd, infoPtr->Buddy, + SetWindowPos (infoPtr->Self, infoPtr->Buddy, x, budRect.top-DEFAULT_ADDTOP, width, (budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT, SWP_NOACTIVATE); @@ -530,10 +507,9 @@ * It handles wraping and non-wraping correctly. * It is assumed that delta>0 */ -static void UPDOWN_DoAction (HWND hwnd, int delta, BOOL incr) +static void UPDOWN_DoAction (UPDOWN_INFO *infoPtr, int delta, BOOL incr) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongA (infoPtr->Self, GWL_STYLE); NM_UPDOWN ni; TRACE("%s by %d\n", incr ? "inc" : "dec", delta); @@ -544,28 +520,28 @@ /* We must notify parent now to obtain permission */ ni.iPos = infoPtr->CurVal; ni.iDelta = delta; - ni.hdr.hwndFrom = hwnd; - ni.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID); + ni.hdr.hwndFrom = infoPtr->Self; + ni.hdr.idFrom = GetWindowLongA (infoPtr->Self, GWL_ID); ni.hdr.code = UDN_DELTAPOS; - if (!SendMessageA(GetParent (hwnd), WM_NOTIFY, + if (!SendMessageA(GetParent (infoPtr->Self), WM_NOTIFY, (WPARAM)ni.hdr.idFrom, (LPARAM)&ni)) { /* Parent said: OK to adjust */ /* Now adjust value with (maybe new) delta */ - if (UPDOWN_OffsetVal (hwnd, ni.iDelta)) + if (UPDOWN_OffsetVal (infoPtr, ni.iDelta)) { /* Now take care about our buddy */ if(infoPtr->Buddy && IsWindow(infoPtr->Buddy) && (dwStyle & UDS_SETBUDDYINT) ) - UPDOWN_SetBuddyInt (hwnd); + UPDOWN_SetBuddyInt (infoPtr); } } /* Also, notify it. This message is sent in any case. */ - SendMessageA (GetParent (hwnd), + SendMessageA (GetParent (infoPtr->Self), dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL, - MAKELONG(SB_THUMBPOSITION, infoPtr->CurVal), hwnd); + MAKELONG(SB_THUMBPOSITION, infoPtr->CurVal), infoPtr->Self); } /*********************************************************************** @@ -574,11 +550,9 @@ * Returns TRUE if it is enabled as well as its buddy (if any) * FALSE otherwise */ -static BOOL UPDOWN_IsEnabled (HWND hwnd) +static BOOL UPDOWN_IsEnabled (UPDOWN_INFO *infoPtr) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - - if(GetWindowLongA (hwnd, GWL_STYLE) & WS_DISABLED) + if(GetWindowLongA (infoPtr->Self, GWL_STYLE) & WS_DISABLED) return FALSE; if(infoPtr->Buddy) return IsWindowEnabled(infoPtr->Buddy); @@ -593,22 +567,20 @@ * If the control was not in cancel mode, it returns FALSE. * If the control was in cancel mode, it returns TRUE. */ -static BOOL UPDOWN_CancelMode (HWND hwnd) +static BOOL UPDOWN_CancelMode (UPDOWN_INFO *infoPtr) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - /* if not in 'capture' mode, do nothing */ if(!(infoPtr->Flags & FLAG_CLICKED)) return FALSE; - KillTimer (hwnd, TIMERID1); /* kill all possible timers */ - KillTimer (hwnd, TIMERID2); + KillTimer (infoPtr->Self, TIMERID1); /* kill all possible timers */ + KillTimer (infoPtr->Self, TIMERID2); - if (GetCapture() == hwnd) /* let the mouse go */ - ReleaseCapture(); /* if we still have it */ + if (GetCapture() == infoPtr->Self) /* let the mouse go */ + ReleaseCapture(); /* if we still have it */ - infoPtr->Flags = 0; /* get rid of any flags */ - UPDOWN_Refresh (hwnd); /* redraw the control just in case */ + infoPtr->Flags = 0; /* get rid of any flags */ + UPDOWN_Refresh (infoPtr); /* redraw the control just in case */ return TRUE; } @@ -620,10 +592,9 @@ * 'pt' is the location of the mouse event in client or * windows coordinates. */ -static void UPDOWN_HandleMouseEvent (HWND hwnd, UINT msg, POINT pt) +static void UPDOWN_HandleMouseEvent (UPDOWN_INFO *infoPtr, UINT msg, POINT pt) { - UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongA (infoPtr->Self, GWL_STYLE); RECT rect; int temp; @@ -639,11 +610,11 @@ SetFocus(infoPtr->Buddy); /* Now see which one is the 'active' arrow */ - temp = UPDOWN_GetArrowFromPoint (hwnd, &rect, pt); + temp = UPDOWN_GetArrowFromPoint (infoPtr, &rect, pt); /* Update the CurVal if necessary */ if (dwStyle & UDS_SETBUDDYINT) - UPDOWN_GetBuddyInt (hwnd); + UPDOWN_GetBuddyInt (infoPtr); /* Set up the correct flags */ infoPtr->Flags = 0; @@ -651,16 +622,16 @@ infoPtr->Flags |= FLAG_MOUSEIN; /* repaint the control */ - UPDOWN_Refresh (hwnd); + UPDOWN_Refresh (infoPtr); /* process the click */ - UPDOWN_DoAction (hwnd, 1, infoPtr->Flags & FLAG_INCR); + UPDOWN_DoAction (infoPtr, 1, infoPtr->Flags & FLAG_INCR); /* now capture all mouse messages */ - SetCapture (hwnd); + SetCapture (infoPtr->Self); /* and startup the first timer */ - SetTimer(hwnd, TIMERID1, INITIAL_DELAY, 0); + SetTimer(infoPtr->Self, TIMERID1, INITIAL_DELAY, 0); break; case WM_MOUSEMOVE: @@ -673,21 +644,21 @@ /* Now get the 'active' arrow rectangle */ if (infoPtr->Flags & FLAG_INCR) - UPDOWN_GetArrowRect (hwnd, &rect, TRUE); + UPDOWN_GetArrowRect (infoPtr, &rect, TRUE); else - UPDOWN_GetArrowRect (hwnd, &rect, FALSE); + UPDOWN_GetArrowRect (infoPtr, &rect, FALSE); /* Update the flags if we are in/out */ if(PtInRect(&rect, pt)) infoPtr->Flags |= FLAG_MOUSEIN; else{ infoPtr->Flags &= ~FLAG_MOUSEIN; - if(accelIndex != -1) /* if we have accel info */ - accelIndex = 0; /* reset it */ + if(infoPtr->AccelIndex != -1) /* if we have accel info */ + infoPtr->AccelIndex = 0; /* reset it */ } /* If state changed, redraw the control */ if(temp != infoPtr->Flags) - UPDOWN_Refresh (hwnd); + UPDOWN_Refresh (infoPtr); break; default: @@ -719,15 +690,20 @@ SetWindowLongA (hwnd, 0, (DWORD)infoPtr); /* initialize the info struct */ - infoPtr->AccelCount=0; infoPtr->AccelVect=0; - infoPtr->CurVal=0; infoPtr->MinVal=0; infoPtr->MaxVal=9999; + infoPtr->Self = hwnd; + infoPtr->AccelCount = 0; + infoPtr->AccelVect = 0; + infoPtr->AccelIndex = -1; + infoPtr->CurVal = 0; + infoPtr->MinVal = 0; + infoPtr->MaxVal = 9999; infoPtr->Base = 10; /* Default to base 10 */ infoPtr->Buddy = 0; /* No buddy window yet */ infoPtr->Flags = 0; /* And no flags */ /* Do we pick the buddy win ourselves? */ if (dwStyle & UDS_AUTOBUDDY) - UPDOWN_SetBuddy (hwnd, GetWindow (hwnd, GW_HWNDPREV)); + UPDOWN_SetBuddy (infoPtr, GetWindow (hwnd, GW_HWNDPREV)); TRACE("UpDown Ctrl creation, hwnd=%04x\n", hwnd); break; @@ -746,9 +722,9 @@ case WM_ENABLE: if (dwStyle & WS_DISABLED) - UPDOWN_CancelMode (hwnd); + UPDOWN_CancelMode (infoPtr); - UPDOWN_Refresh (hwnd); + UPDOWN_Refresh (infoPtr); break; case WM_TIMER: @@ -757,25 +733,25 @@ KillTimer(hwnd, TIMERID1); /* if no accel info given, used default timer */ if(infoPtr->AccelCount==0 || infoPtr->AccelVect==0){ - accelIndex = -1; + infoPtr->AccelIndex = -1; temp = REPEAT_DELAY; } else{ - accelIndex = 0; /* otherwise, use it */ - temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1; + infoPtr->AccelIndex = 0; /* otherwise, use it */ + temp = infoPtr->AccelVect[infoPtr->AccelIndex].nSec * 1000 + 1; } SetTimer(hwnd, TIMERID2, temp, 0); } /* now, if the mouse is above us, do the thing...*/ if(infoPtr->Flags & FLAG_MOUSEIN){ - temp = accelIndex==-1 ? 1 : infoPtr->AccelVect[accelIndex].nInc; - UPDOWN_DoAction(hwnd, temp, infoPtr->Flags & FLAG_INCR); + temp = infoPtr->AccelIndex == -1 ? 1 : infoPtr->AccelVect[infoPtr->AccelIndex].nInc; + UPDOWN_DoAction(infoPtr, temp, infoPtr->Flags & FLAG_INCR); - if(accelIndex!=-1 && accelIndex < infoPtr->AccelCount-1){ + if(infoPtr->AccelIndex != -1 && infoPtr->AccelIndex < infoPtr->AccelCount-1){ KillTimer(hwnd, TIMERID2); - accelIndex++; /* move to the next accel info */ - temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1; + infoPtr->AccelIndex++; /* move to the next accel info */ + temp = infoPtr->AccelVect[infoPtr->AccelIndex].nSec * 1000 + 1; /* make sure we have at least 1ms intervals */ SetTimer(hwnd, TIMERID2, temp, 0); } @@ -783,11 +759,11 @@ break; case WM_CANCELMODE: - UPDOWN_CancelMode (hwnd); + UPDOWN_CancelMode (infoPtr); break; case WM_LBUTTONUP: - if(!UPDOWN_CancelMode(hwnd)) + if(!UPDOWN_CancelMode(infoPtr)) break; SendMessageA(GetParent(hwnd), dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL, @@ -801,29 +777,29 @@ case WM_LBUTTONDOWN: case WM_MOUSEMOVE: - if(UPDOWN_IsEnabled(hwnd)){ + if(UPDOWN_IsEnabled(infoPtr)){ POINT pt; pt.x = SLOWORD(lParam); pt.y = SHIWORD(lParam); - UPDOWN_HandleMouseEvent (hwnd, message, pt ); + UPDOWN_HandleMouseEvent (infoPtr, message, pt ); } break; case WM_KEYDOWN: - if((dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(hwnd)){ + if((dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(infoPtr)){ switch(wParam){ case VK_UP: case VK_DOWN: - UPDOWN_GetBuddyInt (hwnd); - /* Fixme: Paint the according button pressed for some time, like win95 does*/ - UPDOWN_DoAction (hwnd, 1, wParam==VK_UP); + UPDOWN_GetBuddyInt (infoPtr); + /* FIXME: Paint the according button pressed for some time, like win95 does*/ + UPDOWN_DoAction (infoPtr, 1, wParam==VK_UP); break; } } break; case WM_PAINT: - UPDOWN_Paint (hwnd, (HDC)wParam); + UPDOWN_Paint (infoPtr, (HDC)wParam); break; case UDM_GETACCEL: @@ -858,8 +834,7 @@ return infoPtr->Base; case UDM_SETBASE: - TRACE("UpDown Ctrl new base(%d), hwnd=%04x\n", - wParam, hwnd); + TRACE("UpDown Ctrl new base(%d), hwnd=%04x\n", wParam, hwnd); if ( !(wParam==10 || wParam==16) || lParam) UNKNOWN_PARAM(UDM_SETBASE, wParam, lParam); if (wParam==10 || wParam==16){ @@ -878,24 +853,22 @@ if (lParam) UNKNOWN_PARAM(UDM_SETBUDDY, wParam, lParam); temp = infoPtr->Buddy; - UPDOWN_SetBuddy (hwnd, wParam); - TRACE("UpDown Ctrl new buddy(%04x), hwnd=%04x\n", - infoPtr->Buddy, hwnd); + UPDOWN_SetBuddy (infoPtr, wParam); + TRACE("UpDown Ctrl new buddy(%04x), hwnd=%04x\n", infoPtr->Buddy, hwnd); return temp; case UDM_GETPOS: if (wParam || lParam) UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam); - temp = UPDOWN_GetBuddyInt (hwnd); + temp = UPDOWN_GetBuddyInt (infoPtr); return MAKELONG(infoPtr->CurVal, temp ? 0 : 1); case UDM_SETPOS: if (wParam || HIWORD(lParam)) UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam); temp = SLOWORD(lParam); - TRACE("UpDown Ctrl new value(%d), hwnd=%04x\n", - temp, hwnd); - if(!UPDOWN_InBounds(hwnd, temp)){ + TRACE("UpDown Ctrl new value(%d), hwnd=%04x\n", temp, hwnd); + if(!UPDOWN_InBounds(infoPtr, temp)){ if(temp < infoPtr->MinVal) temp = infoPtr->MinVal; if(temp > infoPtr->MaxVal) @@ -904,7 +877,7 @@ wParam = infoPtr->CurVal; /* save prev value */ infoPtr->CurVal = temp; /* set the new value */ if(dwStyle & UDS_SETBUDDYINT) - UPDOWN_SetBuddyInt (hwnd); + UPDOWN_SetBuddyInt (infoPtr); return wParam; /* return prev value */ case UDM_GETRANGE: @@ -919,7 +892,7 @@ infoPtr->MinVal = SHIWORD(lParam); /* UD_MINVAL <= Min <= UD_MAXVAL */ /* |Max-Min| <= UD_MAXVAL */ TRACE("UpDown Ctrl new range(%d to %d), hwnd=%04x\n", - infoPtr->MinVal, infoPtr->MaxVal, hwnd); + infoPtr->MinVal, infoPtr->MaxVal, hwnd); break; case UDM_GETRANGE32: @@ -935,7 +908,7 @@ if (infoPtr->MaxVal <= infoPtr->MinVal) infoPtr->MaxVal = infoPtr->MinVal + 1; TRACE("UpDown Ctrl new range(%d to %d), hwnd=%04x\n", - infoPtr->MinVal, infoPtr->MaxVal, hwnd); + infoPtr->MinVal, infoPtr->MaxVal, hwnd); break; case UDM_GETPOS32: @@ -944,7 +917,7 @@ return infoPtr->CurVal; case UDM_SETPOS32: - if(!UPDOWN_InBounds(hwnd, (int)lParam)){ + if(!UPDOWN_InBounds(infoPtr, (int)lParam)){ if((int)lParam < infoPtr->MinVal) lParam = infoPtr->MinVal; if((int)lParam > infoPtr->MaxVal) @@ -953,13 +926,12 @@ temp = infoPtr->CurVal; /* save prev value */ infoPtr->CurVal = (int)lParam; /* set the new value */ if(dwStyle & UDS_SETBUDDYINT) - UPDOWN_SetBuddyInt (hwnd); + UPDOWN_SetBuddyInt (infoPtr); return temp; /* return prev value */ default: if (message >= WM_USER) - ERR("unknown msg %04x wp=%04x lp=%08lx\n", - message, wParam, lParam); + ERR("unknown msg %04x wp=%04x lp=%08lx\n", message, wParam, lParam); return DefWindowProcA (hwnd, message, wParam, lParam); } @@ -998,8 +970,8 @@ } else { - UPDOWN_GetBuddyInt(upDownHwnd); - UPDOWN_DoAction(upDownHwnd, 1, wParam==VK_UP); + UPDOWN_GetBuddyInt(infoPtr); + UPDOWN_DoAction(infoPtr, 1, wParam==VK_UP); } break;