Win9x look & feel on scrollbars.

diff --git a/controls/scroll.c b/controls/scroll.c
index f8731e4..c162b68 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -46,7 +46,7 @@
 #define SCROLL_MIN_THUMB 6
 
   /* Overlap between arrows and thumb */
-#define SCROLL_ARROW_THUMB_OVERLAP 1
+#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
@@ -91,6 +91,12 @@
 				    BOOL fShowH, BOOL fShowV );
 static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, 
 				   const SCROLLINFO *info, INT *action );
+static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar, 
+				    RECT *rect, INT arrowSize,
+				    INT thumbSize, INT thumbPos,
+				    UINT flags, BOOL vertical,
+				    BOOL top_selected, BOOL bottom_selected );
+
 
 /***********************************************************************
  *           SCROLL_LoadBitmaps
@@ -377,21 +383,48 @@
  *
  * Draw the scroll bar arrows.
  */
-static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr,
-                               RECT *rect, INT arrowSize, BOOL vertical,
-                               BOOL top_pressed, BOOL bottom_pressed )
+static void SCROLL_DrawArrows_9x( HDC hdc, SCROLLBAR_INFO *infoPtr,
+                                  RECT *rect, INT arrowSize, BOOL vertical,
+                                  BOOL top_pressed, BOOL bottom_pressed )
+{
+  RECT r;
+
+  r = *rect;
+  if( vertical )
+    r.bottom = r.top + arrowSize;
+  else
+    r.right = r.left + arrowSize;
+
+  DrawFrameControl( hdc, &r, DFC_SCROLL,
+		    (vertical ? DFCS_SCROLLUP : DFCS_SCROLLLEFT)
+		    | (top_pressed ? (DFCS_PUSHED | DFCS_FLAT) : 0 )
+		    | (infoPtr->flags&ESB_DISABLE_LTUP ? DFCS_INACTIVE : 0 ) );
+
+  r = *rect;
+  if( vertical )
+    r.top = r.bottom-arrowSize;
+  else
+    r.left = r.right-arrowSize;
+
+  DrawFrameControl( hdc, &r, DFC_SCROLL,
+		    (vertical ? DFCS_SCROLLDOWN : DFCS_SCROLLRIGHT)
+		    | (bottom_pressed ? (DFCS_PUSHED | DFCS_FLAT) : 0 )
+		    | (infoPtr->flags&ESB_DISABLE_RTDN ? DFCS_INACTIVE : 0) );
+}
+
+static void SCROLL_DrawArrows_31( HDC hdc, SCROLLBAR_INFO *infoPtr,
+				  RECT *rect, INT arrowSize, BOOL vertical,
+				  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));
-    INT offset = (TWEAK_WineLook > WIN31_LOOK) ? 1 : 0;
 
-    if (offset) arrowSize--;
     SetStretchBltMode( hdc, STRETCH_DELETESCANS );
-    StretchBlt( hdc, rect->left+offset, rect->top+offset,
-                  vertical ? rect->right-(rect->left+offset) : arrowSize,
-                  vertical ? arrowSize : rect->bottom-(rect->top+offset),
+    StretchBlt( hdc, rect->left, rect->top,
+                  vertical ? rect->right-rect->left : arrowSize,
+                  vertical ? arrowSize : rect->bottom-rect->top,
                   hdcMem, 0, 0,
                   GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL),
                   SRCCOPY );
@@ -400,14 +433,14 @@
                     BOTTOM_ARROW( infoPtr->flags, bottom_pressed )
                     : RIGHT_ARROW( infoPtr->flags, bottom_pressed ) );
     if (vertical)
-        StretchBlt( hdc, (rect->left+offset), rect->bottom - arrowSize,
-                      rect->right - (rect->left+offset), arrowSize,
+        StretchBlt( hdc, rect->left, rect->bottom - arrowSize,
+                      rect->right - rect->left, arrowSize,
                       hdcMem, 0, 0,
                       GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL),
                       SRCCOPY );
     else
-        StretchBlt( hdc, rect->right - arrowSize, rect->top+offset,
-                      arrowSize, rect->bottom - (rect->top+offset),
+        StretchBlt( hdc, rect->right - arrowSize, rect->top,
+                      arrowSize, rect->bottom - rect->top,
                       hdcMem, 0, 0,
                       GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL),
                       SRCCOPY );
@@ -415,14 +448,26 @@
     DeleteDC( hdcMem );
 }
 
