Scroll cleanup part 3

Andrew M. Johnston johnstonam at logica.com
Tue Oct 8 05:51:21 CDT 2002


Changelog:
    scrollbar.c - group the window 31 arrows

The patch was developed without CVS access use patch -p1 from within
the top level wine directory to apply

Licence: X11

Andrew.

--- wine-20020904/controls/scroll.c	Tue Oct  8 18:06:20 2002
+++ wine/controls/scroll.c	Tue Oct  8 18:44:06 2002
@@ -44,52 +44,46 @@
 	UINT flags;            /* EnableScrollBar flags */
 } SCROLLBAR_INFO, *LPSCROLLBAR_INFO;
 
+
+/*********************************************************************
+ * 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 */
+
+#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) \
 	((info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) || \
 	((info->cbSize != sizeof(*info)) && \
 	(info->cbSize != sizeof(*info) - sizeof(info->nTrackPos))))
 
-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
-
   /* 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
+/*********************************************************************
+ * 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 timer id */
-#define SCROLL_TIMER   0
 
   /* Scroll-bar hit testing */
 enum SCROLL_HITTEST
@@ -146,21 +140,31 @@
 
 /***********************************************************************
  *           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 draw
  */
 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));
 }
 
 
@@ -471,11 +475,10 @@
 				  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));
 
-    if (!hUpArrow) SCROLL_LoadBitmaps();
+    if (!hUp.normal) SCROLL_LoadBitmaps();
     SetStretchBltMode( hdc, STRETCH_DELETESCANS );
     StretchBlt( hdc, rect->left, rect->top,
                   vertical ? rect->right-rect->left : arrowSize,
@@ -484,9 +487,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