/* vi:set ts=8 sts=4 sw=4 noet: */
/*
 * MODIFIED ATHENA SCROLLBAR (USING ARROWHEADS AT ENDS OF TRAVEL)
 * Modifications Copyright 1992 by Mitch Trachtenberg
 * Rights, permissions, and disclaimer of warranty are as in the DEC and MIT
 * notice below.
 * $XConsortium: Scrollbar.c,v 1.72 94/04/17 20:12:40 kaleb Exp $
 */

/*
 * Modified for Vim by Bill Foster and Bram Moolenaar
 */

/*

Copyright (c) 1987, 1988, 1994	X Consortium

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE X
CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of the X Consortium shall not be
used in advertising or otherwise to promote the sale, use or other dealings in
this Software without prior written authorization from the X Consortium.

Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.

			All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and that
the name of Digital not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.

DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

// ScrollBar.c
// created by weissman, Mon Jul  7 13:20:03 1986
// converted by swick, Thu Aug 27 1987

#include "vim.h"

#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>

#include <X11/Xaw/XawInit.h>
#include "gui_at_sb.h"

#include <X11/Xmu/Drawing.h>

// Private definitions.

static char defaultTranslations[] =
    "<Btn1Down>: NotifyScroll()\n\
     <Btn2Down>: MoveThumb() NotifyThumb()\n\
     <Btn3Down>: NotifyScroll()\n\
     <Btn4Down>: ScrollOneLineUp()\n\
     Shift<Btn4Down>: ScrollPageUp()\n\
     <Btn5Down>: ScrollOneLineDown()\n\
     Shift<Btn5Down>: ScrollPageDown()\n\
     <Btn1Motion>: HandleThumb()\n\
     <Btn3Motion>: HandleThumb()\n\
     <Btn2Motion>: MoveThumb() NotifyThumb()\n\
     <BtnUp>: EndScroll()";

static float floatZero = 0.0;

#define Offset(field) XtOffsetOf(ScrollbarRec, field)

static XtResource resources[] =
{
  {XtNlength, XtCLength, XtRDimension, sizeof(Dimension),
       Offset(scrollbar.length), XtRImmediate, (XtPointer) 1},
  {XtNthickness, XtCThickness, XtRDimension, sizeof(Dimension),
       Offset(scrollbar.thickness), XtRImmediate, (XtPointer) 14},
  {XtNorientation, XtCOrientation, XtROrientation, sizeof(XtOrientation),
      Offset(scrollbar.orientation), XtRImmediate, (XtPointer) XtorientVertical},
  {XtNscrollProc, XtCCallback, XtRCallback, sizeof(XtPointer),
       Offset(scrollbar.scrollProc), XtRCallback, NULL},
  {XtNthumbProc, XtCCallback, XtRCallback, sizeof(XtPointer),
       Offset(scrollbar.thumbProc), XtRCallback, NULL},
  {XtNjumpProc, XtCCallback, XtRCallback, sizeof(XtPointer),
       Offset(scrollbar.jumpProc), XtRCallback, NULL},
  {XtNthumb, XtCThumb, XtRBitmap, sizeof(Pixmap),
       Offset(scrollbar.thumb), XtRImmediate, (XtPointer) XtUnspecifiedPixmap},
  {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
       Offset(scrollbar.foreground), XtRString, XtDefaultForeground},
  {XtNshown, XtCShown, XtRFloat, sizeof(float),
       Offset(scrollbar.shown), XtRFloat, (XtPointer)&floatZero},
  {XtNtopOfThumb, XtCTopOfThumb, XtRFloat, sizeof(float),
       Offset(scrollbar.top), XtRFloat, (XtPointer)&floatZero},
  {XtNmaxOfThumb, XtCMaxOfThumb, XtRFloat, sizeof(float),
       Offset(scrollbar.max), XtRFloat, (XtPointer)&floatZero},
  {XtNminimumThumb, XtCMinimumThumb, XtRDimension, sizeof(Dimension),
       Offset(scrollbar.min_thumb), XtRImmediate, (XtPointer) 7},
  {XtNshadowWidth, XtCShadowWidth, XtRDimension, sizeof(Dimension),
       Offset(scrollbar.shadow_width), XtRImmediate, (XtPointer) 1},
  {XtNtopShadowPixel, XtCTopShadowPixel, XtRPixel, sizeof(Pixel),
       Offset(scrollbar.top_shadow_pixel), XtRString, XtDefaultBackground},
  {XtNbottomShadowPixel, XtCBottomShadowPixel, XtRPixel, sizeof(Pixel),
       Offset(scrollbar.bot_shadow_pixel), XtRString, XtDefaultForeground},
  {XtNlimitThumb, XtCLimitThumb, XtRBool, sizeof(Bool),
       Offset(scrollbar.limit_thumb), XtRImmediate, (XtPointer)0}
};
#undef Offset

static void ClassInitialize(void);
static void Initialize(Widget, Widget, ArgList, Cardinal *);
static void Destroy(Widget);
static void Realize(Widget, Mask *, XSetWindowAttributes *);
static void Resize(Widget);
static void Redisplay(Widget, XEvent *, Region);
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *);

static void HandleThumb(Widget, XEvent *, String *, Cardinal *);
static void MoveThumb(Widget, XEvent *, String *, Cardinal *);
static void NotifyThumb(Widget, XEvent *, String *, Cardinal *);
static void NotifyScroll(Widget, XEvent *, String *, Cardinal *);
static void EndScroll(Widget, XEvent *, String *, Cardinal *);
static void ScrollOneLineUp(Widget, XEvent *, String *, Cardinal *);
static void ScrollOneLineDown(Widget, XEvent *, String *, Cardinal *);
static void ScrollPageUp(Widget, XEvent *, String *, Cardinal *);
static void ScrollPageDown(Widget, XEvent *, String *, Cardinal *);
static void ScrollSome(Widget w, XEvent *event, int call_data);
static void _Xaw3dDrawShadows(Widget, XEvent *, Region, int);
static void AllocTopShadowGC(Widget);
static void AllocBotShadowGC(Widget);

static XtActionsRec actions[] =
{
    {"HandleThumb",	HandleThumb},
    {"MoveThumb",	MoveThumb},
    {"NotifyThumb",	NotifyThumb},
    {"NotifyScroll",	NotifyScroll},
    {"EndScroll",	EndScroll},
    {"ScrollOneLineUp", ScrollOneLineUp},
    {"ScrollOneLineDown", ScrollOneLineDown},
    {"ScrollPageUp",	ScrollPageUp},
    {"ScrollPageDown",	ScrollPageDown}
};


ScrollbarClassRec vim_scrollbarClassRec =
{
  { // core fields
    /* superclass	*/  (WidgetClass) &simpleClassRec,
    /* class_name	*/  "Scrollbar",
    /* size		*/  sizeof(ScrollbarRec),
    /* class_initialize	*/  ClassInitialize,
    /* class_part_init	*/  NULL,
    /* class_inited	*/  FALSE,
    /* initialize	*/  Initialize,
    /* initialize_hook	*/  NULL,
    /* realize		*/  Realize,
    /* actions		*/  actions,
    /* num_actions	*/  XtNumber(actions),
    /* resources	*/  resources,
    /* num_resources	*/  XtNumber(resources),
    /* xrm_class	*/  NULLQUARK,
    /* compress_motion	*/  TRUE,
    /* compress_exposure*/  TRUE,
    /* compress_enterleave*/	TRUE,
    /* visible_interest */  FALSE,
    /* destroy		*/  Destroy,
    /* resize		*/  Resize,
    /* expose		*/  Redisplay,
    /* set_values	*/  SetValues,
    /* set_values_hook	*/  NULL,
    /* set_values_almost */ XtInheritSetValuesAlmost,
    /* get_values_hook	*/  NULL,
    /* accept_focus	*/  NULL,
    /* version		*/  XtVersion,
    /* callback_private */  NULL,
    /* tm_table		*/  defaultTranslations,
    /* query_geometry	*/  XtInheritQueryGeometry,
    /* display_accelerator*/	XtInheritDisplayAccelerator,
    /* extension	*/  NULL
  },
  { // simple fields
    /* change_sensitive	*/  XtInheritChangeSensitive,
#ifndef OLDXAW
    /* extension */	    NULL
#endif
  },
  { // scrollbar fields
    /* empty	    */	    0
  }
};

