[PATCH 3/6] user32: Pass a scroll bar tracking info parameter to SCROLL_DrawScrollBar().

Zhiyi Zhang zzhang at codeweavers.com
Tue Jul 6 02:07:39 CDT 2021


Pack all scroll bar tracking information in a struct and pass that struct as a parameter to
SCROLL_DrawScrollBar() instead of using global variables.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/user32/controls.h |  14 ++++-
 dlls/user32/scroll.c   | 121 +++++++++++++++++++----------------------
 2 files changed, 70 insertions(+), 65 deletions(-)

diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 9bb6a0047d1..25ff4fe05ff 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -191,9 +191,21 @@ enum SCROLL_HITTEST
     SCROLL_BOTTOM_ARROW  /* Bottom or right arrow */
 };
 
+/* Scroll bar tracking information */
+struct SCROLL_TRACKING_INFO
+{
+    HWND win;                       /* Tracking window */
+    INT bar;                        /* SB_HORZ / SB_VERT / SB_CTL */
+    INT thumb_pos;                  /* Thumb position */
+    INT thumb_val;                  /* Current thumb value from thumb position */
+    BOOL vertical;                  /* Is scroll bar vertical */
+    enum SCROLL_HITTEST hit_test;   /* Hit Test code of the last button-down event */
+};
+
 extern void SCROLL_DrawNCScrollBar( HWND hwnd, HDC hdc, BOOL draw_horizontal, BOOL draw_vertical ) DECLSPEC_HIDDEN;
 extern void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test,
-                                  BOOL arrows, BOOL interior ) DECLSPEC_HIDDEN;
+                                  const struct SCROLL_TRACKING_INFO *tracking_info, BOOL arrows,
+                                  BOOL interior ) DECLSPEC_HIDDEN;
 extern void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt ) DECLSPEC_HIDDEN;
 
 /* combo box */
diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c
index fdd657feda6..e941c00a562 100644
--- a/dlls/user32/scroll.c
+++ b/dlls/user32/scroll.c
@@ -80,14 +80,8 @@ typedef struct
 #define SA_SSI_REFRESH		0x0004
 #define SA_SSI_REPAINT_ARROWS	0x0008
 
- /* Thumb-tracking info */
-static HWND SCROLL_TrackingWin = 0;
-static INT  SCROLL_TrackingBar = 0;
-static INT  SCROLL_TrackingPos = 0;
-static INT  SCROLL_TrackingVal = 0;
- /* Hit test code of the last button-down event */
-static enum SCROLL_HITTEST SCROLL_trackHitTest;
-static BOOL SCROLL_trackVertical;
+/* Scroll Bar tracking information */
+static struct SCROLL_TRACKING_INFO g_tracking_info;
 
  /* Is the moving thumb being displayed? */
 static BOOL SCROLL_MovingThumb = FALSE;
@@ -456,7 +450,7 @@ static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr,
 static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical,
 				    INT arrowSize, INT thumbSize )
 {
-  INT pos = SCROLL_TrackingPos;
+  INT pos = g_tracking_info.thumb_pos;
   INT max_size;
 
   if( vertical )
@@ -471,7 +465,7 @@ static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical,
   else if( pos > max_size )
     pos = max_size;
 
-  SCROLL_DrawInterior( SCROLL_TrackingWin, hdc, SCROLL_TrackingBar, rect, arrowSize, thumbSize, pos,
+  SCROLL_DrawInterior( g_tracking_info.win, hdc, g_tracking_info.bar, rect, arrowSize, thumbSize, pos,
                        0, vertical, FALSE, FALSE );
 }
 
@@ -572,7 +566,8 @@ static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar,
  *
  * Redraw the whole scrollbar.
  */
-void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test, BOOL arrows,
+void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit_test,
+                           const struct SCROLL_TRACKING_INFO *tracking_info, BOOL arrows,
                            BOOL interior )
 {
     INT arrowSize, thumbSize, thumbPos;
@@ -598,10 +593,10 @@ void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit
 
     if (arrows && arrowSize)
     {
-	if( vertical == SCROLL_trackVertical && GetCapture() == hwnd )
+        if (vertical == tracking_info->vertical && GetCapture() == hwnd)
 	    SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical,
-                               hit_test == SCROLL_trackHitTest && hit_test == SCROLL_TOP_ARROW,
-                               hit_test == SCROLL_trackHitTest && hit_test == SCROLL_BOTTOM_ARROW );
+                               hit_test == tracking_info->hit_test && hit_test == SCROLL_TOP_ARROW,
+                               hit_test == tracking_info->hit_test && hit_test == SCROLL_BOTTOM_ARROW );
 	else
 	    SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical,
 							       FALSE, FALSE );
