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