summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/gui/Panner.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvik/gui/Panner.c')
-rw-r--r--Build/source/texk/xdvik/gui/Panner.c1238
1 files changed, 0 insertions, 1238 deletions
diff --git a/Build/source/texk/xdvik/gui/Panner.c b/Build/source/texk/xdvik/gui/Panner.c
deleted file mode 100644
index 8a8577a617d..00000000000
--- a/Build/source/texk/xdvik/gui/Panner.c
+++ /dev/null
@@ -1,1238 +0,0 @@
-/*
- * $XConsortium: Panner.c,v 1.52 95/01/10 14:31:26 kaleb Exp $
- *
- Copyright (c) 1989, 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.
- *
- * Author: Jim Fulton, MIT X Consortium
- */
-
-#include "xdvi-config.h"
-#include "xdvi.h"
-#include "string-utils.h"
-
-#if defined(MOTIF) && defined(USE_PANNER) && USE_XAW_PANNER /* entire file */
-
-#if defined(__GNUC__) && DEVEL_MODE
-#warning COMPILING Panner_c
-#endif
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h> /* for XtN and XtC defines */
-#include <X11/Xmu/CharSet.h> /* for XmuCompareISOLatin1() */
-#include "PannerP.h" /* us */
-#include <X11/Xos.h>
-#include <X11/Xmu/Misc.h> /* for Min */
-#include <X11/Xmu/Drawing.h>
-#include <ctype.h> /* for isascii() etc. */
-
-extern Bool XmuDistinguishablePixels(); /* not defined in any Xmu headers */
-
-#if HAVE_XKB_BELL_EXT
-# include <X11/XKBlib.h>
-# define panBell(display, window, percent) \
- XkbBell(display, window, percent, (Atom) None)
-#else
-# define panBell(display, window, percent) XBell(display, percent)
-#endif
-
-/*
- ======================================================================
- begin copy from Simple.c
- ======================================================================
-*/
-
-#define offset(field) XtOffsetOf(SimpleRec, simple.field)
-
-static XtResource resources[] = {
- {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
- offset(cursor), XtRImmediate, (XtPointer) None},
- {XtNinsensitiveBorder, XtCInsensitive, XtRPixmap, sizeof(Pixmap),
- offset(insensitive_border), XtRImmediate, (XtPointer) NULL},
- {XtNpointerColor, XtCForeground, XtRPixel, sizeof(Pixel),
- offset(pointer_fg), XtRString, XtDefaultForeground},
- {XtNpointerColorBackground, XtCBackground, XtRPixel, sizeof(Pixel),
- offset(pointer_bg), XtRString, XtDefaultBackground},
- {XtNcursorName, XtCCursor, XtRString, sizeof(String),
- offset(cursor_name), XtRString, NULL},
- {XtNinternational, XtCInternational, XtRBoolean, sizeof(Boolean),
- offset(international), XtRImmediate, (XtPointer) FALSE},
-#undef offset
-};
-
-static void ClassPartInitialize(), ClassInitialize(),Realize(),ConvertCursor();
-static Bool SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args);
-static Bool ChangeSensitive(Widget w);
-
-SimpleClassRec simpleClassRec = {
- { /* core fields */
- /* superclass */ (WidgetClass) &widgetClassRec,
- /* class_name */ "Simple",
- /* widget_size */ sizeof(SimpleRec),
- /* class_initialize */ ClassInitialize,
- /* class_part_initialize */ ClassPartInitialize,
- /* class_inited */ FALSE,
- /* initialize */ NULL,
- /* initialize_hook */ NULL,
- /* realize */ Realize,
- /* actions */ NULL,
- /* num_actions */ 0,
- /* resources */ resources,
- /* num_resources */ XtNumber(resources),
- /* xrm_class */ NULLQUARK,
- /* compress_motion */ TRUE,
- /* compress_exposure */ TRUE,
- /* compress_enterleave */ TRUE,
- /* visible_interest */ FALSE,
- /* destroy */ NULL,
- /* resize */ NULL,
- /* expose */ NULL,
-#warning FIXME: incompatible pointer type
- /* 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 */ NULL,
- /* query_geometry */ XtInheritQueryGeometry,
- /* display_accelerator */ XtInheritDisplayAccelerator,
- /* extension */ NULL
- },
- { /* simple fields */
- /* change_sensitive */ ChangeSensitive
-#ifndef HAVE_OLD_XAW
- , NULL
-#endif
- }
-};
-
-WidgetClass simpleWidgetClass = (WidgetClass)&simpleClassRec;
-
-static void ClassInitialize()
-{
- static XtConvertArgRec convertArg[] = {
- {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen),
- sizeof(Screen *)},
- {XtResourceString, (XtPointer) XtNpointerColor, sizeof(Pixel)},
- {XtResourceString, (XtPointer) XtNpointerColorBackground,
- sizeof(Pixel)},
- {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.colormap),
- sizeof(Colormap)}
- };
-
- XawInitializeWidgetSet();
- XtSetTypeConverter( XtRString, XtRColorCursor, XmuCvtStringToColorCursor,
- convertArg, XtNumber(convertArg),
- XtCacheByDisplay, (XtDestructor)NULL);
-}
-
-static void ClassPartInitialize(class)
- WidgetClass class;
-{
- SimpleWidgetClass c = (SimpleWidgetClass) class;
- SimpleWidgetClass super = (SimpleWidgetClass)
- c->core_class.superclass;
-
- if (c->simple_class.change_sensitive == NULL) {
- char buf[BUFSIZ];
-
- (void) sprintf(buf,
- "%s Widget: The Simple Widget class method 'change_sensitive' is undefined.\nA function must be defined or inherited.",
- c->core_class.class_name);
- XtWarning(buf);
- c->simple_class.change_sensitive = ChangeSensitive;
- }
-
- if (c->simple_class.change_sensitive == XtInheritChangeSensitive)
- c->simple_class.change_sensitive = super->simple_class.change_sensitive;
-}
-
-static void Realize(w, valueMask, attributes)
- Widget w;
- Mask *valueMask;
- XSetWindowAttributes *attributes;
-{
- Pixmap border_pixmap = 0;
- if (!XtIsSensitive(w)) {
- /* change border to gray; have to remember the old one,
- * so XtDestroyWidget deletes the proper one */
- if (((SimpleWidget)w)->simple.insensitive_border == None)
- ((SimpleWidget)w)->simple.insensitive_border =
- XmuCreateStippledPixmap(XtScreen(w),
- w->core.border_pixel,
- w->core.background_pixel,
- w->core.depth);
- border_pixmap = w->core.border_pixmap;
- attributes->border_pixmap =
- w->core.border_pixmap = ((SimpleWidget)w)->simple.insensitive_border;
-
- *valueMask |= CWBorderPixmap;
- *valueMask &= ~CWBorderPixel;
- }
-
- ConvertCursor(w);
-
- if ((attributes->cursor = ((SimpleWidget)w)->simple.cursor) != None)
- *valueMask |= CWCursor;
-
- XtCreateWindow( w, (unsigned int)InputOutput, (Visual *)CopyFromParent,
- *valueMask, attributes );
-
- if (!XtIsSensitive(w))
- w->core.border_pixmap = border_pixmap;
-}
-
-/* Function Name: ConvertCursor
- * Description: Converts a name to a new cursor.
- * Arguments: w - the simple widget.
- * Returns: none.
- */
-
-static void
-ConvertCursor(w)
- Widget w;
-{
- SimpleWidget simple = (SimpleWidget) w;
- XrmValue from, to;
- Cursor cursor;
-
- if (simple->simple.cursor_name == NULL)
- return;
-
- from.addr = (XPointer) simple->simple.cursor_name;
- from.size = strlen((char *) from.addr) + 1;
-
- to.size = sizeof(Cursor);
- to.addr = (XPointer) &cursor;
-
- if (XtConvertAndStore(w, XtRString, &from, XtRColorCursor, &to)) {
- if ( cursor != None)
- simple->simple.cursor = cursor;
- }
- else {
- XtAppErrorMsg(XtWidgetToApplicationContext(w),
- "convertFailed","ConvertCursor","XawError",
- "Simple: ConvertCursor failed.",
- (String *)NULL, (Cardinal *)NULL);
- }
-}
-
-
-/* ARGSUSED */
-static Bool
-SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args)
-{
- SimpleWidget s_old = (SimpleWidget) current;
- SimpleWidget s_new = (SimpleWidget) new;
- Boolean new_cursor = FALSE;
-
- UNUSED(request);
- UNUSED(args);
- UNUSED(num_args);
- /* this disables user changes after creation*/
- s_new->simple.international = s_old->simple.international;
-
- if ( XtIsSensitive(current) != XtIsSensitive(new) )
- (*((SimpleWidgetClass)XtClass(new))->
- simple_class.change_sensitive) ( new );
-
- if (s_old->simple.cursor != s_new->simple.cursor) {
- new_cursor = TRUE;
- }
-
- /*
- * We are not handling the string cursor_name correctly here.
- */
-
- if ( (s_old->simple.pointer_fg != s_new->simple.pointer_fg) ||
- (s_old->simple.pointer_bg != s_new->simple.pointer_bg) ||
- (s_old->simple.cursor_name != s_new->simple.cursor_name) ) {
- ConvertCursor(new);
- new_cursor = TRUE;
- }
-
- if (new_cursor && XtIsRealized(new))
- XDefineCursor(XtDisplay(new), XtWindow(new), s_new->simple.cursor);
-
- return False;
-}
-
-
-static Bool ChangeSensitive(Widget w)
-{
- if (XtIsRealized(w)) {
- if (XtIsSensitive(w))
- if (w->core.border_pixmap != XtUnspecifiedPixmap)
- XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w),
- w->core.border_pixmap );
- else
- XSetWindowBorder( XtDisplay(w), XtWindow(w),
- w->core.border_pixel );
- else {
- if (((SimpleWidget)w)->simple.insensitive_border == None)
- ((SimpleWidget)w)->simple.insensitive_border =
- XmuCreateStippledPixmap(XtScreen(w),
- w->core.border_pixel,
- w->core.background_pixel,
- w->core.depth);
- XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w),
- ((SimpleWidget)w)->
- simple.insensitive_border );
- }
- }
- return False;
-}
-
-/*
- ======================================================================
- end copy from Simple.c
- ======================================================================
-*/
-
-
-/* following function copied from XawInit.c */
-void XawInitializeWidgetSet ()
-{
- static int firsttime = 1;
-
- if (firsttime) {
- firsttime = 0;
- XtInitializeWidgetClass (vendorShellWidgetClass);
- }
-}
-
-static char defaultTranslations[] =
-"<Btn1Down>: start() \n\
- <Btn1Motion>: move() \n\
- <Btn1Up>: notify() stop() \n\
- <Btn2Down>: abort() \n\
- :<Key>KP_Enter: set(rubberband,toggle) \n\
- <Key>space: page(+1p,+1p) \n\
- <Key>Delete: page(-1p,-1p) \n\
- :<Key>KP_Delete: page(-1p,-1p) \n\
- <Key>BackSpace: page(-1p,-1p) \n\
- <Key>Left: page(-.5p,+0) \n\
- :<Key>KP_Left: page(-.5p,+0) \n\
- <Key>Right: page(+.5p,+0) \n\
- :<Key>KP_Right: page(+.5p,+0) \n\
- <Key>Up: page(+0,-.5p) \n\
- :<Key>KP_Up: page(+0,-.5p) \n\
- <Key>Down: page(+0,+.5p) \n\
- :<Key>KP_Down: page(+0,+.5p) \n\
- <Key>Home: page(0,0) \n\
- :<Key>KP_Home: page(0,0)";
-
-
-static void ActionStart(), ActionStop(), ActionAbort(), ActionMove();
-static void ActionPage(), ActionNotify(), ActionSet();
-
-static XtActionsRec actions[] = {
- { "start", ActionStart }, /* start tmp graphics */
- { "stop", ActionStop }, /* stop tmp graphics */
- { "abort", ActionAbort }, /* punt */
- { "move", ActionMove }, /* move tmp graphics on Motion event */
- { "page", ActionPage }, /* page around usually from keyboard */
- { "notify", ActionNotify }, /* callback new position */
- { "set", ActionSet }, /* set various parameters */
-};
-
-
-/*
- * resources for the panner
- */
-static XtResource panner_resources[] = {
-#define poff(field) XtOffsetOf(PannerRec, panner.field)
- { XtNallowOff, XtCAllowOff, XtRBoolean, sizeof(Boolean),
- poff(allow_off), XtRImmediate, (XtPointer) FALSE },
- { XtNresize, XtCResize, XtRBoolean, sizeof(Boolean),
- poff(resize_to_pref), XtRImmediate, (XtPointer) TRUE },
- { XtNreportCallback, XtCReportCallback, XtRCallback, sizeof(XtPointer),
- poff(report_callbacks), XtRCallback, (XtPointer) NULL },
- { XtNdefaultScale, XtCDefaultScale, XtRDimension, sizeof(Dimension),
- poff(default_scale), XtRImmediate, (XtPointer) PANNER_DEFAULT_SCALE },
- { XtNrubberBand, XtCRubberBand, XtRBoolean, sizeof(Boolean),
- poff(rubber_band), XtRImmediate, (XtPointer) FALSE },
- { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
- poff(foreground), XtRString, (XtPointer) XtDefaultBackground },
- { XtNinternalSpace, XtCInternalSpace, XtRDimension, sizeof(Dimension),
- poff(internal_border), XtRImmediate, (XtPointer) 4 },
- { XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension),
- poff(line_width), XtRImmediate, (XtPointer) 0 },
- { XtNcanvasWidth, XtCCanvasWidth, XtRDimension, sizeof(Dimension),
- poff(canvas_width), XtRImmediate, (XtPointer) 0 },
- { XtNcanvasHeight, XtCCanvasHeight, XtRDimension, sizeof(Dimension),
- poff(canvas_height), XtRImmediate, (XtPointer) 0 },
- { XtNsliderX, XtCSliderX, XtRPosition, sizeof(Position),
- poff(slider_x), XtRImmediate, (XtPointer) 0 },
- { XtNsliderY, XtCSliderY, XtRPosition, sizeof(Position),
- poff(slider_y), XtRImmediate, (XtPointer) 0 },
- { XtNsliderWidth, XtCSliderWidth, XtRDimension, sizeof(Dimension),
- poff(slider_width), XtRImmediate, (XtPointer) 0 },
- { XtNsliderHeight, XtCSliderHeight, XtRDimension, sizeof(Dimension),
- poff(slider_height), XtRImmediate, (XtPointer) 0 },
- { XtNshadowColor, XtCShadowColor, XtRPixel, sizeof(Pixel),
- poff(shadow_color), XtRString, (XtPointer) XtDefaultForeground },
- { XtNshadowThickness, XtCShadowThickness, XtRDimension, sizeof(Dimension),
- poff(shadow_thickness), XtRImmediate, (XtPointer) 2 },
- { XtNbackgroundStipple, XtCBackgroundStipple, XtRString, sizeof(String),
- poff(stipple_name), XtRImmediate, (XtPointer) NULL },
-#undef poff
-};
-
-
-/*
- * widget class methods used below
- */
-static void Initialize(); /* create gc's */
-static void PannerRealize(); /* create window */
-static void Destroy(); /* clean up widget */
-static void Resize(); /* need to rescale ourselves */
-static void Redisplay(); /* draw ourselves */
-static Boolean PannerSetValues(); /* set all of the resources */
-static void SetValuesAlmost(); /* deal with failed setval geom req */
-static XtGeometryResult QueryGeometry(); /* say how big we would like to be */
-
-PannerClassRec pannerClassRec = {
- { /* core fields */
- /* superclass */ (WidgetClass) &simpleClassRec,
- /* class_name */ "Panner",
- /* widget_size */ sizeof(PannerRec),
- /* class_initialize */ XawInitializeWidgetSet,
- /* class_part_initialize */ NULL,
- /* class_inited */ FALSE,
- /* initialize */ Initialize,
- /* initialize_hook */ NULL,
- /* realize */ PannerRealize,
- /* actions */ actions,
- /* num_actions */ XtNumber(actions),
- /* resources */ panner_resources,
- /* num_resources */ XtNumber(panner_resources),
- /* xrm_class */ NULLQUARK,
- /* compress_motion */ TRUE,
- /* compress_exposure */ TRUE,
- /* compress_enterleave */ TRUE,
- /* visible_interest */ FALSE,
- /* destroy */ Destroy,
- /* resize */ Resize,
- /* expose */ Redisplay,
- /* set_values */ PannerSetValues,
- /* set_values_hook */ NULL,
- /* set_values_almost */ SetValuesAlmost,
- /* get_values_hook */ NULL,
- /* accept_focus */ NULL,
- /* version */ XtVersion,
- /* callback_private */ NULL,
- /* tm_table */ defaultTranslations,
- /* query_geometry */ QueryGeometry,
- /* display_accelerator */ XtInheritDisplayAccelerator,
- /* extension */ NULL
- },
- { /* simple fields */
- /* change_sensitive */ XtInheritChangeSensitive
-#ifndef HAVE_OLD_XAW
- , NULL
-#endif
- },
- { /* panner fields */
- /* ignore */ 0
- }
-};
-
-WidgetClass pannerWidgetClass = (WidgetClass) &pannerClassRec;
-
-
-/*****************************************************************************
- * *
- * panner utility routines *
- * *
- *****************************************************************************/
-
-static void reset_shadow_gc (pw) /* used when resources change */
- PannerWidget pw;
-{
- XtGCMask valuemask = GCForeground;
- XGCValues values;
- unsigned long pixels[3];
-
- if (pw->panner.shadow_gc) XtReleaseGC ((Widget) pw, pw->panner.shadow_gc);
-
- pixels[0] = pw->panner.foreground;
- pixels[1] = pw->core.background_pixel;
- pixels[2] = pw->panner.shadow_color;
- if (!pw->panner.stipple_name &&
- !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
- pixels, 3) &&
- XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
- pixels, 2))
- {
- valuemask = GCTile | GCFillStyle;
- values.fill_style = FillTiled;
- values.tile = XmuCreateStippledPixmap(XtScreen((Widget)pw),
- pw->panner.foreground,
- pw->core.background_pixel,
- pw->core.depth);
- }
- else
- {
- if (!pw->panner.line_width &&
- !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
- pixels, 2))
- pw->panner.line_width = 1;
- valuemask = GCForeground;
- values.foreground = pw->panner.shadow_color;
- }
- if (pw->panner.line_width > 0) {
- values.line_width = pw->panner.line_width;
- valuemask |= GCLineWidth;
- }
-
- pw->panner.shadow_gc = XtGetGC ((Widget) pw, valuemask, &values);
-}
-
-static void reset_slider_gc (pw) /* used when resources change */
- PannerWidget pw;
-{
- XtGCMask valuemask = GCForeground;
- XGCValues values;
-
- if (pw->panner.slider_gc) XtReleaseGC ((Widget) pw, pw->panner.slider_gc);
-
- values.foreground = pw->panner.foreground;
-
- pw->panner.slider_gc = XtGetGC ((Widget) pw, valuemask, &values);
-}
-
-static void reset_xor_gc (pw) /* used when resources change */
- PannerWidget pw;
-{
- if (pw->panner.xor_gc) XtReleaseGC ((Widget) pw, pw->panner.xor_gc);
-
- if (pw->panner.rubber_band) {
- XtGCMask valuemask = (GCForeground | GCFunction);
- XGCValues values;
- Pixel tmp;
-
- tmp = ((pw->panner.foreground == pw->core.background_pixel) ?
- pw->panner.shadow_color : pw->panner.foreground);
- values.foreground = tmp ^ pw->core.background_pixel;
- values.function = GXxor;
- if (pw->panner.line_width > 0) {
- valuemask |= GCLineWidth;
- values.line_width = pw->panner.line_width;
- }
- pw->panner.xor_gc = XtGetGC ((Widget) pw, valuemask, &values);
- } else {
- pw->panner.xor_gc = NULL;
- }
-}
-
-
-static void check_knob (pw, knob)
- PannerWidget pw;
- Boolean knob;
-{
- Position pad = pw->panner.internal_border * 2;
- Position maxx = (((Position) pw->core.width) - pad -
- ((Position) pw->panner.knob_width));
- Position maxy = (((Position) pw->core.height) - pad -
- ((Position) pw->panner.knob_height));
- Position *x = (knob ? &pw->panner.knob_x : &pw->panner.tmp.x);
- Position *y = (knob ? &pw->panner.knob_y : &pw->panner.tmp.y);
-
- /*
- * note that positions are already normalized (i.e. internal_border
- * has been subtracted out)
- */
- if (*x < 0) *x = 0;
- if (*x > maxx) *x = maxx;
-
- if (*y < 0) *y = 0;
- if (*y > maxy) *y = maxy;
-
- if (knob) {
- pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) /
- pw->panner.haspect + 0.5);
- pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) /
- pw->panner.vaspect + 0.5);
- pw->panner.last_x = pw->panner.last_y = PANNER_OUTOFRANGE;
- }
-}
-
-
-static void move_shadow (pw)
- PannerWidget pw;
-{
- if (pw->panner.shadow_thickness > 0) {
- int lw = pw->panner.shadow_thickness + pw->panner.line_width * 2;
- int pad = pw->panner.internal_border;
-
- if ((int)pw->panner.knob_height > lw && (int)pw->panner.knob_width > lw) {
- XRectangle *r = pw->panner.shadow_rects;
- r->x = (short) (pw->panner.knob_x + pad + pw->panner.knob_width);
- r->y = (short) (pw->panner.knob_y + pad + lw);
- r->width = pw->panner.shadow_thickness;
- r->height = (unsigned short) (pw->panner.knob_height - lw);
- r++;
- r->x = (short) (pw->panner.knob_x + pad + lw);
- r->y = (short) (pw->panner.knob_y + pad + pw->panner.knob_height);
- r->width = (unsigned short) (pw->panner.knob_width - lw +
- pw->panner.shadow_thickness);
- r->height = pw->panner.shadow_thickness;
- pw->panner.shadow_valid = TRUE;
- return;
- }
- }
- pw->panner.shadow_valid = FALSE;
-}
-
-static void scale_knob (pw, location, size) /* set knob size and/or loc */
- PannerWidget pw;
- Boolean location, size;
-{
- if (location) {
- pw->panner.knob_x = (Position) PANNER_HSCALE (pw, pw->panner.slider_x);
- pw->panner.knob_y = (Position) PANNER_VSCALE (pw, pw->panner.slider_y);
- }
- if (size) {
- Dimension width, height;
-
- if (pw->panner.slider_width < 1) {
- pw->panner.slider_width = pw->panner.canvas_width;
- }
- if (pw->panner.slider_height < 1) {
- pw->panner.slider_height = pw->panner.canvas_height;
- }
- width = Min (pw->panner.slider_width, pw->panner.canvas_width);
- height = Min (pw->panner.slider_height, pw->panner.canvas_height);
-
- pw->panner.knob_width = (Dimension) PANNER_HSCALE (pw, width);
- pw->panner.knob_height = (Dimension) PANNER_VSCALE (pw, height);
- }
- if (!pw->panner.allow_off) check_knob (pw, TRUE);
- move_shadow (pw);
-}
-
-static void rescale (pw)
- PannerWidget pw;
-{
- int hpad = pw->panner.internal_border * 2;
- int vpad = hpad;
-
- if (pw->panner.canvas_width < 1)
- pw->panner.canvas_width = pw->core.width;
- if (pw->panner.canvas_height < 1)
- pw->panner.canvas_height = pw->core.height;
-
- if ((int)pw->core.width <= hpad) hpad = 0;
- if ((int)pw->core.height <= vpad) vpad = 0;
-
- pw->panner.haspect = ((double) pw->core.width - hpad) /
- (double) pw->panner.canvas_width;
- pw->panner.vaspect = ((double) pw->core.height - vpad) /
- (double) pw->panner.canvas_height;
- scale_knob (pw, TRUE, TRUE);
-}
-
-
-static void get_default_size (pw, wp, hp)
- PannerWidget pw;
- Dimension *wp, *hp;
-{
- Dimension pad = pw->panner.internal_border * 2;
- *wp = PANNER_DSCALE (pw, pw->panner.canvas_width) + pad;
- *hp = PANNER_DSCALE (pw, pw->panner.canvas_height) + pad;
-}
-
-static Boolean get_event_xy (pw, event, x, y)
- PannerWidget pw;
- XEvent *event;
- int *x, *y;
-{
- int pad = pw->panner.internal_border;
-
- switch (event->type) {
- case ButtonPress:
- case ButtonRelease:
- *x = event->xbutton.x - pad;
- *y = event->xbutton.y - pad;
- return TRUE;
-
- case KeyPress:
- case KeyRelease:
- *x = event->xkey.x - pad;
- *y = event->xkey.y - pad;
- return TRUE;
-
- case EnterNotify:
- case LeaveNotify:
- *x = event->xcrossing.x - pad;
- *y = event->xcrossing.y - pad;
- return TRUE;
-
- case MotionNotify:
- *x = event->xmotion.x - pad;
- *y = event->xmotion.y - pad;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static int parse_page_string (s, pagesize, canvassize, relative)
- char *s;
- int pagesize, canvassize;
- Boolean *relative;
-{
- char *cp;
- double val = 1.0;
- Boolean rel = FALSE;
-
- /*
- * syntax: spaces [+-] number spaces [pc\0] spaces
- */
-
- for (; isascii(*s) && isspace(*s); s++) ; /* skip white space */
-
- if (*s == '+' || *s == '-') { /* deal with signs */
- rel = TRUE;
- if (*s == '-') val = -1.0;
- s++;
- }
- if (!*s) { /* if null then return nothing */
- *relative = TRUE;
- return 0;
- }
-
- /* skip over numbers */
- for (cp = s; isascii(*s) && (isdigit(*s) || *s == '.'); s++) ;
- val *= atof(cp);
-
- /* skip blanks */
- for (; isascii(*s) && isspace(*s); s++) ;
-
- if (*s) { /* if units */
- switch (s[0]) {
- case 'p': case 'P':
- val *= (double) pagesize;
- break;
-
- case 'c': case 'C':
- val *= (double) canvassize;
- break;
- }
- }
- *relative = rel;
- return ((int) val);
-}
-
-
-#define DRAW_TMP(pw) \
-{ \
- XDrawRectangle (XtDisplay(pw), XtWindow(pw), \
- pw->panner.xor_gc, \
- (int) (pw->panner.tmp.x + pw->panner.internal_border), \
- (int) (pw->panner.tmp.y + pw->panner.internal_border), \
- (unsigned int) (pw->panner.knob_width - 1), \
- (unsigned int) (pw->panner.knob_height - 1)); \
- pw->panner.tmp.showing = !pw->panner.tmp.showing; \
-}
-
-#define UNDRAW_TMP(pw) \
-{ \
- if (pw->panner.tmp.showing) DRAW_TMP(pw); \
-}
-
-#define BACKGROUND_STIPPLE(pw) \
- XmuLocatePixmapFile (pw->core.screen, pw->panner.stipple_name, \
- pw->panner.shadow_color, pw->core.background_pixel, \
- pw->core.depth, NULL, 0, NULL, NULL, NULL, NULL)
-
-#define PIXMAP_OKAY(pm) ((pm) != None && (pm) != XtUnspecifiedPixmap)
-
-
-/*****************************************************************************
- * *
- * panner class methods *
- * *
- *****************************************************************************/
-
-
-/*ARGSUSED*/
-static void Initialize (greq, gnew, args, num_args)
- Widget greq, gnew;
- ArgList args;
- Cardinal *num_args;
-{
- PannerWidget req = (PannerWidget) greq, new = (PannerWidget) gnew;
- Dimension defwidth, defheight;
-
- UNUSED(args);
- UNUSED(num_args);
-
- if (req->panner.canvas_width < 1) new->panner.canvas_width = 1;
- if (req->panner.canvas_height < 1) new->panner.canvas_height = 1;
- if (req->panner.default_scale < 1)
- new->panner.default_scale = PANNER_DEFAULT_SCALE;
-
- get_default_size (req, &defwidth, &defheight);
- if (req->core.width < 1) new->core.width = defwidth;
- if (req->core.height < 1) new->core.height = defheight;
-
- new->panner.shadow_gc = NULL;
- reset_shadow_gc (new); /* shadowColor */
- new->panner.slider_gc = NULL;
- reset_slider_gc (new); /* foreground */
- new->panner.xor_gc = NULL;
- reset_xor_gc (new); /* foreground ^ background */
-
- rescale (new); /* does a position check */
- new->panner.shadow_valid = FALSE;
- new->panner.tmp.doing = FALSE;
- new->panner.tmp.showing = FALSE;
-}
-
-
-static void PannerRealize (gw, valuemaskp, attr)
- Widget gw;
- XtValueMask *valuemaskp;
- XSetWindowAttributes *attr;
-{
- PannerWidget pw = (PannerWidget) gw;
- Pixmap pm = XtUnspecifiedPixmap;
- Boolean gotpm = FALSE;
-
- if (pw->core.background_pixmap == XtUnspecifiedPixmap) {
- if (pw->panner.stipple_name) pm = BACKGROUND_STIPPLE (pw);
-
- if (PIXMAP_OKAY(pm)) {
- attr->background_pixmap = pm;
- *valuemaskp |= CWBackPixmap;
- *valuemaskp &= ~CWBackPixel;
- gotpm = TRUE;
- }
- }
- (*pannerWidgetClass->core_class.superclass->core_class.realize)
- (gw, valuemaskp, attr);
-
- if (gotpm) XFreePixmap (XtDisplay(gw), pm);
-}
-
-
-static void Destroy (gw)
- Widget gw;
-{
- PannerWidget pw = (PannerWidget) gw;
-
- XtReleaseGC (gw, pw->panner.shadow_gc);
- XtReleaseGC (gw, pw->panner.slider_gc);
- XtReleaseGC (gw, pw->panner.xor_gc);
-}
-
-
-static void Resize (gw)
- Widget gw;
-{
- rescale ((PannerWidget) gw);
-}
-
-
-/* ARGSUSED */
-static void Redisplay (Widget gw, XEvent *event, Region region)
-{
- PannerWidget pw = (PannerWidget) gw;
- Display *dpy = XtDisplay(gw);
- Window w = XtWindow(gw);
- int pad = pw->panner.internal_border;
- Dimension lw = pw->panner.line_width;
- Dimension extra = pw->panner.shadow_thickness + lw * 2;
- int kx = pw->panner.knob_x + pad, ky = pw->panner.knob_y + pad;
-
- UNUSED(event);
- UNUSED(region);
-
- pw->panner.tmp.showing = FALSE;
- XClearArea (XtDisplay(pw), XtWindow(pw),
- (int) pw->panner.last_x - ((int) lw) + pad,
- (int) pw->panner.last_y - ((int) lw) + pad,
- (unsigned int) (pw->panner.knob_width + extra),
- (unsigned int) (pw->panner.knob_height + extra),
- False);
- pw->panner.last_x = pw->panner.knob_x;
- pw->panner.last_y = pw->panner.knob_y;
-
- XFillRectangle (dpy, w, pw->panner.slider_gc, kx, ky,
- pw->panner.knob_width - 1, pw->panner.knob_height - 1);
-
- if (lw)
- {
- XDrawRectangle (dpy, w, pw->panner.shadow_gc, kx, ky,
- (unsigned int) (pw->panner.knob_width - 1),
- (unsigned int) (pw->panner.knob_height - 1));
- }
-
- if (pw->panner.shadow_valid) {
- XFillRectangles (dpy, w, pw->panner.shadow_gc,
- pw->panner.shadow_rects, 2);
- }
- if (pw->panner.tmp.doing && pw->panner.rubber_band) DRAW_TMP (pw);
-}
-
-
-/* ARGSUSED */
-static Boolean PannerSetValues (Widget gcur, Widget greq, Widget gnew, ArgList args, Cardinal *num_args)
-{
- PannerWidget cur = (PannerWidget) gcur;
- PannerWidget new = (PannerWidget) gnew;
- Boolean redisplay = FALSE;
-
- UNUSED(greq);
- UNUSED(args);
- UNUSED(num_args);
-
- if (cur->panner.foreground != new->panner.foreground) {
- reset_slider_gc (new);
- if (cur->panner.foreground != cur->core.background_pixel)
- reset_xor_gc (new);
- redisplay = TRUE;
- } else if (cur->panner.line_width != new->panner.line_width ||
- cur->core.background_pixel != new->core.background_pixel) {
- reset_xor_gc (new);
- redisplay = TRUE;
- }
- if (cur->panner.shadow_color != new->panner.shadow_color) {
- reset_shadow_gc (new);
- if (cur->panner.foreground == cur->core.background_pixel)
- reset_xor_gc (new);
- redisplay = TRUE;
- }
- if (cur->panner.shadow_thickness != new->panner.shadow_thickness) {
- move_shadow (new);
- redisplay = TRUE;
- }
- if (cur->panner.rubber_band != new->panner.rubber_band) {
- reset_xor_gc (new);
- if (new->panner.tmp.doing) redisplay = TRUE;
- }
-
- if ((cur->panner.stipple_name != new->panner.stipple_name ||
- cur->panner.shadow_color != new->panner.shadow_color ||
- cur->core.background_pixel != new->core.background_pixel) &&
- XtIsRealized(gnew)) {
- Pixmap pm = (new->panner.stipple_name ? BACKGROUND_STIPPLE (new)
- : XtUnspecifiedPixmap);
-
- if (PIXMAP_OKAY(pm)) {
- XSetWindowBackgroundPixmap (XtDisplay (new), XtWindow(new), pm);
- XFreePixmap (XtDisplay (new), pm);
- } else {
- XSetWindowBackground (XtDisplay (new), XtWindow(new),
- new->core.background_pixel);
- }
- redisplay = TRUE;
- }
-
- if (new->panner.resize_to_pref &&
- (cur->panner.canvas_width != new->panner.canvas_width ||
- cur->panner.canvas_height != new->panner.canvas_height ||
- cur->panner.resize_to_pref != new->panner.resize_to_pref)) {
- get_default_size (new, &new->core.width, &new->core.height);
- redisplay = TRUE;
- } else if (cur->panner.canvas_width != new->panner.canvas_width ||
- cur->panner.canvas_height != new->panner.canvas_height ||
- cur->panner.internal_border != new->panner.internal_border) {
- rescale (new); /* does a scale_knob as well */
- redisplay = TRUE;
- } else {
- Boolean loc = (cur->panner.slider_x != new->panner.slider_x ||
- cur->panner.slider_y != new->panner.slider_y);
- Boolean siz = (cur->panner.slider_width != new->panner.slider_width ||
- cur->panner.slider_height != new->panner.slider_height);
- if (loc || siz ||
- (cur->panner.allow_off != new->panner.allow_off &&
- new->panner.allow_off)) {
- scale_knob (new, loc, siz);
- redisplay = TRUE;
- }
- }
-
- return redisplay;
-}
-
-static void SetValuesAlmost (gold, gnew, req, reply)
- Widget gold, gnew;
- XtWidgetGeometry *req, *reply;
-{
- if (reply->request_mode == 0) { /* got turned down, so cope */
- Resize (gnew);
- }
- (*pannerWidgetClass->core_class.superclass->core_class.set_values_almost)
- (gold, gnew, req, reply);
-}
-
-static XtGeometryResult QueryGeometry (gw, intended, pref)
- Widget gw;
- XtWidgetGeometry *intended, *pref;
-{
- PannerWidget pw = (PannerWidget) gw;
-
- pref->request_mode = (CWWidth | CWHeight);
- get_default_size (pw, &pref->width, &pref->height);
-
- if (((intended->request_mode & (CWWidth | CWHeight)) ==
- (CWWidth | CWHeight)) &&
- intended->width == pref->width &&
- intended->height == pref->height)
- return XtGeometryYes;
- else if (pref->width == pw->core.width && pref->height == pw->core.height)
- return XtGeometryNo;
- else
- return XtGeometryAlmost;
-}
-
-
-/*****************************************************************************
- * *
- * panner action procs *
- * *
- *****************************************************************************/
-
-/* ARGSUSED */
-static void ActionStart (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
- int x, y;
-
- UNUSED(params);
- UNUSED(num_params);
-
- if (!get_event_xy (pw, event, &x, &y)) {
- panBell(XtDisplay(gw), XtWindow(gw), 0); /* should do error message */
- return;
- }
-
- pw->panner.tmp.doing = TRUE;
- pw->panner.tmp.startx = pw->panner.knob_x;
- pw->panner.tmp.starty = pw->panner.knob_y;
- pw->panner.tmp.dx = (((Position) x) - pw->panner.knob_x);
- pw->panner.tmp.dy = (((Position) y) - pw->panner.knob_y);
- pw->panner.tmp.x = pw->panner.knob_x;
- pw->panner.tmp.y = pw->panner.knob_y;
- if (pw->panner.rubber_band) DRAW_TMP (pw);
-}
-
-/* ARGSUSED */
-static void ActionStop (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
- int x, y;
-
- UNUSED(params);
- UNUSED(num_params);
-
- if (get_event_xy (pw, event, &x, &y)) {
- pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx;
- pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy;
- if (!pw->panner.allow_off) check_knob (pw, FALSE);
- }
- if (pw->panner.rubber_band) UNDRAW_TMP (pw);
- pw->panner.tmp.doing = FALSE;
-}
-
-/* ARGSUSED */
-static void ActionAbort (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
-
- UNUSED(params);
- UNUSED(num_params);
-
- if (!pw->panner.tmp.doing) return;
-
- if (pw->panner.rubber_band) UNDRAW_TMP (pw);
-
- if (!pw->panner.rubber_band) { /* restore old position */
- pw->panner.tmp.x = pw->panner.tmp.startx;
- pw->panner.tmp.y = pw->panner.tmp.starty;
- ActionNotify (gw, event, params, num_params);
- }
- pw->panner.tmp.doing = FALSE;
-}
-
-
-/* ARGSUSED */
-static void ActionMove (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
- int x, y;
-
- UNUSED(params);
- UNUSED(num_params);
-
- if (!pw->panner.tmp.doing) return;
-
- if (!get_event_xy (pw, event, &x, &y)) {
- panBell(XtDisplay(gw), XtWindow(gw), 0); /* should do error message */
- return;
- }
-
- if (pw->panner.rubber_band) UNDRAW_TMP (pw);
- pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx;
- pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy;
-
- if (!pw->panner.rubber_band) {
- ActionNotify (gw, event, params, num_params); /* does a check */
- } else {
- if (!pw->panner.allow_off) check_knob (pw, FALSE);
- DRAW_TMP (pw);
- }
-}
-
-
-/* ARGSUSED */
-static void ActionPage (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
- Cardinal zero = 0;
- Boolean isin = pw->panner.tmp.doing;
- int x, y;
- Boolean relx, rely;
- int pad = pw->panner.internal_border * 2;
-
- UNUSED(event);
- UNUSED(num_params);
-
- if (*num_params != 2) {
- panBell (XtDisplay(gw), XtWindow(gw), 0);
- return;
- }
-
- x = parse_page_string (params[0], (int) pw->panner.knob_width,
- ((int) pw->core.width) - pad, &relx);
- y = parse_page_string (params[1], (int) pw->panner.knob_height,
- ((int) pw->core.height) - pad, &rely);
-
- if (relx) x += pw->panner.knob_x;
- if (rely) y += pw->panner.knob_y;
-
- if (isin) { /* if in, then use move */
- XEvent ev;
- ev.xbutton.type = ButtonPress;
- ev.xbutton.x = x;
- ev.xbutton.y = y;
- ActionMove (gw, &ev, (String *) NULL, &zero);
- } else { /* else just do it */
- pw->panner.tmp.doing = TRUE;
- pw->panner.tmp.x = x;
- pw->panner.tmp.y = y;
- ActionNotify (gw, event, (String *) NULL, &zero);
- pw->panner.tmp.doing = FALSE;
- }
-}
-
-
-/* ARGSUSED */
-static void ActionNotify (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
-
- UNUSED(event);
- UNUSED(params);
- UNUSED(num_params);
-
- if (!pw->panner.tmp.doing) return;
-
- if (!pw->panner.allow_off) check_knob (pw, FALSE);
- pw->panner.knob_x = pw->panner.tmp.x;
- pw->panner.knob_y = pw->panner.tmp.y;
- move_shadow (pw);
-
- pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) /
- pw->panner.haspect + 0.5);
- pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) /
- pw->panner.vaspect + 0.5);
- if (!pw->panner.allow_off) {
- Position tmp;
-
- if (pw->panner.slider_x >
- (tmp = (((Position) pw->panner.canvas_width) -
- ((Position) pw->panner.slider_width))))
- pw->panner.slider_x = tmp;
- if (pw->panner.slider_x < 0) pw->panner.slider_x = 0;
- if (pw->panner.slider_y >
- (tmp = (((Position) pw->panner.canvas_height) -
- ((Position) pw->panner.slider_height))))
- pw->panner.slider_y = tmp;
- if (pw->panner.slider_y < 0) pw->panner.slider_y = 0;
- }
-
- if (pw->panner.last_x != pw->panner.knob_x ||
- pw->panner.last_y != pw->panner.knob_y) {
- XawPannerReport rep;
-
- Redisplay (gw, (XEvent*) NULL, (Region) NULL);
- rep.changed = (XawPRSliderX | XawPRSliderY);
- rep.slider_x = pw->panner.slider_x;
- rep.slider_y = pw->panner.slider_y;
- rep.slider_width = pw->panner.slider_width;
- rep.slider_height = pw->panner.slider_height;
- rep.canvas_width = pw->panner.canvas_width;
- rep.canvas_height = pw->panner.canvas_height;
- XtCallCallbackList (gw, pw->panner.report_callbacks, (XtPointer) &rep);
- }
-}
-
-/* ARGSUSED */
-static void ActionSet (Widget gw, XEvent *event, String *params, Cardinal *num_params)
-{
- PannerWidget pw = (PannerWidget) gw;
- Boolean rb;
-
- UNUSED(event);
-
- if (*num_params < 2 ||
- XmuCompareISOLatin1 (params[0], "rubberband") != 0) {
- panBell (XtDisplay(gw), XtWindow(gw), 0);
- return;
- }
-
- if (XmuCompareISOLatin1 (params[1], "on") == 0) {
- rb = TRUE;
- } else if (XmuCompareISOLatin1 (params[1], "off") == 0) {
- rb = FALSE;
- } else if (XmuCompareISOLatin1 (params[1], "toggle") == 0) {
- rb = !pw->panner.rubber_band;
- } else {
- panBell (XtDisplay(gw), XtWindow(gw), 0);
- return;
- }
-
- if (rb != pw->panner.rubber_band) {
- Arg args[1];
- XtSetArg (args[0], XtNrubberBand, rb);
- XtSetValues (gw, args, (Cardinal) 1);
- }
-}
-
-#endif /* MOTIF && USE_PANNER */