diff lwlib/xlwscrollbar.c @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents 441bb1e64a06
children c0c698873ce1
line wrap: on
line diff
--- a/lwlib/xlwscrollbar.c	Mon Aug 13 09:00:04 2007 +0200
+++ b/lwlib/xlwscrollbar.c	Mon Aug 13 09:02:59 2007 +0200
@@ -1,6 +1,5 @@
 /* Implements a lightweight scrollbar widget.  
    Copyright (C) 1992, 1993, 1994 Lucid, Inc.
-   Copyright (C) 1997 Sun Microsystems, Inc.
 
 This file is part of the Lucid Widget Library.
 
@@ -15,12 +14,11 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with XEmacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Created by Douglas Keller <dkeller@vnet.ibm.com> */
-/* Lots of hacking by Martin Buchholz */
+/* Last changed 03/24/95 */
 
 /*
  * Athena-style scrollbar button bindings added on Sun Dec 24 22:03:57 1995
@@ -63,7 +61,7 @@
  *     XmNtoBottomCallback
  *     XmNdragCallback
  *
- *     XmNsliderStyle    - values can be: "plain" or "dimple"
+ *     XmNknobStyle      - values can be: "plain" or "dimple"
  *     XmNarrowPosition  - values can be: "opposite" or "same"
  *
  */
@@ -82,122 +80,142 @@
 #define DBUG(x)
 
 #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
-		  ? ((unsigned long) (x)) : ((unsigned long) (y)))
+		   ? ((unsigned long) (x)) : ((unsigned long) (y)))
 
-#define VERT(w) ((w)->sb.orientation == XmVERTICAL)
+#define VERT(w) (w->sb.orientation == XmVERTICAL)
 
 #define SS_MIN 8
 
-typedef enum
-{
-  BUTTON_NONE,
-  BUTTON_SLIDER,
-  BUTTON_UP_ARROW,
-  BUTTON_DOWN_ARROW,
-  BUTTON_TROUGH_ABOVE,
-  BUTTON_TROUGH_BELOW
-} button_where;
+#define ARROW_UP    0
+#define ARROW_DOWN  1
+#define ARROW_LEFT  2
+#define ARROW_RIGHT 3
+
+#define ARM_NONE   0
+#define ARM_KNOB   1
+#define ARM_UP     2
+#define ARM_DOWN   3
+#define ARM_PAGEUP 4
+#define ARM_PAGEDOWN 5
 
-typedef enum
-{
-  SLIDER_PLAIN,
-  SLIDER_DIMPLE
-} SliderStyle;
+#define BUTTON_NONE         0
+#define BUTTON_KNOB         1
+#define BUTTON_UP_ARROW     2
+#define BUTTON_DOWN_ARROW   3
+#define BUTTON_TROUGH_ABOVE 4
+#define BUTTON_TROUGH_BELOW 5
 
