diff options
Diffstat (limited to 'libXaw/src/DisplayList.c')
-rw-r--r-- | libXaw/src/DisplayList.c | 4510 |
1 files changed, 2255 insertions, 2255 deletions
diff --git a/libXaw/src/DisplayList.c b/libXaw/src/DisplayList.c index 1bef9945f..6549650e7 100644 --- a/libXaw/src/DisplayList.c +++ b/libXaw/src/DisplayList.c @@ -1,2255 +1,2255 @@ -/*
- * Copyright (c) 1998 by The XFree86 Project, Inc.
- *
- * 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 XFREE86 PROJECT 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 XFree86 Project 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
- * XFree86 Project.
- *
- * Author: Paulo César Pereira de Andrade
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <ctype.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/CoreP.h>
-#include <X11/Xfuncs.h>
-#include <X11/Xmu/CharSet.h>
-#include <X11/Xmu/SysUtil.h>
-#include "Private.h"
-
-#ifdef __UNIXOS2__
-static char dummy;
-#endif
-
-#ifndef OLDXAW
-
-/*
- * Types
- */
-typedef struct _XawDLProc XawDLProc;
-typedef struct _XawDLData XawDLData;
-typedef struct _XawDLInfo XawDLInfo;
-
-struct _XawDLProc {
- XrmQuark qname;
- String *params;
- Cardinal num_params;
- XawDisplayListProc proc;
- XtPointer args;
- XawDLData *data;
-};
-
-struct _XawDLData {
- XawDLClass *dlclass;
- XtPointer data;
-};
-
-struct _XawDLInfo {
- String name;
- XrmQuark qname;
- XawDisplayListProc proc;
-};
-
-struct _XawDL {
- XawDLProc **procs;
- Cardinal num_procs;
- XawDLData **data;
- Cardinal num_data;
- Screen *screen;
- Colormap colormap;
- int depth;
- XrmQuark qrep; /* for cache lookup */
-};
-
-struct _XawDLClass {
- String name;
- XawDLInfo **infos;
- Cardinal num_infos;
- XawDLArgsInitProc args_init;
- XawDLArgsDestructor args_destructor;
- XawDLDataInitProc data_init;
- XawDLDataDestructor data_destructor;
-};
-
-/*
- * Private Methods
- */
-static XawDLClass *_XawFindDLClass(String);
-static int qcmp_dlist_class(_Xconst void*, _Xconst void*);
-static int bcmp_dlist_class(_Xconst void*, _Xconst void*);
-static XawDLInfo *_XawFindDLInfo(XawDLClass*, String);
-static int qcmp_dlist_info(_Xconst void*, _Xconst void*);
-static int bcmp_dlist_info(_Xconst void*, _Xconst void*);
-static void *_Xaw_Xlib_ArgsInitProc(String, String*, Cardinal*,
- Screen*, Colormap, int);
-static void _Xaw_Xlib_ArgsDestructor(Display*, String, XtPointer,
- String*, Cardinal*);
-static void *_Xaw_Xlib_DataInitProc(String, Screen*, Colormap, int);
-static void _Xaw_Xlib_DataDestructor(Display*, String, XtPointer);
-
-/*
- * Initialization
- */
-static XawDLClass **classes;
-static Cardinal num_classes;
-static String xlib = "xlib";
-
-/*
- * Implementation
- */
-void
-XawRunDisplayList(Widget w, _XawDisplayList *list,
- XEvent *event, Region region)
-{
- XawDLProc *proc;
- Cardinal i;
-
- if (!XtIsRealized(w))
- return;
-
- for (i = 0; i < list->num_procs; i++)
- {
- proc = list->procs[i];
- proc->proc(w, proc->args, proc->data->data, event, region);
- }
-}
-
-#define DLERR -2
-#define DLEOF -1
-#define DLEND 1
-#define DLNAME 2
-#define DLARG 3
-static char *
-read_token(char *src, char *dst, Cardinal size, int *status)
-{
- int ch;
- Bool esc, quote;
- Cardinal i;
-
- i = 0;
- esc = quote = False;
-
- /*CONSTCOND*/
- while (1)
- {
- ch = *src;
- if (ch != '\n' && isspace(ch))
- ++src;
- else
- break;
- }
-
- for (; i < size - 1; src++)
- {
- ch = *src;
- if (ch == '"')
- {
- if (quote)
- {
- quote = False;
- continue;
- }
- quote = True;
- continue;
- }
- if (ch == '\\')
- {
- if (esc)
- {
- dst[i++] = ch;
- esc = False;
- continue;
- }
- esc = True;
- continue;
- }
- if (ch == '\0')
- {
- *status = DLEOF;
- dst[i] = '\0';
- return (src);
- }
- else if (!esc)
- {
- if (!quote)
- {
- if (ch == ',')
- {
- *status = DLARG;
- dst[i] = '\0';
- return (++src);
- }
- else if (ch == ' ' || ch == '\t')
- {
- *status = DLNAME;
- dst[i] = '\0';
- return (++src);
- }
- else if (ch == ';' || ch == '\n')
- {
- *status = DLEND;
- dst[i] = '\0';
- return (++src);
- }
- }
- }
- else
- esc = False;
- dst[i++] = ch;
- }
-
- *status = DLERR;
- dst[i] = '\0';
-
- return (src);
-}
-
-_XawDisplayList *XawCreateDisplayList(String string, Screen *screen,
- Colormap colormap, int depth)
-{
- _XawDisplayList *dlist;
- XawDLClass *lc, *xlibc;
- XawDLData *data;
- XawDLInfo *info;
- XawDLProc *proc;
- char cname[64], fname[64], aname[1024];
- Cardinal i;
- char *cp, *fp, *lp;
- int status;
-
- xlibc = XawGetDisplayListClass(xlib);
- if (!xlibc)
- {
- XawDisplayListInitialize();
- xlibc = XawGetDisplayListClass(xlib);
- }
-
- dlist = (_XawDisplayList *)XtMalloc(sizeof(_XawDisplayList));
- dlist->procs = NULL;
- dlist->num_procs = 0;
- dlist->data = NULL;
- dlist->num_data = 0;
- dlist->screen = screen;
- dlist->colormap = colormap;
- dlist->depth = depth;
- dlist->qrep = NULLQUARK;
- if (!string || !string[0])
- return (dlist);
-
- cp = string;
-
- status = 0;
- while (status != DLEOF)
- {
- lp = cp;
- cp = read_token(cp, fname, sizeof(fname), &status);
-
- if (status != DLNAME && status != DLEND && status != DLEOF)
- {
- char msg[256];
-
- XmuSnprintf(msg, sizeof(msg),
- "Error parsing displayList at \"%s\"", lp);
- XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)),
- msg);
- XawDestroyDisplayList(dlist);
- return (NULL);
- }
- fp = fname;
- /*CONSTCOND*/
- while (1)
- {
- fp = strchr(fp, ':');
- if (!fp || (fp == cp || fp[-1] != '\\'))
- break;
- ++fp;
- }
- if (fp)
- {
- XmuSnprintf(cname, fp - fname + 1, fname);
- memmove(fname, fp + 1, strlen(fp));
- lc = cname[0] ? XawGetDisplayListClass(cname) : xlibc;
- if (!lc)
- {
- char msg[256];
-
- XmuSnprintf(msg, sizeof(msg),
- "Cannot find displayList class \"%s\"", cname);
- XtAppWarning(XtDisplayToApplicationContext
- (DisplayOfScreen(screen)), msg);
- XawDestroyDisplayList(dlist);
- return (NULL);
- }
- }
- else
- lc = xlibc;
-
- if (status == DLEOF && !fname[0])
- break;
-
- if ((info = _XawFindDLInfo(lc, fname)) == NULL)
- {
- char msg[256];
-
- XmuSnprintf(msg, sizeof(msg),
- "Cannot find displayList procedure \"%s\"", fname);
- XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)),
- msg);
- XawDestroyDisplayList(dlist);
- return (NULL);
- }
-
- proc = (XawDLProc *)XtMalloc(sizeof(XawDLProc));
- proc->qname = info->qname;
- proc->params = NULL;
- proc->num_params = 0;
- proc->proc = info->proc;
- proc->args = NULL;
- proc->data = NULL;
-
- if (!dlist->procs)
- {
- dlist->num_procs = 1;
- dlist->procs = (XawDLProc**)XtMalloc(sizeof(XawDLProc*));
- }
- else
- {
- ++dlist->num_procs;
- dlist->procs = (XawDLProc**)
- XtRealloc((char *)dlist->procs, sizeof(XawDLProc*) *
- dlist->num_procs);
- }
- dlist->procs[dlist->num_procs - 1] = proc;
-
- while (status != DLEND && status != DLEOF)
- {
- lp = cp;
- cp = read_token(cp, aname, sizeof(aname), &status);
-
- if (status != DLARG && status != DLEND && status != DLEOF)
- {
- char msg[256];
-
- XmuSnprintf(msg, sizeof(msg),
- "Error parsing displayList at \"%s\"", lp);
- XtAppWarning(XtDisplayToApplicationContext
- (DisplayOfScreen(screen)), msg);
- XawDestroyDisplayList(dlist);
- return (NULL);
- }
-
- if (!proc->num_params)
- {
- proc->num_params = 1;
- proc->params = (String *)XtMalloc(sizeof(String));
- }
- else
- {
- ++proc->num_params;
- proc->params = (String *)XtRealloc((char *)proc->params,
- sizeof(String) *
- proc->num_params);
- }
- proc->params[proc->num_params - 1] = XtNewString(aname);
- }
-
- /* verify if data is already created for lc */
- data = NULL;
- for (i = 0; i < dlist->num_data; i++)
- if (dlist->data[i]->dlclass == lc)
- {
- data = dlist->data[i];
- break;
- }
-
- if (!data)
- {
- data = (XawDLData *)XtMalloc(sizeof(XawDLData));
- data->dlclass = lc;
- if (lc->data_init)
- data->data = lc->data_init(lc->name, screen, colormap, depth);
- else
- data->data = NULL;
-
- if (!dlist->data)
- {
- dlist->num_data = 1;
- dlist->data = (XawDLData **)XtMalloc(sizeof(XawDLData*));
- }
- else
- {
- ++dlist->num_data;
- dlist->data = (XawDLData **)
- XtRealloc((char *)dlist->data, sizeof(XawDLData*) *
- dlist->num_data);
- }
- dlist->data[dlist->num_data - 1] = data;
- }
-
- if (lc->args_init)
- {
- proc->args = lc->args_init(fname, proc->params, &proc->num_params,
- screen, colormap, depth);
- if (proc->args == XAWDL_CONVERT_ERROR)
- {
- char msg[256];
-
- proc->args = NULL;
- XmuSnprintf(msg, sizeof(msg),
- "Cannot convert arguments to displayList function \"%s\"", fname);
- XtAppWarning(XtDisplayToApplicationContext
- (DisplayOfScreen(screen)), msg);
- XawDestroyDisplayList(dlist);
- return (NULL);
- }
- }
- else
- proc->args = NULL;
-
- proc->data = data;
- }
-
- dlist->qrep = XrmStringToQuark(string);
- return (dlist);
-}
-
-String
-XawDisplayListString(_XawDisplayList *dlist)
-{
- if (!dlist || dlist->qrep == NULLQUARK)
- return ("");
- return (XrmQuarkToString(dlist->qrep));
-}
-
-void
-XawDestroyDisplayList(_XawDisplayList *dlist)
-{
- Cardinal i, j;
- XawDLProc *proc;
- XawDLData *data;
-
- if (!dlist)
- return;
-
- for (i = 0; i < dlist->num_procs; i++)
- {
- proc = dlist->procs[i];
- data = proc->data;
-
- if (data)
- {
- if (data->dlclass->args_destructor)
- data->dlclass->args_destructor(DisplayOfScreen(dlist->screen),
- XrmQuarkToString(proc->qname),
- proc->args,
- proc->params, &proc->num_params);
- if (data->data)
- {
- if (data->dlclass->data_destructor)
- {
- data->dlclass
- ->data_destructor(DisplayOfScreen(dlist->screen),
- data->dlclass->name, data->data);
- data->data = NULL;
- }
- }
- }
-
- for (j = 0; j < proc->num_params; j++)
- XtFree(proc->params[j]);
- if (proc->num_params)
- XtFree((char *)proc->params);
- XtFree((char *)proc);
- }
-
- if (dlist->num_procs)
- XtFree((char *)dlist->procs);
-
- XtFree((char *)dlist);
-}
-
-/**********************************************************************
- * If you want to implement your own class of procedures, look at
- * the code bellow.
- **********************************************************************/
-/* Start of Implementation of class "xlib" */
-typedef struct _XawXlibData {
- GC gc;
- unsigned long mask;
- XGCValues values;
- int shape;
- int mode;
- char *dashes;
- /* these fields can be used for optimization, to
- * avoid unnecessary coordinates recalculation.
- */
- Position x, y;
- Dimension width, height;
-} XawXlibData;
-
-typedef struct _XawDLPosition {
- Position pos;
- short denom;
- Boolean high;
-} XawDLPosition;
-
-typedef struct _XawDLPositionPtr {
- XawDLPosition *pos;
- Cardinal num_pos;
-} XawDLPositionPtr;
-
-typedef struct _XawDLArcArgs {
- XawDLPosition pos[4];
- int angle1;
- int angle2;
-} XawDLArcArgs;
-
-typedef struct _XawDLStringArgs {
- XawDLPosition pos[2];
- char *string;
- int length;
-} XawDLStringArgs;
-
-typedef struct _XawDLCopyArgs {
- XawPixmap *pixmap;
- XawDLPosition pos[6];
- int plane;
-} XawDLCopyArgs;
-
-typedef struct _XawDLImageArgs {
- XawPixmap *pixmap;
- XawDLPosition pos[4];
- int depth;
-} XawDLImageArgs;
-
-#define X_ARG(x) (Position)(((x).denom != 0) ? \
- ((float)XtWidth(w) * ((float)(x).pos / (float)(x).denom)) : \
- ((x).high ? XtWidth(w) - (x).pos : (x).pos))
-#define Y_ARG(x) (Position)(((x).denom != 0) ? \
- ((float)XtHeight(w) * ((float)(x).pos / (float)(x).denom)): \
- ((x).high ? XtHeight(w) - (x).pos : (x).pos))
-#define DRECT 0
-#define FRECT 1
-#define LINE 2
-#define GCFG 3
-#define GCBG 4
-#define FPOLY 5
-#define DARC 6
-#define FARC 7
-#define DLINES 8
-#define MASK 9
-#define UMASK 10
-#define LWIDTH 11
-#define POINT 12
-#define POINTS 13
-#define SEGMENTS 14
-#define ARCMODE 15
-#define COORDMODE 16
-#define SHAPEMODE 17
-#define LINESTYLE 18
-#define CAPSTYLE 19
-#define JOINSTYLE 20
-#define FILLSTYLE 21
-#define FILLRULE 22
-#define TILE 23
-#define STIPPLE 24
-#define TSORIGIN 25
-#define FUNCTION 26
-#define PLANEMASK 27
-#define DSTRING 28
-#define PSTRING 29
-#define FONT 30
-#define DASHES 31
-#define SUBWMODE 32
-#define EXPOSURES 33
-#define CLIPORIGIN 34
-#define CLIPMASK 35
-#define CLIPRECTS 36
-#define COPYAREA 37
-#define COPYPLANE 38
-#define IMAGE 39
-
-static void
-Dl1Point(Widget w, XtPointer args, XtPointer data, int id)
-{
- XawDLPosition *pos = (XawDLPosition *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- Display *display;
- Window window;
- Position x, y;
-
- x = X_ARG(pos[0]);
- y = Y_ARG(pos[1]);
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- x += xpad;
- y += ypad;
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- if (id == POINT)
- XDrawPoint(display, window, xdata->gc, x, y);
- else if (id == TSORIGIN)
- {
- xdata->values.ts_x_origin = x;
- xdata->values.ts_y_origin = y;
- xdata->mask |= GCTileStipXOrigin | GCTileStipYOrigin;
- XSetTSOrigin(display, xdata->gc, x, y);
- }
- else if (id == CLIPORIGIN)
- {
- xdata->values.clip_x_origin = x;
- xdata->values.clip_y_origin = y;
- xdata->mask |= GCClipXOrigin | GCClipYOrigin;
- XSetClipOrigin(display, xdata->gc, x, y);
- }
-}
-
-static void
-Dl2Points(Widget w, XtPointer args, XtPointer data, int id)
-{
- XawDLPosition *pos = (XawDLPosition *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- Display *display;
- Window window;
- Position x1, y1, x2, y2;
-
- x1 = X_ARG(pos[0]);
- y1 = Y_ARG(pos[1]);
- x2 = X_ARG(pos[2]);
- y2 = Y_ARG(pos[3]);
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- x1 += xpad; y1 += ypad;
- x2 += xpad; y2 += ypad;
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- if (id == DRECT)
- XDrawRectangle(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1);
- else if (id == FRECT)
- XFillRectangle(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1);
- else if (id == LINE)
- XDrawLine(display, window, xdata->gc, x1, y1, x2, y2);
-}
-
-/* ARGSUSED */
-static void
-DlLine(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region)
-{
- Dl2Points(w, args, data, LINE);
-}
-
-/* ARGSUSED */
-static void
-DlDrawRectangle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- Dl2Points(w, args, data, DRECT);
-}
-
-/* ARGSUSED */
-static void
-DlFillRectangle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- Dl2Points(w, args, data, FRECT);
-}
-
-static void
-DlXPoints(Widget w, XtPointer args, XtPointer data, int id)
-{
- XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- XawDLPosition *pos;
- XPoint points_buf[16];
- XPoint *points;
- Display *display;
- Window window;
- Cardinal num_points, i, j;
-
- num_points = pos_ptr->num_pos>>1;
- points = (XPoint *)XawStackAlloc(sizeof(XPoint) * num_points, points_buf);
-
- for (i = j = 0; i < num_points; i++, j = i << 1)
- {
- pos = &pos_ptr->pos[j];
- points[i].x = X_ARG(pos[0]);
- points[i].y = Y_ARG(pos[1]);
- }
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- if (xdata->mode != CoordModePrevious)
- {
- for (i = 0; i < num_points; i++)
- {
- points[i].x += xpad;
- points[i].y += ypad;
- }
- }
- else
- {
- points[0].x += xpad;
- points[0].y += ypad;
- }
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- if (id == FPOLY)
- XFillPolygon(display, window, xdata->gc, points, num_points,
- xdata->shape, xdata->mode);
- else if (id == DLINES)
- XDrawLines(display, window, xdata->gc, points, num_points, xdata->mode);
- else if (id == POINTS)
- XDrawPoints(display, window, xdata->gc, points, num_points, xdata->mode);
-
- XawStackFree(points, points_buf);
-}
-
-/* ARGSUSED */
-static void
-DlFillPolygon(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlXPoints(w, args, data, FPOLY);
-}
-
-/* ARGSUSED */
-static void
-DlDrawLines(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlXPoints(w, args, data, DLINES);
-}
-
-/* ARGSUSED */
-static void
-DlDrawPoints(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlXPoints(w, args, data, POINTS);
-}
-
-/* ARGSUSED */
-static void
-DlForeground(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- Pixel foreground = (Pixel)args;
-
- if (xdata->values.foreground != foreground)
- {
- xdata->mask |= GCForeground;
- xdata->values.foreground = foreground;
- XSetForeground(XtDisplayOfObject(w), xdata->gc, foreground);
- }
-}
-
-/* ARGSUSED */
-static void
-DlBackground(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- Pixel background = (Pixel)args;
-
- if (xdata->values.background != background)
- {
- xdata->mask |= GCBackground;
- xdata->values.background = background;
- XSetBackground(XtDisplayOfObject(w), xdata->gc, background);
- }
-}
-
-static void
-DlArc(Widget w, XtPointer args, XtPointer data, Bool fill)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- XawDLArcArgs *arc = (XawDLArcArgs *)args;
- Position x1, y1, x2, y2;
- Display *display;
- Window window;
-
- x1 = X_ARG(arc->pos[0]);
- y1 = Y_ARG(arc->pos[1]);
- x2 = X_ARG(arc->pos[2]);
- y2 = Y_ARG(arc->pos[3]);
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- x1 += xpad;
- y1 += ypad;
- x2 += xpad;
- y2 += ypad;
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- if (fill)
- XFillArc(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1,
- arc->angle1, arc->angle2);
- else
- XDrawArc(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1,
- arc->angle1, arc->angle2);
-}
-
-/* ARGSUSED */
-static void
-DlDrawArc(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlArc(w, args, data, False);
-}
-
-/* ARGSUSED */
-static void
-DlFillArc(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlArc(w, args, data, True);
-}
-
-/*ARGSUSED*/
-static void
-DlMask(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- Display *display = XtDisplayOfObject(w);
-
- if (region)
- XSetRegion(display, xdata->gc, region);
- else if (event)
- {
- XRectangle rect;
-
- rect.x = event->xexpose.x;
- rect.y = event->xexpose.y;
- rect.width = event->xexpose.width;
- rect.height = event->xexpose.height;
- XSetClipRectangles(display, xdata->gc, 0, 0, &rect, 1, Unsorted);
- }
-}
-
-/* ARGSUSED */
-static void
-DlUmask(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
-
- XSetClipMask(XtDisplayOfObject(w), xdata->gc, None);
-}
-
-/* ARGSUSED */
-static void
-DlLineWidth(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- unsigned line_width = (unsigned long)args;
-
- if (xdata->values.line_width != line_width)
- {
- xdata->mask |= GCLineWidth;
- xdata->values.line_width = line_width;
- XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineWidth, &xdata->values);
- }
-}
-
-/* ARGSUSED */
-static void
-DlDrawPoint(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region)
-{
- Dl1Point(w, args, data, POINT);
-}
-
-/* ARGSUSED */
-static void
-DlDrawSegments(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- XawDLPosition *pos;
- XSegment *segments;
- XSegment segments_buf[8];
- Display *display;
- Window window;
- Cardinal num_segments, i, j;
-
- num_segments = pos_ptr->num_pos>>2;
- segments = (XSegment *)XawStackAlloc(sizeof(XSegment) * num_segments, segments_buf);
-
- for (i = j = 0; i < num_segments; i++, j = i << 2)
- {
- pos = &pos_ptr->pos[j];
- segments[i].x1 = X_ARG(pos[0]);
- segments[i].y1 = Y_ARG(pos[1]);
- segments[i].x2 = X_ARG(pos[2]);
- segments[i].y2 = Y_ARG(pos[3]);
- }
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- for (i = 0; i < num_segments; i++)
- {
- segments[i].x1 += xpad;
- segments[i].y1 += ypad;
- segments[i].x2 += xpad;
- segments[i].y2 += ypad;
- }
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- XDrawSegments(display, window, xdata->gc, segments, num_segments);
-
- XawStackFree(segments, segments_buf);
-}
-
-/* ARGSUSED */
-static void
-DlArcMode(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int arc_mode = (long)args;
-
- if (xdata->values.arc_mode != arc_mode)
- {
- xdata->mask |= GCArcMode;
- xdata->values.arc_mode = arc_mode;
- XSetArcMode(XtDisplayOfObject(w), xdata->gc, arc_mode);
- }
-}
-
-/* ARGSUSED */
-static void
-DlCoordMode(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int mode = (long)args;
-
- xdata->mode = mode;
-}
-
-/* ARGSUSED */
-static void
-DlShapeMode(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int shape = (long)args;
-
- xdata->shape = shape;
-}
-
-/* ARGSUSED */
-static void
-DlLineStyle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int line_style = (long)args;
-
- if (xdata->values.line_style != line_style)
- {
- xdata->mask |= GCLineStyle;
- xdata->values.line_style = line_style;
- XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineStyle, &xdata->values);
- }
-}
-
-/* ARGSUSED */
-static void
-DlCapStyle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int cap_style = (long)args;
-
- if (xdata->values.cap_style != cap_style)
- {
- xdata->mask |= GCCapStyle;
- xdata->values.cap_style = cap_style;
- XChangeGC(XtDisplayOfObject(w), xdata->gc, GCCapStyle, &xdata->values);
- }
-}
-
-/* ARGSUSED */
-static void
-DlJoinStyle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int join_style = (long)args;
-
- if (xdata->values.join_style != join_style)
- {
- xdata->mask |= GCJoinStyle;
- xdata->values.join_style = join_style;
- XChangeGC(XtDisplayOfObject(w), xdata->gc, GCJoinStyle, &xdata->values);
- }
-}
-
-/* ARGSUSED */
-static void
-DlFillStyle(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int fill_style = (long)args;
-
- if (xdata->values.fill_style != fill_style)
- {
- xdata->mask |= GCFillStyle;
- xdata->values.fill_style = fill_style;
- XSetFillStyle(XtDisplayOfObject(w), xdata->gc, fill_style);
- }
-}
-
-/* ARGSUSED */
-static void
-DlFillRule(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int fill_rule = (long)args;
-
- if (xdata->values.fill_rule != fill_rule)
- {
- xdata->mask |= GCFillRule;
- xdata->values.fill_rule = fill_rule;
- XSetFillRule(XtDisplayOfObject(w), xdata->gc, fill_rule);
- }
-}
-
-/* ARGSUSED */
-static void
-DlTile(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- XawPixmap *pixmap = (XawPixmap *)args;
-
- if (pixmap && xdata->values.tile != pixmap->pixmap)
- {
- xdata->mask |= GCTile;
- xdata->values.tile = pixmap->pixmap;
- XSetTile(XtDisplayOfObject(w), xdata->gc, xdata->values.tile);
- }
-}
-
-/* ARGSUSED */
-static void
-DlStipple(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- XawPixmap *pixmap = (XawPixmap *)args;
-
- if (pixmap && xdata->values.stipple != pixmap->pixmap)
- {
- xdata->mask |= GCStipple;
- xdata->values.stipple = pixmap->pixmap;
- XSetStipple(XtDisplayOfObject(w), xdata->gc, xdata->values.stipple);
- }
-}
-
-/* ARGSUSED */
-static void
-DlTSOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region)
-{
- Dl1Point(w, args, data, TSORIGIN);
-}
-
-/* ARGSUSED */
-static void
-DlFunction(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int function = (long)args;
-
- if (function != xdata->values.function)
- {
- xdata->mask |= GCFunction;
- xdata->values.function = function;
- XSetFunction(XtDisplayOfObject(w), xdata->gc, function);
- }
-}
-
-/* ARGSUSED */
-static void
-DlPlaneMask(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- unsigned long plane_mask = (unsigned long)args;
-
- if (xdata->values.plane_mask != plane_mask)
- {
- xdata->mask |= GCPlaneMask;
- xdata->values.plane_mask = plane_mask;
- XSetPlaneMask(XtDisplayOfObject(w), xdata->gc, plane_mask);
- }
-}
-
-static void
-DlString(Widget w, XtPointer args, XtPointer data, Bool image)
-{
- XawDLStringArgs *string = (XawDLStringArgs *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- Display *display;
- Window window;
- Position x, y;
-
- x = X_ARG(string->pos[0]);
- y = Y_ARG(string->pos[1]);
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- x += xpad;
- y += ypad;
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- if (image)
- XDrawImageString(display, window, xdata->gc, x, y, string->string, string->length);
- else
- XDrawString(display, window, xdata->gc, x, y, string->string, string->length);
-}
-
-/* ARGSUSED */
-static void
-DlDrawString(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlString(w, args, data, False);
-}
-
-/* ARGSUSED */
-static void
-DlPaintString(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlString(w, args, data, True);
-}
-
-/* ARGSUSED */
-static void
-DlFont(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- Font font = (Font)args;
-
- if (xdata->values.font != font)
- {
- xdata->mask |= GCFont;
- xdata->values.font = font;
- XSetFont(XtDisplayOfObject(w), xdata->gc, font);
- }
-}
-
-/* ARGSUSED */
-static void
-DlDashes(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- char *dashes = args;
-
- if (xdata->dashes != dashes)
- {
- xdata->mask |= GCDashOffset | GCDashList;
- xdata->dashes = dashes;
- XSetDashes(XtDisplayOfObject(w), xdata->gc, 0, dashes + 1, *dashes);
- }
-}
-
-/* ARGSUSED */
-static void
-DlSubwindowMode(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- int subwindow_mode = (long)args;
-
- if (xdata->values.subwindow_mode != subwindow_mode)
- {
- xdata->mask |= GCSubwindowMode;
- xdata->values.subwindow_mode = subwindow_mode;
- XSetSubwindowMode(XtDisplayOfObject(w), xdata->gc, subwindow_mode);
- }
-}
-
-/* ARGSUSED */
-static void
-DlExposures(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- Bool graphics_exposures = (Bool)(long)args;
-
- if (xdata->values.graphics_exposures != graphics_exposures)
- {
- xdata->mask |= GCGraphicsExposures;
- xdata->values.graphics_exposures = graphics_exposures;
- XSetGraphicsExposures(XtDisplayOfObject(w), xdata->gc, graphics_exposures);
- }
-}
-
-/* ARGSUSED */
-static void
-DlClipOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region)
-{
- Dl1Point(w, args, data, CLIPORIGIN);
-}
-
-/* ARGSUSED */
-static void
-DlClipMask(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawXlibData *xdata = (XawXlibData *)data;
- XawPixmap *pixmap = (XawPixmap *)args;
- Pixmap clip_mask;
-
- if (pixmap)
- clip_mask = pixmap->mask ? pixmap->mask : pixmap->pixmap;
- else
- clip_mask = None;
-
- if (xdata->values.clip_mask != clip_mask)
- {
- xdata->mask |= GCClipMask;
- XSetClipMask(XtDisplayOfObject(w), xdata->gc, clip_mask);
- }
-}
-
-/* ARGSUSED */
-static void
-DlClipRectangles(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- XawDLPosition *pos;
- XRectangle *rects;
- XRectangle rects_buf[8];
- Position x1, y1, x2, y2;
- Cardinal num_rects, i, j;
-
- num_rects = pos_ptr->num_pos>>2;
- rects = (XRectangle *)XawStackAlloc(sizeof(XRectangle) * num_rects, rects_buf);
-
- for (i = j = 0; i < num_rects; i++, j = i << 2)
- {
- pos = &pos_ptr->pos[j];
- x1 = X_ARG(pos[0]);
- y1 = Y_ARG(pos[1]);
- x2 = X_ARG(pos[2]);
- y2 = Y_ARG(pos[3]);
- rects[i].x = XawMin(x1, x2);
- rects[i].y = XawMin(y1, y2);
- rects[i].width = XawMax(x1, x2) - rects[i].x;
- rects[i].height = XawMax(y1, y2) - rects[i].y;
- }
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- for (i = 0; i < num_rects; i++)
- {
- rects[i].x += xpad;
- rects[i].y += ypad;
- }
- }
-
- XSetClipRectangles(XtDisplayOfObject(w), xdata->gc, 0, 0, rects, num_rects, Unsorted);
-
- XawStackFree(rects, rects_buf);
-}
-
-static void
-DlCopy(Widget w, XtPointer args, XtPointer data, Bool plane)
-{
- XawDLCopyArgs *copy = (XawDLCopyArgs *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- int src_x, src_y, dst_x, dst_y, width, height, tmp1, tmp2;
-
- tmp1 = X_ARG(copy->pos[0]);
- tmp2 = X_ARG(copy->pos[2]);
- dst_x = XawMin(tmp1, tmp2);
- width = XawMax(tmp1, tmp2) - dst_x;
-
- tmp1 = Y_ARG(copy->pos[1]);
- tmp2 = Y_ARG(copy->pos[3]);
- dst_y = XawMin(tmp1, tmp2);
- height = XawMax(tmp1, tmp2) - dst_y;
-
- src_x = X_ARG(copy->pos[4]);
- src_y = Y_ARG(copy->pos[5]);
-
- if (width <= 0)
- {
- if (copy->pixmap)
- width = copy->pixmap->width;
- else
- {
- if ((width = XtWidth(w) - src_x) < 0)
- width = 0;
- }
- }
- if (height <= 0)
- {
- if (copy->pixmap)
- height = copy->pixmap->height;
- else
- {
- if ((height = XtHeight(w) - src_y) < 0)
- height = 0;
- }
- }
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- src_x += xpad;
- src_y += ypad;
- dst_x += xpad;
- dst_y += ypad;
- }
-
- if (plane)
- XCopyPlane(XtDisplayOfObject(w), XtWindowOfObject(w),
- copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w),
- xdata->gc, src_x, src_y, width, height, dst_x, dst_y,
- copy->plane ? copy->plane : 1);
- else
- XCopyArea(XtDisplayOfObject(w),
- copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w),
- XtWindowOfObject(w), xdata->gc, src_x, src_y, width, height, dst_x, dst_y);
-}
-
-/* ARGSUSED */
-static void
-DlCopyArea(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlCopy(w, args, data, False);
-}
-
-/* ARGSUSED */
-static void
-DlCopyPlane(Widget w, XtPointer args, XtPointer data,
- XEvent *event, Region region)
-{
- DlCopy(w, args, data, True);
-}
-
-/*ARGSUSED*/
-/* Note:
- * This function is destructive if you set the ts_x_origin, ts_y_origin,
- * and/or clip-mask. It is meant to be the only function used in a display
- * list. If you need to use other functions (and those values), be sure to
- * set them after calling this function.
- */
-static void
-DlImage(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region)
-{
- XawDLImageArgs *image = (XawDLImageArgs *)args;
- XawXlibData *xdata = (XawXlibData *)data;
- int x, y, xs, ys, xe, ye, width, height;
- Display *display;
- Window window;
-
- width = image->pixmap->width;
- height = image->pixmap->height;
- xs = X_ARG(image->pos[0]);
- ys = Y_ARG(image->pos[1]);
- xe = X_ARG(image->pos[2]);
- ye = Y_ARG(image->pos[3]);
-
- if (xe <= 0)
- xe = xs + width;
- if (ye <= 0)
- ye = ys + height;
-
- if (!XtIsWidget(w))
- {
- Position xpad, ypad;
-
- xpad = XtX(w) + XtBorderWidth(w);
- ypad = XtY(w) + XtBorderWidth(w);
- xe += xpad;
- ye += ypad;
- xe += xpad;
- ye += ypad;
- display = XtDisplayOfObject(w);
- window = XtWindowOfObject(w);
- }
- else
- {
- display = XtDisplay(w);
- window = XtWindow(w);
- }
-
- for (y = ys; y < ye; y += height)
- for (x = xs; x < xe; x += width)
- {
- XSetClipOrigin(display, xdata->gc, x, y);
- if (image->pixmap->mask)
- XSetClipMask(display, xdata->gc, image->pixmap->mask);
- if (image->depth == 1)
- XCopyPlane(display, image->pixmap->pixmap, window, xdata->gc,
- 0, 0, XawMin(width, xe - x), XawMin(height, ye - y),
- x, y, 1L);
- else
- XCopyArea(display, image->pixmap->pixmap, window, xdata->gc, 0, 0,
- XawMin(width, xe - x), XawMin(height, ye - y), x, y);
- }
-
- XSetClipMask(display, xdata->gc, None);
-}
-
-typedef struct _Dl_init Dl_init;
-struct _Dl_init {
- String name;
- XawDisplayListProc proc;
- Cardinal id;
-};
-
-static Dl_init dl_init[] =
-{
- {"arc-mode", DlArcMode, ARCMODE},
- {"background", DlBackground, GCBG},
- {"bg", DlBackground, GCBG},
- {"cap-style", DlCapStyle, CAPSTYLE},
- {"clip-mask", DlClipMask, CLIPMASK},
- {"clip-origin", DlClipOrigin, CLIPORIGIN},
- {"clip-rectangles", DlClipRectangles, CLIPRECTS},
- {"clip-rects", DlClipRectangles, CLIPRECTS},
- {"coord-mode", DlCoordMode, COORDMODE},
- {"copy-area", DlCopyArea, COPYAREA},
- {"copy-plane", DlCopyPlane, COPYPLANE},
- {"dashes", DlDashes, DASHES},
- {"draw-arc", DlDrawArc, DARC},
- {"draw-line", DlLine, LINE},
- {"draw-lines", DlDrawLines, DLINES},
- {"draw-point", DlDrawPoint, POINT},
- {"draw-points", DlDrawPoints, POINTS},
- {"draw-rect", DlDrawRectangle, DRECT},
- {"draw-rectangle", DlDrawRectangle, DRECT},
- {"draw-segments", DlDrawSegments, SEGMENTS},
- {"draw-string", DlDrawString, DSTRING},
- {"exposures", DlExposures, EXPOSURES},
- {"fg", DlForeground, GCFG},
- {"fill-arc", DlFillArc, FARC},
- {"fill-poly", DlFillPolygon, FPOLY},
- {"fill-polygon", DlFillPolygon, FPOLY},
- {"fill-rect", DlFillRectangle, FRECT},
- {"fill-rectangle", DlFillRectangle, FRECT},
- {"fill-rule", DlFillRule, FILLRULE},
- {"fill-style", DlFillStyle, FILLSTYLE},
- {"font", DlFont, FONT},
- {"foreground", DlForeground, GCFG},
- {"function", DlFunction, FUNCTION},
- {"image", DlImage, IMAGE},
- {"join-style", DlJoinStyle, JOINSTYLE},
- {"line", DlLine, LINE},
- {"line-style", DlLineStyle, LINESTYLE},
- {"line-width", DlLineWidth, LWIDTH},
- {"lines", DlDrawLines, DLINES},
- {"mask", DlMask, MASK},
- {"paint-string", DlPaintString, PSTRING},
- {"plane-mask", DlPlaneMask, PLANEMASK},
- {"point", DlDrawPoint, POINT},
- {"points", DlDrawPoints, POINTS},
- {"segments", DlDrawSegments, SEGMENTS},
- {"shape-mode", DlShapeMode, SHAPEMODE},
- {"stipple", DlStipple, STIPPLE},
- {"subwindow-mode", DlSubwindowMode, SUBWMODE},
- {"tile", DlTile, TILE},
- {"ts-origin", DlTSOrigin, TSORIGIN},
- {"umask", DlUmask, UMASK},
-};
-
-void
-XawDisplayListInitialize(void)
-{
- static Bool first_time = True;
- XawDLClass *lc;
- Cardinal i;
-
- if (first_time == False)
- return;
-
- first_time = False;
-
- lc = XawCreateDisplayListClass(xlib,
- _Xaw_Xlib_ArgsInitProc,
- _Xaw_Xlib_ArgsDestructor,
- _Xaw_Xlib_DataInitProc,
- _Xaw_Xlib_DataDestructor);
- for (i = 0; i < sizeof(dl_init) / sizeof(dl_init[0]); i++)
- (void)XawDeclareDisplayListProc(lc, dl_init[i].name, dl_init[i].proc);
-}
-
-static int
-bcmp_cvt_proc(register _Xconst void *string,
- register _Xconst void *dlinfo)
-{
- return (strcmp((String)string, ((Dl_init*)dlinfo)->name));
-}
-
-static long
-read_int(char *cp, char **cpp)
-{
- long value = 0, sign = 1;
-
- if (*cp == '-')
- {
- sign = -1;
- ++cp;
- }
- else if (*cp == '+')
- ++cp;
- value = 0;
- while (*cp >= '0' && *cp <= '9')
- {
- value = value * 10 + *cp - '0';
- ++cp;
- }
- if (cpp)
- *cpp = cp;
- return (value * sign);
-}
-
-static void
-read_position(char *arg, XawDLPosition *pos)
-{
- int ch;
- char *str = arg;
-
- ch = *str;
- if (ch == '-' || ch == '+')
- {
- ++str;
- if (ch == '-')
- pos->high = True;
- pos->pos = read_int(str, NULL);
- }
- else if (isdigit(ch))
- {
- pos->pos = read_int(str, &str);
- ch = *str++;
- if (ch == '/')
- pos->denom = read_int(str, NULL);
- }
-}
-
-/* ARGSUSED */
-static void *
-_Xaw_Xlib_ArgsInitProc(String proc_name, String *params, Cardinal *num_params,
- Screen *screen, Colormap colormap, int depth)
-{
- Cardinal id, i;
- Dl_init *init;
- void *retval = XAWDL_CONVERT_ERROR;
-
- init = (Dl_init *)bsearch(proc_name, dl_init,
- sizeof(dl_init) / sizeof(dl_init[0]),
- sizeof(dl_init[0]),
- bcmp_cvt_proc);
-
- id = init->id;
-
- switch (id)
- {
- case LINE:
- case DRECT:
- case FRECT:
- if (*num_params == 4)
- {
- XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 4);
-
- for (i = 0; i < 4; i++)
- read_position(params[i], &pos[i]);
- retval = (void *)pos;
- }
- break;
- case POINT:
- case TSORIGIN:
- case CLIPORIGIN:
- if (*num_params == 2)
- {
- XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 2);
-
- read_position(params[0], &pos[0]);
- read_position(params[1], &pos[1]);
- retval = (void *)pos;
- }
- break;
- case DLINES:
- case FPOLY:
- case POINTS:
- if (*num_params >= 4 && !(*num_params & 1))
- {
- XawDLPositionPtr *pos = XtNew(XawDLPositionPtr);
-
- pos->pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) *
- *num_params);
- pos->num_pos = *num_params;
- for (i = 0; i < *num_params; i++)
- read_position(params[i], &pos->pos[i]);
- retval = (void *)pos;
- }
- break;
- case SEGMENTS:
- case CLIPRECTS:
- if (*num_params >= 4 && !(*num_params % 4))
- {
- XawDLPositionPtr *pos = XtNew(XawDLPositionPtr);
-
- pos->pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) *
- *num_params);
- pos->num_pos = *num_params;
- for (i = 0; i < *num_params; i++)
- read_position(params[i], &pos->pos[i]);
- retval = (void *)pos;
- }
- break;
- case DARC:
- case FARC:
- if (*num_params >= 4 && *num_params <= 6)
- {
- XawDLArcArgs *args = (XawDLArcArgs *)XtCalloc(1, sizeof(XawDLArcArgs));
-
- args->angle1 = 0;
- args->angle2 = 360;
- for (i = 0; i < 4; i++)
- read_position(params[i], &args->pos[i]);
- if (*num_params > 4)
- args->angle1 = read_int(params[4], NULL);
- if (*num_params > 5)
- args->angle2 = read_int(params[5], NULL);
- args->angle1 *= 64;
- args->angle2 *= 64;
- retval = (void *)args;
- }
- break;
- case GCFG:
- case GCBG:
- {
- XColor xcolor;
-
- if (*num_params == 1 &&
- XAllocNamedColor(DisplayOfScreen(screen), colormap,
- params[0], &xcolor, &xcolor))
- retval = (void *)xcolor.pixel;
- } break;
- case MASK:
- case UMASK:
- if (*num_params == 0)
- retval = NULL;
- break;
- case LWIDTH:
- if (*num_params == 1)
- retval = (void *)read_int(params[0], NULL);
- break;
- case ARCMODE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "pieslice") == 0)
- retval = (void *)ArcPieSlice;
- else if (XmuCompareISOLatin1(params[0], "chord") == 0)
- retval = (void *)ArcChord;
- }
- break;
- case COORDMODE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "origin") == 0)
- retval = (void *)CoordModeOrigin;
- else if (XmuCompareISOLatin1(params[0], "previous") == 0)
- retval = (void *)CoordModePrevious;
- }
- break;
- case SHAPEMODE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "complex") == 0)
- retval = (void *)Complex;
- else if (XmuCompareISOLatin1(params[0], "convex") == 0)
- retval = (void *)Convex;
- else if (XmuCompareISOLatin1(params[0], "nonconvex") == 0)
- retval = (void *)Nonconvex;
- }
- break;
- case LINESTYLE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "solid") == 0)
- retval = (void *)LineSolid;
- else if (XmuCompareISOLatin1(params[0], "onoffdash") == 0)
- retval = (void *)LineOnOffDash;
- else if (XmuCompareISOLatin1(params[0], "doubledash") == 0)
- retval = (void *)LineDoubleDash;
- }
- break;
- case CAPSTYLE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "notlast") == 0)
- retval = (void *)CapNotLast;
- else if (XmuCompareISOLatin1(params[0], "butt") == 0)
- retval = (void *)CapButt;
- else if (XmuCompareISOLatin1(params[0], "round") == 0)
- retval = (void *)CapRound;
- else if (XmuCompareISOLatin1(params[0], "projecting") == 0)
- retval = (void *)CapProjecting;
- }
- break;
- case JOINSTYLE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "miter") == 0)
- retval = (void *)JoinMiter;
- else if (XmuCompareISOLatin1(params[0], "round") == 0)
- retval = (void *)JoinRound;
- else if (XmuCompareISOLatin1(params[0], "bevel") == 0)
- retval = (void *)JoinBevel;
- }
- break;
- case FILLSTYLE:
- if (*num_params == 1)
- {
- if (*num_params && XmuCompareISOLatin1(params[0], "solid") == 0)
- retval = (void *)FillSolid;
- else if (*num_params && XmuCompareISOLatin1(params[0], "tiled") == 0)
- retval = (void *)FillTiled;
- else if (*num_params && XmuCompareISOLatin1(params[0], "stippled") == 0)
- retval = (void *)FillStippled;
- else if (*num_params && XmuCompareISOLatin1(params[0], "opaquestippled") == 0)
- retval = (void *)FillOpaqueStippled;
- }
- break;
- case FILLRULE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "evenodd") == 0)
- retval = (void *)EvenOddRule;
- else if (XmuCompareISOLatin1(params[0], "winding") == 0)
- retval = (void *)WindingRule;
- }
- break;
- case TILE:
- if (*num_params == 1)
- retval = (void *)XawLoadPixmap(params[0], screen, colormap, depth);
- if (retval == NULL)
- {
- XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
- XtRPixmap);
- retval = XAWDL_CONVERT_ERROR;
- }
- break;
- case STIPPLE:
- if (*num_params == 1)
- retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1);
- if (retval == NULL)
- {
- XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
- XtRBitmap);
- retval = XAWDL_CONVERT_ERROR;
- }
- break;
- case FUNCTION:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "set") == 0)
- retval = (void *)GXset;
- else if (XmuCompareISOLatin1(params[0], "clear") == 0)
- retval = (void *)GXclear;
- else if (XmuCompareISOLatin1(params[0], "and") == 0)
- retval = (void *)GXand;
- else if (XmuCompareISOLatin1(params[0], "andreverse") == 0)
- retval = (void *)GXandReverse;
- else if (XmuCompareISOLatin1(params[0], "copy") == 0)
- retval = (void *)GXcopy;
- else if (XmuCompareISOLatin1(params[0], "andinverted") == 0)
- retval = (void *)GXandInverted;
- else if (XmuCompareISOLatin1(params[0], "noop") == 0)
- retval = (void *)GXnoop;
- else if (XmuCompareISOLatin1(params[0], "xor") == 0)
- retval = (void *)GXxor;
- else if (XmuCompareISOLatin1(params[0], "or") == 0)
- retval = (void *)GXor;
- else if (XmuCompareISOLatin1(params[0], "nor") == 0)
- retval = (void *)GXnor;
- else if (XmuCompareISOLatin1(params[0], "equiv") == 0)
- retval = (void *)GXequiv;
- else if (XmuCompareISOLatin1(params[0], "invert") == 0)
- retval = (void *)GXinvert;
- else if (XmuCompareISOLatin1(params[0], "orreverse") == 0)
- retval = (void *)GXorReverse;
- else if (XmuCompareISOLatin1(params[0], "copyinverted") == 0)
- retval = (void *)GXcopyInverted;
- else if (XmuCompareISOLatin1(params[0], "nand") == 0)
- retval = (void *)GXnand;
- }
- break;
- case PLANEMASK:
- if (*num_params == 1)
- retval = (void *)read_int(params[0], NULL);
- break;
- case DSTRING:
- case PSTRING:
- if (*num_params == 3)
- {
- XawDLStringArgs *string = (XawDLStringArgs *)
- XtCalloc(1, sizeof(XawDLStringArgs));
-
- read_position(params[0], &string->pos[0]);
- read_position(params[1], &string->pos[1]);
- string->string = XtNewString(params[2]);
- string->length = strlen(string->string);
- retval = string;
- }
- break;
- case FONT:
- if (*num_params == 1)
- retval = (void *)XLoadFont(DisplayOfScreen(screen), params[0]);
- break;
- case DASHES:
- if (*num_params && *num_params < 127)
- {
- char *dashes;
-
- dashes = XtMalloc(*num_params + 1);
-
- for (i = 0; i < *num_params; i++)
- dashes[i + 1] = read_int(params[i], NULL);
- *dashes = *num_params;
- retval = dashes;
- }
- break;
- case SUBWMODE:
- if (*num_params == 1)
- {
- if (XmuCompareISOLatin1(params[0], "clipbychildren") == 0)
- retval = (void *)ClipByChildren;
- else if (XmuCompareISOLatin1(params[0], "includeinferiors") == 0)
- retval = (void *)IncludeInferiors;
- }
- break;
- case EXPOSURES:
- if (*num_params == 1)
- {
- if (isdigit(params[0][0]) || params[0][0] == '+' || params[0][0] == '-')
- retval = (void *)read_int(params[0], NULL);
- else if (XmuCompareISOLatin1(params[0], "true") == 0 ||
- XmuCompareISOLatin1(params[0], "on") == 0)
- retval = (void *)True;
- else if (XmuCompareISOLatin1(params[0], "false") == 0 ||
- XmuCompareISOLatin1(params[0], "off") == 0)
- retval = (void *)False;
- }
- break;
- case CLIPMASK:
- if (*num_params == 1)
- retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1);
- if (retval == NULL)
- {
- retval = XAWDL_CONVERT_ERROR;
- XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
- XtRPixmap);
- }
- break;
- case COPYAREA:
- case COPYPLANE:
- if (*num_params > 2 && *num_params <= 7 + (id == COPYPLANE))
- {
- XawDLCopyArgs *args = (XawDLCopyArgs *)
- XtCalloc(1, sizeof(XawDLCopyArgs));
-
- retval = args;
- if (params[0][0] == '\0' || strcmp(params[0], ".") == 0)
- args->pixmap = NULL;
- else
- {
- args->pixmap = XawLoadPixmap(params[0], screen, colormap, id == COPYPLANE ? 1 : depth);
- if (args->pixmap == NULL)
- {
- XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
- XtRBitmap);
- retval = XAWDL_CONVERT_ERROR;
- XtFree((char *)args);
- }
- }
- if (retval != XAWDL_CONVERT_ERROR)
- {
- for (i = 1; i < *num_params && i < 7; i++)
- read_position(params[i], &args->pos[i - 1]);
- if (*num_params > 7)
- args->plane = read_int(params[7], NULL);
- }
- }
- break;
- case IMAGE:
- if (*num_params > 2 && *num_params <= 7)
- {
- XawDLImageArgs *args = (XawDLImageArgs *)
- XtCalloc(1, sizeof(XawDLImageArgs));
-
- retval = args;
- args->pixmap = XawLoadPixmap(params[0], screen, colormap, depth);
- if (args->pixmap == NULL)
- {
- XtDisplayStringConversionWarning(DisplayOfScreen(screen),
- (String)params[0], XtRPixmap);
- retval = XAWDL_CONVERT_ERROR;
- XtFree((char *)args);
- }
- else
- {
- args->depth = depth;
- for (i = 1; i < *num_params && i < 5; i++)
- read_position(params[i], &args->pos[i - 1]);
- }
- }
- break;
- }
-
- return (retval);
-}
-
-/* ARGSUSED */
-static void *
-_Xaw_Xlib_DataInitProc(String class_name,
- Screen *screen, Colormap colormap, int depth)
-{
- XawXlibData *data;
- Window tmp_win;
-
- data = (XawXlibData *)XtMalloc(sizeof(XawXlibData));
-
- tmp_win = XCreateWindow(DisplayOfScreen(screen),
- RootWindowOfScreen(screen),
- 0, 0, 1, 1, 1, depth,
- InputOutput, (Visual *)CopyFromParent, 0, NULL);
- data->mask = 0;
- data->gc = XCreateGC(DisplayOfScreen(screen), tmp_win, 0, &data->values);
- XDestroyWindow(DisplayOfScreen(screen), tmp_win);
- data->shape = Complex;
- data->mode = CoordModeOrigin;
- data->dashes = NULL;
-
- return ((void *)data);
-}
-
-/* ARGSUSED */
-static void
-_Xaw_Xlib_ArgsDestructor(Display *display, String proc_name, XtPointer args,
- String *params, Cardinal *num_params)
-{
- Cardinal id;
- Dl_init *init;
-
- init = (Dl_init *)bsearch(proc_name, dl_init,
- sizeof(dl_init) / sizeof(dl_init[0]),
- sizeof(dl_init[0]),
- bcmp_cvt_proc);
-
- id = init->id;
-
- switch (id)
- {
- case LINE:
- case DRECT:
- case FRECT:
- case DARC:
- case FARC:
- case POINT:
- case TSORIGIN:
- case DASHES:
- case CLIPORIGIN:
- case COPYAREA:
- case COPYPLANE:
- case IMAGE:
- XtFree(args);
- break;
- case DSTRING:
- case PSTRING:
- {
- XawDLStringArgs *string = (XawDLStringArgs *)args;
- XtFree(string->string);
- XtFree(args);
- } break;
- case DLINES:
- case FPOLY:
- case POINTS:
- case SEGMENTS:
- case CLIPRECTS:
- {
- XawDLPositionPtr *ptr = (XawDLPositionPtr *)args;
-
- XtFree((char *)ptr->pos);
- XtFree(args);
- } break;
- }
-}
-
-/* ARGSUSED */
-static void
-_Xaw_Xlib_DataDestructor(Display *display, String class_name, XtPointer data)
-{
- if (data)
- {
- XawXlibData *xdata = (XawXlibData *)data;
-
- XFreeGC(display, xdata->gc);
- if (xdata->dashes)
- XtFree(xdata->dashes);
- XtFree((char *)data);
- }
-}
-
-/* Start of DLInfo Management Functions */
-static int
-qcmp_dlist_info(register _Xconst void *left, register _Xconst void *right)
-{
- return (strcmp((*(XawDLInfo **)left)->name, (*(XawDLInfo **)right)->name));
-}
-
-Bool XawDeclareDisplayListProc(XawDLClass *lc, String name,
- XawDisplayListProc proc)
-{
- XawDLInfo *info;
-
- if (!lc || !proc || !name || name[0] == '\0')
- return (False);
-
- if ((info = _XawFindDLInfo(lc, name)) != NULL)
- /* Since the data structures to the displayList classes are(should be)
- * opaque, it is not a good idea to allow overriding a displayList
- * procedure; it's better to choose another name or class name!
- */
- return (False);
-
- info = (XawDLInfo *)XtMalloc(sizeof(XawDLInfo));
- info->name = XtNewString(name);
- info->qname = XrmStringToQuark(info->name);
- info->proc = proc;
-
- if (!lc->num_infos)
- {
- lc->num_infos = 1;
- lc->infos = (XawDLInfo **)XtMalloc(sizeof(XawDLInfo*));
- }
- else
- {
- ++lc->num_infos;
- lc->infos = (XawDLInfo **)
- XtRealloc((char *)lc->infos, sizeof(XawDLInfo*) * lc->num_infos);
- }
- lc->infos[lc->num_infos - 1] = info;
-
- if (lc->num_infos > 1)
- qsort(lc->infos, lc->num_infos, sizeof(XawDLInfo*), qcmp_dlist_info);
-
- return (True);
-}
-
-static int
-bcmp_dlist_info(register _Xconst void *string,
- register _Xconst void *dlinfo)
-{
- return (strcmp((String)string, (*(XawDLClass **)dlinfo)->name));
-}
-
-static XawDLInfo *
-_XawFindDLInfo(XawDLClass *lc, String name)
-{
- XawDLInfo **info;
-
- if (!lc->infos)
- return (NULL);
-
- info = (XawDLInfo **)bsearch(name, lc->infos, lc->num_infos,
- sizeof(XawDLInfo*), bcmp_dlist_info);
-
- return (info ? *info : NULL);
-}
-
-/* Start of DLClass Management Functions */
-XawDLClass *
-XawGetDisplayListClass(String name)
-{
- return (_XawFindDLClass(name));
-}
-
-static int
-qcmp_dlist_class(register _Xconst void *left, register _Xconst void *right)
-{
- return (strcmp((*(XawDLClass **)left)->name, (*(XawDLClass **)right)->name));
-}
-
-XawDLClass *
-XawCreateDisplayListClass(String name,
- XawDLArgsInitProc args_init,
- XawDLArgsDestructor args_destructor,
- XawDLDataInitProc data_init,
- XawDLDataDestructor data_destructor)
-{
- XawDLClass *lc;
-
- if (!name || name[0] == '\0')
- return (NULL);
-
- lc = (XawDLClass *)XtMalloc(sizeof(XawDLClass));
- lc->name = XtNewString(name);
- lc->infos = NULL;
- lc->num_infos = 0;
- lc->args_init = args_init;
- lc->args_destructor = args_destructor;
- lc->data_init = data_init;
- lc->data_destructor = data_destructor;
-
- if (!classes)
- {
- num_classes = 1;
- classes = (XawDLClass **)XtMalloc(sizeof(XawDLClass));
- }
- else
- {
- ++num_classes;
- classes = (XawDLClass **)XtRealloc((char *)classes,
- sizeof(XawDLClass) * num_classes);
- }
- classes[num_classes - 1] = lc;
-
- if (num_classes > 1)
- qsort(&classes[0], num_classes, sizeof(XawDLClass*), qcmp_dlist_class);
-
- return (lc);
-}
-
-static int
-bcmp_dlist_class(register _Xconst void *string,
- register _Xconst void *dlist)
-{
- return (strcmp((String)string, (*(XawDLClass **)dlist)->name));
-}
-
-static XawDLClass *
-_XawFindDLClass(String name)
-{
- XawDLClass **lc;
-
- if (!classes)
- return (NULL);
-
- lc = (XawDLClass **)bsearch(name, &classes[0], num_classes,
- sizeof(XawDLClass*), bcmp_dlist_class);
-
- return (lc ? *lc : NULL);
-}
-
-#endif /* OLDXAW */
+/* + * Copyright (c) 1998 by The XFree86 Project, Inc. + * + * 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 XFREE86 PROJECT 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 XFree86 Project 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 + * XFree86 Project. + * + * Author: Paulo César Pereira de Andrade + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <ctype.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <X11/IntrinsicP.h> +#include <X11/StringDefs.h> +#include <X11/CoreP.h> +#include <X11/Xfuncs.h> +#include <X11/Xmu/CharSet.h> +#include <X11/Xmu/SysUtil.h> +#include "Private.h" + +#ifdef __UNIXOS2__ +static char dummy; +#endif + +#ifndef OLDXAW + +/* + * Types + */ +typedef struct _XawDLProc XawDLProc; +typedef struct _XawDLData XawDLData; +typedef struct _XawDLInfo XawDLInfo; + +struct _XawDLProc { + XrmQuark qname; + String *params; + Cardinal num_params; + XawDisplayListProc proc; + XtPointer args; + XawDLData *data; +}; + +struct _XawDLData { + XawDLClass *dlclass; + XtPointer data; +}; + +struct _XawDLInfo { + String name; + XrmQuark qname; + XawDisplayListProc proc; +}; + +struct _XawDL { + XawDLProc **procs; + Cardinal num_procs; + XawDLData **data; + Cardinal num_data; + Screen *screen; + Colormap colormap; + int depth; + XrmQuark qrep; /* for cache lookup */ +}; + +struct _XawDLClass { + String name; + XawDLInfo **infos; + Cardinal num_infos; + XawDLArgsInitProc args_init; + XawDLArgsDestructor args_destructor; + XawDLDataInitProc data_init; + XawDLDataDestructor data_destructor; +}; + +/* + * Private Methods + */ +static XawDLClass *_XawFindDLClass(String); +static int qcmp_dlist_class(_Xconst void*, _Xconst void*); +static int bcmp_dlist_class(_Xconst void*, _Xconst void*); +static XawDLInfo *_XawFindDLInfo(XawDLClass*, String); +static int qcmp_dlist_info(_Xconst void*, _Xconst void*); +static int bcmp_dlist_info(_Xconst void*, _Xconst void*); +static void *_Xaw_Xlib_ArgsInitProc(String, String*, Cardinal*, + Screen*, Colormap, int); +static void _Xaw_Xlib_ArgsDestructor(Display*, String, XtPointer, + String*, Cardinal*); +static void *_Xaw_Xlib_DataInitProc(String, Screen*, Colormap, int); +static void _Xaw_Xlib_DataDestructor(Display*, String, XtPointer); + +/* + * Initialization + */ +static XawDLClass **classes; +static Cardinal num_classes; +static String xlib = "xlib"; + +/* + * Implementation + */ +void +XawRunDisplayList(Widget w, _XawDisplayList *list, + XEvent *event, Region region) +{ + XawDLProc *proc; + Cardinal i; + + if (!XtIsRealized(w)) + return; + + for (i = 0; i < list->num_procs; i++) + { + proc = list->procs[i]; + proc->proc(w, proc->args, proc->data->data, event, region); + } +} + +#define DLERR -2 +#define DLEOF -1 +#define DLEND 1 +#define DLNAME 2 +#define DLARG 3 +static char * +read_token(char *src, char *dst, Cardinal size, int *status) +{ + int ch; + Bool esc, quote; + Cardinal i; + + i = 0; + esc = quote = False; + + /*CONSTCOND*/ + while (1) + { + ch = *src; + if (ch != '\n' && isspace(ch)) + ++src; + else + break; + } + + for (; i < size - 1; src++) + { + ch = *src; + if (ch == '"') + { + if (quote) + { + quote = False; + continue; + } + quote = True; + continue; + } + if (ch == '\\') + { + if (esc) + { + dst[i++] = ch; + esc = False; + continue; + } + esc = True; + continue; + } + if (ch == '\0') + { + *status = DLEOF; + dst[i] = '\0'; + return (src); + } + else if (!esc) + { + if (!quote) + { + if (ch == ',') + { + *status = DLARG; + dst[i] = '\0'; + return (++src); + } + else if (ch == ' ' || ch == '\t') + { + *status = DLNAME; + dst[i] = '\0'; + return (++src); + } + else if (ch == ';' || ch == '\n') + { + *status = DLEND; + dst[i] = '\0'; + return (++src); + } + } + } + else + esc = False; + dst[i++] = ch; + } + + *status = DLERR; + dst[i] = '\0'; + + return (src); +} + +_XawDisplayList *XawCreateDisplayList(String string, Screen *screen, + Colormap colormap, int depth) +{ + _XawDisplayList *dlist; + XawDLClass *lc, *xlibc; + XawDLData *data; + XawDLInfo *info; + XawDLProc *proc; + char cname[64], fname[64], aname[1024]; + Cardinal i; + char *cp, *fp, *lp; + int status; + + xlibc = XawGetDisplayListClass(xlib); + if (!xlibc) + { + XawDisplayListInitialize(); + xlibc = XawGetDisplayListClass(xlib); + } + + dlist = (_XawDisplayList *)XtMalloc(sizeof(_XawDisplayList)); + dlist->procs = NULL; + dlist->num_procs = 0; + dlist->data = NULL; + dlist->num_data = 0; + dlist->screen = screen; + dlist->colormap = colormap; + dlist->depth = depth; + dlist->qrep = NULLQUARK; + if (!string || !string[0]) + return (dlist); + + cp = string; + + status = 0; + while (status != DLEOF) + { + lp = cp; + cp = read_token(cp, fname, sizeof(fname), &status); + + if (status != DLNAME && status != DLEND && status != DLEOF) + { + char msg[256]; + + XmuSnprintf(msg, sizeof(msg), + "Error parsing displayList at \"%s\"", lp); + XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)), + msg); + XawDestroyDisplayList(dlist); + return (NULL); + } + fp = fname; + /*CONSTCOND*/ + while (1) + { + fp = strchr(fp, ':'); + if (!fp || (fp == cp || fp[-1] != '\\')) + break; + ++fp; + } + if (fp) + { + XmuSnprintf(cname, fp - fname + 1, fname); + memmove(fname, fp + 1, strlen(fp)); + lc = cname[0] ? XawGetDisplayListClass(cname) : xlibc; + if (!lc) + { + char msg[256]; + + XmuSnprintf(msg, sizeof(msg), + "Cannot find displayList class \"%s\"", cname); + XtAppWarning(XtDisplayToApplicationContext + (DisplayOfScreen(screen)), msg); + XawDestroyDisplayList(dlist); + return (NULL); + } + } + else + lc = xlibc; + + if (status == DLEOF && !fname[0]) + break; + + if ((info = _XawFindDLInfo(lc, fname)) == NULL) + { + char msg[256]; + + XmuSnprintf(msg, sizeof(msg), + "Cannot find displayList procedure \"%s\"", fname); + XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)), + msg); + XawDestroyDisplayList(dlist); + return (NULL); + } + + proc = (XawDLProc *)XtMalloc(sizeof(XawDLProc)); + proc->qname = info->qname; + proc->params = NULL; + proc->num_params = 0; + proc->proc = info->proc; + proc->args = NULL; + proc->data = NULL; + + if (!dlist->procs) + { + dlist->num_procs = 1; + dlist->procs = (XawDLProc**)XtMalloc(sizeof(XawDLProc*)); + } + else + { + ++dlist->num_procs; + dlist->procs = (XawDLProc**) + XtRealloc((char *)dlist->procs, sizeof(XawDLProc*) * + dlist->num_procs); + } + dlist->procs[dlist->num_procs - 1] = proc; + + while (status != DLEND && status != DLEOF) + { + lp = cp; + cp = read_token(cp, aname, sizeof(aname), &status); + + if (status != DLARG && status != DLEND && status != DLEOF) + { + char msg[256]; + + XmuSnprintf(msg, sizeof(msg), + "Error parsing displayList at \"%s\"", lp); + XtAppWarning(XtDisplayToApplicationContext + (DisplayOfScreen(screen)), msg); + XawDestroyDisplayList(dlist); + return (NULL); + } + + if (!proc->num_params) + { + proc->num_params = 1; + proc->params = (String *)XtMalloc(sizeof(String)); + } + else + { + ++proc->num_params; + proc->params = (String *)XtRealloc((char *)proc->params, + sizeof(String) * + proc->num_params); + } + proc->params[proc->num_params - 1] = XtNewString(aname); + } + + /* verify if data is already created for lc */ + data = NULL; + for (i = 0; i < dlist->num_data; i++) + if (dlist->data[i]->dlclass == lc) + { + data = dlist->data[i]; + break; + } + + if (!data) + { + data = (XawDLData *)XtMalloc(sizeof(XawDLData)); + data->dlclass = lc; + if (lc->data_init) + data->data = lc->data_init(lc->name, screen, colormap, depth); + else + data->data = NULL; + + if (!dlist->data) + { + dlist->num_data = 1; + dlist->data = (XawDLData **)XtMalloc(sizeof(XawDLData*)); + } + else + { + ++dlist->num_data; + dlist->data = (XawDLData **) + XtRealloc((char *)dlist->data, sizeof(XawDLData*) * + dlist->num_data); + } + dlist->data[dlist->num_data - 1] = data; + } + + if (lc->args_init) + { + proc->args = lc->args_init(fname, proc->params, &proc->num_params, + screen, colormap, depth); + if (proc->args == XAWDL_CONVERT_ERROR) + { + char msg[256]; + + proc->args = NULL; + XmuSnprintf(msg, sizeof(msg), + "Cannot convert arguments to displayList function \"%s\"", fname); + XtAppWarning(XtDisplayToApplicationContext + (DisplayOfScreen(screen)), msg); + XawDestroyDisplayList(dlist); + return (NULL); + } + } + else + proc->args = NULL; + + proc->data = data; + } + + dlist->qrep = XrmStringToQuark(string); + return (dlist); +} + +String +XawDisplayListString(_XawDisplayList *dlist) +{ + if (!dlist || dlist->qrep == NULLQUARK) + return (""); + return (XrmQuarkToString(dlist->qrep)); +} + +void +XawDestroyDisplayList(_XawDisplayList *dlist) +{ + Cardinal i, j; + XawDLProc *proc; + XawDLData *data; + + if (!dlist) + return; + + for (i = 0; i < dlist->num_procs; i++) + { + proc = dlist->procs[i]; + data = proc->data; + + if (data) + { + if (data->dlclass->args_destructor) + data->dlclass->args_destructor(DisplayOfScreen(dlist->screen), + XrmQuarkToString(proc->qname), + proc->args, + proc->params, &proc->num_params); + if (data->data) + { + if (data->dlclass->data_destructor) + { + data->dlclass + ->data_destructor(DisplayOfScreen(dlist->screen), + data->dlclass->name, data->data); + data->data = NULL; + } + } + } + + for (j = 0; j < proc->num_params; j++) + XtFree(proc->params[j]); + if (proc->num_params) + XtFree((char *)proc->params); + XtFree((char *)proc); + } + + if (dlist->num_procs) + XtFree((char *)dlist->procs); + + XtFree((char *)dlist); +} + +/********************************************************************** + * If you want to implement your own class of procedures, look at + * the code bellow. + **********************************************************************/ +/* Start of Implementation of class "xlib" */ +typedef struct _XawXlibData { + GC gc; + unsigned long mask; + XGCValues values; + int shape; + int mode; + char *dashes; + /* these fields can be used for optimization, to + * avoid unnecessary coordinates recalculation. + */ + Position x, y; + Dimension width, height; +} XawXlibData; + +typedef struct _XawDLPosition { + Position pos; + short denom; + Boolean high; +} XawDLPosition; + +typedef struct _XawDLPositionPtr { + XawDLPosition *pos; + Cardinal num_pos; +} XawDLPositionPtr; + +typedef struct _XawDLArcArgs { + XawDLPosition pos[4]; + int angle1; + int angle2; +} XawDLArcArgs; + +typedef struct _XawDLStringArgs { + XawDLPosition pos[2]; + char *string; + int length; +} XawDLStringArgs; + +typedef struct _XawDLCopyArgs { + XawPixmap *pixmap; + XawDLPosition pos[6]; + int plane; +} XawDLCopyArgs; + +typedef struct _XawDLImageArgs { + XawPixmap *pixmap; + XawDLPosition pos[4]; + int depth; +} XawDLImageArgs; + +#define X_ARG(x) (Position)(((x).denom != 0) ? \ + ((float)XtWidth(w) * ((float)(x).pos / (float)(x).denom)) : \ + ((x).high ? XtWidth(w) - (x).pos : (x).pos)) +#define Y_ARG(x) (Position)(((x).denom != 0) ? \ + ((float)XtHeight(w) * ((float)(x).pos / (float)(x).denom)): \ + ((x).high ? XtHeight(w) - (x).pos : (x).pos)) +#define DRECT 0 +#define FRECT 1 +#define LINE 2 +#define GCFG 3 +#define GCBG 4 +#define FPOLY 5 +#define DARC 6 +#define FARC 7 +#define DLINES 8 +#define MASK 9 +#define UMASK 10 +#define LWIDTH 11 +#define POINT 12 +#define POINTS 13 +#define SEGMENTS 14 +#define ARCMODE 15 +#define COORDMODE 16 +#define SHAPEMODE 17 +#define LINESTYLE 18 +#define CAPSTYLE 19 +#define JOINSTYLE 20 +#define FILLSTYLE 21 +#define FILLRULE 22 +#define TILE 23 +#define STIPPLE 24 +#define TSORIGIN 25 +#define FUNCTION 26 +#define PLANEMASK 27 +#define DSTRING 28 +#define PSTRING 29 +#define FONT 30 +#define DASHES 31 +#define SUBWMODE 32 +#define EXPOSURES 33 +#define CLIPORIGIN 34 +#define CLIPMASK 35 +#define CLIPRECTS 36 +#define COPYAREA 37 +#define COPYPLANE 38 +#define IMAGE 39 + +static void +Dl1Point(Widget w, XtPointer args, XtPointer data, int id) +{ + XawDLPosition *pos = (XawDLPosition *)args; + XawXlibData *xdata = (XawXlibData *)data; + Display *display; + Window window; + Position x, y; + + x = X_ARG(pos[0]); + y = Y_ARG(pos[1]); + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + x += xpad; + y += ypad; + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + if (id == POINT) + XDrawPoint(display, window, xdata->gc, x, y); + else if (id == TSORIGIN) + { + xdata->values.ts_x_origin = x; + xdata->values.ts_y_origin = y; + xdata->mask |= GCTileStipXOrigin | GCTileStipYOrigin; + XSetTSOrigin(display, xdata->gc, x, y); + } + else if (id == CLIPORIGIN) + { + xdata->values.clip_x_origin = x; + xdata->values.clip_y_origin = y; + xdata->mask |= GCClipXOrigin | GCClipYOrigin; + XSetClipOrigin(display, xdata->gc, x, y); + } +} + +static void +Dl2Points(Widget w, XtPointer args, XtPointer data, int id) +{ + XawDLPosition *pos = (XawDLPosition *)args; + XawXlibData *xdata = (XawXlibData *)data; + Display *display; + Window window; + Position x1, y1, x2, y2; + + x1 = X_ARG(pos[0]); + y1 = Y_ARG(pos[1]); + x2 = X_ARG(pos[2]); + y2 = Y_ARG(pos[3]); + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + x1 += xpad; y1 += ypad; + x2 += xpad; y2 += ypad; + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + if (id == DRECT) + XDrawRectangle(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1); + else if (id == FRECT) + XFillRectangle(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1); + else if (id == LINE) + XDrawLine(display, window, xdata->gc, x1, y1, x2, y2); +} + +/* ARGSUSED */ +static void +DlLine(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region) +{ + Dl2Points(w, args, data, LINE); +} + +/* ARGSUSED */ +static void +DlDrawRectangle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + Dl2Points(w, args, data, DRECT); +} + +/* ARGSUSED */ +static void +DlFillRectangle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + Dl2Points(w, args, data, FRECT); +} + +static void +DlXPoints(Widget w, XtPointer args, XtPointer data, int id) +{ + XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args; + XawXlibData *xdata = (XawXlibData *)data; + XawDLPosition *pos; + XPoint points_buf[16]; + XPoint *points; + Display *display; + Window window; + Cardinal num_points, i, j; + + num_points = pos_ptr->num_pos>>1; + points = (XPoint *)XawStackAlloc(sizeof(XPoint) * num_points, points_buf); + + for (i = j = 0; i < num_points; i++, j = i << 1) + { + pos = &pos_ptr->pos[j]; + points[i].x = X_ARG(pos[0]); + points[i].y = Y_ARG(pos[1]); + } + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + if (xdata->mode != CoordModePrevious) + { + for (i = 0; i < num_points; i++) + { + points[i].x += xpad; + points[i].y += ypad; + } + } + else + { + points[0].x += xpad; + points[0].y += ypad; + } + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + if (id == FPOLY) + XFillPolygon(display, window, xdata->gc, points, num_points, + xdata->shape, xdata->mode); + else if (id == DLINES) + XDrawLines(display, window, xdata->gc, points, num_points, xdata->mode); + else if (id == POINTS) + XDrawPoints(display, window, xdata->gc, points, num_points, xdata->mode); + + XawStackFree(points, points_buf); +} + +/* ARGSUSED */ +static void +DlFillPolygon(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlXPoints(w, args, data, FPOLY); +} + +/* ARGSUSED */ +static void +DlDrawLines(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlXPoints(w, args, data, DLINES); +} + +/* ARGSUSED */ +static void +DlDrawPoints(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlXPoints(w, args, data, POINTS); +} + +/* ARGSUSED */ +static void +DlForeground(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + Pixel foreground = (Pixel)args; + + if (xdata->values.foreground != foreground) + { + xdata->mask |= GCForeground; + xdata->values.foreground = foreground; + XSetForeground(XtDisplayOfObject(w), xdata->gc, foreground); + } +} + +/* ARGSUSED */ +static void +DlBackground(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + Pixel background = (Pixel)args; + + if (xdata->values.background != background) + { + xdata->mask |= GCBackground; + xdata->values.background = background; + XSetBackground(XtDisplayOfObject(w), xdata->gc, background); + } +} + +static void +DlArc(Widget w, XtPointer args, XtPointer data, Bool fill) +{ + XawXlibData *xdata = (XawXlibData *)data; + XawDLArcArgs *arc = (XawDLArcArgs *)args; + Position x1, y1, x2, y2; + Display *display; + Window window; + + x1 = X_ARG(arc->pos[0]); + y1 = Y_ARG(arc->pos[1]); + x2 = X_ARG(arc->pos[2]); + y2 = Y_ARG(arc->pos[3]); + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + x1 += xpad; + y1 += ypad; + x2 += xpad; + y2 += ypad; + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + if (fill) + XFillArc(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1, + arc->angle1, arc->angle2); + else + XDrawArc(display, window, xdata->gc, x1, y1, x2 - x1, y2 - y1, + arc->angle1, arc->angle2); +} + +/* ARGSUSED */ +static void +DlDrawArc(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlArc(w, args, data, False); +} + +/* ARGSUSED */ +static void +DlFillArc(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlArc(w, args, data, True); +} + +/*ARGSUSED*/ +static void +DlMask(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + Display *display = XtDisplayOfObject(w); + + if (region) + XSetRegion(display, xdata->gc, region); + else if (event) + { + XRectangle rect; + + rect.x = event->xexpose.x; + rect.y = event->xexpose.y; + rect.width = event->xexpose.width; + rect.height = event->xexpose.height; + XSetClipRectangles(display, xdata->gc, 0, 0, &rect, 1, Unsorted); + } +} + +/* ARGSUSED */ +static void +DlUmask(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + + XSetClipMask(XtDisplayOfObject(w), xdata->gc, None); +} + +/* ARGSUSED */ +static void +DlLineWidth(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + unsigned line_width = (unsigned long)args; + + if (xdata->values.line_width != line_width) + { + xdata->mask |= GCLineWidth; + xdata->values.line_width = line_width; + XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineWidth, &xdata->values); + } +} + +/* ARGSUSED */ +static void +DlDrawPoint(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region) +{ + Dl1Point(w, args, data, POINT); +} + +/* ARGSUSED */ +static void +DlDrawSegments(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args; + XawXlibData *xdata = (XawXlibData *)data; + XawDLPosition *pos; + XSegment *segments; + XSegment segments_buf[8]; + Display *display; + Window window; + Cardinal num_segments, i, j; + + num_segments = pos_ptr->num_pos>>2; + segments = (XSegment *)XawStackAlloc(sizeof(XSegment) * num_segments, segments_buf); + + for (i = j = 0; i < num_segments; i++, j = i << 2) + { + pos = &pos_ptr->pos[j]; + segments[i].x1 = X_ARG(pos[0]); + segments[i].y1 = Y_ARG(pos[1]); + segments[i].x2 = X_ARG(pos[2]); + segments[i].y2 = Y_ARG(pos[3]); + } + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + for (i = 0; i < num_segments; i++) + { + segments[i].x1 += xpad; + segments[i].y1 += ypad; + segments[i].x2 += xpad; + segments[i].y2 += ypad; + } + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + XDrawSegments(display, window, xdata->gc, segments, num_segments); + + XawStackFree(segments, segments_buf); +} + +/* ARGSUSED */ +static void +DlArcMode(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int arc_mode = (long)args; + + if (xdata->values.arc_mode != arc_mode) + { + xdata->mask |= GCArcMode; + xdata->values.arc_mode = arc_mode; + XSetArcMode(XtDisplayOfObject(w), xdata->gc, arc_mode); + } +} + +/* ARGSUSED */ +static void +DlCoordMode(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int mode = (long)args; + + xdata->mode = mode; +} + +/* ARGSUSED */ +static void +DlShapeMode(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int shape = (long)args; + + xdata->shape = shape; +} + +/* ARGSUSED */ +static void +DlLineStyle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int line_style = (long)args; + + if (xdata->values.line_style != line_style) + { + xdata->mask |= GCLineStyle; + xdata->values.line_style = line_style; + XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineStyle, &xdata->values); + } +} + +/* ARGSUSED */ +static void +DlCapStyle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int cap_style = (long)args; + + if (xdata->values.cap_style != cap_style) + { + xdata->mask |= GCCapStyle; + xdata->values.cap_style = cap_style; + XChangeGC(XtDisplayOfObject(w), xdata->gc, GCCapStyle, &xdata->values); + } +} + +/* ARGSUSED */ +static void +DlJoinStyle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int join_style = (long)args; + + if (xdata->values.join_style != join_style) + { + xdata->mask |= GCJoinStyle; + xdata->values.join_style = join_style; + XChangeGC(XtDisplayOfObject(w), xdata->gc, GCJoinStyle, &xdata->values); + } +} + +/* ARGSUSED */ +static void +DlFillStyle(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int fill_style = (long)args; + + if (xdata->values.fill_style != fill_style) + { + xdata->mask |= GCFillStyle; + xdata->values.fill_style = fill_style; + XSetFillStyle(XtDisplayOfObject(w), xdata->gc, fill_style); + } +} + +/* ARGSUSED */ +static void +DlFillRule(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int fill_rule = (long)args; + + if (xdata->values.fill_rule != fill_rule) + { + xdata->mask |= GCFillRule; + xdata->values.fill_rule = fill_rule; + XSetFillRule(XtDisplayOfObject(w), xdata->gc, fill_rule); + } +} + +/* ARGSUSED */ +static void +DlTile(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + XawPixmap *pixmap = (XawPixmap *)args; + + if (pixmap && xdata->values.tile != pixmap->pixmap) + { + xdata->mask |= GCTile; + xdata->values.tile = pixmap->pixmap; + XSetTile(XtDisplayOfObject(w), xdata->gc, xdata->values.tile); + } +} + +/* ARGSUSED */ +static void +DlStipple(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + XawPixmap *pixmap = (XawPixmap *)args; + + if (pixmap && xdata->values.stipple != pixmap->pixmap) + { + xdata->mask |= GCStipple; + xdata->values.stipple = pixmap->pixmap; + XSetStipple(XtDisplayOfObject(w), xdata->gc, xdata->values.stipple); + } +} + +/* ARGSUSED */ +static void +DlTSOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region) +{ + Dl1Point(w, args, data, TSORIGIN); +} + +/* ARGSUSED */ +static void +DlFunction(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int function = (long)args; + + if (function != xdata->values.function) + { + xdata->mask |= GCFunction; + xdata->values.function = function; + XSetFunction(XtDisplayOfObject(w), xdata->gc, function); + } +} + +/* ARGSUSED */ +static void +DlPlaneMask(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + unsigned long plane_mask = (unsigned long)args; + + if (xdata->values.plane_mask != plane_mask) + { + xdata->mask |= GCPlaneMask; + xdata->values.plane_mask = plane_mask; + XSetPlaneMask(XtDisplayOfObject(w), xdata->gc, plane_mask); + } +} + +static void +DlString(Widget w, XtPointer args, XtPointer data, Bool image) +{ + XawDLStringArgs *string = (XawDLStringArgs *)args; + XawXlibData *xdata = (XawXlibData *)data; + Display *display; + Window window; + Position x, y; + + x = X_ARG(string->pos[0]); + y = Y_ARG(string->pos[1]); + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + x += xpad; + y += ypad; + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + if (image) + XDrawImageString(display, window, xdata->gc, x, y, string->string, string->length); + else + XDrawString(display, window, xdata->gc, x, y, string->string, string->length); +} + +/* ARGSUSED */ +static void +DlDrawString(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlString(w, args, data, False); +} + +/* ARGSUSED */ +static void +DlPaintString(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlString(w, args, data, True); +} + +/* ARGSUSED */ +static void +DlFont(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + Font font = (Font)args; + + if (xdata->values.font != font) + { + xdata->mask |= GCFont; + xdata->values.font = font; + XSetFont(XtDisplayOfObject(w), xdata->gc, font); + } +} + +/* ARGSUSED */ +static void +DlDashes(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + char *dashes = args; + + if (xdata->dashes != dashes) + { + xdata->mask |= GCDashOffset | GCDashList; + xdata->dashes = dashes; + XSetDashes(XtDisplayOfObject(w), xdata->gc, 0, dashes + 1, *dashes); + } +} + +/* ARGSUSED */ +static void +DlSubwindowMode(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + int subwindow_mode = (long)args; + + if (xdata->values.subwindow_mode != subwindow_mode) + { + xdata->mask |= GCSubwindowMode; + xdata->values.subwindow_mode = subwindow_mode; + XSetSubwindowMode(XtDisplayOfObject(w), xdata->gc, subwindow_mode); + } +} + +/* ARGSUSED */ +static void +DlExposures(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + Bool graphics_exposures = (Bool)(long)args; + + if (xdata->values.graphics_exposures != graphics_exposures) + { + xdata->mask |= GCGraphicsExposures; + xdata->values.graphics_exposures = graphics_exposures; + XSetGraphicsExposures(XtDisplayOfObject(w), xdata->gc, graphics_exposures); + } +} + +/* ARGSUSED */ +static void +DlClipOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region) +{ + Dl1Point(w, args, data, CLIPORIGIN); +} + +/* ARGSUSED */ +static void +DlClipMask(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawXlibData *xdata = (XawXlibData *)data; + XawPixmap *pixmap = (XawPixmap *)args; + Pixmap clip_mask; + + if (pixmap) + clip_mask = pixmap->mask ? pixmap->mask : pixmap->pixmap; + else + clip_mask = None; + + if (xdata->values.clip_mask != clip_mask) + { + xdata->mask |= GCClipMask; + XSetClipMask(XtDisplayOfObject(w), xdata->gc, clip_mask); + } +} + +/* ARGSUSED */ +static void +DlClipRectangles(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args; + XawXlibData *xdata = (XawXlibData *)data; + XawDLPosition *pos; + XRectangle *rects; + XRectangle rects_buf[8]; + Position x1, y1, x2, y2; + Cardinal num_rects, i, j; + + num_rects = pos_ptr->num_pos>>2; + rects = (XRectangle *)XawStackAlloc(sizeof(XRectangle) * num_rects, rects_buf); + + for (i = j = 0; i < num_rects; i++, j = i << 2) + { + pos = &pos_ptr->pos[j]; + x1 = X_ARG(pos[0]); + y1 = Y_ARG(pos[1]); + x2 = X_ARG(pos[2]); + y2 = Y_ARG(pos[3]); + rects[i].x = XawMin(x1, x2); + rects[i].y = XawMin(y1, y2); + rects[i].width = XawMax(x1, x2) - rects[i].x; + rects[i].height = XawMax(y1, y2) - rects[i].y; + } + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + for (i = 0; i < num_rects; i++) + { + rects[i].x += xpad; + rects[i].y += ypad; + } + } + + XSetClipRectangles(XtDisplayOfObject(w), xdata->gc, 0, 0, rects, num_rects, Unsorted); + + XawStackFree(rects, rects_buf); +} + +static void +DlCopy(Widget w, XtPointer args, XtPointer data, Bool plane) +{ + XawDLCopyArgs *copy = (XawDLCopyArgs *)args; + XawXlibData *xdata = (XawXlibData *)data; + int src_x, src_y, dst_x, dst_y, width, height, tmp1, tmp2; + + tmp1 = X_ARG(copy->pos[0]); + tmp2 = X_ARG(copy->pos[2]); + dst_x = XawMin(tmp1, tmp2); + width = XawMax(tmp1, tmp2) - dst_x; + + tmp1 = Y_ARG(copy->pos[1]); + tmp2 = Y_ARG(copy->pos[3]); + dst_y = XawMin(tmp1, tmp2); + height = XawMax(tmp1, tmp2) - dst_y; + + src_x = X_ARG(copy->pos[4]); + src_y = Y_ARG(copy->pos[5]); + + if (width <= 0) + { + if (copy->pixmap) + width = copy->pixmap->width; + else + { + if ((width = XtWidth(w) - src_x) < 0) + width = 0; + } + } + if (height <= 0) + { + if (copy->pixmap) + height = copy->pixmap->height; + else + { + if ((height = XtHeight(w) - src_y) < 0) + height = 0; + } + } + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + src_x += xpad; + src_y += ypad; + dst_x += xpad; + dst_y += ypad; + } + + if (plane) + XCopyPlane(XtDisplayOfObject(w), XtWindowOfObject(w), + copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w), + xdata->gc, src_x, src_y, width, height, dst_x, dst_y, + copy->plane ? copy->plane : 1); + else + XCopyArea(XtDisplayOfObject(w), + copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w), + XtWindowOfObject(w), xdata->gc, src_x, src_y, width, height, dst_x, dst_y); +} + +/* ARGSUSED */ +static void +DlCopyArea(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlCopy(w, args, data, False); +} + +/* ARGSUSED */ +static void +DlCopyPlane(Widget w, XtPointer args, XtPointer data, + XEvent *event, Region region) +{ + DlCopy(w, args, data, True); +} + +/*ARGSUSED*/ +/* Note: + * This function is destructive if you set the ts_x_origin, ts_y_origin, + * and/or clip-mask. It is meant to be the only function used in a display + * list. If you need to use other functions (and those values), be sure to + * set them after calling this function. + */ +static void +DlImage(Widget w, XtPointer args, XtPointer data, XEvent *event, Region region) +{ + XawDLImageArgs *image = (XawDLImageArgs *)args; + XawXlibData *xdata = (XawXlibData *)data; + int x, y, xs, ys, xe, ye, width, height; + Display *display; + Window window; + + width = image->pixmap->width; + height = image->pixmap->height; + xs = X_ARG(image->pos[0]); + ys = Y_ARG(image->pos[1]); + xe = X_ARG(image->pos[2]); + ye = Y_ARG(image->pos[3]); + + if (xe <= 0) + xe = xs + width; + if (ye <= 0) + ye = ys + height; + + if (!XtIsWidget(w)) + { + Position xpad, ypad; + + xpad = XtX(w) + XtBorderWidth(w); + ypad = XtY(w) + XtBorderWidth(w); + xe += xpad; + ye += ypad; + xe += xpad; + ye += ypad; + display = XtDisplayOfObject(w); + window = XtWindowOfObject(w); + } + else + { + display = XtDisplay(w); + window = XtWindow(w); + } + + for (y = ys; y < ye; y += height) + for (x = xs; x < xe; x += width) + { + XSetClipOrigin(display, xdata->gc, x, y); + if (image->pixmap->mask) + XSetClipMask(display, xdata->gc, image->pixmap->mask); + if (image->depth == 1) + XCopyPlane(display, image->pixmap->pixmap, window, xdata->gc, + 0, 0, XawMin(width, xe - x), XawMin(height, ye - y), + x, y, 1L); + else + XCopyArea(display, image->pixmap->pixmap, window, xdata->gc, 0, 0, + XawMin(width, xe - x), XawMin(height, ye - y), x, y); + } + + XSetClipMask(display, xdata->gc, None); +} + +typedef struct _Dl_init Dl_init; +struct _Dl_init { + String name; + XawDisplayListProc proc; + Cardinal id; +}; + +static Dl_init dl_init[] = +{ + {"arc-mode", DlArcMode, ARCMODE}, + {"background", DlBackground, GCBG}, + {"bg", DlBackground, GCBG}, + {"cap-style", DlCapStyle, CAPSTYLE}, + {"clip-mask", DlClipMask, CLIPMASK}, + {"clip-origin", DlClipOrigin, CLIPORIGIN}, + {"clip-rectangles", DlClipRectangles, CLIPRECTS}, + {"clip-rects", DlClipRectangles, CLIPRECTS}, + {"coord-mode", DlCoordMode, COORDMODE}, + {"copy-area", DlCopyArea, COPYAREA}, + {"copy-plane", DlCopyPlane, COPYPLANE}, + {"dashes", DlDashes, DASHES}, + {"draw-arc", DlDrawArc, DARC}, + {"draw-line", DlLine, LINE}, + {"draw-lines", DlDrawLines, DLINES}, + {"draw-point", DlDrawPoint, POINT}, + {"draw-points", DlDrawPoints, POINTS}, + {"draw-rect", DlDrawRectangle, DRECT}, + {"draw-rectangle", DlDrawRectangle, DRECT}, + {"draw-segments", DlDrawSegments, SEGMENTS}, + {"draw-string", DlDrawString, DSTRING}, + {"exposures", DlExposures, EXPOSURES}, + {"fg", DlForeground, GCFG}, + {"fill-arc", DlFillArc, FARC}, + {"fill-poly", DlFillPolygon, FPOLY}, + {"fill-polygon", DlFillPolygon, FPOLY}, + {"fill-rect", DlFillRectangle, FRECT}, + {"fill-rectangle", DlFillRectangle, FRECT}, + {"fill-rule", DlFillRule, FILLRULE}, + {"fill-style", DlFillStyle, FILLSTYLE}, + {"font", DlFont, FONT}, + {"foreground", DlForeground, GCFG}, + {"function", DlFunction, FUNCTION}, + {"image", DlImage, IMAGE}, + {"join-style", DlJoinStyle, JOINSTYLE}, + {"line", DlLine, LINE}, + {"line-style", DlLineStyle, LINESTYLE}, + {"line-width", DlLineWidth, LWIDTH}, + {"lines", DlDrawLines, DLINES}, + {"mask", DlMask, MASK}, + {"paint-string", DlPaintString, PSTRING}, + {"plane-mask", DlPlaneMask, PLANEMASK}, + {"point", DlDrawPoint, POINT}, + {"points", DlDrawPoints, POINTS}, + {"segments", DlDrawSegments, SEGMENTS}, + {"shape-mode", DlShapeMode, SHAPEMODE}, + {"stipple", DlStipple, STIPPLE}, + {"subwindow-mode", DlSubwindowMode, SUBWMODE}, + {"tile", DlTile, TILE}, + {"ts-origin", DlTSOrigin, TSORIGIN}, + {"umask", DlUmask, UMASK}, +}; + +void +XawDisplayListInitialize(void) +{ + static Bool first_time = True; + XawDLClass *lc; + Cardinal i; + + if (first_time == False) + return; + + first_time = False; + + lc = XawCreateDisplayListClass(xlib, + _Xaw_Xlib_ArgsInitProc, + _Xaw_Xlib_ArgsDestructor, + _Xaw_Xlib_DataInitProc, + _Xaw_Xlib_DataDestructor); + for (i = 0; i < sizeof(dl_init) / sizeof(dl_init[0]); i++) + (void)XawDeclareDisplayListProc(lc, dl_init[i].name, dl_init[i].proc); +} + +static int +bcmp_cvt_proc(register _Xconst void *string, + register _Xconst void *dlinfo) +{ + return (strcmp((String)string, ((Dl_init*)dlinfo)->name)); +} + +static long +read_int(char *cp, char **cpp) +{ + long value = 0, sign = 1; + + if (*cp == '-') + { + sign = -1; + ++cp; + } + else if (*cp == '+') + ++cp; + value = 0; + while (*cp >= '0' && *cp <= '9') + { + value = value * 10 + *cp - '0'; + ++cp; + } + if (cpp) + *cpp = cp; + return (value * sign); +} + +static void +read_position(char *arg, XawDLPosition *pos) +{ + int ch; + char *str = arg; + + ch = *str; + if (ch == '-' || ch == '+') + { + ++str; + if (ch == '-') + pos->high = True; + pos->pos = read_int(str, NULL); + } + else if (isdigit(ch)) + { + pos->pos = read_int(str, &str); + ch = *str++; + if (ch == '/') + pos->denom = read_int(str, NULL); + } +} + +/* ARGSUSED */ +static void * +_Xaw_Xlib_ArgsInitProc(String proc_name, String *params, Cardinal *num_params, + Screen *screen, Colormap colormap, int depth) +{ + Cardinal id, i; + Dl_init *init; + void *retval = XAWDL_CONVERT_ERROR; + + init = (Dl_init *)bsearch(proc_name, dl_init, + sizeof(dl_init) / sizeof(dl_init[0]), + sizeof(dl_init[0]), + bcmp_cvt_proc); + + id = init->id; + + switch (id) + { + case LINE: + case DRECT: + case FRECT: + if (*num_params == 4) + { + XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 4); + + for (i = 0; i < 4; i++) + read_position(params[i], &pos[i]); + retval = (void *)pos; + } + break; + case POINT: + case TSORIGIN: + case CLIPORIGIN: + if (*num_params == 2) + { + XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 2); + + read_position(params[0], &pos[0]); + read_position(params[1], &pos[1]); + retval = (void *)pos; + } + break; + case DLINES: + case FPOLY: + case POINTS: + if (*num_params >= 4 && !(*num_params & 1)) + { + XawDLPositionPtr *pos = XtNew(XawDLPositionPtr); + + pos->pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * + *num_params); + pos->num_pos = *num_params; + for (i = 0; i < *num_params; i++) + read_position(params[i], &pos->pos[i]); + retval = (void *)pos; + } + break; + case SEGMENTS: + case CLIPRECTS: + if (*num_params >= 4 && !(*num_params % 4)) + { + XawDLPositionPtr *pos = XtNew(XawDLPositionPtr); + + pos->pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * + *num_params); + pos->num_pos = *num_params; + for (i = 0; i < *num_params; i++) + read_position(params[i], &pos->pos[i]); + retval = (void *)pos; + } + break; + case DARC: + case FARC: + if (*num_params >= 4 && *num_params <= 6) + { + XawDLArcArgs *args = (XawDLArcArgs *)XtCalloc(1, sizeof(XawDLArcArgs)); + + args->angle1 = 0; + args->angle2 = 360; + for (i = 0; i < 4; i++) + read_position(params[i], &args->pos[i]); + if (*num_params > 4) + args->angle1 = read_int(params[4], NULL); + if (*num_params > 5) + args->angle2 = read_int(params[5], NULL); + args->angle1 *= 64; + args->angle2 *= 64; + retval = (void *)args; + } + break; + case GCFG: + case GCBG: + { + XColor xcolor; + + if (*num_params == 1 && + XAllocNamedColor(DisplayOfScreen(screen), colormap, + params[0], &xcolor, &xcolor)) + retval = (void *)xcolor.pixel; + } break; + case MASK: + case UMASK: + if (*num_params == 0) + retval = NULL; + break; + case LWIDTH: + if (*num_params == 1) + retval = (void *)read_int(params[0], NULL); + break; + case ARCMODE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "pieslice") == 0) + retval = (void *)ArcPieSlice; + else if (XmuCompareISOLatin1(params[0], "chord") == 0) + retval = (void *)ArcChord; + } + break; + case COORDMODE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "origin") == 0) + retval = (void *)CoordModeOrigin; + else if (XmuCompareISOLatin1(params[0], "previous") == 0) + retval = (void *)CoordModePrevious; + } + break; + case SHAPEMODE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "complex") == 0) + retval = (void *)Complex; + else if (XmuCompareISOLatin1(params[0], "convex") == 0) + retval = (void *)Convex; + else if (XmuCompareISOLatin1(params[0], "nonconvex") == 0) + retval = (void *)Nonconvex; + } + break; + case LINESTYLE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "solid") == 0) + retval = (void *)LineSolid; + else if (XmuCompareISOLatin1(params[0], "onoffdash") == 0) + retval = (void *)LineOnOffDash; + else if (XmuCompareISOLatin1(params[0], "doubledash") == 0) + retval = (void *)LineDoubleDash; + } + break; + case CAPSTYLE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "notlast") == 0) + retval = (void *)CapNotLast; + else if (XmuCompareISOLatin1(params[0], "butt") == 0) + retval = (void *)CapButt; + else if (XmuCompareISOLatin1(params[0], "round") == 0) + retval = (void *)CapRound; + else if (XmuCompareISOLatin1(params[0], "projecting") == 0) + retval = (void *)CapProjecting; + } + break; + case JOINSTYLE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "miter") == 0) + retval = (void *)JoinMiter; + else if (XmuCompareISOLatin1(params[0], "round") == 0) + retval = (void *)JoinRound; + else if (XmuCompareISOLatin1(params[0], "bevel") == 0) + retval = (void *)JoinBevel; + } + break; + case FILLSTYLE: + if (*num_params == 1) + { + if (*num_params && XmuCompareISOLatin1(params[0], "solid") == 0) + retval = (void *)FillSolid; + else if (*num_params && XmuCompareISOLatin1(params[0], "tiled") == 0) + retval = (void *)FillTiled; + else if (*num_params && XmuCompareISOLatin1(params[0], "stippled") == 0) + retval = (void *)FillStippled; + else if (*num_params && XmuCompareISOLatin1(params[0], "opaquestippled") == 0) + retval = (void *)FillOpaqueStippled; + } + break; + case FILLRULE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "evenodd") == 0) + retval = (void *)EvenOddRule; + else if (XmuCompareISOLatin1(params[0], "winding") == 0) + retval = (void *)WindingRule; + } + break; + case TILE: + if (*num_params == 1) + retval = (void *)XawLoadPixmap(params[0], screen, colormap, depth); + if (retval == NULL) + { + XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0], + XtRPixmap); + retval = XAWDL_CONVERT_ERROR; + } + break; + case STIPPLE: + if (*num_params == 1) + retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1); + if (retval == NULL) + { + XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0], + XtRBitmap); + retval = XAWDL_CONVERT_ERROR; + } + break; + case FUNCTION: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "set") == 0) + retval = (void *)GXset; + else if (XmuCompareISOLatin1(params[0], "clear") == 0) + retval = (void *)GXclear; + else if (XmuCompareISOLatin1(params[0], "and") == 0) + retval = (void *)GXand; + else if (XmuCompareISOLatin1(params[0], "andreverse") == 0) + retval = (void *)GXandReverse; + else if (XmuCompareISOLatin1(params[0], "copy") == 0) + retval = (void *)GXcopy; + else if (XmuCompareISOLatin1(params[0], "andinverted") == 0) + retval = (void *)GXandInverted; + else if (XmuCompareISOLatin1(params[0], "noop") == 0) + retval = (void *)GXnoop; + else if (XmuCompareISOLatin1(params[0], "xor") == 0) + retval = (void *)GXxor; + else if (XmuCompareISOLatin1(params[0], "or") == 0) + retval = (void *)GXor; + else if (XmuCompareISOLatin1(params[0], "nor") == 0) + retval = (void *)GXnor; + else if (XmuCompareISOLatin1(params[0], "equiv") == 0) + retval = (void *)GXequiv; + else if (XmuCompareISOLatin1(params[0], "invert") == 0) + retval = (void *)GXinvert; + else if (XmuCompareISOLatin1(params[0], "orreverse") == 0) + retval = (void *)GXorReverse; + else if (XmuCompareISOLatin1(params[0], "copyinverted") == 0) + retval = (void *)GXcopyInverted; + else if (XmuCompareISOLatin1(params[0], "nand") == 0) + retval = (void *)GXnand; + } + break; + case PLANEMASK: + if (*num_params == 1) + retval = (void *)read_int(params[0], NULL); + break; + case DSTRING: + case PSTRING: + if (*num_params == 3) + { + XawDLStringArgs *string = (XawDLStringArgs *) + XtCalloc(1, sizeof(XawDLStringArgs)); + + read_position(params[0], &string->pos[0]); + read_position(params[1], &string->pos[1]); + string->string = XtNewString(params[2]); + string->length = strlen(string->string); + retval = string; + } + break; + case FONT: + if (*num_params == 1) + retval = (void *)XLoadFont(DisplayOfScreen(screen), params[0]); + break; + case DASHES: + if (*num_params && *num_params < 127) + { + char *dashes; + + dashes = XtMalloc(*num_params + 1); + + for (i = 0; i < *num_params; i++) + dashes[i + 1] = read_int(params[i], NULL); + *dashes = *num_params; + retval = dashes; + } + break; + case SUBWMODE: + if (*num_params == 1) + { + if (XmuCompareISOLatin1(params[0], "clipbychildren") == 0) + retval = (void *)ClipByChildren; + else if (XmuCompareISOLatin1(params[0], "includeinferiors") == 0) + retval = (void *)IncludeInferiors; + } + break; + case EXPOSURES: + if (*num_params == 1) + { + if (isdigit(params[0][0]) || params[0][0] == '+' || params[0][0] == '-') + retval = (void *)read_int(params[0], NULL); + else if (XmuCompareISOLatin1(params[0], "true") == 0 || + XmuCompareISOLatin1(params[0], "on") == 0) + retval = (void *)True; + else if (XmuCompareISOLatin1(params[0], "false") == 0 || + XmuCompareISOLatin1(params[0], "off") == 0) + retval = (void *)False; + } + break; + case CLIPMASK: + if (*num_params == 1) + retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1); + if (retval == NULL) + { + retval = XAWDL_CONVERT_ERROR; + XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0], + XtRPixmap); + } + break; + case COPYAREA: + case COPYPLANE: + if (*num_params > 2 && *num_params <= 7 + (id == COPYPLANE)) + { + XawDLCopyArgs *args = (XawDLCopyArgs *) + XtCalloc(1, sizeof(XawDLCopyArgs)); + + retval = args; + if (params[0][0] == '\0' || strcmp(params[0], ".") == 0) + args->pixmap = NULL; + else + { + args->pixmap = XawLoadPixmap(params[0], screen, colormap, id == COPYPLANE ? 1 : depth); + if (args->pixmap == NULL) + { + XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0], + XtRBitmap); + retval = XAWDL_CONVERT_ERROR; + XtFree((char *)args); + } + } + if (retval != XAWDL_CONVERT_ERROR) + { + for (i = 1; i < *num_params && i < 7; i++) + read_position(params[i], &args->pos[i - 1]); + if (*num_params > 7) + args->plane = read_int(params[7], NULL); + } + } + break; + case IMAGE: + if (*num_params > 2 && *num_params <= 7) + { + XawDLImageArgs *args = (XawDLImageArgs *) + XtCalloc(1, sizeof(XawDLImageArgs)); + + retval = args; + args->pixmap = XawLoadPixmap(params[0], screen, colormap, depth); + if (args->pixmap == NULL) + { + XtDisplayStringConversionWarning(DisplayOfScreen(screen), + (String)params[0], XtRPixmap); + retval = XAWDL_CONVERT_ERROR; + XtFree((char *)args); + } + else + { + args->depth = depth; + for (i = 1; i < *num_params && i < 5; i++) + read_position(params[i], &args->pos[i - 1]); + } + } + break; + } + + return (retval); +} + +/* ARGSUSED */ +static void * +_Xaw_Xlib_DataInitProc(String class_name, + Screen *screen, Colormap colormap, int depth) +{ + XawXlibData *data; + Window tmp_win; + + data = (XawXlibData *)XtMalloc(sizeof(XawXlibData)); + + tmp_win = XCreateWindow(DisplayOfScreen(screen), + RootWindowOfScreen(screen), + 0, 0, 1, 1, 1, depth, + InputOutput, (Visual *)CopyFromParent, 0, NULL); + data->mask = 0; + data->gc = XCreateGC(DisplayOfScreen(screen), tmp_win, 0, &data->values); + XDestroyWindow(DisplayOfScreen(screen), tmp_win); + data->shape = Complex; + data->mode = CoordModeOrigin; + data->dashes = NULL; + + return ((void *)data); +} + +/* ARGSUSED */ +static void +_Xaw_Xlib_ArgsDestructor(Display *display, String proc_name, XtPointer args, + String *params, Cardinal *num_params) +{ + Cardinal id; + Dl_init *init; + + init = (Dl_init *)bsearch(proc_name, dl_init, + sizeof(dl_init) / sizeof(dl_init[0]), + sizeof(dl_init[0]), + bcmp_cvt_proc); + + id = init->id; + + switch (id) + { + case LINE: + case DRECT: + case FRECT: + case DARC: + case FARC: + case POINT: + case TSORIGIN: + case DASHES: + case CLIPORIGIN: + case COPYAREA: + case COPYPLANE: + case IMAGE: + XtFree(args); + break; + case DSTRING: + case PSTRING: + { + XawDLStringArgs *string = (XawDLStringArgs *)args; + XtFree(string->string); + XtFree(args); + } break; + case DLINES: + case FPOLY: + case POINTS: + case SEGMENTS: + case CLIPRECTS: + { + XawDLPositionPtr *ptr = (XawDLPositionPtr *)args; + + XtFree((char *)ptr->pos); + XtFree(args); + } break; + } +} + +/* ARGSUSED */ +static void +_Xaw_Xlib_DataDestructor(Display *display, String class_name, XtPointer data) +{ + if (data) + { + XawXlibData *xdata = (XawXlibData *)data; + + XFreeGC(display, xdata->gc); + if (xdata->dashes) + XtFree(xdata->dashes); + XtFree((char *)data); + } +} + +/* Start of DLInfo Management Functions */ +static int +qcmp_dlist_info(register _Xconst void *left, register _Xconst void *right) +{ + return (strcmp((*(XawDLInfo **)left)->name, (*(XawDLInfo **)right)->name)); +} + +Bool XawDeclareDisplayListProc(XawDLClass *lc, String name, + XawDisplayListProc proc) +{ + XawDLInfo *info; + + if (!lc || !proc || !name || name[0] == '\0') + return (False); + + if ((info = _XawFindDLInfo(lc, name)) != NULL) + /* Since the data structures to the displayList classes are(should be) + * opaque, it is not a good idea to allow overriding a displayList + * procedure; it's better to choose another name or class name! + */ + return (False); + + info = (XawDLInfo *)XtMalloc(sizeof(XawDLInfo)); + info->name = XtNewString(name); + info->qname = XrmStringToQuark(info->name); + info->proc = proc; + + if (!lc->num_infos) + { + lc->num_infos = 1; + lc->infos = (XawDLInfo **)XtMalloc(sizeof(XawDLInfo*)); + } + else + { + ++lc->num_infos; + lc->infos = (XawDLInfo **) + XtRealloc((char *)lc->infos, sizeof(XawDLInfo*) * lc->num_infos); + } + lc->infos[lc->num_infos - 1] = info; + + if (lc->num_infos > 1) + qsort(lc->infos, lc->num_infos, sizeof(XawDLInfo*), qcmp_dlist_info); + + return (True); +} + +static int +bcmp_dlist_info(register _Xconst void *string, + register _Xconst void *dlinfo) +{ + return (strcmp((String)string, (*(XawDLClass **)dlinfo)->name)); +} + +static XawDLInfo * +_XawFindDLInfo(XawDLClass *lc, String name) +{ + XawDLInfo **info; + + if (!lc->infos) + return (NULL); + + info = (XawDLInfo **)bsearch(name, lc->infos, lc->num_infos, + sizeof(XawDLInfo*), bcmp_dlist_info); + + return (info ? *info : NULL); +} + +/* Start of DLClass Management Functions */ +XawDLClass * +XawGetDisplayListClass(String name) +{ + return (_XawFindDLClass(name)); +} + +static int +qcmp_dlist_class(register _Xconst void *left, register _Xconst void *right) +{ + return (strcmp((*(XawDLClass **)left)->name, (*(XawDLClass **)right)->name)); +} + +XawDLClass * +XawCreateDisplayListClass(String name, + XawDLArgsInitProc args_init, + XawDLArgsDestructor args_destructor, + XawDLDataInitProc data_init, + XawDLDataDestructor data_destructor) +{ + XawDLClass *lc; + + if (!name || name[0] == '\0') + return (NULL); + + lc = (XawDLClass *)XtMalloc(sizeof(XawDLClass)); + lc->name = XtNewString(name); + lc->infos = NULL; + lc->num_infos = 0; + lc->args_init = args_init; + lc->args_destructor = args_destructor; + lc->data_init = data_init; + lc->data_destructor = data_destructor; + + if (!classes) + { + num_classes = 1; + classes = (XawDLClass **)XtMalloc(sizeof(XawDLClass)); + } + else + { + ++num_classes; + classes = (XawDLClass **)XtRealloc((char *)classes, + sizeof(XawDLClass) * num_classes); + } + classes[num_classes - 1] = lc; + + if (num_classes > 1) + qsort(&classes[0], num_classes, sizeof(XawDLClass*), qcmp_dlist_class); + + return (lc); +} + +static int +bcmp_dlist_class(register _Xconst void *string, + register _Xconst void *dlist) +{ + return (strcmp((String)string, (*(XawDLClass **)dlist)->name)); +} + +static XawDLClass * +_XawFindDLClass(String name) +{ + XawDLClass **lc; + + if (!classes) + return (NULL); + + lc = (XawDLClass **)bsearch(name, &classes[0], num_classes, + sizeof(XawDLClass*), bcmp_dlist_class); + + return (lc ? *lc : NULL); +} + +#endif /* OLDXAW */ |