WidgetClass vim_scrollbarWidgetClass = (WidgetClass)&vim_scrollbarClassRec;

#define NoButton -1
#define PICKLENGTH(widget, x, y) \
    ((widget->scrollbar.orientation == XtorientHorizontal) ? (x) : (y))
#define AT_MIN(x,y)    ((x) < (y) ? (x) : (y))
#define AT_MAX(x,y)    ((x) > (y) ? (x) : (y))

#define LINE_DELAY	300
#define PAGE_DELAY	300
#define LINE_REPEAT	 50
#define PAGE_REPEAT	250

    static void
ClassInitialize(void)
{
    XawInitializeWidgetSet();
    XtAddConverter( XtRString, XtROrientation, XmuCvtStringToOrientation,
	    (XtConvertArgList)NULL, (Cardinal)0 );
}

#define MARGIN(sbw) (sbw)->scrollbar.thickness + (sbw)->scrollbar.shadow_width

    static void
FillArea(
    ScrollbarWidget	sbw,
    Position		top,
    Position		bottom,
    int			fill,
    int			draw_shadow)
{
    int tlen = bottom - top;	// length of thumb in pixels
    int sw, margin, floor;
    int lx, ly, lw, lh;

    if (bottom <= 0 || bottom <= top)
	return;
    sw = sbw->scrollbar.shadow_width;
    if (sw < 0)
	sw = 0;
    margin = MARGIN (sbw);
    floor = sbw->scrollbar.length - margin + 2;

    if (sbw->scrollbar.orientation == XtorientHorizontal)
    {
	lx = ((top < margin) ? margin : top);
	ly = sw;
	lw = (((top + tlen) > floor) ? floor - top : tlen);
	lh = sbw->core.height - 2 * sw;
    }
    else
    {
	lx = sw;
	ly = ((top < margin) ? margin : top);
	lw = sbw->core.width - 2 * sw;
	lh = (((top + tlen) > floor) ? floor - top : tlen);
    }
    if (lh <= 0 || lw <= 0)
	return;

    if (draw_shadow)
    {
	if (!(sbw->scrollbar.orientation == XtorientHorizontal))
	{
	    // Top border
	    XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.top_shadow_GC,
		    lx, ly, lx + lw - 1, ly);

	    // Bottom border
	    XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.bot_shadow_GC,
		    lx, ly + lh - 1, lx + lw - 1, ly + lh - 1);
	}
	else
	{
	    // Left border
	    XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.top_shadow_GC,
		    lx, ly, lx, ly + lh - 1);

	    // Right border
	    XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.bot_shadow_GC,
		    lx + lw - 1, ly, lx + lw - 1, ly + lh - 1);
	}
	return;
    }

    if (fill)
    {
	XFillRectangle(XtDisplay((Widget) sbw), XtWindow((Widget) sbw),
		sbw->scrollbar.gc,
		lx, ly, (unsigned int) lw, (unsigned int) lh);

	if (!(sbw->scrollbar.orientation == XtorientHorizontal))
	{
	    // Left border
	    XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.top_shadow_GC,
		    lx, ly, lx, ly + lh - 1);

	    // Right border
	    XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.bot_shadow_GC,
		    lx + lw - 1, ly, lx + lw - 1, ly + lh - 1);
	}
	else
	{
	    // Top border
	    XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.top_shadow_GC,
		    lx, ly, lx + lw - 1, ly);

	    // Bottom border
	    XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		    sbw->scrollbar.bot_shadow_GC,
		    lx, ly + lh - 1, lx + lw - 1, ly + lh - 1);
	}
    }
    else
    {
	XClearArea(XtDisplay((Widget) sbw), XtWindow((Widget) sbw),
		lx, ly, (unsigned int) lw, (unsigned int) lh, FALSE);
    }
}

