987 lines
23 KiB
C
987 lines
23 KiB
C
/*
|
|
* WWW.c
|
|
*
|
|
* Copyright (c) 1995-1997, John Kilburg <john@cs.unlv.edu>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
|
|
Some of the code was borrowed from the Viewport widget:
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
#include "port_before.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
#include <stdlib.h>
|
|
#endif
|
|
|
|
#include <X11/IntrinsicP.h>
|
|
#include <X11/StringDefs.h>
|
|
#include <X11/Xaw/Scrollbar.h>
|
|
|
|
#include <X11/keysym.h>
|
|
|
|
#include "port_after.h"
|
|
|
|
#include "WWWP.h"
|
|
#include "Geom.h"
|
|
|
|
#define WMethod(x) ((x) != NULL ? (x):10)
|
|
|
|
/*
|
|
* Action prototypes
|
|
*/
|
|
static void WWWMotionAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWSelectAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWExposeAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWPageUpAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWPageDownAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWPageLeftAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWPageRightAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScrollUpAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScrollDownAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScrollLeftAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScrollRightAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScroll5UpAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
static void WWWScroll5DownAction _ArgProto((Widget, XEvent *,
|
|
String *, Cardinal *));
|
|
|
|
static char defaultTranslations[] =
|
|
"<Btn1Up>: select() \n\
|
|
<Btn2Up>: select() \n\
|
|
<Btn3Up>: select() \n\
|
|
<Btn4Down>: scroll5_up() \n\
|
|
<Btn5Down>: scroll5_down() \n\
|
|
<Expose>: expose() \n\
|
|
<Motion>: motion() \n\
|
|
:<Key>BackSpace: page_up()\n\
|
|
:<Key>Page_Up: page_up()\n\
|
|
:<Key>KP_Page_Up: page_up()\n\
|
|
:<Key>0x20: page_down()\n\
|
|
:<Key>Page_Down: page_down()\n\
|
|
:<Key>KP_Page_Down: page_down()\n\
|
|
:s<Key>Up: page_up()\n\
|
|
:s<Key>KP_Up: page_up()\n\
|
|
:s<Key>Down: page_down()\n\
|
|
:s<Key>KP_Down: page_down()\n\
|
|
:s<Key>Left: page_left()\n\
|
|
:s<Key>KP_Left: page_left()\n\
|
|
:s<Key>Right: page_right()\n\
|
|
:s<Key>KP_Right: page_right()\n\
|
|
:<Key>Up: scroll_up()\n\
|
|
:<Key>KP_Up: scroll_up()\n\
|
|
:<Key>Down: scroll_down()\n\
|
|
:<Key>KP_Down: scroll_down()\n\
|
|
:<Key>Left: scroll_left()\n\
|
|
:<Key>KP_Left: scroll_left()\n\
|
|
:<Key>Right: scroll_right()\n\
|
|
:<Key>KP_Right: scroll_right()\n\
|
|
";
|
|
|
|
static XtActionsRec actionsList[] =
|
|
{
|
|
{ "expose", WWWExposeAction },
|
|
{ "select", WWWSelectAction },
|
|
{ "motion", WWWMotionAction },
|
|
{ "page_up", WWWPageUpAction },
|
|
{ "page_down", WWWPageDownAction },
|
|
{ "page_left", WWWPageLeftAction },
|
|
{ "page_right", WWWPageRightAction},
|
|
{ "scroll_up", WWWScrollUpAction },
|
|
{ "scroll_down", WWWScrollDownAction },
|
|
{ "scroll_left", WWWScrollLeftAction },
|
|
{ "scroll_right", WWWScrollRightAction},
|
|
{ "scroll5_up", WWWScroll5UpAction },
|
|
{ "scroll5_down", WWWScroll5DownAction },
|
|
};
|
|
|
|
#define offset(field) XtOffsetOf(WWWRec, www.field)
|
|
static XtResource resources[] =
|
|
{
|
|
{ XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel),
|
|
offset(background), XtRString, (XtPointer)"moccasin" },
|
|
|
|
{ XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
|
|
offset(foreground), XtRString, (XtPointer)"black" },
|
|
};
|
|
#undef offset
|
|
|
|
static void WWWInitialize _ArgProto((Widget, Widget, ArgList, Cardinal *));
|
|
void WWWResize _ArgProto((Widget));
|
|
static void WWWRealize _ArgProto((Widget, XtValueMask *,
|
|
XSetWindowAttributes *));
|
|
static Boolean WWWSetValues _ArgProto((Widget, Widget, Widget,
|
|
ArgList, Cardinal *));
|
|
static XtGeometryResult WWWGeometryManager _ArgProto((Widget,
|
|
XtWidgetGeometry *,
|
|
XtWidgetGeometry *));
|
|
static XtGeometryResult WWWPreferredGeometry _ArgProto((Widget,
|
|
XtWidgetGeometry *,
|
|
XtWidgetGeometry *));
|
|
|
|
static void WWWGetValuesHook _ArgProto((Widget, ArgList, Cardinal *));
|
|
|
|
static Dimension FixDim _ArgProto((unsigned int));
|
|
static void ConfigureWidgets _ArgProto((WWWWidget,
|
|
unsigned int, unsigned int));
|
|
|
|
/* Scrollbar handling functions */
|
|
static void RedrawThumbs _ArgProto((WWWWidget));
|
|
static void ScrollUpDownProc _ArgProto((Widget, XtPointer, XtPointer));
|
|
static void ThumbProc _ArgProto((Widget, XtPointer, XtPointer));
|
|
|
|
WWWClassRec wwwClassRec =
|
|
{
|
|
{ /* core_class fields */
|
|
/* superclass */ (WidgetClass) &compositeClassRec,
|
|
/* class_name */ "WWW",
|
|
/* widget_size */ sizeof(WWWRec),
|
|
/* class_initialize */ NULL,
|
|
/* class_part_init */ NULL,
|
|
/* class_inited */ FALSE,
|
|
/* initialize */ WWWInitialize,
|
|
/* initialize_hook */ NULL,
|
|
/* realize */ WWWRealize,
|
|
/* actions */ actionsList,
|
|
/* num_actions */ XtNumber(actionsList),
|
|
/* resources */ resources,
|
|
/* num_resources */ XtNumber(resources),
|
|
/* xrm_class */ NULLQUARK,
|
|
/* compress_motion */ FALSE,
|
|
/* compress_exposure */ FALSE,
|
|
/* compress_enterleave*/ FALSE,
|
|
/* visible_interest */ FALSE,
|
|
/* destroy */ NULL,
|
|
/* resize */ WWWResize,
|
|
/* expose */ NULL,
|
|
/* set_values */ WWWSetValues,
|
|
/* set_values_hook */ NULL,
|
|
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
/* get_values_hook */ WWWGetValuesHook,
|
|
/* accept_focus */ NULL,
|
|
/* version */ XtVersion,
|
|
/* callback_private */ NULL,
|
|
/* tm_table */ NULL,
|
|
/* query_geometry */ WWWPreferredGeometry,
|
|
/* display_accelerator*/ XtInheritDisplayAccelerator,
|
|
/* extension */ NULL
|
|
},
|
|
{ /* composite_class fields */
|
|
/* geometry_manager */ WWWGeometryManager,
|
|
/* change_managed */ NULL,
|
|
/* insert_child */ XtInheritInsertChild,
|
|
/* delete_child */ XtInheritDeleteChild,
|
|
/* extension */ NULL
|
|
},
|
|
{ /* www_class fields */
|
|
NULL,
|
|
}
|
|
};
|
|
|
|
WidgetClass wwwWidgetClass = (WidgetClass)&wwwClassRec;
|
|
|
|
/*
|
|
* WWWGetValuesHook
|
|
*/
|
|
static void
|
|
WWWGetValuesHook(w, args, num_args)
|
|
Widget w;
|
|
ArgList args;
|
|
Cardinal * num_args;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
int i;
|
|
|
|
for (i = 0; i < *num_args; i++)
|
|
{
|
|
if (strcmp(args[i].name, XtNbackground) == 0)
|
|
{
|
|
*((Pixel *)args[i].value) = rw->www.background;
|
|
}
|
|
if (strcmp(args[i].name, XtNforeground) == 0)
|
|
{
|
|
*((Pixel *)args[i].value) = rw->www.foreground;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWResize
|
|
*/
|
|
void
|
|
WWWResize(w)
|
|
Widget w;
|
|
{
|
|
WWWWidget rw;
|
|
|
|
if (XtClass(w) != wwwWidgetClass) return;
|
|
|
|
rw = (WWWWidget)w;
|
|
if (rw->www.resize_callback != NULL)
|
|
{
|
|
(rw->www.resize_callback)(w, rw->www.resize_closure, NULL);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWRealize
|
|
*/
|
|
static void
|
|
WWWRealize(w, valueMask, attributes)
|
|
Widget w;
|
|
XtValueMask *valueMask;
|
|
XSetWindowAttributes *attributes;
|
|
{
|
|
(*wwwWidgetClass->core_class.superclass->core_class.realize)
|
|
(w, valueMask, attributes);
|
|
|
|
return;
|
|
}
|
|
|
|
static XtGeometryResult
|
|
WWWPreferredGeometry(w, con, reply)
|
|
Widget w;
|
|
XtWidgetGeometry *con, *reply;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
XtResizeWidget(rw->www.clip, con->width > 0 ? con->width:100,
|
|
con->height > 0 ? con->height:100, 0);
|
|
|
|
return(XtGeometryYes);
|
|
}
|
|
|
|
/*
|
|
* WWWGeometryManager
|
|
*/
|
|
static XtGeometryResult
|
|
WWWGeometryManager(w, request, reply)
|
|
Widget w;
|
|
XtWidgetGeometry *request;
|
|
XtWidgetGeometry *reply;
|
|
{
|
|
return(XtGeometryNo);
|
|
}
|
|
|
|
/*
|
|
* WWWSetValues
|
|
*/
|
|
Boolean
|
|
WWWSetValues(c, r, n, args, count)
|
|
Widget c, r, n;
|
|
ArgList args;
|
|
Cardinal *count;
|
|
{
|
|
return(False);
|
|
}
|
|
|
|
static void
|
|
RedrawThumbs(rw)
|
|
WWWWidget rw;
|
|
{
|
|
Widget child = rw->www.child;
|
|
Widget clip = rw->www.clip;
|
|
Dimension length, total;
|
|
Position top;
|
|
|
|
if (rw->www.horiz_bar != (Widget)NULL)
|
|
{
|
|
top = -(child->core.x);
|
|
length = clip->core.width;
|
|
total = child->core.width;
|
|
|
|
XawScrollbarSetThumb(rw->www.horiz_bar,
|
|
(float)top/(float)total,
|
|
(float)length/(float)total);
|
|
}
|
|
|
|
if (rw->www.vert_bar != (Widget)NULL)
|
|
{
|
|
top = -(child->core.y);
|
|
length = clip->core.height;
|
|
total = child->core.height;
|
|
|
|
XawScrollbarSetThumb(rw->www.vert_bar,
|
|
(float)top/(float)total,
|
|
(float)length/(float)total);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
WWWMoveChild(w, x, y)
|
|
Widget w;
|
|
int x, y;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
register Widget child = rw->www.child;
|
|
register Widget clip = rw->www.clip;
|
|
|
|
if (-x + (int)clip->core.width > (int)child->core.width)
|
|
{
|
|
x = -(child->core.width - clip->core.width);
|
|
}
|
|
|
|
if (-y + (int)clip->core.height > (int)child->core.height)
|
|
{
|
|
y = -(child->core.height - clip->core.height);
|
|
}
|
|
|
|
if (x >= 0) x = 0;
|
|
if (y >= 0) y = 0;
|
|
|
|
/* Mmmm hairy cast */
|
|
XtMoveWidget(child, (Position)x, (Position)y);
|
|
|
|
RedrawThumbs(rw);
|
|
|
|
return;
|
|
}
|
|
|
|
static void
|
|
ScrollUpDownProc(widget, closure, call_data)
|
|
Widget widget;
|
|
XtPointer closure;
|
|
XtPointer call_data;
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(widget);
|
|
register Widget child = rw->www.child;
|
|
int pix = (int)call_data;
|
|
Position x, y;
|
|
|
|
if (child == NULL) return; /* no child to scroll. */
|
|
|
|
x = child->core.x - ((widget == rw->www.horiz_bar) ? pix : 0);
|
|
y = child->core.y - ((widget == rw->www.vert_bar) ? pix : 0);
|
|
WWWMoveChild((Widget)rw, (int)x, (int)y);
|
|
|
|
return;
|
|
}
|
|
|
|
static void
|
|
ThumbProc(widget, closure, call_data)
|
|
Widget widget;
|
|
XtPointer closure;
|
|
XtPointer call_data;
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(widget);
|
|
register Widget child = rw->www.child;
|
|
Position x, y;
|
|
float *percent = (float *)call_data;
|
|
|
|
if (child == NULL) return; /* no child to scroll. */
|
|
|
|
if (widget == rw->www.horiz_bar) x = -(int)(*percent * child->core.width);
|
|
else x = child->core.x;
|
|
|
|
if (widget == rw->www.vert_bar) y = -(int)(*percent * child->core.height);
|
|
else y = child->core.y;
|
|
|
|
WWWMoveChild((Widget)rw, (int)x, (int)y);
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWInitialize
|
|
*/
|
|
static void
|
|
WWWInitialize(r, n, args, count)
|
|
Widget r, n;
|
|
ArgList args;
|
|
Cardinal *count;
|
|
{
|
|
WWWWidget new = (WWWWidget)n;
|
|
|
|
/*
|
|
* Avoid zero.
|
|
*/
|
|
if (new->core.width < 5) new->core.width = 5;
|
|
if (new->core.height < 5) new->core.height = 5;
|
|
|
|
new->www.use_scroll = false;
|
|
|
|
new->www.resize_closure = NULL;
|
|
new->www.resize_callback = NULL;
|
|
new->www.motion_callback = NULL;
|
|
new->www.motion_closure = NULL;
|
|
new->www.select_callback = NULL;
|
|
new->www.select_closure = NULL;
|
|
new->www.expose_callback = NULL;
|
|
new->www.expose_closure = NULL;
|
|
|
|
/*
|
|
* Create scrollbars, clip, and the child widget. The child widget is
|
|
* the one that we draw into.
|
|
*/
|
|
new->www.vert_bar = XtVaCreateWidget("vert_bar",
|
|
scrollbarWidgetClass, n,
|
|
XtNorientation, XtorientVertical,
|
|
XtNmappedWhenManaged, False,
|
|
NULL);
|
|
XtManageChild(new->www.vert_bar);
|
|
|
|
XtAddCallback(new->www.vert_bar, XtNscrollProc,
|
|
ScrollUpDownProc, (XtPointer)new);
|
|
XtAddCallback(new->www.vert_bar, XtNjumpProc,
|
|
ThumbProc, (XtPointer)new);
|
|
|
|
new->www.horiz_bar = XtVaCreateWidget("horiz_bar",
|
|
scrollbarWidgetClass, n,
|
|
XtNorientation, XtorientHorizontal,
|
|
XtNmappedWhenManaged, False,
|
|
NULL);
|
|
XtManageChild(new->www.horiz_bar);
|
|
|
|
XtAddCallback(new->www.horiz_bar, XtNscrollProc,
|
|
ScrollUpDownProc, (XtPointer)new);
|
|
XtAddCallback(new->www.horiz_bar, XtNjumpProc,
|
|
ThumbProc, (XtPointer)new);
|
|
|
|
new->www.clip = XtVaCreateWidget("clip",
|
|
geomWidgetClass, n,
|
|
XtNwidth, new->core.width,
|
|
XtNheight, new->core.height,
|
|
XtNborderWidth, 0,
|
|
NULL);
|
|
XtManageChild(new->www.clip);
|
|
|
|
new->www.child = XtVaCreateWidget("child",
|
|
geomWidgetClass, new->www.clip,
|
|
XtNwidth, new->www.clip->core.width,
|
|
XtNheight, new->www.clip->core.height,
|
|
XtNborderWidth, 0,
|
|
NULL);
|
|
XtManageChild(new->www.child);
|
|
|
|
XtAugmentTranslations(new->www.child,
|
|
XtParseTranslationTable(defaultTranslations));
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* FixDim
|
|
*/
|
|
static Dimension
|
|
FixDim(d)
|
|
unsigned int d;
|
|
{
|
|
if (d > 0x7ffd) return(0x7ffd);
|
|
return((Dimension)d);
|
|
}
|
|
|
|
/*
|
|
* ConfigureWidgets
|
|
*/
|
|
static void
|
|
ConfigureWidgets(rw, width, height)
|
|
WWWWidget rw;
|
|
unsigned int width, height;
|
|
{
|
|
Dimension child_width, child_height;
|
|
Dimension clip_width, clip_height;
|
|
Dimension vx, hy;
|
|
Dimension vw, hh;
|
|
float shown;
|
|
|
|
if (!XtIsRealized((Widget)rw)) return;
|
|
|
|
vw = rw->www.vert_bar->core.width;
|
|
hh = rw->www.horiz_bar->core.height;
|
|
|
|
child_width = FixDim(width);
|
|
child_height = FixDim(height);
|
|
|
|
clip_width = rw->core.width - vw;
|
|
clip_height = rw->core.height - hh;
|
|
|
|
if (child_width > clip_width) hy = hh;
|
|
else
|
|
{
|
|
hy = 0;
|
|
child_width = clip_width;
|
|
}
|
|
|
|
if (child_height > clip_height) vx = vw;
|
|
else
|
|
{
|
|
vx = 0;
|
|
child_height = clip_height;
|
|
}
|
|
|
|
if (child_height > clip_height)
|
|
{
|
|
XtConfigureWidget(rw->www.vert_bar,
|
|
0, hy,
|
|
vw, rw->core.height - hy, 0);
|
|
shown = (float)clip_height / (float)child_height;
|
|
XawScrollbarSetThumb(rw->www.vert_bar, (float)-1.0, shown);
|
|
XtSetMappedWhenManaged(rw->www.vert_bar, True);
|
|
}
|
|
else XtSetMappedWhenManaged(rw->www.vert_bar, False);
|
|
|
|
if (child_width > clip_width)
|
|
{
|
|
XtConfigureWidget(rw->www.horiz_bar,
|
|
vx, 0,
|
|
rw->core.width - vx, hh, 0);
|
|
shown = (float)clip_width / (float)child_width;
|
|
XawScrollbarSetThumb(rw->www.horiz_bar, (float)-1.0, shown);
|
|
XtSetMappedWhenManaged(rw->www.horiz_bar, True);
|
|
}
|
|
else XtSetMappedWhenManaged(rw->www.horiz_bar, False);
|
|
|
|
XtConfigureWidget(rw->www.clip,
|
|
vw, hh,
|
|
clip_width, clip_height, 0);
|
|
|
|
XtResizeWidget(rw->www.child, child_width, child_height, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWGetDrawWidget
|
|
*/
|
|
Widget
|
|
WWWGetDrawWidget(w)
|
|
Widget w;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
return(rw->www.child);
|
|
}
|
|
|
|
/*
|
|
* WWWGetSize
|
|
*/
|
|
int
|
|
WWWGetDrawSize(w, width, height)
|
|
Widget w;
|
|
unsigned int *width, *height;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
*width = (unsigned int)rw->www.child->core.width;
|
|
*height = (unsigned int)rw->www.child->core.height;
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*
|
|
* WWWSetDrawSize
|
|
*/
|
|
int
|
|
WWWSetDrawSize(w, width, height)
|
|
Widget w;
|
|
unsigned int width, height;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
if (!rw->www.use_scroll)
|
|
{
|
|
XtSetMappedWhenManaged(rw->www.vert_bar, False);
|
|
XtSetMappedWhenManaged(rw->www.horiz_bar, False);
|
|
XtConfigureWidget(rw->www.clip, 0, 0, FixDim(width), FixDim(height), 0);
|
|
XtConfigureWidget(rw->www.child, 0, 0, FixDim(width), FixDim(height), 0);
|
|
}
|
|
else
|
|
{
|
|
ConfigureWidgets(rw, width, height);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*
|
|
* WWWSetScrollBar
|
|
*/
|
|
void
|
|
WWWSetScrollBar(w, use_scroll)
|
|
Widget w;
|
|
bool use_scroll;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
rw->www.use_scroll = use_scroll;
|
|
if (!rw->www.use_scroll)
|
|
{
|
|
XtSetMappedWhenManaged(rw->www.vert_bar, False);
|
|
XtSetMappedWhenManaged(rw->www.horiz_bar, False);
|
|
XtConfigureWidget(rw->www.clip, 0, 0,
|
|
rw->core.width, rw->core.height, 0);
|
|
XtConfigureWidget(rw->www.child, 0, 0,
|
|
rw->core.width, rw->core.height, 0);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWSetResizeCallback
|
|
*/
|
|
void
|
|
WWWSetResizeCallback(w, callback, closure)
|
|
Widget w;
|
|
void (*callback)();
|
|
void *closure;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
rw->www.resize_callback = callback;
|
|
rw->www.resize_closure = closure;
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWSetMotionCallback
|
|
*/
|
|
void
|
|
WWWSetMotionCallback(w, callback, closure)
|
|
Widget w;
|
|
void (*callback)();
|
|
void *closure;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
rw->www.motion_callback = callback;
|
|
rw->www.motion_closure = closure;
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWSetSelectCallback
|
|
*/
|
|
void
|
|
WWWSetSelectCallback(w, callback, closure)
|
|
Widget w;
|
|
void (*callback)();
|
|
void *closure;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
rw->www.select_callback = callback;
|
|
rw->www.select_closure = closure;
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWSetExposeCallback
|
|
*/
|
|
void
|
|
WWWSetExposeCallback(w, callback, closure)
|
|
Widget w;
|
|
void (*callback)();
|
|
void *closure;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
rw->www.expose_callback = callback;
|
|
rw->www.expose_closure = closure;
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWExposeAction
|
|
*/
|
|
static void
|
|
WWWExposeAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
|
|
if (rw->www.expose_callback != NULL)
|
|
{
|
|
(rw->www.expose_callback) (w, rw->www.expose_closure,
|
|
xe->xexpose.x, xe->xexpose.y,
|
|
xe->xexpose.width, xe->xexpose.height);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWSelectAction
|
|
*/
|
|
static void
|
|
WWWSelectAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
|
|
if (rw->www.select_callback != NULL)
|
|
{
|
|
(rw->www.select_callback) (w, rw->www.select_closure,
|
|
xe->xbutton.x, xe->xbutton.y,
|
|
xe->xbutton.button);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWMotionAction
|
|
*/
|
|
static void
|
|
WWWMotionAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
|
|
if (rw->www.motion_callback != NULL)
|
|
{
|
|
(rw->www.motion_callback) (w, rw->www.motion_closure,
|
|
xe->xmotion.x, xe->xmotion.y);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWGetScrollPosition
|
|
*/
|
|
void
|
|
WWWGetScrollPosition(w, x, y)
|
|
Widget w;
|
|
int *x, *y;
|
|
{
|
|
WWWWidget rw = (WWWWidget)w;
|
|
|
|
*x = (int)(rw->www.child->core.x);
|
|
*y = (int)(rw->www.child->core.y);
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WWWPageUpAction
|
|
*/
|
|
static void
|
|
WWWPageUpAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
Widget clip = rw->www.clip;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y+clip->core.height/2);
|
|
}
|
|
|
|
/*
|
|
* WWWPageDownAction
|
|
*/
|
|
static void
|
|
WWWPageDownAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
Widget clip = rw->www.clip;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y-clip->core.height/2);
|
|
}
|
|
|
|
/*
|
|
* WWWPageLeftAction
|
|
*/
|
|
static void
|
|
WWWPageLeftAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
Widget clip = rw->www.clip;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x+clip->core.width/2,child->core.y);
|
|
}
|
|
|
|
/*
|
|
* WWWPageRightAction
|
|
*/
|
|
static void
|
|
WWWPageRightAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
Widget clip = rw->www.clip;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x-clip->core.width/2,child->core.y);
|
|
}
|
|
|
|
/*
|
|
* WWWScrollUpAction
|
|
*/
|
|
static void
|
|
WWWScrollUpAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y+10);
|
|
}
|
|
|
|
/*
|
|
* WWWScrollDownAction
|
|
*/
|
|
static void
|
|
WWWScrollDownAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y-10);
|
|
}
|
|
|
|
/*
|
|
* WWWScrolLeftAction
|
|
*/
|
|
static void
|
|
WWWScrollLeftAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x+10,child->core.y);
|
|
}
|
|
|
|
/*
|
|
* WWWScrollRightAction
|
|
*/
|
|
static void
|
|
WWWScrollRightAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x-10,child->core.y);
|
|
}
|
|
|
|
/*
|
|
* WWWScroll5UpAction
|
|
*/
|
|
static void
|
|
WWWScroll5UpAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y+50);
|
|
}
|
|
|
|
/*
|
|
* WWWScroll5DownAction
|
|
*/
|
|
static void
|
|
WWWScroll5DownAction(w, xe, params, num_params)
|
|
Widget w;
|
|
XEvent *xe;
|
|
String *params; /* unused */
|
|
Cardinal *num_params; /* unused */
|
|
{
|
|
WWWWidget rw = (WWWWidget)XtParent(XtParent(w));
|
|
Widget child = rw->www.child;
|
|
|
|
WWWMoveChild((Widget)rw,child->core.x,child->core.y-50);
|
|
}
|