Mercurial > hg > xemacs-beta
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 ); + } }