/*
 * Paint the thumb in the area specified by sbw->top and
 * sbw->shown.	The old area is erased.  The painting and
 * erasing is done cleverly so that no flickering will occur.
 */
    static void
PaintThumb(ScrollbarWidget sbw)
{
    Position	    oldtop, oldbot, newtop, newbot;
    Dimension	    margin, tzl;

    margin = MARGIN (sbw);
    tzl = sbw->scrollbar.length - 2 * margin;
    newtop = margin + (int)(tzl * sbw->scrollbar.top);
    newbot = newtop + (int)(tzl * sbw->scrollbar.shown) + 1;
    if (newbot < newtop + (int)sbw->scrollbar.min_thumb)
	newbot = newtop + sbw->scrollbar.min_thumb;

    oldtop = sbw->scrollbar.topLoc;
    oldbot = oldtop + sbw->scrollbar.shownLength;
    sbw->scrollbar.topLoc = newtop;
    sbw->scrollbar.shownLength = newbot - newtop;
    if (XtIsRealized ((Widget) sbw))
    {
	if (newtop < oldtop)
	    FillArea(sbw, newtop, AT_MIN(newbot,	oldtop+1),1,0);
	if (newtop > oldtop)
	    FillArea(sbw, oldtop, AT_MIN(newtop,	oldbot	),0,0);
	if (newbot < oldbot)
	    FillArea(sbw, AT_MAX(newbot, oldtop),	oldbot,   0,0);
	if (newbot > oldbot)
	    FillArea(sbw, AT_MAX(newtop, oldbot-1), newbot,  1,0);

	// Only draw the missing shadows
	FillArea(sbw, newtop, newbot, 0, 1);
    }
}

    static void