@@ -609,17 +604,17 @@ void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit
 
     if (interior)
     {
-        if (SCROLL_MovingThumb && SCROLL_TrackingWin == hwnd && SCROLL_TrackingBar == nBar)
+        if (SCROLL_MovingThumb && tracking_info->win == hwnd && tracking_info->bar == nBar)
         {
             SCROLL_DrawMovingThumb( hdc, &rect, vertical, arrowSize, thumbSize );
             SCROLL_MovingThumb = FALSE;
         }
-        else if (vertical == SCROLL_trackVertical && GetCapture() == hwnd)
+        else if (vertical == tracking_info->vertical && GetCapture() == hwnd)
         {
             SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, thumbPos,
                                  infoPtr->flags, vertical,
-                                 hit_test == SCROLL_trackHitTest && hit_test == SCROLL_TOP_RECT,
-                                 hit_test == SCROLL_trackHitTest && hit_test == SCROLL_BOTTOM_RECT );
+                                 hit_test == tracking_info->hit_test && hit_test == SCROLL_TOP_RECT,
+                                 hit_test == tracking_info->hit_test && hit_test == SCROLL_BOTTOM_RECT );
         }
         else
         {
@@ -645,9 +640,9 @@ void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, enum SCROLL_HITTEST hit
 void SCROLL_DrawNCScrollBar( HWND hwnd, HDC hdc, BOOL draw_horizontal, BOOL draw_vertical )
 {
     if (draw_horizontal)
-        SCROLL_DrawScrollBar( hwnd, hdc, SB_HORZ, SCROLL_trackHitTest, TRUE, TRUE );
+        SCROLL_DrawScrollBar( hwnd, hdc, SB_HORZ, g_tracking_info.hit_test, &g_tracking_info, TRUE, TRUE );
     if (draw_vertical)
-        SCROLL_DrawScrollBar( hwnd, hdc, SB_VERT, SCROLL_trackHitTest, TRUE, TRUE );
+        SCROLL_DrawScrollBar( hwnd, hdc, SB_VERT, g_tracking_info.hit_test, &g_tracking_info, TRUE, TRUE );
 }
 
 /***********************************************************************
@@ -680,7 +675,7 @@ static void SCROLL_RefreshScrollBar( HWND hwnd, INT nBar,
                            DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW) );
     if (!hdc) return;
 
-    SCROLL_DrawScrollBar( hwnd, hdc, nBar, SCROLL_trackHitTest, arrows, interior );
+    SCROLL_DrawScrollBar( hwnd, hdc, nBar, g_tracking_info.hit_test, &g_tracking_info, arrows, interior );
     ReleaseDC( hwnd, hdc );
 }
 
@@ -748,7 +743,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
 
     SCROLLBAR_INFO *infoPtr = SCROLL_GetInternalInfo( hwnd, nBar, FALSE );
     if (!infoPtr) return;
-    if ((SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN))
+    if ((g_tracking_info.hit_test == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN))
 		  return;
 
     if (nBar == SB_CTL && (GetWindowLongW( hwnd, GWL_STYLE ) & (SBS_SIZEGRIP | SBS_SIZEBOX)))
@@ -759,7 +754,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
                 HideCaret(hwnd);  /* hide caret while holding down LBUTTON */
                 SetCapture( hwnd );
                 prevPt = pt;
-                SCROLL_trackHitTest  = hittest = SCROLL_THUMB;
+                g_tracking_info.hit_test = hittest = SCROLL_THUMB;
                 break;
             case WM_MOUSEMOVE:
                 GetClientRect(GetParent(GetParent(hwnd)),&rect);
@@ -767,7 +762,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
                 break;
             case WM_LBUTTONUP:
                 ReleaseCapture();
-                SCROLL_trackHitTest  = hittest = SCROLL_NOWHERE;
+                g_tracking_info.hit_test = hittest = SCROLL_NOWHERE;
                 if (hwnd==GetFocus()) ShowCaret(hwnd);
                 break;
             case WM_SYSTIMER:
@@ -787,8 +782,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
     {
       case WM_LBUTTONDOWN:  /* Initialise mouse tracking */
           HideCaret(hwnd);  /* hide caret while holding down LBUTTON */
-          SCROLL_trackVertical = vertical;
-          SCROLL_trackHitTest  = hittest = SCROLL_HitTest( hwnd, nBar, pt, FALSE );
+          g_tracking_info.vertical = vertical;
+          g_tracking_info.hit_test = hittest = SCROLL_HitTest( hwnd, nBar, pt, FALSE );
           lastClickPos  = vertical ? (pt.y - rect.top) : (pt.x - rect.left);
           lastMousePos  = lastClickPos;
           trackThumbPos = thumbPos;
@@ -821,14 +816,14 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
     TRACE("Event: hwnd=%p bar=%d msg=%s pt=%d,%d hit=%d\n",
           hwnd, nBar, SPY_GetMsgName(msg,hwnd), pt.x, pt.y, hittest );
 
-    switch(SCROLL_trackHitTest)
+    switch (g_tracking_info.hit_test)
     {
     case SCROLL_NOWHERE:  /* No tracking in progress */
         break;
 
     case SCROLL_TOP_ARROW:
-        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, TRUE, FALSE );
-        if (hittest == SCROLL_trackHitTest)
+        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, TRUE, FALSE );
+        if (hittest == g_tracking_info.hit_test)
         {
             if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
             {
@@ -843,8 +838,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
         break;
 
     case SCROLL_TOP_RECT:
-        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, FALSE, TRUE );
-        if (hittest == SCROLL_trackHitTest)
+        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, FALSE, TRUE );
+        if (hittest == g_tracking_info.hit_test)
         {
             if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
             {
@@ -860,21 +855,20 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
     case SCROLL_THUMB:
         if (msg == WM_LBUTTONDOWN)
         {
-            SCROLL_TrackingWin = hwnd;
-            SCROLL_TrackingBar = nBar;
-            SCROLL_TrackingPos = trackThumbPos + lastMousePos - lastClickPos;
-            SCROLL_TrackingVal = SCROLL_GetThumbVal( infoPtr, &rect,
-                                                        vertical,
-                                                        SCROLL_TrackingPos );
-	    if (!SCROLL_MovingThumb)
+            g_tracking_info.win = hwnd;
+            g_tracking_info.bar = nBar;
+            g_tracking_info.thumb_pos = trackThumbPos + lastMousePos - lastClickPos;
+            g_tracking_info.thumb_val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
+                                                            g_tracking_info.thumb_pos );
+            if (!SCROLL_MovingThumb)
             {
                 SCROLL_MovingThumb = TRUE;
-                SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, FALSE, TRUE );
+                SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, FALSE, TRUE );
             }
         }
         else if (msg == WM_LBUTTONUP)
         {
-            SCROLL_DrawScrollBar( hwnd, hdc, nBar, SCROLL_NOWHERE, FALSE, TRUE );
+            SCROLL_DrawScrollBar( hwnd, hdc, nBar, SCROLL_NOWHERE, &g_tracking_info, FALSE, TRUE );
         }
         else  /* WM_MOUSEMOVE */
         {
@@ -889,22 +883,21 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
             if ( (pos != lastMousePos) || (!SCROLL_MovingThumb) )
             {
                 lastMousePos = pos;
-                SCROLL_TrackingPos = trackThumbPos + pos - lastClickPos;
-                SCROLL_TrackingVal = SCROLL_GetThumbVal( infoPtr, &rect,
-                                                         vertical,
-                                                         SCROLL_TrackingPos );
+                g_tracking_info.thumb_pos = trackThumbPos + pos - lastClickPos;
+                g_tracking_info.thumb_val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
+                                                                g_tracking_info.thumb_pos );
                 SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                                MAKEWPARAM( SB_THUMBTRACK, SCROLL_TrackingVal),
-                                (LPARAM)hwndCtl );
+                              MAKEWPARAM( SB_THUMBTRACK, g_tracking_info.thumb_val ),
+                              (LPARAM)hwndCtl );
                 SCROLL_MovingThumb = TRUE;
