Clean-up of scroll.c (3/4)

Andrew M. Johnston johnstonam at logica.com
Thu Feb 27 02:07:21 CST 2003


Hi,

More cleanup laying the foundation of unifiying all the drawing code (thumb 
moving with non moving and win31 with win9x) so that there is a single 
drawing routine

Changelog:
    scrollbar.c - group the window 31 arrows

Use patch -p1 from within the top level wine directory to apply

Licence: X11

Andrew.--- wine-20030219/controls/scroll.c	2003-02-27 14:29:38.000000000 +0800
+++ wine/controls/scroll.c	2003-02-27 14:21:46.000000000 +0800
@@ -30,6 +30,11 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(scroll);
 
+/*********************************************************************
+ * scrollbar state
+ * 
+ *  Lives as long as the scroll bar
+ */
 typedef struct
 {
     INT   curVal;   /* Current scroll-bar value */
@@ -40,46 +45,29 @@
 } SCROLLBAR_INFO, *LPSCROLLBAR_INFO;
 
 
-static HBITMAP hUpArrow;
-static HBITMAP hDnArrow;
-static HBITMAP hLfArrow;
-static HBITMAP hRgArrow;
-static HBITMAP hUpArrowD;
-static HBITMAP hDnArrowD;
-static HBITMAP hLfArrowD;
-static HBITMAP hRgArrowD;
-static HBITMAP hUpArrowI;
-static HBITMAP hDnArrowI;
-static HBITMAP hLfArrowI;
-static HBITMAP hRgArrowI;
-
-#define TOP_ARROW(flags,pressed) \
-   (((flags)&ESB_DISABLE_UP) ? hUpArrowI : ((pressed) ? hUpArrowD:hUpArrow))
-#define BOTTOM_ARROW(flags,pressed) \
-   (((flags)&ESB_DISABLE_DOWN) ? hDnArrowI : ((pressed) ? 
hDnArrowD:hDnArrow))
-#define LEFT_ARROW(flags,pressed) \
-   (((flags)&ESB_DISABLE_LEFT) ? hLfArrowI : ((pressed) ? 
hLfArrowD:hLfArrow))
-#define RIGHT_ARROW(flags,pressed) \
-   (((flags)&ESB_DISABLE_RIGHT) ? hRgArrowI : ((pressed) ? 
hRgArrowD:hRgArrow))
-
-
-  /* Minimum size of the rectangle between the arrows */
-#define SCROLL_MIN_RECT  4
-
-  /* Minimum size of the thumb in pixels */
-#define SCROLL_MIN_THUMB 6
+/*********************************************************************
+ * scrollbar arrow states
+ * 
+ *  Used in 3.1 mode for arrow images
+ */
+typedef struct
+{
+    HBITMAP normal;        /* arrow for normal state (unpressed) */
+    HBITMAP pressed;       /* arrow for pressed state */
+    HBITMAP disabled;      /* arrow for disabled state */
+} SCROLL_ARROWS, *LPSCROLL_ARROWS;
+
+#define SCROLL_MIN_RECT       4    /* Minimum size of rectangle between 
arrows */
+#define SCROLL_MIN_THUMB      6    /* Minimum size of the thumb in pixels */
+#define SCROLL_FIRST_DELAY  200    /* Delay (in ms) before first repetition 
*/
+#define SCROLL_REPEAT_DELAY  50    /* Delay (in ms) between scroll 
repetitions */
+#define SCROLL_TIMER          0    /* Scroll timer id */
 
   /* Overlap between arrows and thumb */
 #define SCROLL_ARROW_THUMB_OVERLAP ((TWEAK_WineLook == WIN31_LOOK) ? 1 : 0)
 
-  /* Delay (in ms) before first repetition when holding the button down */
-#define SCROLL_FIRST_DELAY   200
-
-  /* Delay (in ms) between scroll repetitions */
-#define SCROLL_REPEAT_DELAY  50
-
-  /* Scroll timer id */
-#define SCROLL_TIMER   0
+#define GET_ARROW(arrow, inactive, press) \
+    ((inactive) ? (arrow)->disabled : ((press) ? (arrow)->pressed: 
(arrow)->normal))
 
 /* Determine if the info is valid */
 #define SCROLL_INFO_INVALID(info) \
@@ -87,6 +75,15 @@
     ((info->cbSize != sizeof(*info)) && \
     (info->cbSize != sizeof(*info) - sizeof(info->nTrackPos))))
 