PaintArrows(ScrollbarWidget sbw)
{
    XPoint	point[6];
    Dimension	thickness = sbw->scrollbar.thickness - 1;
    Dimension	size;
    Dimension	off;

    if (XtIsRealized((Widget) sbw))
    {
	if ((int)thickness * 2 > (int)sbw->scrollbar.length)
	{
	    size = sbw->scrollbar.length / 2;
	    off = (int)(thickness - size) / 2;
	}
	else
	{
	    size = thickness;
	    off = 0;
	}
	point[0].x = off + sbw->scrollbar.shadow_width;
	point[0].y = size;
	point[1].x = thickness - off - sbw->scrollbar.shadow_width;
	point[1].y = size;
	point[2].x = thickness / 2;
	point[2].y = sbw->scrollbar.shadow_width;

	point[3].x = off + sbw->scrollbar.shadow_width;
	point[3].y = sbw->scrollbar.length - size;
	point[4].x = thickness - off - sbw->scrollbar.shadow_width;
	point[4].y = sbw->scrollbar.length - size;
	point[5].x = thickness / 2;
	point[5].y = sbw->scrollbar.length - sbw->scrollbar.shadow_width - 1;

	// horizontal arrows require that x and y coordinates be swapped
	if (sbw->scrollbar.orientation == XtorientHorizontal)
	{
	    int n;
	    int swap;
	    for (n = 0; n < 6; n++)
	    {
		swap = point[n].x;
		point[n].x = point[n].y;
		point[n].y = swap;
	    }
	}
	// draw the up/left arrow
	XFillPolygon (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.gc,
		point, 3,
		Convex, CoordModeOrigin);
	XDrawLines (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.bot_shadow_GC,
		point, 3,
		CoordModeOrigin);
	XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.top_shadow_GC,
		point[0].x, point[0].y,
		point[2].x, point[2].y);
	// draw the down/right arrow
	XFillPolygon (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.gc,
		point+3, 3,
		Convex, CoordModeOrigin);
	XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.top_shadow_GC,
		point[3].x, point[3].y,
		point[4].x, point[4].y);
	XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.top_shadow_GC,
		point[3].x, point[3].y,
		point[5].x, point[5].y);
	XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw),
		sbw->scrollbar.bot_shadow_GC,
		point[4].x, point[4].y,
		point[5].x, point[5].y);
    }
}

    static void
Destroy(Widget w)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;
    if (sbw->scrollbar.timer_id != (XtIntervalId) 0)
	XtRemoveTimeOut (sbw->scrollbar.timer_id);
    XtReleaseGC(w, sbw->scrollbar.gc);
    XtReleaseGC(w, sbw->scrollbar.top_shadow_GC);
    XtReleaseGC(w, sbw->scrollbar.bot_shadow_GC);
}

    static void
CreateGC(Widget w)
{
    ScrollbarWidget	sbw = (ScrollbarWidget) w;
    XGCValues		gcValues;
    XtGCMask		mask;
    unsigned int	depth = 1;

    if (sbw->scrollbar.thumb == XtUnspecifiedPixmap)
    {
	sbw->scrollbar.thumb = XmuCreateStippledPixmap (XtScreen(w),
		    (Pixel) 1, (Pixel) 0, depth);
    }
    else if (sbw->scrollbar.thumb != None)
    {
	Window		root;
	int		x, y;
	unsigned int	width, height, bw;

	if (XGetGeometry (XtDisplay(w), sbw->scrollbar.thumb, &root, &x, &y,
		&width, &height, &bw, &depth) == 0)
	    emsg(_("Scrollbar Widget: Could not get geometry of thumb pixmap."));
    }

    gcValues.foreground = sbw->scrollbar.foreground;
    gcValues.background = sbw->core.background_pixel;
    mask = GCForeground | GCBackground;

    if (sbw->scrollbar.thumb != None)
    {
	gcValues.fill_style = FillSolid;
	mask |= GCFillStyle;
    }
    // the creation should be non-caching, because
    // we now set and clear clip masks on the gc returned
    sbw->scrollbar.gc = XtGetGC (w, mask, &gcValues);
}

    static void
SetDimensions(ScrollbarWidget sbw)
{
    if (sbw->scrollbar.orientation == XtorientVertical)
    {
	sbw->scrollbar.length = sbw->core.height;
	sbw->scrollbar.thickness = sbw->core.width;
    }
    else
    {
	sbw->scrollbar.length = sbw->core.width;
	sbw->scrollbar.thickness = sbw->core.height;
    }
}

    static void