+static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr,
+			       RECT *rect, INT arrowSize, BOOL vertical,
+			       BOOL top_pressed, BOOL bottom_pressed )
+{
+  if( TWEAK_WineLook == WIN31_LOOK )
+    SCROLL_DrawArrows_31( hdc, infoPtr, rect, arrowSize,
+			  vertical, top_pressed,bottom_pressed );
+  else
+    SCROLL_DrawArrows_9x( hdc, infoPtr, rect, arrowSize,
+			  vertical, top_pressed,bottom_pressed );
+}
+
 
 /***********************************************************************
  *           SCROLL_DrawMovingThumb
  *
  * Draw the moving thumb rectangle.
  */
-static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical,
-                                    INT arrowSize, INT thumbSize )
+static void SCROLL_DrawMovingThumb_31( HDC hdc, RECT *rect, BOOL vertical,
+				       INT arrowSize, INT thumbSize )
 {
     RECT r = *rect;
     if (vertical)
@@ -447,16 +492,139 @@
 	                                                          - thumbSize;
         r.right = r.left + thumbSize;
     }
+
     DrawFocusRect( hdc, &r );
     SCROLL_MovingThumb = !SCROLL_MovingThumb;
 }
 
+static void SCROLL_DrawMovingThumb_9x( HDC hdc, RECT *rect, BOOL vertical,
+				       INT arrowSize, INT thumbSize )
+{
+  INT pos = SCROLL_TrackingPos;
+  INT max_size;
+
+  if( vertical )
+    max_size = rect->bottom - rect->top;
+  else
+    max_size = rect->right - rect->left;
+
+  max_size -= (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) + thumbSize;
+
+  if( pos < (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) )
+    pos = (arrowSize-SCROLL_ARROW_THUMB_OVERLAP);
+  else if( pos > max_size )
+    pos = max_size;
+
+  SCROLL_DrawInterior_9x( SCROLL_TrackingWin, hdc, SCROLL_TrackingBar,
+			  rect, arrowSize, thumbSize, pos,
+			  0, vertical, FALSE, FALSE );
+			  
+  SCROLL_MovingThumb = !SCROLL_MovingThumb;
+}
+
+static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical,
+				    INT arrowSize, INT thumbSize )
+{
+  if( TWEAK_WineLook == WIN31_LOOK )
+    SCROLL_DrawMovingThumb_31( hdc, rect, vertical, arrowSize, thumbSize );
+  else
+    SCROLL_DrawMovingThumb_9x( hdc, rect, vertical, arrowSize, thumbSize );
+}
 
 /***********************************************************************
  *           SCROLL_DrawInterior
  *
  * Draw the scroll bar interior (everything except the arrows).
  */
+static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar, 
+				    RECT *rect, INT arrowSize,
+				    INT thumbSize, INT thumbPos,
+				    UINT flags, BOOL vertical,
+				    BOOL top_selected, BOOL bottom_selected )
+{
+    RECT r;
+    HPEN hSavePen;
+    HBRUSH hSaveBrush,hBrush;
+
+    /* Only scrollbar controls send WM_CTLCOLORSCROLLBAR.
+     * The window-owned scrollbars need to call DEFWND_ControlColor
+     * to correctly setup default scrollbar colors
+     */
+    if (nBar == SB_CTL)
+    {  
+      hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
+				     (WPARAM)hdc,(LPARAM)hwnd);
+    }
+    else
+    {
+      hBrush = DEFWND_ControlColor( hdc, CTLCOLOR_SCROLLBAR );
+    }
+
+    hSavePen = SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );
+    hSaveBrush = SelectObject( hdc, hBrush );
+
+    /* Calculate the scroll rectangle */
+    r = *rect;
+    if (vertical)
+    {
+        r.top    += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
+        r.bottom -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
+    }
+    else
+    {
+        r.left  += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
+        r.right -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
+    }
+
+    /* Draw the scroll rectangles and thumb */
+    if (!thumbPos)  /* No thumb to draw */
+    {
+        PatBlt( hdc, r.left, r.top,
+                     r.right - r.left, r.bottom - r.top,
+                     PATCOPY );
+
+        /* cleanup and return */
+        SelectObject( hdc, hSavePen );
+        SelectObject( hdc, hSaveBrush );
+        return;
+    }
+
+    if (vertical)
+    {
+        PatBlt( hdc, r.left, r.top,
+                  r.right - r.left,
+                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
+                  top_selected ? 0x0f0000 : PATCOPY );
+        r.top += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
+        PatBlt( hdc, r.left, r.top + thumbSize,
+                  r.right - r.left,
+                  r.bottom - r.top - thumbSize,
+                  bottom_selected ? 0x0f0000 : PATCOPY );
+        r.bottom = r.top + thumbSize;
+    }
+    else  /* horizontal */
+    {
+        PatBlt( hdc, r.left, r.top,
+                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
+                  r.bottom - r.top,
+                  top_selected ? 0x0f0000 : PATCOPY );
+        r.left += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
+        PatBlt( hdc, r.left + thumbSize, r.top,
+                  r.right - r.left - thumbSize,
+                  r.bottom - r.top,
+                  bottom_selected ? 0x0f0000 : PATCOPY );
+        r.right = r.left + thumbSize;
+    }
+
+    /* Draw the thumb */
+    DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT | BF_MIDDLE  );
+
+    /* cleanup */
+    SelectObject( hdc, hSavePen );
+    SelectObject( hdc, hSaveBrush );
+}
+
+
 static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar, 
                                  RECT *rect, INT arrowSize,
                                  INT thumbSize, INT thumbPos,
