diff options
Diffstat (limited to 'vendor/x11iraf/obm/ObmW/Slider2.c')
-rw-r--r-- | vendor/x11iraf/obm/ObmW/Slider2.c | 640 |
1 files changed, 640 insertions, 0 deletions
diff --git a/vendor/x11iraf/obm/ObmW/Slider2.c b/vendor/x11iraf/obm/ObmW/Slider2.c new file mode 100644 index 00000000..0e21638d --- /dev/null +++ b/vendor/x11iraf/obm/ObmW/Slider2.c @@ -0,0 +1,640 @@ +/* Generated by wbuild from "Slider2.w" +** (generator version $Revision: 2.0 $ of $Date: 93/07/06 16:08:04 $) +*/ +#include <X11/IntrinsicP.h> +#include <X11/StringDefs.h> +#include "stip4.bm" +#include <stdio.h> +#include "Slider2P.h" +static void start( +#if NeedFunctionPrototypes +Widget,XEvent*,String*,Cardinal* +#endif +); +static void finish( +#if NeedFunctionPrototypes +Widget,XEvent*,String*,Cardinal* +#endif +); +static void drag( +#if NeedFunctionPrototypes +Widget,XEvent*,String*,Cardinal* +#endif +); + +static XtActionsRec actionsList[] = { +{"start", start}, +{"finish", finish}, +{"drag", drag}, +}; + +static char defaultTranslations[] = "\ +<Btn1Down>: start() \n\ +<Btn1Motion>: drag() \n\ +<Btn1Up>: finish() \n\ +"; +static void _resolve_inheritance( +#if NeedFunctionPrototypes +WidgetClass +#endif +); +static void compute_thumb( +#if NeedFunctionPrototypes +Widget,Position *,Position *,Dimension *,Dimension * +#endif +); +static void compute_inside( +#if NeedFunctionPrototypes +Widget,Position *,Position *,Dimension *,Dimension * +#endif +); +static void expose( +#if NeedFunctionPrototypes +Widget,XEvent *,Region +#endif +); +static void initialize( +#if NeedFunctionPrototypes +Widget ,Widget,ArgList ,Cardinal * +#endif +); +static void move_thumb( +#if NeedFunctionPrototypes +Widget,int ,int ,int ,int ,int ,int +#endif +); +static void compute_info( +#if NeedFunctionPrototypes +Widget,Position *,Position *,Dimension *,Dimension *,float *,float *,float *,float * +#endif +); +static Boolean set_values( +#if NeedFunctionPrototypes +Widget ,Widget ,Widget,ArgList ,Cardinal * +#endif +); +static void scroll_response( +#if NeedFunctionPrototypes +Widget ,XtPointer ,XtPointer +#endif +); +static void create_gc( +#if NeedFunctionPrototypes +Widget +#endif +); +static void create_graygc( +#if NeedFunctionPrototypes +Widget +#endif +); +static void create_thumbgc( +#if NeedFunctionPrototypes +Widget +#endif +); +static void create_thumblightgc( +#if NeedFunctionPrototypes +Widget +#endif +); +static void create_thumbdarkgc( +#if NeedFunctionPrototypes +Widget +#endif +); +/*ARGSUSED*/static void create_gc(self)Widget self; +{ + XtGCMask mask; + XGCValues values; + + if (((XfwfSlider2Widget)self)->xfwfLabel.gc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfLabel.gc); + values.background = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.foreground = ((XfwfSlider2Widget)self)->xfwfLabel.foreground; + values.font = ((XfwfSlider2Widget)self)->xfwfLabel.font->fid; + mask = GCFont | GCBackground | GCForeground; + ((XfwfSlider2Widget)self)->xfwfLabel.gc = XtGetGC(self, mask, &values); + + if (((XfwfSlider2Widget)self)->xfwfLabel.rv_gc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfLabel.rv_gc); + values.foreground = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.background = ((XfwfSlider2Widget)self)->xfwfLabel.foreground; + values.font = ((XfwfSlider2Widget)self)->xfwfLabel.font->fid; + mask = GCFont | GCBackground | GCForeground; + ((XfwfSlider2Widget)self)->xfwfLabel.rv_gc = XtGetGC(self, mask, &values); +} +/*ARGSUSED*/static void create_graygc(self)Widget self; +{ + XtGCMask mask; + XGCValues values; + + if (((XfwfSlider2Widget)self)->xfwfLabel.graygc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfLabel.graygc); + values.foreground = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.stipple = + XCreateBitmapFromData(XtDisplay(self), + RootWindowOfScreen(XtScreen(self)), + stip4_bits, stip4_width, stip4_height); + values.fill_style = FillStippled; + mask = GCForeground | GCStipple | GCFillStyle; + ((XfwfSlider2Widget)self)->xfwfLabel.graygc = XtGetGC(self, mask, &values); +} +/*ARGSUSED*/static void create_thumbgc(self)Widget self; +{ + XtGCMask mask; + XGCValues values; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc); + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbPixmap != NULL) { + mask = GCTile | GCFillStyle; + values.tile = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbPixmap; + values.fill_style = FillTiled; + } else { + mask = GCForeground; + values.foreground = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + } + ((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc = XtGetGC(self, mask, &values); +} +/*ARGSUSED*/static void create_thumblightgc(self)Widget self; +{ + XtGCMask mask; + XGCValues values; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc); + switch (((XfwfSlider2Widget)self)->xfwfFrame.shadowScheme) { + case XfwfColor: + mask = GCForeground; + values.foreground = ((XfwfSlider2Widget)self)->xfwfFrame.topShadowColor; + break; + case XfwfStipple: + mask = GCFillStyle | GCStipple | GCForeground | GCBackground; + values.fill_style = FillOpaqueStippled; + values.background = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.stipple = ((XfwfSlider2Widget)self)->xfwfFrame.topShadowStipple; + values.foreground = WhitePixelOfScreen(XtScreen(self)); + break; + case XfwfAuto: + if (DefaultDepthOfScreen(XtScreen(self)) > 4 + && ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfCommon_class.lighter_color(self, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor, &values.foreground)) { + mask = GCForeground; + } else { + mask = GCFillStyle | GCBackground | GCForeground | GCStipple; + values.fill_style = FillOpaqueStippled; + values.background = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.foreground = WhitePixelOfScreen(XtScreen(self)); + values.stipple = + XCreateBitmapFromData(XtDisplay(self), + RootWindowOfScreen(XtScreen(self)), + stip4_bits, stip4_width, stip4_height); + } + break; + } + ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc = XtGetGC(self, mask, &values); +} +/*ARGSUSED*/static void create_thumbdarkgc(self)Widget self; +{ + XtGCMask mask; + XGCValues values; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc != NULL) XtReleaseGC(self, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc); + switch (((XfwfSlider2Widget)self)->xfwfFrame.shadowScheme) { + case XfwfColor: + mask = GCForeground; + values.foreground = ((XfwfSlider2Widget)self)->xfwfFrame.bottomShadowColor; + break; + case XfwfStipple: + mask = GCFillStyle | GCStipple | GCForeground | GCBackground; + values.fill_style = FillOpaqueStippled; + values.stipple = ((XfwfSlider2Widget)self)->xfwfFrame.bottomShadowStipple; + values.foreground = BlackPixelOfScreen(XtScreen(self)); + values.background = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + break; + case XfwfAuto: + if (DefaultDepthOfScreen(XtScreen(self)) > 4 + && ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfCommon_class.darker_color(self, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor, &values.foreground)) { + mask = GCForeground; + } else { + mask = GCFillStyle | GCBackground | GCForeground | GCStipple; + values.fill_style = FillOpaqueStippled; + values.background = ((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor; + values.foreground = WhitePixelOfScreen(XtScreen(self)); + values.stipple = + XCreateBitmapFromData(XtDisplay(self), + RootWindowOfScreen(XtScreen(self)), + stip4_bits, stip4_width, stip4_height); + } + break; + } + ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc = XtGetGC(self, mask, &values); +} + +static XtResource resources[] = { +{XtNthumbColor,XtCThumbColor,XtRPixel,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.thumbColor),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.thumbColor),XtRString,(XtPointer)XtDefaultBackground }, +{XtNthumbPixmap,XtCThumbPixmap,XtRPixmap,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.thumbPixmap),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.thumbPixmap),XtRImmediate,(XtPointer)NULL }, +{XtNminsize,XtCMinsize,XtRDimension,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.minsize),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.minsize),XtRImmediate,(XtPointer)20 }, +{XtNthumbFrameWidth,XtCThumbFrameWidth,XtRDimension,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.thumbFrameWidth),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.thumbFrameWidth),XtRImmediate,(XtPointer)2 }, +{XtNthumbFrameType,XtCThumbFrameType,XtRFrameType,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.thumbFrameType),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.thumbFrameType),XtRImmediate,(XtPointer)XfwfRaised }, +{XtNscrollCallback,XtCScrollCallback,XtRCallback,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.scrollCallback),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.scrollCallback),XtRImmediate,(XtPointer)NULL }, +{XtNscrollResponse,XtCScrollResponse,XtRXTCallbackProc,sizeof(((XfwfSlider2Rec*)NULL)->xfwfSlider2.scrollResponse),XtOffsetOf(XfwfSlider2Rec,xfwfSlider2.scrollResponse),XtRImmediate,(XtPointer)scroll_response }, +{XtNframeWidth,XtCFrameWidth,XtRDimension,sizeof(((XfwfSlider2Rec*)NULL)->xfwfFrame.frameWidth),XtOffsetOf(XfwfSlider2Rec,xfwfFrame.frameWidth),XtRImmediate,(XtPointer)2 }, +{XtNframeType,XtCFrameType,XtRFrameType,sizeof(((XfwfSlider2Rec*)NULL)->xfwfFrame.frameType),XtOffsetOf(XfwfSlider2Rec,xfwfFrame.frameType),XtRImmediate,(XtPointer)XfwfSunken }, +}; + +XfwfSlider2ClassRec xfwfSlider2ClassRec = { +{ /* core_class part */ +(WidgetClass) &xfwfLabelClassRec, +"Slider2d", +sizeof(XfwfSlider2Rec), +NULL, +_resolve_inheritance, +FALSE, +initialize, +NULL, +XtInheritRealize, +actionsList, +3, +resources, +9, +NULLQUARK, +False , +XtExposeCompressMultiple |XtExposeGraphicsExpose , +False , +False , +NULL, +XtInheritResize, +expose, +set_values, +NULL, +XtInheritSetValuesAlmost, +NULL, +XtInheritAcceptFocus, +XtVersion, +NULL, +defaultTranslations, +XtInheritQueryGeometry, +XtInheritDisplayAccelerator, +NULL +}, +{ /* composite_class part */ +XtInheritGeometryManager, +XtInheritChangeManaged, +XtInheritInsertChild, +XtInheritDeleteChild, +NULL +}, +{ /* XfwfCommon_class part */ +compute_inside, +XtInherit_highlight_border, +XtInherit_unhighlight_border, +XtInherit_would_accept_focus, +XtInherit_traverse, +XtInherit_choose_color, +XtInherit_lighter_color, +XtInherit_darker_color, +NULL , +}, +{ /* XfwfFrame_class part */ +0 +}, +{ /* XfwfBoard_class part */ +XtInherit_set_abs_location, +}, +{ /* XfwfLabel_class part */ +XtInherit_set_label, +}, +{ /* XfwfSlider2_class part */ +compute_thumb, +move_thumb, +compute_info, +scroll_response, +}, +}; +WidgetClass xfwfSlider2WidgetClass = (WidgetClass) &xfwfSlider2ClassRec; +/*ARGSUSED*/ +static void start(self,event,params,num_params)Widget self;XEvent*event;String*params;Cardinal*num_params; +{ + Dimension w, h; + Position x, y; + XfwfScrollInfo info; + Boolean outside = False; + + if (event->type != ButtonPress && event->type != ButtonRelease + && event->type != MotionNotify) + XtError("The start action must be bound to a mouse event"); + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &x, &y, &w, &h); + if (event->xbutton.x < x) { /* Left of thumb */ + info.reason = XfwfSPageLeft; + info.flags = XFWF_HPOS; /* Suggest a value: */ + info.hpos = max(0.0, ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x - ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd); + outside = True; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); + } + if (event->xbutton.x >= x + w) { /* Right of thumb */ + info.reason = XfwfSPageRight; + info.flags = XFWF_HPOS; /* Suggest a value: */ + info.hpos = min(1.0, ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd); + outside = True; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); + } + if (event->xbutton.y < y) { /* Above thumb */ + info.reason = XfwfSPageUp; + info.flags = XFWF_VPOS; /* Suggest a value: */ + info.vpos = max(0.0, ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y - ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht); + outside = True; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); + } + if (event->xbutton.y >= y + h) { /* Below thumb */ + info.reason = XfwfSPageDown; + info.flags = XFWF_VPOS; /* Suggest a value: */ + info.vpos = min(1.0, ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht); + outside = True; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); + } + if (! outside) { /* Inside the thumb */ + ((XfwfSlider2Widget)self)->xfwfSlider2.drag_in_progress = True; + ((XfwfSlider2Widget)self)->xfwfSlider2.m_delta_x = x - event->xbutton.x; + ((XfwfSlider2Widget)self)->xfwfSlider2.m_delta_y = y - event->xbutton.y; + } +} + +/*ARGSUSED*/ +static void finish(self,event,params,num_params)Widget self;XEvent*event;String*params;Cardinal*num_params; +{ + XfwfScrollInfo info; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.drag_in_progress) { + ((XfwfSlider2Widget)self)->xfwfSlider2.drag_in_progress = False; + info.reason = XfwfSMove; + info.flags = XFWF_VPOS | XFWF_HPOS; + info.hpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x; + info.vpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); + } +} + +/*ARGSUSED*/ +static void drag(self,event,params,num_params)Widget self;XEvent*event;String*params;Cardinal*num_params; +{ + XfwfScrollInfo info; + Dimension wd, ht, fwd, fht; + Position oldx, oldy, newx, newy, fx, fy; + float dum1, dum2; + + if (! ((XfwfSlider2Widget)self)->xfwfSlider2.drag_in_progress) return; + if (event->type != ButtonPress && event->type != ButtonRelease + && event->type != MotionNotify) + XtError("The drag action must be bound to a mouse event"); + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &oldx, &oldy, &wd, &ht); + newx = event->xbutton.x + ((XfwfSlider2Widget)self)->xfwfSlider2.m_delta_x; + newy = event->xbutton.y + ((XfwfSlider2Widget)self)->xfwfSlider2.m_delta_y; + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_info(self, &newx, &newy, &wd, &ht, &((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x, &((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y,&dum1,&dum2); + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.move_thumb(self, oldx, oldy, wd, ht, newx, newy); + info.reason = XfwfSDrag; + info.flags = XFWF_VPOS | XFWF_HPOS; + info.hpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x; + info.vpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &info); +} + +static void _resolve_inheritance(class) +WidgetClass class; +{ + XfwfSlider2WidgetClass c = (XfwfSlider2WidgetClass) class; + XfwfSlider2WidgetClass super; + static CompositeClassExtensionRec extension_rec = { + NULL, NULLQUARK, XtCompositeExtensionVersion, + sizeof(CompositeClassExtensionRec), True}; + CompositeClassExtensionRec *ext; + ext = (XtPointer)XtMalloc(sizeof(*ext)); + *ext = extension_rec; + ext->next_extension = c->composite_class.extension; + c->composite_class.extension = ext; + if (class == xfwfSlider2WidgetClass) return; + super = (XfwfSlider2WidgetClass)class->core_class.superclass; + if (c->xfwfSlider2_class.compute_thumb == XtInherit_compute_thumb) + c->xfwfSlider2_class.compute_thumb = super->xfwfSlider2_class.compute_thumb; + if (c->xfwfSlider2_class.move_thumb == XtInherit_move_thumb) + c->xfwfSlider2_class.move_thumb = super->xfwfSlider2_class.move_thumb; + if (c->xfwfSlider2_class.compute_info == XtInherit_compute_info) + c->xfwfSlider2_class.compute_info = super->xfwfSlider2_class.compute_info; + if (c->xfwfSlider2_class.scroll_response == XtInherit_scroll_response) + c->xfwfSlider2_class.scroll_response = super->xfwfSlider2_class.scroll_response; +} +/*ARGSUSED*/static void compute_thumb(self,x,y,width,height)Widget self;Position * x;Position * y;Dimension * width;Dimension * height; +{ + Position fx, fy; + Dimension fw, fh; + + xfwfLabelClassRec.xfwfCommon_class.compute_inside(self, &fx, &fy, &fw, &fh); + *width = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd * fw + 0.5; + *height = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht * fh + 0.5; + if (*width < ((XfwfSlider2Widget)self)->xfwfSlider2.minsize) *width = min(fw, ((XfwfSlider2Widget)self)->xfwfSlider2.minsize); + if (*height < ((XfwfSlider2Widget)self)->xfwfSlider2.minsize) *height = min(fh, ((XfwfSlider2Widget)self)->xfwfSlider2.minsize); + *x = fx + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x * (fw - *width) + 0.5; + *y = fy + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y * (fh - *height) + 0.5; +} +/*ARGSUSED*/static void compute_inside(self,x,y,w,h)Widget self;Position * x;Position * y;Dimension * w;Dimension * h; +{ + int tmp; + + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, x, y, w, h); + *x += ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth; + *y += ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth; + tmp = *w - 2 * ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth; *w = (tmp < 0) ? 0 : tmp; + tmp = *h - 2 * ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth; *h = (tmp < 0) ? 0 : tmp; +} +/*ARGSUSED*/static void expose(self,event,region)Widget self;XEvent * event;Region region; +{ + Position x, y; + Dimension wd, ht; + + if (! XtIsRealized(self)) return; + if (region != NULL) { + XSetRegion(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc, region); + XSetRegion(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc, region); + XSetRegion(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc, region); + } + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &x, &y, &wd, &ht); + XFillRectangle(XtDisplay(self), XtWindow(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc, x, y, wd, ht); + XfwfDrawFrame(self, x, y, wd, ht, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameType, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth, + ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc, ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc); + if (region != NULL) { + XSetClipMask(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumbgc, None); + XSetClipMask(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc, None); + XSetClipMask(XtDisplay(self), ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc, None); + } + xfwfLabelClassRec.core_class.expose(self, event, region); +} +/*ARGSUSED*/static void initialize(request,self,args,num_args)Widget request;Widget self;ArgList args;Cardinal * num_args; +{ + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y = 0.0; + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht = 1.0; + ((XfwfSlider2Widget)self)->xfwfSlider2.drag_in_progress = False; + create_thumbgc(self); + create_gc(self); + create_graygc(self); + ((XfwfSlider2Widget)self)->xfwfSlider2.thumblightgc = NULL; create_thumblightgc(self); + ((XfwfSlider2Widget)self)->xfwfSlider2.thumbdarkgc = NULL; create_thumbdarkgc(self); +} +/*ARGSUSED*/static void move_thumb(self,oldx,oldy,wd,ht,newx,newy)Widget self;int oldx;int oldy;int wd;int ht;int newx;int newy; +{ + int h; + + XCopyArea(XtDisplay(self), XtWindow(self), XtWindow(self), + DefaultGCOfScreen(XtScreen(self)), + oldx, oldy, wd, ht, newx, newy); + /* First check if the old and new areas do not overlap */ + if (newx + wd <= oldx || oldx + wd <= newx + || newy + ht <= oldy || oldy + ht <= newy) { + XClearArea(XtDisplay(self), XtWindow(self), oldx, oldy, wd, ht, False); + return; + } else { /* They do overlap */ + h = oldy - newy; + if (h > 0) + XClearArea(XtDisplay(self), XtWindow(self), oldx, newy + ht, wd,h,False); + else if (h < 0) + XClearArea(XtDisplay(self), XtWindow(self), oldx, oldy, wd, -h, False); + if (newx < oldx) + XClearArea(XtDisplay(self), XtWindow(self), newx + wd, + max(oldy, newy), oldx - newx, ht - abs(h), False); + else if (oldx < newx) + XClearArea(XtDisplay(self), XtWindow(self), oldx, max(oldy, newy), + newx - oldx, ht - abs(h), False); + } +} +/*ARGSUSED*/static void compute_info(self,x,y,w,h,thumb_x,thumb_y,thumb_wd,thumb_ht)Widget self;Position * x;Position * y;Dimension * w;Dimension * h;float * thumb_x;float * thumb_y;float * thumb_wd;float * thumb_ht; +{ + Dimension fw, fh; + Position fx, fy; + + xfwfLabelClassRec.xfwfCommon_class.compute_inside(self, &fx, &fy, &fw, &fh); + *w = min(fw, max(((XfwfSlider2Widget)self)->xfwfSlider2.minsize, *w)); + *h = min(fh, max(((XfwfSlider2Widget)self)->xfwfSlider2.minsize, *h)); + *x = min(fx + fw - *w, max(fx, *x)); + *y = min(fy + fh - *h, max(fy, *y)); + *thumb_wd = ((float) *w)/fw; + *thumb_ht = ((float) *h)/fh; + *thumb_x = (*w == fw) ? 0.0 : ((float) (*x - fx))/(fw - *w); + *thumb_y = (*h == fh) ? 0.0 : ((float) (*y - fy))/(fh - *h); +} +/*ARGSUSED*/static Boolean set_values(old,request,self,args,num_args)Widget old;Widget request;Widget self;ArgList args;Cardinal * num_args; +{ + Boolean need_redisplay = False; + Position x, y; + Dimension w, h; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbPixmap != ((XfwfSlider2Widget)old)->xfwfSlider2.thumbPixmap) { + create_thumbgc(self); + need_redisplay = True; + } else if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbColor != ((XfwfSlider2Widget)old)->xfwfSlider2.thumbColor) { + ((XfwfSlider2Widget)self)->xfwfSlider2.thumbPixmap = NULL; + create_thumbgc(self); + need_redisplay = True; + } + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameWidth != ((XfwfSlider2Widget)old)->xfwfSlider2.thumbFrameWidth) + need_redisplay = True; + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumbFrameType != ((XfwfSlider2Widget)old)->xfwfSlider2.thumbFrameType) + need_redisplay = True; + if (((XfwfSlider2Widget)self)->xfwfSlider2.minsize != ((XfwfSlider2Widget)old)->xfwfSlider2.minsize) { + compute_thumb(old, &x, &y, &w, &h); + if (w < ((XfwfSlider2Widget)self)->xfwfSlider2.minsize || h < ((XfwfSlider2Widget)self)->xfwfSlider2.minsize) need_redisplay = True; + } + if (((XfwfSlider2Widget)self)->xfwfSlider2.scrollResponse != ((XfwfSlider2Widget)old)->xfwfSlider2.scrollResponse) { + ((XfwfSlider2Widget)self)->xfwfSlider2.scrollResponse = ((XfwfSlider2Widget)old)->xfwfSlider2.scrollResponse; + XtWarning("scrollResponse resource may only be queried, not set"); + } + return need_redisplay; +} +/*ARGSUSED*/static void scroll_response(wdg,client_data,call_data)Widget wdg;XtPointer client_data;XtPointer call_data; +{ + Widget self = (Widget) client_data; + XfwfScrollInfo *inf = (XfwfScrollInfo *)call_data; + XfwfScrollInfo new_info; + float x, y, w, h; + Position newx, newy, oldx, oldy; + Dimension newwd, newht, oldwd, oldht, wd, ht; + XEvent event; + XRectangle rect; + Region clip; + Display *dpy = XtDisplay(self); + + x = (inf->flags&XFWF_HPOS) && range(inf->hpos) ? inf->hpos : ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x; + y = (inf->flags&XFWF_VPOS) && range(inf->vpos) ? inf->vpos : ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y; + w = (inf->flags&XFWF_HSIZE) && range(inf->hsize) ? inf->hsize : ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd; + h = (inf->flags&XFWF_VSIZE) && range(inf->vsize) ? inf->vsize : ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht; + + if (((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd != w || ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht != h) { /* Size changed */ + if (XtIsRealized(self)) + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &oldx, &oldy, &oldwd, &oldht); + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd = w; + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht = h; + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x = x; + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y = y; + if (XtIsRealized(self)) { + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &newx, &newy, &newwd, &newht); + XClearArea(dpy, XtWindow(self), oldx, oldy, oldwd, oldht, False); + event.xexpose.x = rect.x = newx; + event.xexpose.y = rect.y = newy; + event.xexpose.width = rect.width = newwd; + event.xexpose.height = rect.height = newht; + clip = XCreateRegion(); + XUnionRectWithRegion(&rect, clip, clip); + ((XfwfSlider2WidgetClass)self->core.widget_class)->core_class.expose(self, &event, clip); + XDestroyRegion(clip); + } + } else if (((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x != x || ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y != y) { /* Only position changed */ + if (XtIsRealized(self)) + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &oldx, &oldy, &wd, &ht); + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x = x; + ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y = y; + if (XtIsRealized(self)) { + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.compute_thumb(self, &newx, &newy, &wd, &ht); + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.move_thumb(self, oldx, oldy, wd, ht, newx, newy); + } + } + + if (inf->reason != XfwfSNotify) { + new_info = *inf; + new_info.reason = XfwfSNotify; + XtCallCallbackList(self, ((XfwfSlider2Widget)self)->xfwfSlider2.scrollCallback, &new_info); + } +} +/*ARGSUSED*/void XfwfGetThumb(self,info)Widget self;XfwfScrollInfo * info; +{ + if (! XtIsSubclass(self, xfwfSlider2WidgetClass)) + XtError("XfwfGetThumb called with incorrect widget type"); + info->reason = XfwfSNotify; + info->flags = XFWF_VPOS | XFWF_VSIZE | XFWF_HPOS | XFWF_HSIZE; + info->vpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_y; + info->vsize = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_ht; + info->hpos = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_x; + info->hsize = ((XfwfSlider2Widget)self)->xfwfSlider2.thumb_wd; +} +/*ARGSUSED*/void XfwfMoveThumb(self,x,y)Widget self;double x;double y; +{ + XfwfScrollInfo info; + + if (! XtIsSubclass(self, xfwfSlider2WidgetClass)) + XtError("XfwfMoveThumb called with incorrect widget type"); + if (x < 0.0 || x > 1.0 || y < 0.0 || y > 1.0) + XtError("XfwfMoveThumb called with incorrect arguments"); + + info.flags = XFWF_VPOS | XFWF_HPOS; + info.reason = XfwfSNotify; + info.vpos = y; + info.hpos = x; + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.scroll_response(NULL, self, &info); +} +/*ARGSUSED*/void XfwfResizeThumb(self,wd,ht)Widget self;double wd;double ht; +{ + XfwfScrollInfo info; + + if (! XtIsSubclass(self, xfwfSlider2WidgetClass)) + XtError("XfwfResizeThumb called with incorrect widget type"); + if (wd < 0.0 || wd > 1.0 || ht < 0.0 || ht > 1.0) + XtError("XfwfResizeThumb called with incorrect arguments"); + + info.reason = XfwfSNotify; + info.flags = XFWF_VSIZE | XFWF_HSIZE; + info.vsize = ht; + info.hsize = wd; + ((XfwfSlider2WidgetClass)self->core.widget_class)->xfwfSlider2_class.scroll_response(NULL, self, &info); +} |