Initialize(
    Widget	request UNUSED,	// what the client asked for
    Widget	new,		// what we're going to give him
    ArgList	args UNUSED,
    Cardinal	*num_args UNUSED)
{
    ScrollbarWidget sbw = (ScrollbarWidget) new;

    CreateGC(new);
    AllocTopShadowGC(new);
    AllocBotShadowGC(new);

    if (sbw->core.width == 0)
	sbw->core.width = (sbw->scrollbar.orientation == XtorientVertical)
	    ? sbw->scrollbar.thickness : sbw->scrollbar.length;

    if (sbw->core.height == 0)
	sbw->core.height = (sbw->scrollbar.orientation == XtorientHorizontal)
	    ? sbw->scrollbar.thickness : sbw->scrollbar.length;

    SetDimensions(sbw);
    sbw->scrollbar.scroll_mode = SMODE_NONE;
    sbw->scrollbar.timer_id = (XtIntervalId)0;
    sbw->scrollbar.topLoc = 0;
    sbw->scrollbar.shownLength = sbw->scrollbar.min_thumb;
}

    static void
Realize(
    Widget w,
    Mask *valueMask,
    XSetWindowAttributes *attributes)
{
    // The Simple widget actually stuffs the value in the valuemask.
    (*vim_scrollbarWidgetClass->core_class.superclass->core_class.realize)
	(w, valueMask, attributes);
}

    static Boolean
SetValues(
    Widget  current,	    // what I am
    Widget  request UNUSED, // what he wants me to be
    Widget  desired,	    // what I will become
    ArgList args UNUSED,
    Cardinal *num_args UNUSED)
{
    ScrollbarWidget	sbw = (ScrollbarWidget) current;
    ScrollbarWidget	dsbw = (ScrollbarWidget) desired;
    Boolean		redraw = FALSE;

/*
 * If these values are outside the acceptable range ignore them...
 */
    if (dsbw->scrollbar.top < 0.0 || dsbw->scrollbar.top > 1.0)
	dsbw->scrollbar.top = sbw->scrollbar.top;

    if (dsbw->scrollbar.shown < 0.0 || dsbw->scrollbar.shown > 1.0)
	dsbw->scrollbar.shown = sbw->scrollbar.shown;

/*
 * Change colors and stuff...
 */
    if (XtIsRealized(desired))
    {
	if (sbw->scrollbar.foreground != dsbw->scrollbar.foreground ||
		sbw->core.background_pixel != dsbw->core.background_pixel ||
		sbw->scrollbar.thumb != dsbw->scrollbar.thumb)
	{
	    XtReleaseGC(desired, sbw->scrollbar.gc);
	    CreateGC (desired);
	    redraw = TRUE;
	}
	if (sbw->scrollbar.top != dsbw->scrollbar.top ||
		sbw->scrollbar.shown != dsbw->scrollbar.shown)
	    redraw = TRUE;
    }
    return redraw;
}

    static void
Resize(Widget w)
{
    // ForgetGravity has taken care of background, but thumb may
    // have to move as a result of the new size.
    SetDimensions ((ScrollbarWidget) w);
    Redisplay(w, (XEvent*) NULL, (Region)NULL);
}


    static void
Redisplay(Widget w, XEvent *event, Region region)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;
    int x, y;
    unsigned int width, height;

    _Xaw3dDrawShadows(w, event, region, FALSE);

    if (sbw->scrollbar.orientation == XtorientHorizontal)
    {
	x = sbw->scrollbar.topLoc;
	y = 1;
	width = sbw->scrollbar.shownLength;
	height = sbw->core.height - 2;
    }
    else
    {
	x = 1;
	y = sbw->scrollbar.topLoc;
	width = sbw->core.width - 2;
	height = sbw->scrollbar.shownLength;
    }
    if (region == NULL ||
	    XRectInRegion (region, x, y, width, height) != RectangleOut)
    {
	// Forces entire thumb to be painted.
	sbw->scrollbar.topLoc = -(sbw->scrollbar.length + 1);
	PaintThumb (sbw);
    }
    // we'd like to be region aware here!!!!
    PaintArrows(sbw);
}


    static Boolean
CompareEvents(XEvent *oldEvent, XEvent *newEvent)
{
#define Check(field) \
    do { \
	if (newEvent->field != oldEvent->field) \
	    return False; \
    } while (0)

    Check(xany.display);
    Check(xany.type);
    Check(xany.window);

    switch (newEvent->type)
    {
	case MotionNotify:
	    Check(xmotion.state);
	    break;
	case ButtonPress:
	case ButtonRelease:
	    Check(xbutton.state);
	    Check(xbutton.button);
	    break;
	case KeyPress:
	case KeyRelease:
	    Check(xkey.state);
	    Check(xkey.keycode);
	    break;
	case EnterNotify:
	case LeaveNotify:
	    Check(xcrossing.mode);
	    Check(xcrossing.detail);
	    Check(xcrossing.state);
	    break;
    }
#undef Check

    return True;
}

struct EventData
{
    XEvent *oldEvent;
    int count;
};

    static Bool