@@ -475,7 +643,7 @@
 
       /* Select the correct brush and pen */
 
-    if ((flags & ESB_DISABLE_BOTH) == ESB_DISABLE_BOTH)
+    if (TWEAK_WineLook == WIN31_LOOK && (flags & ESB_DISABLE_BOTH) == ESB_DISABLE_BOTH)
     {
         /* This ought to be the color of the parent window */
         if (TWEAK_WineLook == WIN31_LOOK) {
@@ -529,8 +697,11 @@
 
     if (!thumbPos)  /* No thumb to draw */
     {
-        PatBlt( hdc, r.left+1, r.top+1, r.right - r.left - 2,
-                  r.bottom - r.top - 2, PATCOPY );
+        INT offset = (TWEAK_WineLook > WIN31_LOOK) ? 0 : 1;
+
+        PatBlt( hdc, r.left+offset, r.top+offset,
+                     r.right - r.left - 2*offset, r.bottom - r.top - 2*offset,
+                     PATCOPY );
 
         /* cleanup and return */
         SelectObject( hdc, hSavePen );
@@ -540,27 +711,31 @@
 
     if (vertical)
     {
-        PatBlt( hdc, r.left + 1, r.top + 1,
-                  r.right - r.left - 2,
-                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - 1,
+        INT offset = (TWEAK_WineLook == WIN31_LOOK) ? 1 : 0;
+
+        PatBlt( hdc, r.left + offset, r.top + offset,
+                  r.right - r.left - offset*2,
+                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - offset,
                   top_selected ? 0x0f0000 : PATCOPY );
         r.top += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
-        PatBlt( hdc, r.left + 1, r.top + thumbSize,
-                  r.right - r.left - 2,
-                  r.bottom - r.top - thumbSize - 1,
+        PatBlt( hdc, r.left + offset, r.top + thumbSize,
+                  r.right - r.left - offset*2,
+                  r.bottom - r.top - thumbSize - offset,
                   bottom_selected ? 0x0f0000 : PATCOPY );
         r.bottom = r.top + thumbSize;
     }
     else  /* horizontal */
     {
-        PatBlt( hdc, r.left + 1, r.top + 1,
-                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - 1,
-                  r.bottom - r.top - 2,
+        INT offset = (TWEAK_WineLook == WIN31_LOOK) ? 1 : 0;
+
+        PatBlt( hdc, r.left + offset, r.top + offset,
+                  thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
+                  r.bottom - r.top - offset*2,
                   top_selected ? 0x0f0000 : PATCOPY );
         r.left += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
-        PatBlt( hdc, r.left + thumbSize, r.top + 1,
-                  r.right - r.left - thumbSize - 1,
-                  r.bottom - r.top - 2,
+        PatBlt( hdc, r.left + thumbSize, r.top + offset,
+                  r.right - r.left - thumbSize - offset,
+                  r.bottom - r.top - offset*2,
                   bottom_selected ? 0x0f0000 : PATCOPY );
         r.right = r.left + thumbSize;
     }
@@ -575,9 +750,7 @@
     }
     else
     {
-	r.top++, r.left++;
-	r.bottom--; r.right--;
-	Rectangle( hdc, r.left, r.top, r.right-1, r.bottom-1 );
+	Rectangle( hdc, r.left+1, r.top+1, r.right-1, r.bottom-1 );
     }
     DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT );
 
@@ -778,10 +951,11 @@
             {
                 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                                 SB_LINEUP, hwndCtl );
-                SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
-                                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
-                                  (TIMERPROC)0 );
-            }
+	    }
+             
+	    SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
+			    SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
+			    (TIMERPROC)0 );
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
         break;
@@ -879,10 +1053,11 @@
             {
                 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                                 SB_LINEDOWN, hwndCtl );
-                SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
-                                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
-                                  (TIMERPROC)0 );
-            }
+	    }
+
+	    SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
+			    SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
+			    (TIMERPROC)0 );
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
         break;