-                SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, FALSE, TRUE );
+                SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, FALSE, TRUE );
             }
         }
         break;
 
     case SCROLL_BOTTOM_RECT:
-        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, FALSE, TRUE );
-        if (hittest == SCROLL_trackHitTest)
+        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, FALSE, TRUE );
+        if (hittest == g_tracking_info.hit_test)
         {
             if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
             {
@@ -918,8 +911,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
         break;
 
     case SCROLL_BOTTOM_ARROW:
-        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, TRUE, FALSE );
-        if (hittest == SCROLL_trackHitTest)
+        SCROLL_DrawScrollBar( hwnd, hdc, nBar, hittest, &g_tracking_info, TRUE, FALSE );
+        if (hittest == g_tracking_info.hit_test)
         {
             if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
             {
@@ -948,8 +941,8 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
 
     if (msg == WM_LBUTTONUP)
     {
-	hittest = SCROLL_trackHitTest;
-	SCROLL_trackHitTest = SCROLL_NOWHERE;  /* Terminate tracking */
+        hittest = g_tracking_info.hit_test;
+        g_tracking_info.hit_test = SCROLL_NOWHERE; /* Terminate tracking */
 
         if (hittest == SCROLL_THUMB)
         {
@@ -963,7 +956,7 @@ static void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
                           SB_ENDSCROLL, (LPARAM)hwndCtl );
 
         /* Terminate tracking */
-        SCROLL_TrackingWin = 0;
+        g_tracking_info.win = 0;
         SCROLL_MovingThumb = FALSE;
     }
 
@@ -1115,7 +1108,7 @@ static BOOL SCROLL_GetScrollInfo(HWND hwnd, INT nBar, LPSCROLLINFO info)
     if (info->fMask & SIF_PAGE) info->nPage = infoPtr->page;
     if (info->fMask & SIF_POS) info->nPos = infoPtr->curVal;
     if ((info->fMask & SIF_TRACKPOS) && (info->cbSize == sizeof(*info)))
-        info->nTrackPos = (SCROLL_TrackingWin == WIN_GetFullHandle(hwnd)) ? SCROLL_TrackingVal : infoPtr->curVal;
+        info->nTrackPos = (g_tracking_info.win == WIN_GetFullHandle(hwnd)) ? g_tracking_info.thumb_val : infoPtr->curVal;
     if (info->fMask & SIF_RANGE)
     {
         info->nMin = infoPtr->minVal;
@@ -1190,12 +1183,12 @@ static BOOL SCROLL_GetScrollBarInfo(HWND hwnd, LONG idObject, LPSCROLLBARINFO in
     }
     if (nBar == SB_CTL && !IsWindowEnabled(hwnd))
         info->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE;
-    
-    pressed = ((nBar == SB_VERT) == SCROLL_trackVertical && GetCapture() == hwnd);
-    
+
+    pressed = ((nBar == SB_VERT) == g_tracking_info.vertical && GetCapture() == hwnd);
+
     /* Top/left arrow button state. MSDN says top/right, but I don't believe it */
     info->rgstate[1] = 0;
-    if (pressed && SCROLL_trackHitTest == SCROLL_TOP_ARROW)
+    if (pressed && g_tracking_info.hit_test == SCROLL_TOP_ARROW)
         info->rgstate[1] |= STATE_SYSTEM_PRESSED;
     if (infoPtr->flags & ESB_DISABLE_LTUP)
         info->rgstate[1] |= STATE_SYSTEM_UNAVAILABLE;
@@ -1204,24 +1197,24 @@ static BOOL SCROLL_GetScrollBarInfo(HWND hwnd, LONG idObject, LPSCROLLBARINFO in
     info->rgstate[2] = 0;
     if (infoPtr->curVal == infoPtr->minVal)
         info->rgstate[2] |= STATE_SYSTEM_INVISIBLE;
-    if (pressed && SCROLL_trackHitTest == SCROLL_TOP_RECT)
+    if (pressed && g_tracking_info.hit_test == SCROLL_TOP_RECT)
         info->rgstate[2] |= STATE_SYSTEM_PRESSED;
 
     /* Thumb state */
     info->rgstate[3] = 0;
-    if (pressed && SCROLL_trackHitTest == SCROLL_THUMB)
+    if (pressed && g_tracking_info.hit_test == SCROLL_THUMB)
         info->rgstate[3] |= STATE_SYSTEM_PRESSED;
 
     /* Page down/right region state. MSDN says down/left, but I don't believe it */
     info->rgstate[4] = 0;
     if (infoPtr->curVal >= infoPtr->maxVal - 1)
         info->rgstate[4] |= STATE_SYSTEM_INVISIBLE;
-    if (pressed && SCROLL_trackHitTest == SCROLL_BOTTOM_RECT)
+    if (pressed && g_tracking_info.hit_test == SCROLL_BOTTOM_RECT)
         info->rgstate[4] |= STATE_SYSTEM_PRESSED;
     
     /* Bottom/right arrow button state. MSDN says bottom/left, but I don't believe it */
     info->rgstate[5] = 0;
-    if (pressed && SCROLL_trackHitTest == SCROLL_BOTTOM_ARROW)
+    if (pressed && g_tracking_info.hit_test == SCROLL_BOTTOM_ARROW)
         info->rgstate[5] |= STATE_SYSTEM_PRESSED;
     if (infoPtr->flags & ESB_DISABLE_RTDN)
         info->rgstate[5] |= STATE_SYSTEM_UNAVAILABLE;
@@ -1418,7 +1411,7 @@ LRESULT ScrollBarWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM
                 FillRect( hdc, &rc, GetSysColorBrush(COLOR_SCROLLBAR) );
             }
             else
-                SCROLL_DrawScrollBar( hwnd, hdc, SB_CTL, SCROLL_trackHitTest, TRUE, TRUE );
+                SCROLL_DrawScrollBar( hwnd, hdc, SB_CTL, g_tracking_info.hit_test, &g_tracking_info, TRUE, TRUE );
             if (!wParam) EndPaint(hwnd, &ps);
         }
         break;
-- 
2.30.2




More information about the wine-devel mailing list