PeekNotifyEvent(Display *dpy, XEvent *event, char *args)
{
    struct EventData *eventData = (struct EventData*)args;

    return ((++eventData->count == QLength(dpy)) // since PeekIf blocks
	|| CompareEvents(event, eventData->oldEvent));
}


    static Boolean
LookAhead(Widget w, XEvent *event)
{
    XEvent newEvent;
    struct EventData eventData;

    if (QLength (XtDisplay (w)) == 0)
	return False;

    eventData.count = 0;
    eventData.oldEvent = event;

    XPeekIfEvent (XtDisplay (w), &newEvent, PeekNotifyEvent, (char*)&eventData);

    return CompareEvents (event, &newEvent);
}


    static void
ExtractPosition(
    XEvent	    *event,
    Position	    *x,		// RETURN
    Position	    *y,		// RETURN
    unsigned int    *state)	// RETURN
{
    switch (event->type)
    {
	case MotionNotify:
	    *x = event->xmotion.x;
	    *y = event->xmotion.y;
	    if (state != NULL)
		*state = event->xmotion.state;
	    break;
	case ButtonPress:
	case ButtonRelease:
	    *x = event->xbutton.x;
	    *y = event->xbutton.y;
	    if (state != NULL)
		*state = event->xbutton.state;
	    break;
	case KeyPress:
	case KeyRelease:
	    *x = event->xkey.x;
	    *y = event->xkey.y;
	    if (state != NULL)
		*state = event->xkey.state;
	    break;
	case EnterNotify:
	case LeaveNotify:
	    *x = event->xcrossing.x;
	    *y = event->xcrossing.y;
	    if (state != NULL)
		*state = event->xcrossing.state;
	    break;
	default:
	    *x = 0; *y = 0;
	    if (state != NULL)
		*state = 0;
    }
}

    static void
HandleThumb(
    Widget w,
    XEvent *event,
    String *params,
    Cardinal *num_params)
{
    Position x, y, loc;
    ScrollbarWidget sbw = (ScrollbarWidget) w;

    ExtractPosition(event, &x, &y, (unsigned int *)NULL);
    loc = PICKLENGTH(sbw, x, y);
    // if the motion event puts the pointer in thumb, call Move and Notify
    // also call Move and Notify if we're already in continuous scroll mode
    if (sbw->scrollbar.scroll_mode == SMODE_CONT ||
	    (loc >= sbw->scrollbar.topLoc &&
	     loc <= sbw->scrollbar.topLoc + (int)sbw->scrollbar.shownLength))
    {
	XtCallActionProc(w, "MoveThumb", event, params, *num_params);
	XtCallActionProc(w, "NotifyThumb", event, params, *num_params);
    }
}

    static void
RepeatNotify(XtPointer client_data, XtIntervalId *idp UNUSED)
{
    ScrollbarWidget sbw = (ScrollbarWidget) client_data;
    int		    call_data;
    char	    mode = sbw->scrollbar.scroll_mode;
    unsigned long   rep;

    if (mode == SMODE_NONE || mode == SMODE_CONT)
    {
	sbw->scrollbar.timer_id = (XtIntervalId)0;
	return;
    }

    if (mode == SMODE_LINE_DOWN || mode == SMODE_LINE_UP)
    {
	call_data = ONE_LINE_DATA;
	rep = LINE_REPEAT;
    }
    else
    {
	call_data = ONE_PAGE_DATA;
	rep = PAGE_REPEAT;
    }

    if (mode == SMODE_PAGE_UP || mode == SMODE_LINE_UP)
	call_data = -call_data;

    XtCallCallbacks((Widget)sbw, XtNscrollProc, (XtPointer)(long_u)call_data);

    sbw->scrollbar.timer_id =
	XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)sbw),
		rep,
		RepeatNotify,
		client_data);
}

/*
 * Same as above, but for floating numbers.
 */
    static float
FloatInRange(float num, float small, float big)
{
    return (num < small) ? small : ((num > big) ? big : num);
}

    static void
ScrollOneLineUp(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollSome(w, event, -ONE_LINE_DATA);
}

    static void
ScrollOneLineDown(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollSome(w, event, ONE_LINE_DATA);
}

    static void
ScrollPageDown(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollSome(w, event, ONE_PAGE_DATA);
}

    static void
ScrollPageUp(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollSome(w, event, -ONE_PAGE_DATA);
}

    static void
ScrollSome(
    Widget	w,
    XEvent	*event,
    int		call_data)
{
    ScrollbarWidget	sbw = (ScrollbarWidget) w;

    if (sbw->scrollbar.scroll_mode == SMODE_CONT)   // if scroll continuous
	return;

    if (LookAhead(w, event))
	return;

    sbw->scrollbar.scroll_mode = SMODE_LINE_UP;
    XtCallCallbacks(w, XtNscrollProc, (XtPointer)(long_u)call_data);
}

    static void