+
+/*********************************************************************
+ * scrollbar arrow collections (used by Win 31 only)
+ */
+static SCROLL_ARROWS hUp;    /* Arrow images for up arrow */
+static SCROLL_ARROWS hDown;  /* Arrow images for down arrow */
+static SCROLL_ARROWS hLeft;  /* Arrow images for left arrow */
+static SCROLL_ARROWS hRight; /* Arrow images for right arrow */
+
   /* Scroll-bar hit testing */
 enum SCROLL_HITTEST
 {
@@ -142,28 +139,45 @@
 
 /***********************************************************************
  *           SCROLL_LoadBitmaps
+ *
+ * Setup the arrow collections.
+ *
+ * NOTE:
+ *   Should be called in a libary set up phase rather than SCROLL_DrawArrow
+ *   Also if the OEM numbers follow a matmatical pattern it can be made 
neater
+ *   Currently called once in Win31 emulating if a scroll bar arrow is drawn
  */
 static void SCROLL_LoadBitmaps(void)
 {
-    hUpArrow  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_UPARROW) );
-    hDnArrow  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_DNARROW) );
-    hLfArrow  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_LFARROW) );
-    hRgArrow  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_RGARROW) );
-    hUpArrowD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_UPARROWD) );
-    hDnArrowD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_DNARROWD) );
-    hLfArrowD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_LFARROWD) );
-    hRgArrowD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_RGARROWD) );
-    hUpArrowI = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_UPARROWI) );
-    hDnArrowI = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_DNARROWI) );
-    hLfArrowI = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_LFARROWI) );
-    hRgArrowI = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_RGARROWI) );
+    hUp.normal      = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_UPARROW));
+    hUp.pressed     = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_UPARROWD));
+    hUp.disabled    = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_UPARROWI));
+
+    hDown.normal    = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_DNARROW));
+    hDown.pressed   = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_DNARROWD));
+    hDown.disabled  = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_DNARROWI));
+
+    hLeft.normal    = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_LFARROW));
+    hLeft.pressed   = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_LFARROWD));
+    hLeft.disabled  = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_LFARROWI));
+
+    hRight.normal   = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_RGARROW));
+    hRight.pressed  = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_RGARROWD));
+    hRight.disabled = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_RGARROWI));
 }
 
 
 /***********************************************************************
  *           SCROLL_GetScrollInfo
+ *
+ * Get the scoll info structure for the scroll bar
+ * 
+ * RETURNS
+ *  Scroll info pointer
  */
-static SCROLLBAR_INFO *SCROLL_GetScrollInfo( HWND hwnd, INT nBar )
+LPSCROLLBAR_INFO SCROLL_GetScrollInfo(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */,
+INT nBar /* [in] One of SB_HORZ, SB_VERT, SB_BOTH or SB_CTL */)
 {
     SCROLLBAR_INFO *infoPtr;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
@@ -189,7 +203,7 @@
             if (nBar == SB_HORZ) wndPtr->pHScroll = infoPtr;
             else wndPtr->pVScroll = infoPtr;
         }
-        if (!hUpArrow) SCROLL_LoadBitmaps();
+        if (!hUp.normal) SCROLL_LoadBitmaps();
     }
     WIN_ReleaseWndPtr( wndPtr );
     return infoPtr;
@@ -453,9 +467,8 @@
 				  BOOL top_pressed, BOOL bottom_pressed )
 {
     HDC hdcMem = CreateCompatibleDC( hdc );
-    HBITMAP hbmpPrev = SelectObject( hdcMem, vertical ?
-                                    TOP_ARROW(infoPtr->flags, top_pressed)
-                                    : LEFT_ARROW(infoPtr->flags, 
top_pressed));
+    HBITMAP hbmpPrev = SelectObject( hdcMem, GET_ARROW(vertical ? &hUp : 
&hLeft,
+        infoPtr->flags & ESB_DISABLE_UP, top_pressed));
 
     SetStretchBltMode( hdc, STRETCH_DELETESCANS );
     StretchBlt( hdc, rect->left, rect->top,
@@ -465,9 +478,9 @@
                   
GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL),
                   SRCCOPY );
 
-    SelectObject( hdcMem, vertical ?
-                    BOTTOM_ARROW( infoPtr->flags, bottom_pressed )
-                    : RIGHT_ARROW( infoPtr->flags, bottom_pressed ) );
+    SelectObject( hdcMem, GET_ARROW(vertical ? &hDown : &hRight,
+        infoPtr->flags & ESB_DISABLE_DOWN, bottom_pressed));
+
     if (vertical)
         StretchBlt( hdc, rect->left, rect->bottom - arrowSize,
                       rect->right - rect->left, arrowSize,




More information about the wine-patches mailing list