-/*-------------------------- Resources ----------------------------------*/
+#define KNOB_PLAIN  0
+#define KNOB_DIMPLE 1
+
+/************************************************************************
+**
+** Resources
+**
+*/
 #define offset(field) XtOffset(XlwScrollBarWidget, field)
 
 static XtResource resources[] = {
-    { XmNforeground, XmCForeground, XtRPixel, sizeof(Pixel),
+    { (String) XmNforeground, (String) XmCForeground, XtRPixel, sizeof(Pixel),
       offset(sb.foreground), XtRImmediate, (XtPointer) XtDefaultForeground },
 
-    { XmNtopShadowColor, XmCTopShadowColor, XtRPixel,
+    { (String) XmNtopShadowColor, (String) XmCTopShadowColor, XtRPixel,
       sizeof(Pixel), offset(sb.topShadowColor), XtRImmediate, (XtPointer) ~0 },
-    { XmNbottomShadowColor, XmCBottomShadowColor, XtRPixel,
+    { (String) XmNbottomShadowColor, (String) XmCBottomShadowColor, XtRPixel,
       sizeof(Pixel), offset(sb.bottomShadowColor), XtRImmediate,
       (XtPointer)~0 },
 
-    { XmNtopShadowPixmap, XmCTopShadowPixmap, XtRPixmap,
+    { (String) XmNtopShadowPixmap, (String) XmCTopShadowPixmap, XtRPixmap,
       sizeof (Pixmap), offset(sb.topShadowPixmap), XtRImmediate,
       (XtPointer)None},
-    { XmNbottomShadowPixmap, XmCBottomShadowPixmap,
+    { (String) XmNbottomShadowPixmap, (String) XmCBottomShadowPixmap,
       XtRPixmap, sizeof (Pixmap), offset(sb.bottomShadowPixmap),
       XtRImmediate, (XtPointer)None},
 
-    { XmNtroughColor, XmCTroughColor, XtRPixel, sizeof(Pixel),
+    { (String)XmNtroughColor, (String)XmCTroughColor, XtRPixel, sizeof(Pixel),
       offset(sb.troughColor), XtRImmediate, (XtPointer)~0 },
 
-    { XmNshadowThickness, XmCShadowThickness, XtRInt,
+    { (String)XmNshadowThickness, (String)XmCShadowThickness, XtRInt,
       sizeof(int), offset(sb.shadowThickness), XtRImmediate, (XtPointer)2 },
 
-    { XmNborderWidth, XmCBorderWidth, XtRDimension,
+    { (String) XmNborderWidth, (String) XmCBorderWidth, XtRDimension,
       sizeof(Dimension), offset(core.border_width), XtRImmediate,
       (XtPointer)0 },
 
-    { XmNshowArrows, XmCShowArrows, XtRBoolean,
+    { (String) XmNshowArrows, (String) XmCShowArrows, XtRBoolean,
       sizeof(Boolean), offset(sb.showArrows), XtRImmediate, (XtPointer)True },
 
-    { XmNinitialDelay, XmCInitialDelay, XtRInt, sizeof(int),
+    { (String) XmNinitialDelay, (String) XmCInitialDelay, XtRInt, sizeof(int),
       offset(sb.initialDelay), XtRImmediate, (XtPointer) 250 },
-    { XmNrepeatDelay, XmCRepeatDelay, XtRInt, sizeof(int),
+    { (String) XmNrepeatDelay, (String) XmCRepeatDelay, XtRInt, sizeof(int),
       offset(sb.repeatDelay), XtRImmediate, (XtPointer) 50 },
 
-    { XmNorientation, XmCOrientation, XtROrientation,
+    { (String) XmNorientation, (String) XmCOrientation, XtROrientation,
       sizeof(unsigned char), offset(sb.orientation), XtRImmediate,
       (XtPointer) XmVERTICAL },
 
-    { XmNminimum, XmCMinimum, XtRInt, sizeof(int),
+    { (String) XmNminimum, (String) XmCMinimum, XtRInt, sizeof(int),
       offset(sb.minimum), XtRImmediate, (XtPointer) 0},
-    { XmNmaximum, XmCMaximum, XtRInt, sizeof(int),
+    { (String) XmNmaximum, (String) XmCMaximum, XtRInt, sizeof(int),
       offset(sb.maximum), XtRImmediate, (XtPointer) 100},
-    { XmNvalue, XmCValue, XtRInt, sizeof(int),
+    { (String) XmNvalue, (String) XmCValue, XtRInt, sizeof(int),
       offset(sb.value), XtRImmediate, (XtPointer) 0},
-    { XmNsliderSize, XmCSliderSize, XtRInt, sizeof(int),
+    { (String) XmNsliderSize, (String) XmCSliderSize, XtRInt, sizeof(int),
       offset(sb.sliderSize), XtRImmediate, (XtPointer) 10},
-    { XmNincrement, XmCIncrement, XtRInt, sizeof(int),
+    { (String) XmNincrement, (String) XmCIncrement, XtRInt, sizeof(int),
       offset(sb.increment), XtRImmediate, (XtPointer) 1},
-    { XmNpageIncrement, XmCPageIncrement, XtRInt, sizeof(int),
+    { (String)XmNpageIncrement, (String)XmCPageIncrement, XtRInt, sizeof(int),
       offset(sb.pageIncrement), XtRImmediate, (XtPointer) 10},
 
-    { XmNvalueChangedCallback, XmCValueChangedCallback,
+    { (String) XmNvalueChangedCallback, (String) XmCValueChangedCallback,
       XtRCallback, sizeof(XtPointer), offset(sb.valueChangedCBL),
       XtRCallback, NULL},
-    { XmNincrementCallback, XmCIncrementCallback,
+    { (String) XmNincrementCallback, (String) XmCIncrementCallback,
       XtRCallback, sizeof(XtPointer), offset(sb.incrementCBL),
       XtRCallback, NULL},
-    { XmNdecrementCallback, XmCDecrementCallback,
+    { (String) XmNdecrementCallback, (String) XmCDecrementCallback,
       XtRCallback, sizeof(XtPointer), offset(sb.decrementCBL),
       XtRCallback, NULL},
-    { XmNpageIncrementCallback, XmCPageIncrementCallback,
+    { (String) XmNpageIncrementCallback, (String) XmCPageIncrementCallback,
       XtRCallback, sizeof(XtPointer), offset(sb.pageIncrementCBL),
       XtRCallback, NULL},
-    { XmNpageDecrementCallback, XmCPageDecrementCallback,
+    { (String) XmNpageDecrementCallback, (String) XmCPageDecrementCallback,
       XtRCallback, sizeof(XtPointer), offset(sb.pageDecrementCBL),
       XtRCallback, NULL},
-    { XmNtoTopCallback, XmCToTopCallback, XtRCallback,
+    { (String) XmNtoTopCallback, (String) XmCToTopCallback, XtRCallback,
       sizeof(XtPointer), offset(sb.toTopCBL), XtRCallback, NULL},
-    { XmNtoBottomCallback, XmCToBottomCallback, XtRCallback,
+    { (String) XmNtoBottomCallback, (String) XmCToBottomCallback, XtRCallback,
       sizeof(XtPointer), offset(sb.toBottomCBL), XtRCallback, NULL},
-    { XmNdragCallback, XmCDragCallback, XtRCallback,
+    { (String) XmNdragCallback, (String) XmCDragCallback, XtRCallback,
       sizeof(XtPointer), offset(sb.dragCBL), XtRCallback, NULL},
 
-      /* "knob" is obsolete; use "slider" instead. */
-    { XmNsliderStyle, XmCSliderStyle, XtRString, sizeof(char *),
-      offset(sb.sliderStyle), XtRImmediate, NULL},
-    { XmNknobStyle, XmCKnobStyle, XtRString, sizeof(char *),
-      offset(sb.sliderStyle), XtRImmediate, NULL},
+    { (String) XmNknobStyle, (String) XmCKnobStyle, XtRString, sizeof(char *),
+      offset(sb.knobStyle), XtRImmediate, NULL},
 
-    { XmNarrowPosition, XmCArrowPosition, XtRString,
+    { (String) XmNarrowPosition, (String) XmCArrowPosition, XtRString,
       sizeof(char *), offset(sb.arrowPosition), XtRImmediate, NULL},
 };
 
-/*-------------------------- Prototypes ---------------------------------*/
+/************************************************************************
+**
+** Prototypes
+**
+*/
 
-/* Actions */
-typedef void Action(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
-static Action Select, PageUpOrLeft, PageDownOrRight, Drag, Release, Jump, Abort;
+/*
+** Actions
+*/
+static void Select(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void PageUpOrLeft(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void PageDownOrRight(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void Drag(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void Release(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void Jump(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
+static void Abort(Widget w, XEvent *event, String *parms, Cardinal *num_parms);
 
-/* Methods */
+/*
+** Methods
+*/
 static void Initialize(Widget treq, Widget tnew, ArgList args, Cardinal *num_args);
 static Boolean SetValues(Widget current, Widget request, Widget nw, ArgList args, Cardinal *num_args);
 static void Destroy(Widget widget);
@@ -205,37 +223,51 @@
 static void Resize(Widget widget);
 static void Realize(Widget widget, XtValueMask *valuemask, XSetWindowAttributes *attr);
 
-/* Private */
+/*
+** Private
+*/
+
 
-/*-------------------------- Actions Table ------------------------------*/
-static XtActionsRec actions[] =
-{
-  {"Select",		Select},
-  {"PageDownOrRight",	PageDownOrRight},
-  {"PageUpOrLeft",	PageUpOrLeft},
-  {"Drag",		Drag},
-  {"Release",		Release},
-  {"Jump",		Jump},
-  {"Abort",		Abort},
+/************************************************************************
+**
+** Actions Table
+**
+*/
+static XtActionsRec actions[] = {
+    {(String) "Select",     		Select},
+    {(String) "PageDownOrRight",	PageDownOrRight},
+    {(String) "PageUpOrLeft",	    	PageUpOrLeft},
+    {(String) "Drag",			Drag},
+    {(String) "Release",		Release},
+    {(String) "Jump",			Jump},
+    {(String) "Abort",			Abort},
 };
 
-/*--------------------- Default Translation Table -----------------------*/
+/************************************************************************
+**
+** Default Translation Table
+**
+*/
 static char default_translations[] =
-  "<Btn1Down>:    Select()\n"
-  "<Btn1Motion>:  Drag()\n"
-  "<Btn1Up>:      Release()\n"
-  "<Btn2Down>:    Jump()\n"
-  "<Btn2Motion>:  Drag()\n"
-  "<Btn2Up>:      Release()\n"
-  "<Key>Delete:   Abort()"
+    "<Btn1Down>:    Select()\n"
+    "<Btn1Motion>:  Drag()\n"
+    "<Btn1Up>:      Release()\n"
+    "<Btn2Down>:    Jump()\n"
+    "<Btn2Motion>:  Drag()\n"
+    "<Btn2Up>:      Release()\n"
+    "<Key>Delete:   Abort()"
 ;
 
-/*------------------- Class record initialization -----------------------*/
+/************************************************************************
+**
+** Class record initalization
+**
+*/
 XlwScrollBarClassRec xlwScrollBarClassRec = {
     /* core_class fields */
     {
     /* superclass          */ (WidgetClass) &coreClassRec,
-    /* class_name          */ "XlwScrollBar",
+    /* class_name          */ (String) "XlwScrollBar",
     /* widget_size         */ sizeof(XlwScrollBarRec),
     /* class_initialize    */ NULL,
     /* class_part_init     */ NULL,
@@ -273,41 +305,43 @@
 
 WidgetClass xlwScrollBarWidgetClass = (WidgetClass) &xlwScrollBarClassRec;
 
-/*-------------------------- Debug Functions ----------------------------*/
+/************************************************************************
+**
+** Debug funcitons
+**
+*/
 
 #ifdef SHOW_CLEAR
-static void
-myXClearArea(Display *dpy, Drawable d, int x, int y, int w, int h,
-	     Boolean exp, XlwScrollBarWidget widget)
+static void myXClearArea(Display *dpy, Drawable d, int x, int y, int w, int h, Boolean exp, XlwScrollBarWidget widget)
 {
-  XFillRectangle (dpy, d, widget->sb.topShadowGC, x, y, w, h);
-  XSync (dpy, False);
-  sleep (2);
-  XClearArea (dpy, d, x, y, w, h, exp);
+  XFillRectangle(dpy, d, widget->sb.topShadowGC, x, y, w, h);
+  XSync(dpy, False);
+  sleep(2);
+  XClearArea(dpy, d, x, y, w, h, exp);
 }
 
 #define XClearArea(dpy,win,x,y,width,height,exp) myXClearArea(dpy,win,x,y,width,height,exp,w)
 #endif
 
 #ifdef CHECK_VALUES
-static void
-check(XlwScrollBarWidget w)
+static void check(XlwScrollBarWidget w)
 {
-  int height = widget_h (w);
-  if (w->sb.showArrows)
-    height -= (2 * arrow_h (w));
+  int height;
+  
+  height= widget_h(w);
+  if( w->sb.showArrows ) height -= (2*arrow_h(w));
 
-  if ((w->sb.above + w->sb.ss + w->sb.below > height) ||
+  if( (w->sb.above + w->sb.ss + w->sb.below > height) ||
       (w->sb.value < w->sb.minimum) ||
-      (w->sb.value > w->sb.maximum - w->sb.sliderSize))
-    {
+      (w->sb.value > w->sb.maximum - w->sb.sliderSize )
+      )
+      {
       printf("above=%d ss=%d below=%d height=%d\n", 
 	     w->sb.above, w->sb.ss, w->sb.below, height);
       printf("value=%d min=%d max=%d ss=%d max-ss=%d\n",
-	     w->sb.value, w->sb.minimum, w->sb.maximum,
-	     w->sb.sliderSize, w->sb.maximum - w->sb.sliderSize);
+	     w->sb.value, w->sb.minimum, w->sb.maximum, w->sb.sliderSize, w->sb.maximum - w->sb.sliderSize);
       abort();
-    }
+      }
 }
 
 #  define CHECK(w) check(w)
@@ -315,193 +349,215 @@
 #  define CHECK(w)
 #endif
 
-/*-------------------------- Static functions ---------------------------*/
+/************************************************************************
+**
+** Static funcitons
+**
+*/
 
-static void
-call_callbacks (XlwScrollBarWidget w, int reason,
-		int value, int pixel, XEvent *event)
+static void call_callbacks(XlwScrollBarWidget w, int reason, int value, int pixel,
+			   XEvent *event)
 {
   XlwScrollBarCallbackStruct cbs;
   Boolean called_anything;
 
-  cbs.reason = reason;
-  cbs.event  = event;
-  cbs.value  = value;
-  cbs.pixel  = pixel;
+  cbs.reason  = reason;
+  cbs.event   = event;
+  cbs.value   = value;
+  cbs.pixel   = pixel;
 
   called_anything = False;
 
-  switch (reason)
-    {
-    case XmCR_VALUE_CHANGED:
-      XtCallCallbackList ((Widget) w, w->sb.valueChangedCBL, &cbs);
-      called_anything = True;
-      break;
-    case XmCR_INCREMENT:
-      if (w->sb.incrementCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.incrementCBL, &cbs);
-	  called_anything = True;
-	}
-      break;
-    case XmCR_DECREMENT:
-      if (w->sb.decrementCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.decrementCBL, &cbs);
-	  called_anything = True;
-	}
-      break;
-    case XmCR_PAGE_INCREMENT:
-      if (w->sb.incrementCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.pageIncrementCBL, &cbs);
+  switch( reason )
+      {
+      case XmCR_VALUE_CHANGED:
+	  XtCallCallbackList( (Widget)w, w->sb.valueChangedCBL, &cbs );
 	  called_anything = True;
-	}
-      break;
-    case XmCR_PAGE_DECREMENT:
-      if (w->sb.decrementCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.pageDecrementCBL, &cbs);
-	  called_anything = True;
-	}
-      break;
-    case XmCR_TO_TOP:
-      if (w->sb.toTopCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.toTopCBL, &cbs);
-	  called_anything = True;
-	}
-      break;
-    case XmCR_TO_BOTTOM:
-      if (w->sb.toBottomCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.toBottomCBL, &cbs);
-	  called_anything = True;
-	}
-      break;
-    case XmCR_DRAG:
-      if (w->sb.dragCBL)
-	{
-	  XtCallCallbackList ((Widget) w, w->sb.dragCBL, &cbs);
-	}
-      called_anything = True; /* Special Case */
-      break;
-    }
+	  break;
+      case XmCR_INCREMENT:
+	  if( w->sb.incrementCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.incrementCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_DECREMENT:
+	  if( w->sb.decrementCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.decrementCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_PAGE_INCREMENT:
+	  if( w->sb.incrementCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.pageIncrementCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_PAGE_DECREMENT:
+	  if( w->sb.decrementCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.pageDecrementCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_TO_TOP:
+	  if( w->sb.toTopCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.toTopCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_TO_BOTTOM:
+	  if( w->sb.toBottomCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.toBottomCBL, &cbs );
+	      called_anything = True;
+	      }
+	  break;
+      case XmCR_DRAG:
+	  if( w->sb.dragCBL )
+	      {
+	      XtCallCallbackList( (Widget)w, w->sb.dragCBL, &cbs );
+	      }
+	  called_anything = True; /* Special Case */
+	  break;
+      }
 
-  if (!called_anything)
-    {
+  if( !called_anything )
+      {
       cbs.reason = XmCR_VALUE_CHANGED;
-      XtCallCallbackList ((Widget) w, w->sb.valueChangedCBL, &cbs);
-    }
+      XtCallCallbackList( (Widget)w, w->sb.valueChangedCBL, &cbs );
+      }
 }
 
-/* Widget sizes minus the shadow and highlight area */
+/*
+** Widget sizes minus the shadow and highlight area
+**
+*/
+static int widget_x(XlwScrollBarWidget w)
+{
+  return( w->sb.shadowThickness );
+}
 
-static int
-widget_x (XlwScrollBarWidget w)
+static int widget_y(XlwScrollBarWidget w)
 {
-  return w->sb.shadowThickness;
+  return( w->sb.shadowThickness );
 }
 
-static int
-widget_y (XlwScrollBarWidget w)
+static int widget_w(XlwScrollBarWidget w)
 {
-  return w->sb.shadowThickness;
-}
+  int width, x = w->sb.shadowThickness;
 
-static int
-widget_w (XlwScrollBarWidget w)
-{
-  int x = w->sb.shadowThickness;
-  int width = (VERT (w) ? w->core.width : w->core.height) - (2 * x);
-  return width > 1 ? width : 1;
+  width = VERT(w) ? w->core.width : w->core.height;
+
+  if( width <= (2 * x) )
+      return( 1 );
+  else
+      return( width - (2 * x) );
 }
 
-static int
-widget_h (XlwScrollBarWidget w)
+static int widget_h(XlwScrollBarWidget w)
 {
-  int y = w->sb.shadowThickness;
-  int height = (VERT (w) ? w->core.height : w->core.width) - (2 * y);
+  int height, y = w->sb.shadowThickness;
+
+  height = VERT(w) ? w->core.height : w->core.width;
 
-  return height > 1 ? height : 1;
+  if( height <= (2 * y) )
+      return( 1 );
+  else
+      return( height - (2 * y) );
 }
 
-static int
-arrow_h (XlwScrollBarWidget w)
+static int arrow_h(XlwScrollBarWidget w)
 {
-  int width = widget_w (w);
-  int minimum_size = ((widget_h (w) - SS_MIN) / 2) - 1;
-  return minimum_size < width ? minimum_size : width;
+  int width, height;
+
+  width = widget_w(w);
+  height= widget_h(w);
+
+  if( width > ((height / 2) - (SS_MIN / 2) - 1) )
+      {
+      return( ((height / 2) - (SS_MIN / 2) - 1) );
+      }
+  else
+      {
+      return( width );
+      }
 }
 
-static int
-event_x (XlwScrollBarWidget w, XEvent *event)
+static int event_x(XlwScrollBarWidget w, XEvent *event)
 {
-  return VERT (w) ? event->xbutton.x : event->xbutton.y;
+  return( VERT(w) ? event->xbutton.x : event->xbutton.y );
 }
 
-static int
-event_y (XlwScrollBarWidget w, XEvent *event)
+static int event_y(XlwScrollBarWidget w, XEvent *event)
 {
-  return VERT (w) ? event->xbutton.y : event->xbutton.x;
+  return( VERT(w) ? event->xbutton.y : event->xbutton.x );
 }
 
-/* Safe addition and subtraction */
-static void
-increment_value (XlwScrollBarWidget w, int diff)
+/*
+** Safe addition and subtraction
+*/
+static int safe_add(int a, int b)
 {
-  w->sb.value = w->sb.maximum - diff < w->sb.value ?
-    w->sb.maximum :
-    w->sb.value + diff;
+  if( a > 0 && INT_MAX - a < b ) return( INT_MAX );
+  else return( a + b );
+}
+
+static int safe_subtract(int a, int b)
+{
+  if( a < 0 && -(INT_MIN - a) < b ) return( INT_MIN );
+  else return( a - b );
 }
 
-static void
-decrement_value (XlwScrollBarWidget w, int diff)
+static int knob_style(XlwScrollBarWidget w)
 {
-  w->sb.value = w->sb.minimum + diff > w->sb.value ?
-    w->sb.minimum :
-    w->sb.value - diff;
+  if( w->sb.knobStyle )
+      {
+      if( w->sb.knobStyle[0] == 'd' )
+	  {
+	  return( KNOB_DIMPLE );
+	  }
+      }
+  return( KNOB_PLAIN );
 }
 
-static SliderStyle
-slider_style (XlwScrollBarWidget w)
+static Boolean arrow_same_end(XlwScrollBarWidget w)
 {
-  return w->sb.sliderStyle && w->sb.sliderStyle[0] == 'd' ?
-    SLIDER_DIMPLE :
-    SLIDER_PLAIN;
+  if( w->sb.arrowPosition && w->sb.arrowPosition[0] == 's' )
+      {
+      return( True );
+      }
+  return( False );
 }
 
-static Boolean
-arrow_same_end (XlwScrollBarWidget w)
-{
-  return w->sb.arrowPosition && w->sb.arrowPosition[0] == 's' ? True : False;
-}
-
-/*-------------------------- GC and Pixel allocation --------------------*/
-static GC
-get_gc (XlwScrollBarWidget w, Pixel fg, Pixel bg, Pixmap pm)
+/*
+** GC and Pixel allocation
+*/
+static GC get_gc(XlwScrollBarWidget w, Pixel fg, Pixel bg, Pixmap pm)
 {
   XGCValues values;
   XtGCMask mask;
 
-  if (pm == w->sb.grayPixmap)
-    {
+  if (pm == w->sb.grayPixmap) {
       /* If we're using the gray pixmap, guarantee white on black ...
        * otherwise, we could end up with something odd like grey on white
        * when we're on a color display that ran out of color cells
        */
 
-      fg = WhitePixelOfScreen (DefaultScreenOfDisplay (XtDisplay (w)));
-      bg = BlackPixelOfScreen (DefaultScreenOfDisplay (XtDisplay (w)));
-    }
+      fg = WhitePixelOfScreen(DefaultScreenOfDisplay(XtDisplay(w)));
+      bg = BlackPixelOfScreen(DefaultScreenOfDisplay(XtDisplay(w)));
+  }
  
   values.foreground = fg;
   values.background = bg;
   values.fill_style = FillOpaqueStippled;
   values.stipple    = pm;
-  mask = GCForeground | GCBackground |
-    (pm == None ? 0 : GCStipple | GCFillStyle);
-  return XtGetGC((Widget) w, mask, &values);
+  mask              = GCForeground | GCBackground |
+      ( pm == None ? 0 : GCStipple | GCFillStyle );
+  return( XtGetGC((Widget)w, mask, &values) );
 }
 
 /* Replacement for XAllocColor() that tries to return the nearest
@@ -511,52 +567,69 @@
 allocate_nearest_color (Display *display, Colormap screen_colormap,
 		        XColor *color_def)
 {
-  int status = XAllocColor (display, screen_colormap, color_def);
-  if (status)
-    return status;
+  int status;
 
+  status = XAllocColor (display, screen_colormap, color_def);
+  if (!status)
     {
       /* If we got to this point, the colormap is full, so we're
-	 going to try to get the next closest color.
+	 going to try and get the next closest color.
 	 The algorithm used is a least-squares matching, which is
 	 what X uses for closest color matching with StaticColor visuals.  */
 
-      int nearest, x;
-      unsigned long nearest_delta = ULONG_MAX;
+      XColor *cells;
+      int no_cells;
+      int nearest;
+      long nearest_delta, trial_delta;
+      int x;
 
-      int no_cells = XDisplayCells (display, XDefaultScreen (display));
+      no_cells = XDisplayCells (display, XDefaultScreen (display));
       /* Don't use alloca here because lwlib doesn't have the
          necessary configuration information that src does. */
-      XColor *cells = (XColor *) malloc (sizeof (XColor) * no_cells);
+      cells = (XColor *) malloc (sizeof (XColor) * no_cells);
 
       for (x = 0; x < no_cells; x++)
 	cells[x].pixel = x;
 
       XQueryColors (display, screen_colormap, cells, no_cells);
-
-      for (nearest = 0, x = 0; x < no_cells; x++)
+      nearest = 0;
+      /* I'm assuming CSE so I'm not going to condense this. */
+      nearest_delta = ((((color_def->red >> 8) - (cells[0].red >> 8))
+			* ((color_def->red >> 8) - (cells[0].red >> 8)))
+		       +
+		       (((color_def->green >> 8) - (cells[0].green >> 8))
+			* ((color_def->green >> 8) - (cells[0].green >> 8)))
+		       +
+		       (((color_def->blue >> 8) - (cells[0].blue >> 8))
+			* ((color_def->blue >> 8) - (cells[0].blue >> 8))));
+      for (x = 1; x < no_cells; x++)
 	{
-	  long dred   = (color_def->red   >> 8) - (cells[x].red   >> 8);
-	  long dgreen = (color_def->green >> 8) - (cells[x].green >> 8);
-	  long dblue  = (color_def->blue  >> 8) - (cells[x].blue  >> 8);
-	  unsigned long delta = dred * dred + dgreen * dgreen + dblue * dblue;
-
-	  if (delta < nearest_delta)
+	  trial_delta = ((((color_def->red >> 8) - (cells[x].red >> 8))
+			  * ((color_def->red >> 8) - (cells[x].red >> 8)))
+			 +
+			 (((color_def->green >> 8) - (cells[x].green >> 8))
+			  * ((color_def->green >> 8) - (cells[x].green >> 8)))
+			 +
+			 (((color_def->blue >> 8) - (cells[x].blue >> 8))
+			  * ((color_def->blue >> 8) - (cells[x].blue >> 8))));
+	  if (trial_delta < nearest_delta)
 	    {
 	      nearest = x;
-	      nearest_delta = delta;
+	      nearest_delta = trial_delta;
 	    }
 	}
-      color_def->red   = cells[nearest].red;
+      color_def->red = cells[nearest].red;
       color_def->green = cells[nearest].green;
-      color_def->blue  = cells[nearest].blue;
+      color_def->blue = cells[nearest].blue;
+      status = XAllocColor (display, screen_colormap, color_def);
+
       free (cells);
-      return XAllocColor (display, screen_colormap, color_def);
     }
+
+  return status;
 }
 
-static void
-make_shadow_pixels (XlwScrollBarWidget w)
+static void make_shadow_pixels(XlwScrollBarWidget w)
 {
   Display *dpy = XtDisplay((Widget) w);
   Colormap cmap = w->core.colormap;
@@ -569,207 +642,215 @@
   bg = w->core.background_pixel;
   fg = w->sb.foreground;
 
-  if (w->sb.topShadowColor    == (Pixel)~0) w->sb.topShadowColor    = bg;
-  if (w->sb.bottomShadowColor == (Pixel)~0) w->sb.bottomShadowColor = fg;
+  if( w->sb.topShadowColor    == (Pixel)~0) w->sb.topShadowColor    = bg;
+  if( w->sb.bottomShadowColor == (Pixel)~0) w->sb.bottomShadowColor = fg;
 
-  if (w->sb.topShadowColor == bg || w->sb.topShadowColor == fg)
-    {
+  if( w->sb.topShadowColor == bg || w->sb.topShadowColor == fg )
+      {
       topc.pixel = bg;
-      XQueryColor (dpy, cmap, &topc);
+      XQueryColor( dpy, cmap, &topc );
       /* don't overflow/wrap! */
       topc.red   = MINL(65535, topc.red   * 1.2);
       topc.green = MINL(65535, topc.green * 1.2);
       topc.blue  = MINL(65535, topc.blue  * 1.2);
-      if (allocate_nearest_color (dpy, cmap, &topc))
-	{
-	  if (topc.pixel == bg)
-	    {
-	      XFreeColors (dpy, cmap, &topc.pixel, 1, 0);
+      if( allocate_nearest_color(dpy, cmap, &topc) )
+	  {
+	  if( topc.pixel == bg )
+	      {
+	      XFreeColors( dpy, cmap, &topc.pixel, 1, 0);
 	      topc.red   = MINL(65535, topc.red   + 0x8000);
 	      topc.green = MINL(65535, topc.green + 0x8000);
 	      topc.blue  = MINL(65535, topc.blue  + 0x8000);
-	      if (allocate_nearest_color (dpy, cmap, &topc))
-		{
+	      if( allocate_nearest_color(dpy, cmap, &topc) )
+		  {
 		  w->sb.topShadowColor = topc.pixel;
-		}
-	    }
+		  }
+	      }
 	  else
-	    {
+	      {
 	      w->sb.topShadowColor = topc.pixel;
-	    }
+	      }
 
 	  top_frobbed = 1;
-	}
-    }
+	  }
+      }
 
-  if (w->sb.bottomShadowColor == fg || w->sb.bottomShadowColor == bg)
-    {
+  if( w->sb.bottomShadowColor == fg || w->sb.bottomShadowColor == bg )
+      {
       botc.pixel = bg;
-      XQueryColor (dpy, cmap, &botc);
+      XQueryColor( dpy, cmap, &botc );
       botc.red   *= 0.6;
       botc.green *= 0.6;
       botc.blue  *= 0.6;
-      if (allocate_nearest_color (dpy, cmap, &botc))
-	{
-	  if (botc.pixel == bg)
-	    {
-	      XFreeColors (dpy, cmap, &botc.pixel, 1, 0);
+      if( allocate_nearest_color(dpy, cmap, &botc) )
+	  {
+	  if( botc.pixel == bg )
+	      {
+	      XFreeColors( dpy, cmap, &botc.pixel, 1, 0);
 	      botc.red   = MINL(65535, botc.red   + 0x4000);
 	      botc.green = MINL(65535, botc.green + 0x4000);
 	      botc.blue  = MINL(65535, botc.blue  + 0x4000);
-	      if (allocate_nearest_color (dpy, cmap, &botc))
-		{
+	      if( allocate_nearest_color(dpy, cmap, &botc) )
+		  {
 		  w->sb.bottomShadowColor = botc.pixel;
-		}
-	    }
+		  }
+	      }
 	  else
-	    {
+	      {
 	      w->sb.bottomShadowColor = botc.pixel;
-	    }
+	      }
 	  bottom_frobbed = 1;
-	}
-    }
+	  }
+      }
 
-  if (top_frobbed && bottom_frobbed)
-    {
+  if( top_frobbed && bottom_frobbed )
+      {
       int top_avg = ((topc.red / 3) + (topc.green / 3) + (topc.blue / 3));
       int bot_avg = ((botc.red / 3) + (botc.green / 3) + (botc.blue / 3));
-      if (bot_avg > top_avg)
-	{
+      if( bot_avg > top_avg )
+	  {
 	  Pixel tmp = w->sb.topShadowColor;
 	  w->sb.topShadowColor = w->sb.bottomShadowColor;
 	  w->sb.bottomShadowColor = tmp;
-	}
-      else if (topc.pixel == botc.pixel)
-	{
-	  if (botc.pixel == bg)
-	    w->sb.topShadowColor = bg;
+	  }
+      else if( topc.pixel == botc.pixel )
+	  {
+	  if( botc.pixel == bg )
+	      w->sb.topShadowColor = bg;
 	  else
-	    w->sb.bottomShadowColor = fg;
-	}
-    }
+	      w->sb.bottomShadowColor = fg;
+	  }
+      }
 
-  if (w->sb.topShadowColor    == w->core.background_pixel || 
-      w->sb.bottomShadowColor == w->core.background_pixel)
-    {
+  if (w->sb.topShadowColor == w->core.background_pixel || 
+      w->sb.bottomShadowColor == w->core.background_pixel) {
+
       /* Assume we're in mono. This code should be okay even if we're
        * really in color but just short on color cells -- We want the 
        * following behavior, which has been empirically determined to
        * work well for all fg/bg combinations in mono: If the trough
-       * and slider are BOTH black, then use a white top shadow and a
+       * and thumb are BOTH black, then use a white top shadow and a
        * grey bottom shadow, otherwise use a grey top shadow and a
        * black bottom shadow.
        */
 
-      Pixel white = WhitePixelOfScreen (DefaultScreenOfDisplay (XtDisplay (w)));
-      Pixel black = BlackPixelOfScreen (DefaultScreenOfDisplay (XtDisplay (w)));
+      Pixel white = WhitePixelOfScreen(DefaultScreenOfDisplay(XtDisplay(w)));
+      Pixel black = BlackPixelOfScreen(DefaultScreenOfDisplay(XtDisplay(w)));
 
-      /* Note: core.background_pixel is the color of the slider ... */
+      /* Note: core.background_pixel is the color of the thumb ... */
 
       if (w->core.background_pixel == black &&
-	  w->sb.troughColor == black)
-	{
-	  w->sb.topShadowColor = white;
-	  w->sb.bottomShadowPixmap = w->sb.grayPixmap;
-	} else {
-	  w->sb.topShadowPixmap = w->sb.grayPixmap;
-	  w->sb.bottomShadowColor = black;
-	}
-    }
+        w->sb.troughColor == black) {
+
+        w->sb.topShadowColor = white;
+        w->sb.bottomShadowPixmap = w->sb.grayPixmap;
+
+      } else {
+
+        w->sb.topShadowPixmap = w->sb.grayPixmap;
+        w->sb.bottomShadowColor = black;
+      }
+
+  }
+      
+
 }
 
-static void
-make_trough_pixel (XlwScrollBarWidget w)
+static void make_trough_pixel(XlwScrollBarWidget w)
 {
   Display *dpy = XtDisplay((Widget) w);
-  Colormap cmap = DefaultColormapOfScreen (XtScreen ((Widget) w));
+  Colormap cmap = DefaultColormapOfScreen( XtScreen((Widget)w) );
   XColor troughC;
 
-  if (w->sb.troughColor == (Pixel)~0) w->sb.troughColor = w->core.background_pixel;
+  if( w->sb.troughColor == (Pixel)~0) w->sb.troughColor = w->core.background_pixel;
 
-  if (w->sb.troughColor == w->core.background_pixel)
-    {
+  if( w->sb.troughColor == w->core.background_pixel )
+      {
       troughC.pixel = w->core.background_pixel;
-      XQueryColor (dpy, cmap, &troughC);
+      XQueryColor( dpy, cmap, &troughC );
       troughC.red   *= 0.8;
       troughC.green *= 0.8;
       troughC.blue  *= 0.8;
-      if (allocate_nearest_color (dpy, cmap, &troughC))
-	w->sb.troughColor = troughC.pixel;
-    }
+      if( allocate_nearest_color(dpy, cmap, &troughC) )
+	  {
+	  w->sb.troughColor = troughC.pixel;
+	  }
+      }
 }
 
-/*-------------------------- Draw 3D Border -----------------------------*/
-static void
-draw_shadows (Display *dpy, Drawable d, GC shine_gc, GC shadow_gc,
-	      int x, int y, int width, int height, int shadowT)
+/*
+** Draw 3d border
+*/
+static void draw_shadows(Display *dpy, Drawable d, 
+			 GC shine_gc, GC shadow_gc, 
+			 int x, int y, int width, int height, 
+			 int shadowT)
 {
-  XSegment shine[10], shadow[10];
-  int i;
+   XSegment shine[10], shadow[10];
+   int i;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT <= 0) return;
+   if(shadowT > (width / 2)) shadowT = (width / 2);
+   if(shadowT > (height / 2)) shadowT = (height / 2);
+   if(shadowT <= 0) return;
 
-  for (i = 0; i < shadowT; i++)
-    {
-      /*  Top segments  */
-      shine[i].x1 = x;
-      shine[i].y2 = shine[i].y1 = y + i;
-      shine[i].x2 = x + width - i - 1;
-      /*  Left segments  */
-      shine[i + shadowT].x2 = shine[i + shadowT].x1 = x + i;
-      shine[i + shadowT].y1 = y + shadowT;
-      shine[i + shadowT].y2 = y + height - i - 1;
+   for(i = 0; i < shadowT; i++)
+       {
+       /*  Top segments  */
+       shine[i].x1 = x;
+       shine[i].y2 = shine[i].y1 = y + i;
+       shine[i].x2 = x + width - i - 1;
+       /*  Left segments  */
+       shine[i + shadowT].x2 = shine[i + shadowT].x1 = x + i;
+       shine[i + shadowT].y1 = y + shadowT;
+       shine[i + shadowT].y2 = y + height - i - 1;
 
-      /*  Bottom segments  */
-      shadow[i].x1 = x + i;
-      shadow[i].y2 = shadow[i].y1 = y + height - i - 1;
-      shadow[i].x2 = x + width - 1 ;
-      /*  Right segments  */
-      shadow[i + shadowT].x2 = shadow[i + shadowT].x1 = x + width - i - 1;
-      shadow[i + shadowT].y1 = y + i + 1;
-      shadow[i + shadowT].y2 = y + height - 1 ;
-    }
+       /*  Bottom segments  */
+       shadow[i].x1 = x + i;
+       shadow[i].y2 = shadow[i].y1 = y + height - i - 1;
+       shadow[i].x2 = x + width - 1 ;
+       /*  Right segments  */
+       shadow[i + shadowT].x2 = shadow[i + shadowT].x1 = x + width - i - 1;
+       shadow[i + shadowT].y1 = y + i + 1;
+       shadow[i + shadowT].y2 = y + height - 1 ;
+       }
 
-  XDrawSegments (dpy, d, shine_gc,  shine,  shadowT * 2);
-  XDrawSegments (dpy, d, shadow_gc, shadow, shadowT * 2);
+   XDrawSegments( dpy, d, shine_gc, shine, shadowT * 2 );
+   XDrawSegments( dpy, d, shadow_gc, shadow, shadowT * 2 );
 }
 
-/*------------------ Draw 3D Arrows: left, up, down, right --------------*/
-static int
-make_vert_seg (XSegment *seg, int x1, int y1, int x2, int y2, int shadowT)
+/*
+** Draw 3d arrows, left, up, down, and right
+*/
+static int make_vert_seg(XSegment *seg, int x1, int y1, int x2, int y2, int shadowT)
 {
   int i;
 
-  for (i=0; i<shadowT; i++, seg++)
-    {
-      seg->x1 = x1;
-      seg->y1 = y1++;
-      seg->x2 = x2;
-      seg->y2 = y2++;
-    }
-  return shadowT;
+  for(i=0; i<shadowT; i++)
+      {
+      seg[i].x1 = x1;
+      seg[i].y1 = y1 + i;
+      seg[i].x2 = x2;
+      seg[i].y2 = y2 + i;
+      }
+  return( shadowT );
 }
 
-static int
-make_hor_seg (XSegment *seg, int x1, int y1, int x2, int y2, int shadowT)
+static int make_hor_seg(XSegment *seg, int x1, int y1, int x2, int y2, int shadowT)
 {
   int i;
 
-  for (i=0; i<shadowT; i++, seg++)
-    {
-      seg->x1 = x1++;
-      seg->y1 = y1;
-      seg->x2 = x2++;
-      seg->y2 = y2;
-    }
-  return shadowT;
+  for(i=0; i<shadowT; i++)
+      {
+      seg[i].x1 = x1 + i;
+      seg[i].y1 = y1;
+      seg[i].x2 = x2 + i;
+      seg[i].y2 = y2;
+      }
+  return( shadowT );
 }
 
-static void
-draw_arrow_up (Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
-	       int x, int y, int width, int height, int shadowT)
+static void draw_arrow_up(Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
+			  int x, int y, int width, int height, int shadowT)
 {
   XSegment shine[10], shadow[10];
   XPoint triangle[3];
@@ -777,21 +858,21 @@
 
   mid = width / 2;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT < 0) shadowT = 0;
+  if(shadowT > (width / 2)) shadowT = (width / 2);
+  if(shadowT > (height / 2)) shadowT = (height / 2);
+  if(shadowT <= 0) shadowT = 0;
 
   /*  /  */
-  make_vert_seg (shine,
-		 x, y + height - shadowT - 1,
-		 x + mid, y, shadowT);
+  make_vert_seg( shine,
+		 x,       y + height - shadowT - 1,
+		 x + mid, y, shadowT );
   /*  _\  */
-  make_vert_seg (shadow,
-		 x, y + height - shadowT - 1,
-		 x + width - 1, y + height - shadowT - 1, shadowT);
-  make_vert_seg (shadow + shadowT,
-		 x + mid, y,
-		 x + width - 1, y + height - shadowT - 1, shadowT);
+  make_vert_seg( shadow,
+		 x,             y + height - shadowT - 1,
+		 x + width - 1, y + height - shadowT - 1, shadowT );
+  make_vert_seg( shadow + shadowT,
+		 x + mid,       y,
+		 x + width - 1, y + height - shadowT - 1, shadowT );
 
   triangle[0].x = x;
   triangle[0].y = y + height - 1;
@@ -800,36 +881,36 @@
   triangle[2].x = x + width - 1;
   triangle[2].y = y + height - 1;
 
-  XFillPolygon (dpy, win, bgGC, triangle, 3, Convex, ArcChord);
+  XFillPolygon( dpy, win, bgGC, triangle, 3, Convex, ArcChord );
 
-  XDrawSegments (dpy, win, shadowGC, shadow, shadowT * 2);
-  XDrawSegments (dpy, win, shineGC,  shine,  shadowT);
+  XDrawSegments( dpy, win, shadowGC, shadow, shadowT * 2 );
+  XDrawSegments( dpy, win, shineGC, shine, shadowT );
 }
 
-static void
-draw_arrow_left (Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
-		 int x, int y, int width, int height, int shadowT)
+static void draw_arrow_left(Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
+			    int x, int y, int width, int height, int shadowT)
 {
   XSegment shine[10], shadow[10];
   XPoint triangle[3];
+  int mid;
 
-  int mid = width / 2;
+  mid = width / 2;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT < 0) shadowT = 0;
+  if(shadowT > (width / 2)) shadowT = (width / 2);
+  if(shadowT > (height / 2)) shadowT = (height / 2);
+  if(shadowT <= 0) shadowT = 0;
 
   /*  /  */
-  make_hor_seg (shine,
-		x, y + mid,
-		x + width - shadowT - 1, y, shadowT);
+  make_hor_seg( shine,
+		 x,         y + mid,
+		 x + width - shadowT - 1, y, shadowT );
   /*  \|  */
-  make_hor_seg (shadow,
-		x, y + mid,
-		x + width - shadowT - 1, y + height - 1, shadowT);
-  make_hor_seg (shadow + shadowT,
-		x + width - shadowT - 1, y,
-		x + width - shadowT - 1, y + height - 1, shadowT);
+  make_hor_seg( shadow,
+		 x,         y + mid,
+		 x + width - shadowT - 1, y + height - 1, shadowT );
+  make_hor_seg( shadow + shadowT,
+		 x + width - shadowT - 1, y,
+		 x + width - shadowT - 1, y + height - 1, shadowT );
 
   triangle[0].x = x + width - 1;
   triangle[0].y = y + height - 1;
@@ -838,15 +919,14 @@
   triangle[2].x = x + width - 1;
   triangle[2].y = y;
 
-  XFillPolygon (dpy, win, bgGC, triangle, 3, Convex, ArcChord);
+  XFillPolygon( dpy, win, bgGC, triangle, 3, Convex, ArcChord );
 
-  XDrawSegments (dpy, win, shadowGC, shadow, shadowT * 2);
-  XDrawSegments (dpy, win, shineGC,  shine,  shadowT);
+  XDrawSegments( dpy, win, shadowGC, shadow, shadowT * 2 );
+  XDrawSegments( dpy, win, shineGC, shine, shadowT );
 }
 
-static void
-draw_arrow_down (Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
-		 int x, int y, int width, int height, int shadowT)
+static void draw_arrow_down(Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
+			    int x, int y, int width, int height, int shadowT)
 {
   XSegment shine[10], shadow[10];
   XPoint triangle[3];
@@ -854,21 +934,21 @@
 
   mid = width / 2;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT < 0) shadowT = 0;
+  if(shadowT > (width / 2)) shadowT = (width / 2);
+  if(shadowT > (height / 2)) shadowT = (height / 2);
+  if(shadowT <= 0) shadowT = 0;
       
   /*  \-  */
-  make_vert_seg (shine,
-		 x, y,
-		 x + mid, y + height - shadowT - 1, shadowT);
-  make_vert_seg (shine + shadowT,
-		 x, y,
-		 x + width - 1, y, shadowT);
+  make_vert_seg( shine,
+		 x,       y,
+		 x + mid, y + height - shadowT - 1, shadowT );
+  make_vert_seg( shine + shadowT,
+		 x,             y,
+		 x + width - 1, y, shadowT );
   /*  /  */
-  make_vert_seg (shadow,
+  make_vert_seg( shadow,
 		 x + width - 1, y,
-		 x + mid, y + height - shadowT - 1, shadowT);
+		 x + mid,       y + height - shadowT - 1, shadowT );
 
   triangle[0].x = x;
   triangle[0].y = y;
@@ -877,15 +957,14 @@
   triangle[2].x = x + width - 1;
   triangle[2].y = y;
 
-  XFillPolygon (dpy, win, bgGC, triangle, 3, Convex, ArcChord);
+  XFillPolygon( dpy, win, bgGC, triangle, 3, Convex, ArcChord );
 
-  XDrawSegments (dpy, win, shadowGC, shadow, shadowT);
-  XDrawSegments (dpy, win, shineGC,  shine,  shadowT * 2);
+  XDrawSegments( dpy, win, shadowGC, shadow, shadowT );
+  XDrawSegments( dpy, win, shineGC, shine, shadowT * 2 );
 }
 
-static void
-draw_arrow_right (Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
-		  int x, int y, int width, int height, int shadowT)
+static void draw_arrow_right(Display *dpy, Drawable win, GC bgGC, GC shineGC, GC shadowGC,
+			     int x, int y, int width, int height, int shadowT)
 {
   XSegment shine[10], shadow[10];
   XPoint triangle[3];
@@ -893,55 +972,55 @@
 
   mid = width / 2;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT < 0) shadowT = 0;
+  if(shadowT > (width / 2)) shadowT = (width / 2);
+  if(shadowT > (height / 2)) shadowT = (height / 2);
+  if(shadowT <= 0) shadowT = 0;
       
   /*  |\  */
-  make_hor_seg (shine,
-		x, y,
-		x + width - shadowT - 1, y + mid, shadowT);
-  make_hor_seg (shine + shadowT,
+  make_hor_seg( shine,
+		x,       y,
+		x + width - shadowT - 1, y + mid, shadowT );
+  make_hor_seg( shine + shadowT,
 		x, y,
-		x, y + height - 1, shadowT);
+		x, y + height -1, shadowT );
   /*  /  */
-  make_hor_seg (shadow,
-		x, y + height - 1,
-		x + width - shadowT - 1, y + mid, shadowT);
+  make_hor_seg( shadow,
+		x, y + height -1,
+		x + width - shadowT - 1, y + mid, shadowT );
 
   triangle[0].x = x + 1;
   triangle[0].y = y + height - 1;
-  triangle[1].x = x + width  - 1;
+  triangle[1].x = x + width - 1;
   triangle[1].y = y + mid;
   triangle[2].x = x + 1;
   triangle[2].y = y;
 
-  XFillPolygon (dpy, win, bgGC, triangle, 3, Convex, ArcChord);
+  XFillPolygon( dpy, win, bgGC, triangle, 3, Convex, ArcChord );
 
-  XDrawSegments (dpy, win, shadowGC, shadow, shadowT);
-  XDrawSegments (dpy, win, shineGC,  shine,  shadowT * 2);
+  XDrawSegments( dpy, win, shadowGC, shadow, shadowT );
+  XDrawSegments( dpy, win, shineGC, shine, shadowT * 2 );
 }
 
-static void
-draw_dimple (Display *dpy, Drawable win, GC shine, GC shadow,
-	     int x, int y, int width, int height)
+static void draw_dimple(Display *dpy, Drawable win, GC shine, GC shadow,
+			int x, int y, int width, int height)
 {
-  XDrawArc (dpy, win, shine,  x, y, width, height, 46*64, 180*64);
-  XDrawArc (dpy, win, shadow, x, y, width, height, 45*64, -179*64);
+  XDrawArc(dpy, win, shine, x, y, width, height, 46*64, 180*64);
+  XDrawArc(dpy, win, shadow, x, y, width, height, 45*64, -179*64);
 }
 
-/*------- Scrollbar values -> pixels, pixels -> scrollbar values --------*/
+/*
+** Scrollbar values -> pixels, pixels -> scrollbar values
+*/
 
-static void
-seg_pixel_sizes (XlwScrollBarWidget w, int *above_return,
-		 int *ss_return, int *below_return)
+static void seg_pixel_sizes(XlwScrollBarWidget w, int *above_return, int *ss_return,
+			    int *below_return)
 {
   float total, height, fuz;
   int value;
   int above, ss, below;
 
-  height= widget_h (w);
-  if (w->sb.showArrows) height -= (2 * arrow_h (w));
+  height= widget_h(w);
+  if( w->sb.showArrows ) height -= (2*arrow_h(w));
 
   value = w->sb.value - w->sb.minimum;
 
@@ -952,89 +1031,90 @@
   above = ((height * value + fuz) / total);
   below = ((height) - (ss + above));
 
-  /* Don't let slider get smaller than SS_MIN */
-  if (ss < SS_MIN)
-    {
-      /* add a percent amount for integer rounding */
-      float tmp = ((((float) (SS_MIN - ss) * (float) value)) / total) + 0.5;
+  /* Dont' let knob get smaller than SS_MIN */
+  if( ss < SS_MIN )
+      {
+      /* add a percent amount for interger rounding */
+      float tmp = ((((float)(SS_MIN - ss) * (float)value)) / total) + 0.5;
 
-      above -= (int) tmp;
-      ss = SS_MIN;
+      above -= (int)tmp;
+      ss     = SS_MIN;
       below = ((height) - (ss + above));
 
-      if (above < 0)
-	{
+      if( above < 0 )
+	  {
 	  above = 0;
 	  below = height - ss;
-	}
-      if (below < 0)
-	{
+	  }
+      if( below < 0 )
+	  {
 	  above = height - ss;
 	  below = 0;
-	}
-      if (ss > height)
-	{
+	  }
+      if( ss > height )
+	  {
 	  above = 0;
 	  ss    = height;
 	  below = 0;
-	}
-    }
+	  }
+      }
 
   *above_return = above;
   *ss_return    = ss;
   *below_return = below;
 
-  CHECK (w);
+  CHECK(w);
 }
 
-static void
-verify_values (XlwScrollBarWidget w)
+static void verify_values(XlwScrollBarWidget w)
 {
   int total = w->sb.maximum - w->sb.minimum;
 
-  if (w->sb.sliderSize > total)
+  if( w->sb.sliderSize > total )
+      {
       w->sb.sliderSize = total;
-
-  if (w->sb.pageIncrement > total)
+      }
+  if( w->sb.pageIncrement > total )
+      {
       w->sb.pageIncrement = total;
-
-  if (w->sb.increment > total)
+      }
+  if( w->sb.increment > total )
+      {
       w->sb.increment = total;
-
-  if (w->sb.value < w->sb.minimum)
+      }
+  if( w->sb.value < w->sb.minimum )
+      {
       w->sb.value = w->sb.minimum;
-
-  if (w->sb.value > w->sb.maximum)
-      w->sb.value = w->sb.maximum;
-
-  if (w->sb.sliderSize > w->sb.maximum - w->sb.value)
-      w->sb.sliderSize = w->sb.maximum - w->sb.value;
+      }
+  if( w->sb.value > w->sb.maximum - w->sb.sliderSize)
+      {
+      w->sb.value = w->sb.maximum - w->sb.sliderSize;
+      }
 }
 
-static int
-value_from_pixel (XlwScrollBarWidget w, int above)
+static int value_from_pixel(XlwScrollBarWidget w, int above)
 {
   float total, height, fuz;
   int value, ss;
 
-  height = widget_h (w);
-  if (w->sb.showArrows)
-    height -= (2 * arrow_h (w));
+  height= widget_h(w);
+  if( w->sb.showArrows ) height -= (2*arrow_h(w));
 
   total = w->sb.maximum - w->sb.minimum;
-  fuz = height / 2;
+  fuz   = height / 2;
 
-  ss = ((height * w->sb.sliderSize + (total / 2)) / total);
+  ss    = ((height * w->sb.sliderSize + (total / 2)) / total);
 
-  if (ss < SS_MIN)
-    {
-      /* add a percent amount for integer rounding */
+  if( ss < SS_MIN )
+      {
+      /* add a percent amount for interger rounding */
       above += ((((SS_MIN - ss) * above) + fuz) / height);
-    }
+      }
 
   {
-    /* Prevent SIGFPE's that would occur if we don't truncate the value. */
-    float floatval = w->sb.minimum + ((float)(above * total + fuz) / height);
+    /* Prevent SIGFPE's that would occur if we don't truncate the
+       value. */
+    float floatval = w->sb.minimum + ((float)(above * total + fuz ) / height);
     if (floatval >= (float) INT_MAX)
       value = INT_MAX;
     else if (floatval <= (float) INT_MIN)
@@ -1043,21 +1123,30 @@
       value = floatval;
   }
 
-  return value;
+  return( value );
 }
 
 
-static void
-redraw_dimple (XlwScrollBarWidget w, Display *dpy, Window win,
-	       int x, int y, int width, int height)
+static void redraw_dimple(XlwScrollBarWidget w, Display *dpy, Window win,
+			  int x, int y, int width, int height)
 {
-  if (SLIDER_DIMPLE == slider_style (w))
-    {
-      int size;
-      int slider_p = (w->sb.armed == ARM_SLIDER);
-      GC shine  = slider_p ? w->sb.bottomShadowGC : w->sb.topShadowGC;
-      GC shadow = slider_p ? w->sb.topShadowGC    : w->sb.bottomShadowGC;
-      int shadowT = w->sb.shadowThickness;
+  GC shine, shadow;
+  int shadowT, size;
+
+  if( KNOB_DIMPLE == knob_style(w) )
+      {
+      if( w->sb.armed == ARM_KNOB )
+	  {
+	  shine = w->sb.bottomShadowGC;
+	  shadow = w->sb.topShadowGC;
+	  }
+      else
+	  {
+	  shine = w->sb.topShadowGC;
+	  shadow = w->sb.bottomShadowGC;
+	  }
+
+      shadowT = w->sb.shadowThickness;
 
       x += shadowT;
       y += shadowT;
@@ -1066,595 +1155,698 @@
 
       size = (width < height ? width : height) * 3 / 4;
 
-      if (size%2 != (width < height ? width : height)%2) size--;
+      if( size%2 != (width < height ? width : height)%2 ) size--;
 
-      DBUG (fprintf (stderr, "%d %d\n",
-		     x + (width / 2) - (size / 2) - 2*shadowT,
-		     width - size - shadowT));
+      DBUG (fprintf(stderr, "%d %d\n",
+		    x + (width / 2) - (size / 2) - 2*shadowT,
+		    width - size - shadowT));
 
-      draw_dimple (dpy, win, shine, shadow,
-		   x + (width  / 2) - (size / 2),
+      draw_dimple( dpy, win, shine, shadow,
+		   x + (width / 2) - (size / 2),
 		   y + (height / 2) - (size / 2),
-		   size, size);
-    }
+		   size, size );
+      }
 }
 
-static void
-draw_slider (XlwScrollBarWidget w, int above, int ss, int below)
+static void draw_knob(XlwScrollBarWidget w, int above, int ss, int below)
 {
-  Display *dpy = XtDisplay ((Widget) w);
-  Window   win = XtWindow  ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
+  Window   win = XtWindow((Widget)w);
+  int x, y, width, height;
+  int shadowT;
 
-  int x       = widget_x (w);
-  int y       = widget_y (w);
-  int width   = widget_w (w);
-  int height  = widget_h (w);
-  int shadowT = w->sb.shadowThickness;
-  int vert_p  = VERT (w);
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
+
+  shadowT = w->sb.shadowThickness;
 
-  if (shadowT > (width  / 2)) shadowT = (width  / 2);
-  if (shadowT > (height / 2)) shadowT = (height / 2);
-  if (shadowT < 0)            shadowT = 0;
+  if(shadowT > (width / 2)) shadowT = (width / 2);
+  if(shadowT > (height / 2)) shadowT = (height / 2);
+  if(shadowT <= 0) return;
 
-  if (w->sb.showArrows && !arrow_same_end (w))
-    y += arrow_h (w);
+  if( w->sb.showArrows && !arrow_same_end(w) ) y += (arrow_h(w));
 
-  /* trough above slider */
-  if (above > 0)
-    {
-      if (vert_p)
-	XClearArea (dpy, win, x, y, width, above, False);
+  /* trough above knob */
+  if( above > 0 )
+      {
+      if( VERT(w) )
+	  XClearArea( dpy, win, x, y, width, above, False );
       else
-	XClearArea (dpy, win, y, x, above, width, False);
-    }
+	  XClearArea( dpy, win, y, x, above, width, False );
+      }
 
-  /* slider */
-  if (vert_p)
-    {
-      draw_shadows (dpy, win, w->sb.topShadowGC, w->sb.bottomShadowGC,
+  /* knob */
+  if( VERT(w) )
+      {
+      draw_shadows( dpy, win, w->sb.topShadowGC, w->sb.bottomShadowGC,
 		    x, y + above, width, ss, shadowT);
-      XFillRectangle (dpy, win, w->sb.backgroundGC,
-		      x+shadowT, y + above + shadowT,
-		      width-2*shadowT, ss-2*shadowT);
-      redraw_dimple (w, dpy, win, x, y + above, width, ss);
-    }
+      XFillRectangle( dpy, win,
+		      w->sb.backgroundGC,
+		      x+shadowT, y + above + shadowT, width-2*shadowT, ss-2*shadowT );
+      redraw_dimple(w, dpy, win, x, y + above, width, ss);
+      }
   else
-    {
-      draw_shadows (dpy, win, w->sb.topShadowGC, w->sb.bottomShadowGC,
+      {
+      draw_shadows( dpy, win, w->sb.topShadowGC, w->sb.bottomShadowGC,
 		    y + above, x, ss, width, shadowT);
-      XFillRectangle (dpy, win, w->sb.backgroundGC,
-		      y + above + shadowT, x+shadowT,
-		      ss-2*shadowT, width-2*shadowT);
-      redraw_dimple (w, dpy, win, y + above, x, ss, width);
-    }
+      XFillRectangle( dpy, win,
+		      w->sb.backgroundGC,
+		      y + above + shadowT, x+shadowT, ss-2*shadowT, width-2*shadowT );
+      redraw_dimple(w, dpy, win, y + above, x, ss, width);
+      }
 
-  /* trough below slider */
-  if (below > 0)
-    {
-      if (vert_p)
-	XClearArea (dpy, win, x, y + above + ss, width, below, False);
+  /* trough below knob */
+  if( below > 0 )
+      {
+      if( VERT(w) )
+	  XClearArea( dpy, win, x, y + above + ss, width, below, False );
       else
-	XClearArea (dpy, win, y + above + ss, x, below, width, False);
-    }
+	  XClearArea( dpy, win, y + above + ss, x, below, width, False );
+      }
 
-  CHECK (w);
+  CHECK(w);
 }
 
-static void
-redraw_up_arrow (XlwScrollBarWidget w, Boolean armed, Boolean clear_behind)
+static void redraw_up_arrow(XlwScrollBarWidget w, Boolean armed, Boolean clear_behind)
 {
-  Display *dpy = XtDisplay ((Widget) w);
-  Window   win = XtWindow  ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
+  Window   win = XtWindow((Widget)w);
+  GC bg, shine, shadow;
+  int x, y, width, height, arrow_height, shadowT;
 
-  int x       = widget_x (w);
-  int y       = widget_y (w);
-  int width   = widget_w (w);
-  int height  = widget_h (w);
-  int shadowT = w->sb.shadowThickness;
-  int arrow_height = arrow_h (w);
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
+  arrow_height = arrow_h(w);
 
-  GC bg     = w->sb.backgroundGC;
-  GC shine  = armed ? w->sb.bottomShadowGC : w->sb.topShadowGC;
-  GC shadow = armed ? w->sb.topShadowGC    : w->sb.bottomShadowGC;
+  shadowT = w->sb.shadowThickness;
+  bg      = w->sb.backgroundGC;
 
-  if (VERT (w))
-    {
-      if (arrow_same_end (w))
-	y += height - 2 * arrow_height;
-      if (clear_behind)
-	XClearArea (dpy, win, x, y, width, arrow_height + 1, False);
-      draw_arrow_up (dpy, win, bg, shine, shadow,
+  if( armed )
+      {
+      shine   = w->sb.bottomShadowGC;
+      shadow  = w->sb.topShadowGC;
+      }
+  else
+      {
+      shine   = w->sb.topShadowGC;
+      shadow  = w->sb.bottomShadowGC;
+      }
+
+  if( VERT(w) )
+      {
+      if( arrow_same_end(w) )
+	  {
+	  y += height - 2*arrow_h(w) + 2;
+	  }
+      if( clear_behind )
+	  XClearArea( dpy, win, x, y, width, arrow_height + 1, False );
+      draw_arrow_up( dpy, win, bg, shine, shadow,
 		     x + (width - arrow_height)/2, y,
-		     arrow_height, arrow_height, shadowT);
-    }
+		     arrow_height, arrow_height, shadowT );
+      }
   else
-    {
-      if (arrow_same_end (w))
-	y += height - 2 * arrow_height;
-      if (clear_behind)
-	XClearArea (dpy, win, y, x, arrow_height + 1, height, False);
-      draw_arrow_left (dpy, win, bg, shine, shadow,
+      {
+      if( arrow_same_end(w) )
+	  {
+	  y += height - 2*arrow_h(w);
+	  }
+      if( clear_behind )
+	  XClearArea( dpy, win, y, x, arrow_height + 1, height, False );
+      draw_arrow_left( dpy, win, bg, shine, shadow,
 		       y, x + (width - arrow_height)/2,
-		       arrow_height, arrow_height, shadowT);
-    }
+		       arrow_height, arrow_height, shadowT );
+      }
 }
 
-static void
-redraw_down_arrow (XlwScrollBarWidget w, Boolean armed, Boolean clear_behind)
+static void redraw_down_arrow(XlwScrollBarWidget w, Boolean armed, Boolean clear_behind)
 {
-  Display *dpy = XtDisplay ((Widget) w);
-  Window   win = XtWindow  ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
+  Window   win = XtWindow((Widget)w);
+  GC bg, shine, shadow;
+  int x, y, width, height, arrow_height, shadowT;
 
-  int x       = widget_x (w);
-  int y       = widget_y (w);
-  int width   = widget_w (w);
-  int height  = widget_h (w);
-  int shadowT = w->sb.shadowThickness;
-  int arrow_height = arrow_h (w);
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
+  arrow_height = arrow_h(w);
 
-  GC bg     = w->sb.backgroundGC;
-  GC shine  = armed ? w->sb.bottomShadowGC : w->sb.topShadowGC;
-  GC shadow = armed ? w->sb.topShadowGC    : w->sb.bottomShadowGC;
+  shadowT = w->sb.shadowThickness;
+  bg      = w->sb.backgroundGC;
 
-  if (VERT (w))
-    {
-      if (clear_behind)
-	XClearArea (dpy, win, x, y + height - arrow_height, width,
-		    arrow_height + 1, False);
-      draw_arrow_down (dpy, win, bg, shine, shadow,
-		       x + (width - arrow_height)/2,
-		       y + height - arrow_height + 1,
-		       arrow_height, arrow_height, shadowT);
-    }
+  if( armed )
+      {
+      shine   = w->sb.bottomShadowGC;
+      shadow  = w->sb.topShadowGC;
+      }
   else
-    {
-      if (clear_behind)
-	XClearArea (dpy, win, y + height - arrow_height, x,
-		    arrow_height + 1, height, False);
-      draw_arrow_right (dpy, win, bg, shine, shadow,
-			y + height - arrow_height + 1,
-			x + (width - arrow_height)/2,
-			arrow_height, arrow_height, shadowT);
-    }
+      {
+      shine   = w->sb.topShadowGC;
+      shadow  = w->sb.bottomShadowGC;
+      }
+
+  if( VERT(w) )
+      {
+      if( clear_behind )
+	  XClearArea( dpy, win, x, y + height - arrow_height, width, arrow_height + 1, False );
+      draw_arrow_down( dpy, win, bg, shine, shadow,
+		       x + (width - arrow_height)/2, y + height - arrow_height + 1,
+		       arrow_height, arrow_height, shadowT );
+      }
+  else
+      {
+      if( clear_behind )
+	  XClearArea( dpy, win, y + height - arrow_height, x, arrow_height + 1, height, False );
+      draw_arrow_right( dpy, win, bg, shine, shadow,
+			y + height - arrow_height + 1, x + (width - arrow_height)/2,
+			arrow_height, arrow_height, shadowT );
+      }
 }
 
-static void
-redraw_everything (XlwScrollBarWidget w, Region region, Boolean behind_arrows)
+static void redraw_everything(XlwScrollBarWidget w, Region region, Boolean behind_arrows)
 {
-  Display *dpy = XtDisplay ((Widget) w);
-  Window   win = XtWindow  ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
+  Window   win = XtWindow((Widget)w);
+  int x, y, width, height, shadowT, tmp;
 
-  if (w->sb.showArrows)
-    {
-      if (region == NULL)
-	{
-	  redraw_up_arrow   (w, False, behind_arrows);
-	  redraw_down_arrow (w, False, behind_arrows);
-	}
-      else
-	{
-	  int x        = widget_x (w);
-	  int y        = widget_y (w);
-	  int width    = widget_w (w);
-	  int height   = widget_h (w);
-	  int arrow_height = arrow_h (w);
-	  int ax = x, ay = y;
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
+  shadowT = w->sb.shadowThickness;
 
-	  if (arrow_same_end (w))
-	    {
-	      if (VERT (w))
-		ay = y + height - arrow_height - arrow_height;
-	      else
-		ax = x + height - arrow_height - arrow_height;
-	    }
-	  if (XRectInRegion (region, ax, ay, width, width))
-	    redraw_up_arrow (w, False, behind_arrows);
+  if( w->sb.showArrows )
+      {
+      if( region == NULL || XRectInRegion( region, x, y, width, width ) )
+	  {
+	  redraw_up_arrow( w, False, behind_arrows );
+	  }
+      if( VERT(w) )
+	  {
+	  y = y + height - width + 1;
+	  }
+      else
+	  {
+	  tmp = y;
+	  y = x;
+	  x = tmp + height - width + 1;
+	  }
+      if( region == NULL || XRectInRegion( region, x, y, width, width ) )
+	  {
+	  redraw_down_arrow( w, False, behind_arrows );
+	  }
+      }
 
-	  if (VERT (w))
-	    ay = y + height - arrow_height;
-	  else
-	    ax = x + height - arrow_height;
-	  if (XRectInRegion (region, ax, ay, width, width))
-	    redraw_down_arrow (w, False, behind_arrows);
-	}
-    }
+  draw_shadows( dpy, win, w->sb.bottomShadowGC, w->sb.topShadowGC,
+		0, 0, w->core.width, w->core.height, shadowT);
 
-  draw_shadows (dpy, win, w->sb.bottomShadowGC, w->sb.topShadowGC, 0, 0,
-		w->core.width, w->core.height, w->sb.shadowThickness);
+  draw_knob( w, w->sb.above, w->sb.ss, w->sb.below );
 
-  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
 }
 
-/*-------------------------- Method Functions ---------------------------*/
+/************************************************************************
+**
+** Method funcitons
+**
+*/
 
-static void
-Initialize (Widget treq, Widget tnew, ArgList args, Cardinal *num_args)
+/*
+** Initialize
+*/
+static void Initialize(Widget treq, Widget tnew, ArgList args, Cardinal *num_args)
 {
   XlwScrollBarWidget request = (XlwScrollBarWidget) treq;
   XlwScrollBarWidget w = (XlwScrollBarWidget) tnew;
-  Display *dpy = XtDisplay ((Widget) w);
-  Window win = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
+  Display *dpy = XtDisplay((Widget)w);
+  Window win = RootWindowOfScreen( DefaultScreenOfDisplay(dpy) );
+
+  DBUG(fprintf(stderr, "Initialize\n"));
 
-  if (request->core.width  == 0) w->core.width  += (VERT (w) ? 12 : 25);
-  if (request->core.height == 0) w->core.height += (VERT (w) ? 25 : 12);
+  if( request->core.width == 0 ) w->core.width += (VERT(w) ? 12 : 25);
+  if( request->core.height == 0 ) w->core.height += (VERT(w) ? 25 : 12);
 
-  verify_values (w);
+  verify_values(w);
 
   w->sb.lastY = 0;
   w->sb.above = 0;
   w->sb.ss    = 0;
   w->sb.below = 0;
   w->sb.armed = ARM_NONE;
-  w->sb.forced_scroll = FORCED_SCROLL_NONE;
 
-  if (w->sb.shadowThickness > 5) w->sb.shadowThickness = 5;
+  if( w->sb.shadowThickness > 5 ) w->sb.shadowThickness = 5;
 
   w->sb.grayPixmap =
-    XCreatePixmapFromBitmapData (dpy, win, (char *) gray_bits, gray_width,
-				 gray_height, 1, 0, 1);
+      XCreatePixmapFromBitmapData( dpy, win, (char *) gray_bits, gray_width,
+				   gray_height, 1, 0, 1);
 
-  make_trough_pixel (w);
-
-  make_shadow_pixels (w);
+  make_trough_pixel( w );
 
-  w->sb.backgroundGC =
-    get_gc (w, w->core.background_pixel, w->core.background_pixel, None);
-  w->sb.topShadowGC =
-    get_gc (w, w->sb.topShadowColor, w->core.background_pixel,
-	    w->sb.topShadowPixmap);
-  w->sb.bottomShadowGC =
-    get_gc (w, w->sb.bottomShadowColor, w->core.background_pixel,
-	    w->sb.bottomShadowPixmap);
+  make_shadow_pixels( w );
+
+  w->sb.backgroundGC   = get_gc(w, w->core.background_pixel, w->core.background_pixel, None);
+  w->sb.topShadowGC    = get_gc(w, w->sb.topShadowColor, w->core.background_pixel, w->sb.topShadowPixmap);
+  w->sb.bottomShadowGC = get_gc(w, w->sb.bottomShadowColor, w->core.background_pixel, w->sb.bottomShadowPixmap);
 
   w->sb.fullRedrawNext = True;
-
-  w->sb.timerActive = False;
 }
 
-static void
-Destroy (Widget widget)
+/*
+** Destroy
+*/
+static void Destroy(Widget widget)
 {
   XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  Display *dpy = XtDisplay ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
 
-  XtReleaseGC (widget, w->sb.bottomShadowGC);
-  XtReleaseGC (widget, w->sb.topShadowGC);
-  XtReleaseGC (widget, w->sb.backgroundGC);
+  DBUG(fprintf(stderr, "Destroy\n"));
 
-  XFreePixmap (dpy, w->sb.grayPixmap);
+  XtReleaseGC(widget, w->sb.bottomShadowGC);
+  XtReleaseGC(widget, w->sb.topShadowGC);
+  XtReleaseGC(widget, w->sb.backgroundGC);
 
-  if (w->sb.timerActive)
-    {
-      XtRemoveTimeOut (w->sb.timerId);
-      w->sb.timerActive = False; /* Should be a no-op, but you never know */
-    }
+  XFreePixmap( dpy, w->sb.grayPixmap );
 }
 
-static void
-Realize (Widget widget, XtValueMask *valuemask, XSetWindowAttributes *attr)
+/*
+** Realize
+*/
+static void Realize(Widget widget, XtValueMask *valuemask, XSetWindowAttributes *attr)
 {
   XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  Display *dpy = XtDisplay ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
   Window win;
   XSetWindowAttributes win_attr;
 
+  DBUG(fprintf(stderr, "Realize\n"));
+
   (*coreClassRec.core_class.realize)(widget, valuemask, attr);
 
-  win = XtWindow ((Widget) w);
+  win = XtWindow((Widget)w);
 
-  seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
+  seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
 
-  XSetWindowBackground (dpy, win, w->sb.troughColor);
+  XSetWindowBackground( dpy, win, w->sb.troughColor);
 
   /* Change bit gravity so widget is not cleared on resize */
-  win_attr.bit_gravity = NorthWestGravity;
-  XChangeWindowAttributes (dpy, win, CWBitGravity , &win_attr);
+  win_attr.bit_gravity   = NorthWestGravity;
+  XChangeWindowAttributes( dpy, win, CWBitGravity , &win_attr);
 
 }
 
-static void
-Resize (Widget widget)
+/*
+** Resize
+*/
+static void Resize(Widget widget)
 {
   XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  Display *dpy = XtDisplay ((Widget) w);
-  Window win   = XtWindow  ((Widget) w);
+  Display *dpy = XtDisplay((Widget)w);
+  Window win = XtWindow((Widget)w);
 
-  if (XtIsRealized (widget))
-    {
-      DBUG (fprintf (stderr, "Resize = %08lx\n", w));
+  if( XtIsRealized(widget) )
+      {
+      DBUG(fprintf(stderr, "Resize = %08lx\n", w));
 
-      seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
+      seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
 
-      /* redraw_everything (w, NULL, True); */
+      /*redraw_everything(w, NULL, True);*/
 
       w->sb.fullRedrawNext = True;
       /* Force expose event */
-      XClearArea (dpy, win, widget_x (w), widget_y (w), 1, 1, True);
-    }
-
-  if (w->sb.timerActive)
-    {
-      XtRemoveTimeOut (w->sb.timerId);
-      w->sb.timerActive = False;
-    }
+      XClearArea(dpy, win, widget_x(w), widget_y(w), 1, 1, True);
+      }
 }
 
-static void
-Redisplay (Widget widget, XEvent *event, Region region)
+/*
+** Redisplay
+*/
+static void Redisplay(Widget widget, XEvent *event, Region region)
 {
   XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
 
-  DBUG (fprintf (stderr, "Redisplay = %08lx\n", w));
+  DBUG(fprintf(stderr, "Redisplay = %08lx\n", w));
 
-  if (XtIsRealized (widget))
-    {
-      if (w->sb.fullRedrawNext)
-	redraw_everything (w, NULL, True);
+  if( XtIsRealized(widget) )
+      {
+      if( w->sb.fullRedrawNext )
+	  {
+	  redraw_everything(w, NULL, True);
+	  }
       else
-	redraw_everything (w, region, False);
+	  {
+	  redraw_everything(w, region, False);
+	  }
       w->sb.fullRedrawNext = False;
-    }
+      }
 }
 
-static Boolean
-SetValues (Widget current, Widget request, Widget neww,
-	   ArgList args, Cardinal *num_args)
+/*
+** SetValues
+*/
+static Boolean SetValues(Widget current, Widget request, Widget neww, ArgList args, Cardinal *num_args)
 {
   XlwScrollBarWidget cur = (XlwScrollBarWidget) current;
   XlwScrollBarWidget w = (XlwScrollBarWidget) neww;
   Boolean do_redisplay = False;
 
-  if (cur->sb.troughColor != w->sb.troughColor)
-    {
-      if (XtIsRealized ((Widget) w))
-	{
-	  XSetWindowBackground (XtDisplay((Widget) w), XtWindow ((Widget) w),
+  if( cur->sb.troughColor != w->sb.troughColor )
+      {
+      if( XtIsRealized((Widget)w) )
+	  {
+	  XSetWindowBackground( XtDisplay((Widget)w), XtWindow((Widget)w),
 				w->sb.troughColor);
 	  do_redisplay = True;
-	}
-    }
+	  }
+      }
 
-  if (cur->core.background_pixel != w->core.background_pixel)
-    {
-      XtReleaseGC ((Widget)cur, cur->sb.backgroundGC);
-      w->sb.backgroundGC =
-	get_gc (w, w->core.background_pixel, w->core.background_pixel, None);
+  if( cur->core.background_pixel != w->core.background_pixel )
+      {
+      XtReleaseGC((Widget)cur, cur->sb.backgroundGC);
+      w->sb.backgroundGC = get_gc(w, w->core.background_pixel, w->core.background_pixel, None);
       do_redisplay = True;
-    }
+      }
 
-  if (cur->sb.topShadowColor != w->sb.topShadowColor ||
-      cur->sb.topShadowPixmap != w->sb.topShadowPixmap)
-    {
-      XtReleaseGC ((Widget)cur, cur->sb.topShadowGC);
-      w->sb.topShadowGC =
-	get_gc (w, w->sb.topShadowColor, w->core.background_pixel,
-		w->sb.topShadowPixmap);
+  if( cur->sb.topShadowColor != w->sb.topShadowColor ||
+      cur->sb.topShadowPixmap != w->sb.topShadowPixmap )
+      {
+      XtReleaseGC((Widget)cur, cur->sb.topShadowGC);
+      w->sb.topShadowGC = get_gc(w, w->sb.topShadowColor, w->core.background_pixel, w->sb.topShadowPixmap);
       do_redisplay = True;
-    }
+      }
 
-  if (cur->sb.bottomShadowColor != w->sb.bottomShadowColor ||
-      cur->sb.bottomShadowPixmap != w->sb.bottomShadowPixmap)
-    {
-      XtReleaseGC ((Widget)cur, cur->sb.bottomShadowGC);
-      w->sb.bottomShadowGC =
-	get_gc (w, w->sb.bottomShadowColor, w->core.background_pixel,
-		w->sb.bottomShadowPixmap);
+  if( cur->sb.bottomShadowColor != w->sb.bottomShadowColor ||
+      cur->sb.bottomShadowPixmap != w->sb.bottomShadowPixmap )
+      {
+      XtReleaseGC((Widget)cur, cur->sb.bottomShadowGC);
+      w->sb.bottomShadowGC = get_gc(w, w->sb.bottomShadowColor, w->core.background_pixel, w->sb.bottomShadowPixmap);
       do_redisplay = True;
-    }
+      }
 
-  if (cur->sb.orientation != w->sb.orientation)
-    do_redisplay = True;
+  if( cur->sb.orientation != w->sb.orientation )
+      {
+      do_redisplay = True;
+      }
 
 
-  if (cur->sb.minimum       != w->sb.minimum       ||
+  if( cur->sb.minimum       != w->sb.minimum       ||
       cur->sb.maximum       != w->sb.maximum       ||
       cur->sb.sliderSize    != w->sb.sliderSize    ||
       cur->sb.value         != w->sb.value         ||
       cur->sb.pageIncrement != w->sb.pageIncrement ||
-      cur->sb.increment     != w->sb.increment)
-    {
-      verify_values (w);
-      if (XtIsRealized ((Widget) w))
-	{
-	  seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
-	  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
-	}
-    }
+      cur->sb.increment     != w->sb.increment )
+      {
+      verify_values(w);
+      if( XtIsRealized((Widget)w) )
+	  {
+	  seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
+	  draw_knob( w, w->sb.above, w->sb.ss, w->sb.below );
+	  }
+      }
 
-  if (w->sb.shadowThickness > 5) w->sb.shadowThickness = 5;
+  if( w->sb.shadowThickness > 5 ) w->sb.shadowThickness = 5;
 
-  return do_redisplay;
+  return( do_redisplay );
 }
 
-void
-XlwScrollBarGetValues (Widget widget, int *value, int *sliderSize,
-		       int *increment, int *pageIncrement)
+void XlwScrollBarGetValues(Widget widget, int *value, int *sliderSize,
+			   int *increment, int *pageIncrement)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
 
-  if (w && XtClass ((Widget) w) == xlwScrollBarWidgetClass)
-    {
-      if (value)         *value         = w->sb.value;
-      if (sliderSize)    *sliderSize    = w->sb.sliderSize;
-      if (increment)     *increment     = w->sb.increment;
-      if (pageIncrement) *pageIncrement = w->sb.pageIncrement;
-    }
+  if( w && XtClass((Widget)w) == xlwScrollBarWidgetClass )
+      {
+      if( value )         *value         = w->sb.value;
+      if( sliderSize )    *sliderSize    = w->sb.sliderSize;
+      if( increment )     *increment     = w->sb.increment;
+      if( pageIncrement ) *pageIncrement = w->sb.pageIncrement;
+      }
 }
 
-void
-XlwScrollBarSetValues (Widget widget, int value, int sliderSize,
-		       int increment, int pageIncrement, Boolean notify)
+void XlwScrollBarSetValues(Widget widget, int value, int sliderSize,
+			   int increment, int pageIncrement, Boolean notify)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
+  int last_value;
 
-  if (w && XtClass ((Widget) w) == xlwScrollBarWidgetClass &&
+  if( w && XtClass((Widget)w) == xlwScrollBarWidgetClass &&
       (w->sb.value         != value         ||
        w->sb.sliderSize    != sliderSize    ||
        w->sb.increment     != increment     ||
-       w->sb.pageIncrement != pageIncrement))
-    {
-      int last_value = w->sb.value;
-      
+       w->sb.pageIncrement != pageIncrement ))
+      {
       w->sb.value         = value;
       w->sb.sliderSize    = sliderSize;
       w->sb.increment     = increment;
       w->sb.pageIncrement = pageIncrement;
 
-      verify_values (w);
+      verify_values(w);
+
+      if( XtIsRealized(widget) )
+	  {
+	  seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
 
-      if (XtIsRealized (widget))
-	{
-	  seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
-	  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
+	  last_value  = w->sb.value;
+	  w->sb.value = value_from_pixel(w, w->sb.above);
+	  verify_values(w);
 
-	  if (w->sb.value != last_value && notify)
-	    call_callbacks (w, XmCR_VALUE_CHANGED, w->sb.value, 0, NULL);
-	}
-    }
+	  if( w->sb.value != last_value && notify )
+	      {
+	      call_callbacks( w, XmCR_VALUE_CHANGED, w->sb.value, 0, NULL );
+	      }
+	  }
+      }
 }
 
-/*-------------------------- Action Functions ---------------------------*/
+/************************************************************************
+**
+** Action funcitons
+**
+*/
 
-static void
-timer (XtPointer data, XtIntervalId *id)
+static void timer(XtPointer data, XtIntervalId *id)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) data;
-  w->sb.timerActive = False;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)data;
+  int reason, last_value;
 
-  if (w->sb.armed != ARM_NONE)
-    {
-      int last_value = w->sb.value;
-      int reason     = XmCR_NONE;
+  if( w->sb.armed != ARM_NONE )
+      {
+      last_value = w->sb.value;
+      reason     = XmCR_NONE;
 
-      switch (w->sb.armed)
-	{
-	case ARM_PAGEUP:
-	  decrement_value (w, w->sb.pageIncrement);
-	  reason = XmCR_PAGE_DECREMENT;
-	  break;
-	case ARM_PAGEDOWN:
-	  increment_value (w, w->sb.pageIncrement);
-	  reason = XmCR_PAGE_INCREMENT;
-	  break;
-	case ARM_UP:
-	  decrement_value (w, w->sb.increment);
-	  reason = XmCR_DECREMENT;
-	  break;
-	case ARM_DOWN:
-	  increment_value (w, w->sb.increment);
-	  reason = XmCR_INCREMENT;
-	  break;
-	}
+      switch( w->sb.armed )
+	  {
+	  case ARM_PAGEUP:
+	      w->sb.value = safe_subtract( w->sb.value, w->sb.pageIncrement );
+	      reason = XmCR_PAGE_DECREMENT;
+	      break;
+	  case ARM_PAGEDOWN:
+	      w->sb.value = safe_add( w->sb.value, w->sb.pageIncrement );
+	      reason = XmCR_PAGE_INCREMENT;
+	      break;
+	  case ARM_UP:
+	      w->sb.value = safe_subtract( w->sb.value, w->sb.increment );
+	      reason = XmCR_DECREMENT;
+	      break;
+	  case ARM_DOWN:
+	      w->sb.value = safe_add( w->sb.value, w->sb.increment );
+	      reason = XmCR_INCREMENT;
+	      break;
+	  }
 
-      verify_values (w);
-
-      if (last_value != w->sb.value)
-	{
-	  seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
-	  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
+      verify_values(w);
 
-	  call_callbacks (w, reason, w->sb.value, 0, NULL);
+      if( last_value != w->sb.value )
+	  {
+	  seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
+	  
+	  call_callbacks( w, reason, w->sb.value, 0, NULL );
 
-	  w->sb.timerId =
-	    XtAppAddTimeOut (XtWidgetToApplicationContext ((Widget) w),
-			     (unsigned long) w->sb.repeatDelay,
-			     timer,  (XtPointer) w);
-	  w->sb.timerActive = True;
-	}
-    }
+	  XtAppAddTimeOut( XtWidgetToApplicationContext((Widget)w),
+			   (unsigned long) w->sb.repeatDelay,
+			   timer,  (XtPointer) w );
+	  }
+      }
 }
 
-static button_where
-what_button (XlwScrollBarWidget w, int mouse_x, int mouse_y)
+static int what_button(XlwScrollBarWidget w, int mouse_x, int mouse_y)
 {
-  int width   = widget_w (w);
-  int height  = widget_h (w);
-  int arrow_height = arrow_h (w);
+  int x, y, width, height, arrow_height_top, arrow_height_bottom;
+  int where;
+
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
 
-  mouse_x -= widget_x (w);
-  mouse_y -= widget_y (w);
+#if 0
+  arrow_height = w->sb.showArrows ? arrow_h(w) : 0;
+#endif
+  if( w->sb.showArrows )
+      {
+      if( arrow_same_end(w) )
+	  {
+	  arrow_height_top = 0;
+	  arrow_height_bottom = 2*arrow_h(w);
+	  }
+      else
+	  {
+	  arrow_height_top = arrow_height_bottom = arrow_h(w);
+	  }
+      }
+  else
+      {
+      arrow_height_top = arrow_height_bottom = 0;
+      }
 
-  if (mouse_x < 0 || mouse_x >= width ||
-      mouse_y < 0 || mouse_y >= height)
-    return BUTTON_NONE;
+  where = BUTTON_NONE;
 
-  if (w->sb.showArrows)
-    {
-      if (mouse_y >= (height -= arrow_height))
-	return BUTTON_DOWN_ARROW;
-      
-      if (arrow_same_end (w))
-	{
-	  if (mouse_y >= (height -= arrow_height))
-	    return BUTTON_UP_ARROW;
-	}
+  if( mouse_x > x && mouse_x < (x + width) )
+      {
+      if( mouse_y > (y + arrow_height_top) && mouse_y < (y + height - arrow_height_bottom) )
+	  {
+	  if( mouse_y < (y + w->sb.above + arrow_height_top) )
+	      {
+	      where = BUTTON_TROUGH_ABOVE;
+	      }
+	  else if( mouse_y > (y + w->sb.above + w->sb.ss + arrow_height_top) )
+	      {
+	      where = BUTTON_TROUGH_BELOW;
+	      }
+	  else
+	      {
+	      where = BUTTON_KNOB;
+	      }
+	  }
+      else if( arrow_same_end(w) )
+	  {
+	  if( mouse_y > (y + height - arrow_height_bottom + 1) && mouse_y < (y + height) )
+	      {
+	      if( mouse_y < (y + height - arrow_height_bottom/2) )
+		  {
+		  where = BUTTON_UP_ARROW;
+		  }
+	      else
+		  {
+		  where = BUTTON_DOWN_ARROW;
+		  }
+	      }
+	  }
       else
-	if ( (mouse_y -= arrow_height) < 0)
-	  return BUTTON_UP_ARROW;
-    }
-  
-  if ( (mouse_y -= w->sb.above) < 0)
-    return BUTTON_TROUGH_ABOVE;
-
-  if ( (mouse_y -= w->sb.ss) < 0)
-    return BUTTON_SLIDER;
-
-  return BUTTON_TROUGH_BELOW;
+	  {
+	  if( mouse_y > y && mouse_y < (y + arrow_height_top) )
+	      {
+	      where = BUTTON_UP_ARROW;
+	      }
+	  else if( mouse_y > (y + height - arrow_height_bottom + 1) && mouse_y < (y + height) )
+	      {
+	      where = BUTTON_DOWN_ARROW;
+	      }
+	  }
+      }
+#if 0
+  if( mouse_x > x && mouse_x < (x + width) )
+      {
+      if( mouse_y > (y + arrow_height) && mouse_y < (y + height - arrow_height) )
+	  {
+	  if( mouse_y < (y+w->sb.above+arrow_height) )
+	      {
+	      where = BUTTON_TROUGH_ABOVE;
+	      }
+	  else if( mouse_y > (y + w->sb.above + w->sb.ss + arrow_height) )
+	      {
+	      where = BUTTON_TROUGH_BELOW;
+	      }
+	  else
+	      {
+	      where = BUTTON_KNOB;
+	      }
+	  }
+      else if( mouse_y > y && mouse_y < (y + arrow_height) )
+	  {
+	  where = BUTTON_UP_ARROW;
+	  }
+      else if( mouse_y > (y + height - arrow_height + 1) && mouse_y < (y + height) )
+	  {
+	  where = BUTTON_DOWN_ARROW;
+	  }
+      }
+#endif
+  return( where );
 }
 
-static void
-PageDownOrRight (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+#define FORCED_SCROLL_NONE		0
+#define FORCED_SCROLL_DOWNRIGHT	1
+#define FORCED_SCROLL_UPLEFT	2
+
+int forced_scroll_flag = FORCED_SCROLL_NONE;
+
+/*
+** PageDownOrRight
+*/
+static void PageDownOrRight(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  w->sb.forced_scroll = FORCED_SCROLL_DOWNRIGHT;
-  Select (widget, event, parms, num_parms);
-  w->sb.forced_scroll = FORCED_SCROLL_NONE;
+  forced_scroll_flag = FORCED_SCROLL_DOWNRIGHT;
+  Select(widget, event, parms, num_parms);
+  forced_scroll_flag = FORCED_SCROLL_NONE;
 }
 
-static void
-PageUpOrLeft (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** PageUpOrLeft
+*/
+static void PageUpOrLeft(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  w->sb.forced_scroll = FORCED_SCROLL_UPLEFT;
-  Select (widget, event, parms, num_parms);
-  w->sb.forced_scroll = FORCED_SCROLL_NONE;
+  forced_scroll_flag = FORCED_SCROLL_UPLEFT;
+  Select(widget, event, parms, num_parms);
+  forced_scroll_flag = FORCED_SCROLL_NONE;
 }
 
-static void
-Select (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** Select
+*/
+static void Select(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  button_where sb_button;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
+  int mouse_x, mouse_y;
+  int reason, last_value;
+  int sb_button;
 
-  int mouse_x = event_x (w, event);
-  int mouse_y = event_y (w, event);
+  DBUG(fprintf(stderr, "Select:\n"));
 
-  int last_value = w->sb.savedValue = w->sb.value;
-  int reason     = XmCR_NONE;
+  mouse_x = event_x( w, event );
+  mouse_y = event_y( w, event );
 
-  XtGrabKeyboard ((Widget) w, False, GrabModeAsync, GrabModeAsync,
-		  event->xbutton.time);
+  w->sb.savedValue = w->sb.value;
+
+  last_value = w->sb.value;
+  reason     = XmCR_NONE;
 
-  sb_button = what_button (w, mouse_x, mouse_y);
+  XtGrabKeyboard( (Widget)w, False, GrabModeAsync, GrabModeAsync, event->xbutton.time );
+
+  sb_button = what_button(w, mouse_x, mouse_y);
 
-  if (w->sb.forced_scroll != FORCED_SCROLL_NONE)
+  if ( forced_scroll_flag != FORCED_SCROLL_NONE )
     {
-      switch (sb_button)
+      switch ( sb_button )
 	{
 	case BUTTON_TROUGH_ABOVE:
 	case BUTTON_TROUGH_BELOW:
-	case BUTTON_SLIDER:
+	case BUTTON_KNOB:
 	  sb_button= BUTTON_NONE; /* cause next switch to fall through */
-	  if (w->sb.forced_scroll == FORCED_SCROLL_UPLEFT)
+	  if ( forced_scroll_flag == FORCED_SCROLL_UPLEFT )
 	    {
-	      decrement_value (w, w->sb.pageIncrement);
+	      w->sb.value = safe_subtract( w->sb.value, w->sb.pageIncrement );
 	      w->sb.armed = ARM_PAGEUP;
 	      reason      = XmCR_PAGE_DECREMENT;
 	      break;
 	    }
-	  else if (w->sb.forced_scroll == FORCED_SCROLL_DOWNRIGHT)
+	  else if ( forced_scroll_flag == FORCED_SCROLL_DOWNRIGHT )
 	    {
-	      increment_value (w, w->sb.pageIncrement);
+	      w->sb.value = safe_add( w->sb.value, w->sb.pageIncrement );
 	      w->sb.armed = ARM_PAGEDOWN;
 	      reason      = XmCR_PAGE_INCREMENT;
 	      break;
@@ -1663,223 +1855,277 @@
 	}
     }
 
-  switch (sb_button)
-    {
-    case BUTTON_TROUGH_ABOVE:
-      decrement_value (w, w->sb.pageIncrement);
-      w->sb.armed = ARM_PAGEUP;
-      reason      = XmCR_PAGE_DECREMENT;
-      break;
-    case BUTTON_TROUGH_BELOW:
-      increment_value (w, w->sb.pageIncrement);
-      w->sb.armed = ARM_PAGEDOWN;
-      reason      = XmCR_PAGE_INCREMENT;
-      break;
-    case BUTTON_SLIDER:
-      w->sb.lastY = mouse_y;
-      w->sb.armed = ARM_SLIDER;
-      draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
-      break;
-    case BUTTON_UP_ARROW:
-      if (event->xbutton.state & ControlMask)
-	{
-	  w->sb.value = w->sb.minimum;
-	  reason      = XmCR_TO_TOP;
-	}
-      else
-	{
-	  decrement_value (w, w->sb.increment);
-	  reason      = XmCR_DECREMENT;
-	}
-      w->sb.armed = ARM_UP;
-      redraw_up_arrow (w, True, False);
-      break;
-    case BUTTON_DOWN_ARROW:
-      if (event->xbutton.state & ControlMask)
-	{
-	  w->sb.value = w->sb.maximum;
-	  reason      = XmCR_TO_BOTTOM;
-	}
-      else
-	{
-	  increment_value (w, w->sb.increment);
-	  reason      = XmCR_INCREMENT;
-	}
-      w->sb.armed = ARM_DOWN;
-      redraw_down_arrow (w, True, False);
-      break;
-    }
+  switch( sb_button )
+      {
+      case BUTTON_TROUGH_ABOVE:
+	  w->sb.value = safe_subtract( w->sb.value, w->sb.pageIncrement );
+	  w->sb.armed = ARM_PAGEUP;
+	  reason      = XmCR_PAGE_DECREMENT;
+	  break;
+      case BUTTON_TROUGH_BELOW:
+	  w->sb.value = safe_add( w->sb.value, w->sb.pageIncrement );
+	  w->sb.armed = ARM_PAGEDOWN;
+	  reason      = XmCR_PAGE_INCREMENT;
+	  break;
+      case BUTTON_KNOB:
+	  w->sb.lastY = mouse_y;
+	  w->sb.armed = ARM_KNOB;
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
+	  break;
+      case BUTTON_UP_ARROW:
+	  if( event->xbutton.state & ControlMask )
+	      {
+	      w->sb.value = INT_MIN;
+	      w->sb.armed = ARM_UP;
+	      reason      = XmCR_TO_TOP;
+	      }
+	  else
+	      {
+	      w->sb.value = safe_subtract( w->sb.value, w->sb.increment );
+	      w->sb.armed = ARM_UP;
+	      reason      = XmCR_DECREMENT;
+	      }
+	  redraw_up_arrow(w, True, False);
+	  break;
+      case BUTTON_DOWN_ARROW:
+	  if( event->xbutton.state & ControlMask )
+	      {
+	      w->sb.value = INT_MAX;
+	      w->sb.armed = ARM_DOWN;
+	      reason      = XmCR_TO_BOTTOM;
+	      }
+	  else
+	      {
+	      w->sb.value = safe_add( w->sb.value, w->sb.increment );
+	      w->sb.armed = ARM_DOWN;
+	      reason      = XmCR_INCREMENT;
+	      }
+	  redraw_down_arrow(w, True, False);
+	  break;
+      }
 
-  verify_values (w);
-
-  if (last_value != w->sb.value)
-    {
-      seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
-      draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
-	  
-      call_callbacks (w, reason, w->sb.value, mouse_y, event);
+  verify_values(w);
 
-      if (w->sb.timerActive)
-	XtRemoveTimeOut (w->sb.timerId);
+  if( last_value != w->sb.value )
+      {
+      seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
+      draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
+	  
+      call_callbacks( w, reason, w->sb.value, mouse_y, event );
 
-      w->sb.timerId =
-	XtAppAddTimeOut (XtWidgetToApplicationContext ((Widget) w),
-			 (unsigned long) w->sb.initialDelay,
-			 timer,  (XtPointer) w);
-      w->sb.timerActive = True;
-    }
+      XtAppAddTimeOut( XtWidgetToApplicationContext((Widget)w),
+		       (unsigned long) w->sb.initialDelay,
+		       timer,  (XtPointer) w );
+      }
 
-  CHECK (w);
+  CHECK(w);
 }
 
-static void
-Drag (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** Drag
+*/
+static void Drag(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
+  int diff;
+  int height, mouse_y;
+  int last_value, last_above;
+
+  DBUG(fprintf(stderr, "Drag:\n"));
 
-  if (w->sb.armed == ARM_SLIDER)
-    {
-      int mouse_y = event_y (w, event);
-      int diff    = mouse_y - w->sb.lastY;
+  if( w->sb.armed == ARM_KNOB )
+      {
+      height  = widget_h(w);
+      if( w->sb.showArrows ) height -= (2*arrow_h(w));
+
+      mouse_y = event_y( w, event );
+
+      diff = mouse_y - w->sb.lastY;
+
+      last_above = w->sb.above;
+      last_value = w->sb.value;
 
-      if (diff < -(w->sb.above)) /* up */
-	{
-	  mouse_y -= (diff + w->sb.above);
-	  diff = -(w->sb.above);
-	}
-      else if (diff > w->sb.below) /* down */
-	{
-	  mouse_y -= (diff - w->sb.below);
-	  diff = w->sb.below;
-	}
+      if( diff < 0 )
+	  {
+	  /* up */
+	  w->sb.above -= (-diff);
+	  if( w->sb.above < 0 )
+	      {
+	      mouse_y = (mouse_y - w->sb.above);
+	      w->sb.above = 0;
+	      diff = 0;
+	      w->sb.below = height - w->sb.ss;
+	      }
+	  w->sb.below -= diff;
+	  CHECK(w);
+	  }
+      else if( diff > 0 )
+	  {
+	  /* down */
+	  w->sb.above += diff;
+	  if( w->sb.above + w->sb.ss > height )
+	      {
+	      mouse_y = height + (mouse_y - (w->sb.above + w->sb.ss));
+	      w->sb.above = height - w->sb.ss;
+	      diff = 0;
+	      w->sb.below = 0;
+	      }
+	  w->sb.below -= diff;
+	  CHECK(w);
+	  }
 
-      if (diff)
-	{
-	  w->sb.above += diff;
-	  w->sb.below -= diff;
-
-	  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
+      if( last_above != w->sb.above )
+	  {
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
 
 	  w->sb.lastY = mouse_y;
 
-	  w->sb.value = value_from_pixel (w, w->sb.above);
-	  verify_values (w);
-	  CHECK (w);
+	  w->sb.value = value_from_pixel(w, w->sb.above);
+	  verify_values(w);
+	  CHECK(w);
 
-	  call_callbacks (w, XmCR_DRAG, w->sb.value, event_y (w, event), event);
-	}
-    }
-  CHECK (w);
+	  if( w->sb.value != last_value )
+	      {
+	      call_callbacks( w, XmCR_DRAG, w->sb.value, event_y(w, event), event );
+	      }
+	  }
+      }
+  CHECK(w);
 }
 
-static void
-Release (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** Release
+*/
+static void Release(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
+
+  DBUG(fprintf(stderr, "EndDrag:\n"));
 
-  switch (w->sb.armed)
-    {
-    case ARM_SLIDER:
-      call_callbacks (w, XmCR_VALUE_CHANGED, w->sb.value, event_y (w, event), event);
-      w->sb.armed = ARM_NONE;
-      draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
-      break;
-    case ARM_UP:
-      redraw_up_arrow (w, False, False);
-      break;
-    case ARM_DOWN:
-      redraw_down_arrow (w, False, False);
-      break;
-    }
+  switch( w->sb.armed )
+      {
+      case ARM_KNOB:
+	  call_callbacks( w, XmCR_VALUE_CHANGED, w->sb.value, event_y(w, event), event );
+	  w->sb.armed = ARM_NONE;
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
+	  break;
+      case ARM_UP:
+	  redraw_up_arrow(w, False, False);
+	  break;
+      case ARM_DOWN:
+	  redraw_down_arrow(w, False, False);
+	  break;
+      }
 
-  XtUngrabKeyboard ((Widget) w, event->xbutton.time);
+  XtUngrabKeyboard( (Widget)w, event->xbutton.time );
 
   w->sb.armed = ARM_NONE;
 }
 
-static void
-Jump (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** Jump
+*/
+static void Jump(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
-  int last_value;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
+  int x, y, width, height, mouse_x, mouse_y;
+  int arrow_height;
+  int last_above, last_value;
 
-  int mouse_x = event_x (w, event);
-  int mouse_y = event_y (w, event);
+  DBUG(fprintf(stderr, "Jump:\n"));
 
-  int scroll_region_y = widget_y (w);
-  int scroll_region_h = widget_h (w);
-  
-  if (w->sb.showArrows)
-    {
-      int arrow_height = arrow_h (w);
-      scroll_region_h -= 2 * arrow_height;
-      if (!arrow_same_end (w))
-	scroll_region_y += arrow_height;
-    }
+  x       = widget_x(w);
+  y       = widget_y(w);
+  width   = widget_w(w);
+  height  = widget_h(w);
+  mouse_x = event_x( w, event );
+  mouse_y = event_y( w, event );
+
+  arrow_height = w->sb.showArrows ? arrow_h(w) : 0;
 
-  XtGrabKeyboard ((Widget) w, False, GrabModeAsync, GrabModeAsync,
-		  event->xbutton.time);
+  XtGrabKeyboard( (Widget)w, False, GrabModeAsync, GrabModeAsync, event->xbutton.time );
+
+  switch( what_button(w, mouse_x, mouse_y) )
+      {
+      case BUTTON_TROUGH_ABOVE:
+      case BUTTON_TROUGH_BELOW:
+      case BUTTON_KNOB:
+	  w->sb.savedValue = w->sb.value;
+
+	  height -= (2*arrow_height);
+	  y      += arrow_height;
 
-  switch (what_button (w, mouse_x, mouse_y))
-    {
-    case BUTTON_TROUGH_ABOVE:
-    case BUTTON_TROUGH_BELOW:
-    case BUTTON_SLIDER:
-      w->sb.savedValue = w->sb.value;
+	  last_above = w->sb.above;
+	  last_value = w->sb.value;
+
+	  w->sb.armed = ARM_KNOB;
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
 
-      last_value = w->sb.value;
-
-      w->sb.above = mouse_y - (w->sb.ss / 2) - scroll_region_y;
-      if (w->sb.above < 0)
-	w->sb.above = 0;
-      else if (w->sb.above + w->sb.ss > scroll_region_h) 
-	w->sb.above = scroll_region_h - w->sb.ss;
+	  w->sb.above = mouse_y - (w->sb.ss / 2) - arrow_height;
+	  if( w->sb.above < 0 )
+	      {
+	      w->sb.above = 0;
+	      }
+	  else if( w->sb.above + w->sb.ss > height )
+	      {
+	      w->sb.above = height - w->sb.ss;
+	      }
+	  w->sb.below = (height - (w->sb.ss + w->sb.above));
 
-      w->sb.below = scroll_region_h - w->sb.ss - w->sb.above;
+	  if( last_above != w->sb.above )
+	      {
+	      draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
 
-      w->sb.armed = ARM_SLIDER;
-      draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
-
-      w->sb.value = value_from_pixel (w, w->sb.above);
-      verify_values (w);
-      CHECK (w);
+	      w->sb.value = value_from_pixel(w, w->sb.above);
+	      verify_values(w);
+	      CHECK(w);
 
-      w->sb.lastY = mouse_y;
+	      w->sb.lastY = mouse_y;
+	      w->sb.lastY = w->sb.above + arrow_height + (w->sb.ss / 2);
 
-      if (w->sb.value != last_value)
-	call_callbacks (w, XmCR_DRAG, w->sb.value, mouse_y, event);
-      
-      break;
-    }
-  CHECK (w);
+	      if( w->sb.value != last_value )
+		  {
+		  call_callbacks( w, XmCR_DRAG, w->sb.value, event_y(w, event), event );
+		  }
+	      }
+	  break;
+      }
+  CHECK(w);
 }
 
-static void
-Abort (Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
+/*
+** Abort
+*/
+static void Abort(Widget widget, XEvent *event, String *parms, Cardinal *num_parms)
 {
-  XlwScrollBarWidget w = (XlwScrollBarWidget) widget;
+  XlwScrollBarWidget w = (XlwScrollBarWidget)widget;
 
-  if (w->sb.armed != ARM_NONE)
-    {
-      if (w->sb.value != w->sb.savedValue)
-	{
+  DBUG(fprintf(stderr, "Abort:\n"));
+
+  if( w->sb.armed != ARM_NONE )
+      {
+      if( w->sb.value != w->sb.savedValue )
+	  {
 	  w->sb.value = w->sb.savedValue;
 
-	  seg_pixel_sizes (w, &w->sb.above, &w->sb.ss, &w->sb.below);
-	  draw_slider (w, w->sb.above, w->sb.ss, w->sb.below);
+	  seg_pixel_sizes(w, &w->sb.above, &w->sb.ss, &w->sb.below);
+	  draw_knob(w, w->sb.above, w->sb.ss, w->sb.below);
+
+	  call_callbacks( w, XmCR_VALUE_CHANGED, w->sb.value, event_y(w, event), event );
+	  }
 
-	  call_callbacks (w, XmCR_VALUE_CHANGED, w->sb.value,
-			  event_y (w, event), event);
-	}
-
-      switch (w->sb.armed)
-	{
-	case ARM_UP:   redraw_up_arrow   (w, False, False); break;
-	case ARM_DOWN: redraw_down_arrow (w, False, False); break;
-	}
+      switch( w->sb.armed )
+	  {
+	  case ARM_UP:
+	      redraw_up_arrow(w, False, False);
+	      break;
+	  case ARM_DOWN:
+	      redraw_down_arrow(w, False, False);
+	      break;
+	  }
 
       w->sb.armed = ARM_NONE;
 
-      XtUngrabKeyboard ((Widget) w, event->xbutton.time);
-    }
+      XtUngrabKeyboard( (Widget)w, event->xbutton.time );
+      }
 }