NotifyScroll(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;
    Position	    x, y, loc;
    Dimension	    arrow_size;
    unsigned long   delay = 0;
    int		    call_data = 0;
    unsigned int    state;

    if (sbw->scrollbar.scroll_mode == SMODE_CONT)   // if scroll continuous
	return;

    if (LookAhead (w, event))
	return;

    ExtractPosition(event, &x, &y, &state);
    loc = PICKLENGTH(sbw, x, y);

    if ((int)sbw->scrollbar.thickness * 2 > (int)sbw->scrollbar.length)
	arrow_size = sbw->scrollbar.length / 2;
    else
	arrow_size = sbw->scrollbar.thickness;

    /*
     * handle CTRL modifier
     */
    if (state & ControlMask)
    {
	if (loc > sbw->scrollbar.topLoc + (Position)sbw->scrollbar.shownLength)
	    call_data = END_PAGE_DATA;
	else
	    call_data = -END_PAGE_DATA;
	sbw->scrollbar.scroll_mode = SMODE_NONE;
    }
    /*
     * handle first arrow zone
     */
    else if (loc < (Position)arrow_size)
    {
	call_data = -ONE_LINE_DATA;
	sbw->scrollbar.scroll_mode = SMODE_LINE_UP;
	delay = LINE_DELAY;
    }

    /*
     * handle last arrow zone
     */
    else if (loc > (Position)(sbw->scrollbar.length - arrow_size))
    {
	call_data = ONE_LINE_DATA;
	sbw->scrollbar.scroll_mode = SMODE_LINE_DOWN;
	delay = LINE_DELAY;
    }

    /*
     * handle zone "above" the thumb
     */
    else if (loc < sbw->scrollbar.topLoc)
    {
	call_data = -ONE_PAGE_DATA;
	sbw->scrollbar.scroll_mode = SMODE_PAGE_UP;
	delay = PAGE_DELAY;
    }

    /*
     * handle zone "below" the thumb
     */
    else if (loc > sbw->scrollbar.topLoc + (Position)sbw->scrollbar.shownLength)
    {
	call_data = ONE_PAGE_DATA;
	sbw->scrollbar.scroll_mode = SMODE_PAGE_DOWN;
	delay = PAGE_DELAY;
    }

    if (call_data)
	XtCallCallbacks(w, XtNscrollProc, (XtPointer)(long_u)call_data);

    // establish autoscroll
    if (delay)
	sbw->scrollbar.timer_id =
	    XtAppAddTimeOut(XtWidgetToApplicationContext(w),
					   delay, RepeatNotify, (XtPointer)w);
}

    static void
EndScroll(
    Widget w,
    XEvent *event UNUSED,
    String *params UNUSED,
    Cardinal *num_params UNUSED)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;

    sbw->scrollbar.scroll_mode = SMODE_NONE;
    // no need to remove any autoscroll timeout; it will no-op
    // because the scroll_mode is SMODE_NONE
    // but be sure to remove timeout in destroy proc
}

    static float
FractionLoc(ScrollbarWidget sbw, int x, int y)
{
    int	    margin;
    float   height, width;

    margin = MARGIN(sbw);
    x -= margin;
    y -= margin;
    height = (float)sbw->core.height - 2 * margin;
    width = (float)sbw->core.width - 2 * margin;
    return PICKLENGTH(sbw, x / width, y / height);
}

    static void
MoveThumb(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollbarWidget	sbw = (ScrollbarWidget)w;
    Position		x, y;
    float		top;
    char		old_mode = sbw->scrollbar.scroll_mode;

    sbw->scrollbar.scroll_mode = SMODE_CONT; // indicate continuous scroll

    if (LookAhead(w, event))
	return;

    if (!event->xmotion.same_screen)
	return;

    ExtractPosition(event, &x, &y, (unsigned int *)NULL);

    top = FractionLoc(sbw, x, y);

    if (old_mode != SMODE_CONT)		    // start dragging: set offset
    {
	if (event->xbutton.button == Button2)
	    sbw->scrollbar.scroll_off = sbw->scrollbar.shown / 2.;
	else
	    sbw->scrollbar.scroll_off = top - sbw->scrollbar.top;
    }

    top -= sbw->scrollbar.scroll_off;
    if (sbw->scrollbar.limit_thumb)
	top = FloatInRange(top, 0.0,
			sbw->scrollbar.max - sbw->scrollbar.shown + 0.000001);
    else
	top = FloatInRange(top, 0.0, sbw->scrollbar.max);

    sbw->scrollbar.top = top;
    PaintThumb(sbw);
    XFlush(XtDisplay(w));   // re-draw it before Notifying
}


    static void
NotifyThumb(
    Widget	w,
    XEvent	*event,
    String	*params UNUSED,
    Cardinal	*num_params UNUSED)
{
    ScrollbarWidget sbw = (ScrollbarWidget)w;
    // Use a union to avoid a warning for the weird conversion from float to
    // XtPointer.  Comes from Xaw/Scrollbar.c.
    union {
	XtPointer xtp;
	float xtf;
    } xtpf;

    if (LookAhead(w, event))
	return;

    // thumbProc is not pretty, but is necessary for backwards
    // compatibility on those architectures for which it work{s,ed};
    // the intent is to pass a (truncated) float by value.
    xtpf.xtf = sbw->scrollbar.top;
    XtCallCallbacks(w, XtNthumbProc, xtpf.xtp);
    XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
}

    static void
AllocTopShadowGC(Widget w)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;
    XtGCMask	    valuemask;
    XGCValues	    myXGCV;

    valuemask = GCForeground;
    myXGCV.foreground = sbw->scrollbar.top_shadow_pixel;
    sbw->scrollbar.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
}

    static void
AllocBotShadowGC(Widget w)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;
    XtGCMask	    valuemask;
    XGCValues	    myXGCV;

    valuemask = GCForeground;
    myXGCV.foreground = sbw->scrollbar.bot_shadow_pixel;
    sbw->scrollbar.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
}

    static void
_Xaw3dDrawShadows(
    Widget  gw,
    XEvent  *event UNUSED,
    Region  region,
    int	    out)
{
    XPoint  pt[6];
    ScrollbarWidget sbw = (ScrollbarWidget) gw;
    Dimension	s = sbw->scrollbar.shadow_width;
    /*
     * draw the shadows using the core part width and height,
     * and the scrollbar part shadow_width.
     *
     *	no point to do anything if the shadow_width is 0 or the
     *	widget has not been realized.
     */
    if (s > 0 && XtIsRealized(gw))
    {
	Dimension   h = sbw->core.height;
	Dimension   w = sbw->core.width;
	Dimension   wms = w - s;
	Dimension   hms = h - s;
	Display	    *dpy = XtDisplay (gw);
	Window	    win = XtWindow (gw);
	GC	top, bot;

	if (out)
	{
	    top = sbw->scrollbar.top_shadow_GC;
	    bot = sbw->scrollbar.bot_shadow_GC;
	}
	else
	{
	    top = sbw->scrollbar.bot_shadow_GC;
	    bot = sbw->scrollbar.top_shadow_GC;
	}

	// top-left shadow
	if ((region == NULL) ||
		(XRectInRegion (region, 0, 0, w, s) != RectangleOut) ||
		(XRectInRegion (region, 0, 0, s, h) != RectangleOut))
	{
	    pt[0].x = 0;    pt[0].y = h;
	    pt[1].x =	    pt[1].y = 0;
	    pt[2].x = w;    pt[2].y = 0;
	    pt[3].x = wms;  pt[3].y = s;
	    pt[4].x =	    pt[4].y = s;
	    pt[5].x = s;    pt[5].y = hms;
	    XFillPolygon (dpy, win, top, pt, 6, Complex, CoordModeOrigin);
	}

	// bottom-right shadow
	if ((region == NULL) ||
		(XRectInRegion (region, 0, hms, w, s) != RectangleOut) ||
		(XRectInRegion (region, wms, 0, s, h) != RectangleOut))
	{
	    pt[0].x = 0;    pt[0].y = h;
	    pt[1].x = w;    pt[1].y = h;
	    pt[2].x = w;    pt[2].y = 0;
	    pt[3].x = wms;  pt[3].y = s;
	    pt[4].x = wms;  pt[4].y = hms;
	    pt[5].x = s;    pt[5].y = hms;
	    XFillPolygon (dpy, win, bot, pt, 6, Complex, CoordModeOrigin);
	}
    }
}


/*
 * Set the scroll bar to the given location.
 */
    void
vim_XawScrollbarSetThumb(Widget w, double top, double shown, double max)
{
    ScrollbarWidget sbw = (ScrollbarWidget) w;

    if (sbw->scrollbar.scroll_mode == SMODE_CONT) // if still thumbing
	return;

    sbw->scrollbar.max = (max > 1.0) ? 1.0 :
		(max >= 0.0) ? max : sbw->scrollbar.max;

    sbw->scrollbar.top = (top > sbw->scrollbar.max) ? sbw->scrollbar.max :
		(top >= 0.0) ? top : sbw->scrollbar.top;

    sbw->scrollbar.shown = (shown > 1.0) ? 1.0 :
		(shown >= 0.0) ? shown : sbw->scrollbar.shown;

    PaintThumb(sbw);
}
