DisplayList.c revision 5b16253f
17a84e134Smrg/*
27a84e134Smrg * Copyright (c) 1998 by The XFree86 Project, Inc.
37a84e134Smrg *
47a84e134Smrg * Permission is hereby granted, free of charge, to any person obtaining a
57a84e134Smrg * copy of this software and associated documentation files (the "Software"),
67a84e134Smrg * to deal in the Software without restriction, including without limitation
77a84e134Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87a84e134Smrg * and/or sell copies of the Software, and to permit persons to whom the
97a84e134Smrg * Software is furnished to do so, subject to the following conditions:
107a84e134Smrg *
117a84e134Smrg * The above copyright notice and this permission notice shall be included in
127a84e134Smrg * all copies or substantial portions of the Software.
13421c997bSmrg *
147a84e134Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
157a84e134Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
167a84e134Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
177a84e134Smrg * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
187a84e134Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
197a84e134Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
207a84e134Smrg * SOFTWARE.
217a84e134Smrg *
227a84e134Smrg * Except as contained in this notice, the name of the XFree86 Project shall
237a84e134Smrg * not be used in advertising or otherwise to promote the sale, use or other
247a84e134Smrg * dealings in this Software without prior written authorization from the
257a84e134Smrg * XFree86 Project.
267a84e134Smrg *
277a84e134Smrg * Author: Paulo César Pereira de Andrade
287a84e134Smrg */
297a84e134Smrg
307a84e134Smrg#ifdef HAVE_CONFIG_H
317a84e134Smrg#include <config.h>
327a84e134Smrg#endif
337a84e134Smrg#include <ctype.h>
347a84e134Smrg#include <string.h>
357a84e134Smrg#include <stdio.h>
367a84e134Smrg#include <stdlib.h>
377a84e134Smrg#include <X11/IntrinsicP.h>
387a84e134Smrg#include <X11/StringDefs.h>
397a84e134Smrg#include <X11/CoreP.h>
407a84e134Smrg#include <X11/Xfuncs.h>
417a84e134Smrg#include <X11/Xmu/CharSet.h>
427a84e134Smrg#include "Private.h"
437a84e134Smrg
447a84e134Smrg
457a84e134Smrg#ifndef OLDXAW
467a84e134Smrg
477a84e134Smrg/*
487a84e134Smrg * Types
497a84e134Smrg */
507a84e134Smrgtypedef struct _XawDLProc XawDLProc;
517a84e134Smrgtypedef struct _XawDLData XawDLData;
527a84e134Smrgtypedef struct _XawDLInfo XawDLInfo;
537a84e134Smrg
547a84e134Smrgstruct _XawDLProc {
557a84e134Smrg  XrmQuark qname;
567a84e134Smrg  String *params;
577a84e134Smrg  Cardinal num_params;
587a84e134Smrg  XawDisplayListProc proc;
597a84e134Smrg  XtPointer args;
607a84e134Smrg  XawDLData *data;
617a84e134Smrg};
627a84e134Smrg
637a84e134Smrgstruct _XawDLData {
647a84e134Smrg  XawDLClass *dlclass;
657a84e134Smrg  XtPointer data;
667a84e134Smrg};
677a84e134Smrg
687a84e134Smrgstruct _XawDLInfo {
697a84e134Smrg  String name;
707a84e134Smrg  XrmQuark qname;
717a84e134Smrg  XawDisplayListProc proc;
727a84e134Smrg};
737a84e134Smrg
747a84e134Smrgstruct _XawDL {
757a84e134Smrg  XawDLProc **procs;
767a84e134Smrg  Cardinal num_procs;
777a84e134Smrg  XawDLData **data;
787a84e134Smrg  Cardinal num_data;
797a84e134Smrg  Screen *screen;
807a84e134Smrg  Colormap colormap;
817a84e134Smrg  int depth;
827a84e134Smrg  XrmQuark qrep;  /* for cache lookup */
837a84e134Smrg};
847a84e134Smrg
857a84e134Smrgstruct _XawDLClass {
867a84e134Smrg  String name;
877a84e134Smrg  XawDLInfo **infos;
887a84e134Smrg  Cardinal num_infos;
897a84e134Smrg  XawDLArgsInitProc args_init;
907a84e134Smrg  XawDLArgsDestructor args_destructor;
917a84e134Smrg  XawDLDataInitProc data_init;
927a84e134Smrg  XawDLDataDestructor data_destructor;
937a84e134Smrg};
947a84e134Smrg
957a84e134Smrg/*
967a84e134Smrg * Private Methods
977a84e134Smrg */
987a84e134Smrgstatic XawDLClass *_XawFindDLClass(String);
997a84e134Smrgstatic int qcmp_dlist_class(_Xconst void*, _Xconst void*);
1007a84e134Smrgstatic int bcmp_dlist_class(_Xconst void*, _Xconst void*);
1017a84e134Smrgstatic XawDLInfo *_XawFindDLInfo(XawDLClass*, String);
1027a84e134Smrgstatic int qcmp_dlist_info(_Xconst void*, _Xconst void*);
1037a84e134Smrgstatic int bcmp_dlist_info(_Xconst void*, _Xconst void*);
1047a84e134Smrgstatic void *_Xaw_Xlib_ArgsInitProc(String, String*, Cardinal*,
1057a84e134Smrg				    Screen*, Colormap, int);
1067a84e134Smrgstatic void _Xaw_Xlib_ArgsDestructor(Display*, String, XtPointer,
1077a84e134Smrg				     String*, Cardinal*);
1087a84e134Smrgstatic void *_Xaw_Xlib_DataInitProc(String, Screen*, Colormap, int);
1097a84e134Smrgstatic void _Xaw_Xlib_DataDestructor(Display*, String, XtPointer);
1107a84e134Smrg
1117a84e134Smrg/*
1127a84e134Smrg * Initialization
1137a84e134Smrg */
1147a84e134Smrgstatic XawDLClass **classes;
1157a84e134Smrgstatic Cardinal num_classes;
1167a84e134Smrgstatic String xlib = "xlib";
1177a84e134Smrg
1187a84e134Smrg/*
1197a84e134Smrg * Implementation
1207a84e134Smrg */
1217a84e134Smrgvoid
1227a84e134SmrgXawRunDisplayList(Widget w, _XawDisplayList *list,
1237a84e134Smrg		       XEvent *event, Region region)
1247a84e134Smrg{
1257a84e134Smrg  XawDLProc *proc;
1267a84e134Smrg  Cardinal i;
1277a84e134Smrg
1287a84e134Smrg  if (!XtIsRealized(w))
1297a84e134Smrg    return;
1307a84e134Smrg
1317a84e134Smrg  for (i = 0; i < list->num_procs; i++)
1327a84e134Smrg    {
1337a84e134Smrg      proc = list->procs[i];
1347a84e134Smrg      proc->proc(w, proc->args, proc->data->data, event, region);
1357a84e134Smrg    }
1367a84e134Smrg}
1377a84e134Smrg
1387a84e134Smrg#define DLERR  -2
1397a84e134Smrg#define DLEOF  -1
1407a84e134Smrg#define DLEND  1
1417a84e134Smrg#define DLNAME 2
1427a84e134Smrg#define DLARG  3
1435ec34c4cSmrgstatic String
1445ec34c4cSmrgread_token(String src, char *dst, Cardinal size, int *status)
1457a84e134Smrg{
1467a84e134Smrg  int ch;
1477a84e134Smrg  Bool esc, quote;
1487a84e134Smrg  Cardinal i;
1497a84e134Smrg
1507a84e134Smrg  i = 0;
1517a84e134Smrg  esc = quote = False;
1527a84e134Smrg
1537a84e134Smrg  /*CONSTCOND*/
1547a84e134Smrg  while (1)
1557a84e134Smrg    {
1567a84e134Smrg      ch = *src;
1577a84e134Smrg      if (ch != '\n' && isspace(ch))
1587a84e134Smrg	++src;
1597a84e134Smrg      else
1607a84e134Smrg	break;
1617a84e134Smrg    }
1627a84e134Smrg
1637a84e134Smrg  for (; i < size - 1; src++)
1647a84e134Smrg    {
1657a84e134Smrg      ch = *src;
1667a84e134Smrg      if (ch == '"')
1677a84e134Smrg	{
1687a84e134Smrg	  if (quote)
1697a84e134Smrg	    {
1707a84e134Smrg	      quote = False;
1717a84e134Smrg	      continue;
1727a84e134Smrg	    }
1737a84e134Smrg	  quote = True;
1747a84e134Smrg	  continue;
1757a84e134Smrg	}
1767a84e134Smrg      if (ch == '\\')
1777a84e134Smrg	{
1787a84e134Smrg	  if (esc)
1797a84e134Smrg	    {
1805ec34c4cSmrg	      dst[i++] = (char)ch;
1817a84e134Smrg	      esc = False;
1827a84e134Smrg	      continue;
1837a84e134Smrg	    }
1847a84e134Smrg	  esc = True;
1857a84e134Smrg	  continue;
1867a84e134Smrg	}
1877a84e134Smrg      if (ch == '\0')
1887a84e134Smrg	{
1897a84e134Smrg	  *status = DLEOF;
1907a84e134Smrg	  dst[i] = '\0';
1917a84e134Smrg	  return (src);
1927a84e134Smrg	}
1937a84e134Smrg      else if (!esc)
1947a84e134Smrg	{
1957a84e134Smrg	  if (!quote)
1967a84e134Smrg	    {
1977a84e134Smrg	      if (ch == ',')
1987a84e134Smrg		{
1997a84e134Smrg		  *status = DLARG;
2007a84e134Smrg		  dst[i] = '\0';
2017a84e134Smrg		  return (++src);
2027a84e134Smrg		}
2037a84e134Smrg	      else if (ch == ' ' || ch == '\t')
2047a84e134Smrg		{
2057a84e134Smrg		  *status = DLNAME;
2067a84e134Smrg		  dst[i] = '\0';
2077a84e134Smrg		  return (++src);
2087a84e134Smrg		}
2097a84e134Smrg	      else if (ch == ';' || ch == '\n')
2107a84e134Smrg		{
2117a84e134Smrg		  *status = DLEND;
2127a84e134Smrg		  dst[i] = '\0';
2137a84e134Smrg		  return (++src);
2147a84e134Smrg		}
2157a84e134Smrg	    }
2167a84e134Smrg	}
2177a84e134Smrg      else
2187a84e134Smrg	esc = False;
2195ec34c4cSmrg      dst[i++] = (char)ch;
2207a84e134Smrg    }
2217a84e134Smrg
2227a84e134Smrg  *status = DLERR;
2237a84e134Smrg  dst[i] = '\0';
2247a84e134Smrg
2257a84e134Smrg  return (src);
2267a84e134Smrg}
2277a84e134Smrg
2287a84e134Smrg_XawDisplayList *XawCreateDisplayList(String string, Screen *screen,
2297a84e134Smrg				     Colormap colormap, int depth)
2307a84e134Smrg{
2317a84e134Smrg  _XawDisplayList *dlist;
2327a84e134Smrg  XawDLClass *lc, *xlibc;
2337a84e134Smrg  XawDLData *data;
2347a84e134Smrg  XawDLInfo *info;
2357a84e134Smrg  XawDLProc *proc;
2367a84e134Smrg  char cname[64], fname[64], aname[1024];
2377a84e134Smrg  Cardinal i;
2385ec34c4cSmrg  String cp;
2395ec34c4cSmrg  String fp;
2405ec34c4cSmrg  String lp;
2417a84e134Smrg  int status;
2427a84e134Smrg
2437a84e134Smrg  xlibc = XawGetDisplayListClass(xlib);
2447a84e134Smrg  if (!xlibc)
2457a84e134Smrg    {
2467a84e134Smrg      XawDisplayListInitialize();
2477a84e134Smrg      xlibc = XawGetDisplayListClass(xlib);
2487a84e134Smrg    }
2497a84e134Smrg
2507a84e134Smrg  dlist = (_XawDisplayList *)XtMalloc(sizeof(_XawDisplayList));
2517a84e134Smrg  dlist->procs = NULL;
2527a84e134Smrg  dlist->num_procs = 0;
2537a84e134Smrg  dlist->data = NULL;
2547a84e134Smrg  dlist->num_data = 0;
2557a84e134Smrg  dlist->screen = screen;
2567a84e134Smrg  dlist->colormap = colormap;
2577a84e134Smrg  dlist->depth = depth;
2587a84e134Smrg  dlist->qrep = NULLQUARK;
2597a84e134Smrg  if (!string || !string[0])
2607a84e134Smrg    return (dlist);
2617a84e134Smrg
2627a84e134Smrg  cp = string;
2637a84e134Smrg
2647a84e134Smrg  status = 0;
2657a84e134Smrg  while (status != DLEOF)
2667a84e134Smrg    {
2677a84e134Smrg      lp = cp;
2687a84e134Smrg      cp = read_token(cp, fname, sizeof(fname), &status);
2697a84e134Smrg
2707a84e134Smrg      if (status != DLNAME && status != DLEND && status != DLEOF)
2717a84e134Smrg	{
2727a84e134Smrg	  char msg[256];
2737a84e134Smrg
274421c997bSmrg	  snprintf(msg, sizeof(msg),
275421c997bSmrg		   "Error parsing displayList at \"%s\"", lp);
2767a84e134Smrg	  XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)),
2777a84e134Smrg		       msg);
2787a84e134Smrg	  XawDestroyDisplayList(dlist);
2797a84e134Smrg	  return (NULL);
2807a84e134Smrg	}
2817a84e134Smrg      fp = fname;
2827a84e134Smrg      /*CONSTCOND*/
2837a84e134Smrg      while (1)
2847a84e134Smrg	{
2857a84e134Smrg	  fp = strchr(fp, ':');
2867a84e134Smrg	  if (!fp || (fp == cp || fp[-1] != '\\'))
2877a84e134Smrg	    break;
2887a84e134Smrg	  ++fp;
2897a84e134Smrg	}
2907a84e134Smrg      if (fp)
2917a84e134Smrg	{
2925ec34c4cSmrg	  snprintf(cname, (size_t)(fp - fname + 1), "%s", fname);
2937a84e134Smrg	  memmove(fname, fp + 1, strlen(fp));
2947a84e134Smrg	  lc = cname[0] ? XawGetDisplayListClass(cname) : xlibc;
2957a84e134Smrg	  if (!lc)
2967a84e134Smrg	    {
2977a84e134Smrg	      char msg[256];
2987a84e134Smrg
299421c997bSmrg	      snprintf(msg, sizeof(msg),
300421c997bSmrg		       "Cannot find displayList class \"%s\"", cname);
3017a84e134Smrg	      XtAppWarning(XtDisplayToApplicationContext
3027a84e134Smrg			   (DisplayOfScreen(screen)), msg);
3037a84e134Smrg	      XawDestroyDisplayList(dlist);
3047a84e134Smrg	      return (NULL);
3057a84e134Smrg	    }
3067a84e134Smrg	}
3077a84e134Smrg      else
3087a84e134Smrg	lc = xlibc;
3097a84e134Smrg
3107a84e134Smrg      if (status == DLEOF && !fname[0])
3117a84e134Smrg	break;
3127a84e134Smrg
3137a84e134Smrg      if ((info = _XawFindDLInfo(lc, fname)) == NULL)
3147a84e134Smrg	{
3157a84e134Smrg	  char msg[256];
3167a84e134Smrg
317421c997bSmrg	  snprintf(msg, sizeof(msg),
318421c997bSmrg		   "Cannot find displayList procedure \"%s\"", fname);
3197a84e134Smrg	  XtAppWarning(XtDisplayToApplicationContext(DisplayOfScreen(screen)),
3207a84e134Smrg		       msg);
3217a84e134Smrg	  XawDestroyDisplayList(dlist);
3227a84e134Smrg	  return (NULL);
3237a84e134Smrg	}
3247a84e134Smrg
3257a84e134Smrg      proc = (XawDLProc *)XtMalloc(sizeof(XawDLProc));
3267a84e134Smrg      proc->qname = info->qname;
3277a84e134Smrg      proc->params = NULL;
3287a84e134Smrg      proc->num_params = 0;
3297a84e134Smrg      proc->proc = info->proc;
3307a84e134Smrg      proc->args = NULL;
3317a84e134Smrg      proc->data = NULL;
3327a84e134Smrg
3337a84e134Smrg      if (!dlist->procs)
3347a84e134Smrg	{
3357a84e134Smrg	  dlist->num_procs = 1;
3367a84e134Smrg	  dlist->procs = (XawDLProc**)XtMalloc(sizeof(XawDLProc*));
3377a84e134Smrg	}
3387a84e134Smrg      else
3397a84e134Smrg	{
3407a84e134Smrg	  ++dlist->num_procs;
3417a84e134Smrg	  dlist->procs = (XawDLProc**)
3425ec34c4cSmrg	    XtRealloc((char *)dlist->procs, (Cardinal)(sizeof(XawDLProc*) *
3435ec34c4cSmrg		      dlist->num_procs));
3447a84e134Smrg	}
3457a84e134Smrg      dlist->procs[dlist->num_procs - 1] = proc;
3467a84e134Smrg
3477a84e134Smrg      while (status != DLEND && status != DLEOF)
3487a84e134Smrg	{
3497a84e134Smrg	  lp = cp;
3507a84e134Smrg	  cp = read_token(cp, aname, sizeof(aname), &status);
3517a84e134Smrg
3527a84e134Smrg	  if (status != DLARG && status != DLEND && status != DLEOF)
3537a84e134Smrg	    {
3547a84e134Smrg	      char msg[256];
3557a84e134Smrg
356421c997bSmrg	      snprintf(msg, sizeof(msg),
357421c997bSmrg		       "Error parsing displayList at \"%s\"", lp);
3587a84e134Smrg	      XtAppWarning(XtDisplayToApplicationContext
3597a84e134Smrg			   (DisplayOfScreen(screen)), msg);
3607a84e134Smrg	      XawDestroyDisplayList(dlist);
3617a84e134Smrg	      return (NULL);
3627a84e134Smrg	    }
3637a84e134Smrg
3647a84e134Smrg	  if (!proc->num_params)
3657a84e134Smrg	    {
3667a84e134Smrg	      proc->num_params = 1;
3677a84e134Smrg	      proc->params = (String *)XtMalloc(sizeof(String));
3687a84e134Smrg	    }
3697a84e134Smrg	  else
3707a84e134Smrg	    {
3717a84e134Smrg	      ++proc->num_params;
3727a84e134Smrg	      proc->params = (String *)XtRealloc((char *)proc->params,
3735ec34c4cSmrg						 (Cardinal)(sizeof(String) *
3745ec34c4cSmrg						 proc->num_params));
3757a84e134Smrg	    }
3767a84e134Smrg	  proc->params[proc->num_params - 1] = XtNewString(aname);
3777a84e134Smrg	}
3787a84e134Smrg
3797a84e134Smrg      /* verify if data is already created for lc */
3807a84e134Smrg      data = NULL;
3817a84e134Smrg      for (i = 0; i < dlist->num_data; i++)
3827a84e134Smrg	if (dlist->data[i]->dlclass == lc)
3837a84e134Smrg	  {
3847a84e134Smrg	    data = dlist->data[i];
3857a84e134Smrg	    break;
3867a84e134Smrg	  }
3877a84e134Smrg
3887a84e134Smrg      if (!data)
3897a84e134Smrg	{
3907a84e134Smrg	  data = (XawDLData *)XtMalloc(sizeof(XawDLData));
3917a84e134Smrg	  data->dlclass = lc;
3927a84e134Smrg	  if (lc->data_init)
3937a84e134Smrg	    data->data = lc->data_init(lc->name, screen, colormap, depth);
3947a84e134Smrg	  else
3957a84e134Smrg	    data->data = NULL;
3967a84e134Smrg
3977a84e134Smrg	  if (!dlist->data)
3987a84e134Smrg	    {
3997a84e134Smrg	      dlist->num_data = 1;
4007a84e134Smrg	      dlist->data = (XawDLData **)XtMalloc(sizeof(XawDLData*));
4017a84e134Smrg	    }
4027a84e134Smrg	  else
4037a84e134Smrg	    {
4047a84e134Smrg	      ++dlist->num_data;
4057a84e134Smrg	      dlist->data = (XawDLData **)
4065ec34c4cSmrg		XtRealloc((char *)dlist->data, (Cardinal)(sizeof(XawDLData*) *
4075ec34c4cSmrg			  dlist->num_data));
4087a84e134Smrg	    }
4097a84e134Smrg	  dlist->data[dlist->num_data - 1] = data;
4107a84e134Smrg	}
4117a84e134Smrg
4127a84e134Smrg      if (lc->args_init)
4137a84e134Smrg	{
4147a84e134Smrg	  proc->args = lc->args_init(fname, proc->params, &proc->num_params,
4157a84e134Smrg				    screen, colormap, depth);
4167a84e134Smrg	  if (proc->args == XAWDL_CONVERT_ERROR)
4177a84e134Smrg	    {
4187a84e134Smrg	      char msg[256];
4197a84e134Smrg
4207a84e134Smrg	      proc->args = NULL;
421421c997bSmrg	      snprintf(msg, sizeof(msg),
422421c997bSmrg		       "Cannot convert arguments to displayList function \"%s\"",
423421c997bSmrg		       fname);
4247a84e134Smrg	      XtAppWarning(XtDisplayToApplicationContext
4257a84e134Smrg			   (DisplayOfScreen(screen)), msg);
4267a84e134Smrg	      XawDestroyDisplayList(dlist);
4277a84e134Smrg	      return (NULL);
4287a84e134Smrg	    }
4297a84e134Smrg	}
4307a84e134Smrg      else
4317a84e134Smrg	proc->args = NULL;
4327a84e134Smrg
4337a84e134Smrg      proc->data = data;
4347a84e134Smrg    }
4357a84e134Smrg
4367a84e134Smrg  dlist->qrep = XrmStringToQuark(string);
4377a84e134Smrg  return (dlist);
4387a84e134Smrg}
4397a84e134Smrg
4407a84e134SmrgString
4417a84e134SmrgXawDisplayListString(_XawDisplayList *dlist)
4427a84e134Smrg{
4437a84e134Smrg  if (!dlist || dlist->qrep == NULLQUARK)
4447a84e134Smrg    return ("");
4457a84e134Smrg  return (XrmQuarkToString(dlist->qrep));
4467a84e134Smrg}
4477a84e134Smrg
4487a84e134Smrgvoid
4497a84e134SmrgXawDestroyDisplayList(_XawDisplayList *dlist)
4507a84e134Smrg{
4517a84e134Smrg  Cardinal i, j;
4527a84e134Smrg  XawDLProc *proc;
4537a84e134Smrg  XawDLData *data;
4547a84e134Smrg
4557a84e134Smrg  if (!dlist)
4567a84e134Smrg    return;
4577a84e134Smrg
4587a84e134Smrg  for (i = 0; i < dlist->num_procs; i++)
4597a84e134Smrg    {
4607a84e134Smrg      proc = dlist->procs[i];
4617a84e134Smrg      data = proc->data;
4627a84e134Smrg
4637a84e134Smrg      if (data)
4647a84e134Smrg	{
4657a84e134Smrg	  if (data->dlclass->args_destructor)
4667a84e134Smrg	    data->dlclass->args_destructor(DisplayOfScreen(dlist->screen),
4677a84e134Smrg					   XrmQuarkToString(proc->qname),
4687a84e134Smrg					   proc->args,
4697a84e134Smrg					   proc->params, &proc->num_params);
4707a84e134Smrg	  if (data->data)
4717a84e134Smrg	    {
4727a84e134Smrg	      if (data->dlclass->data_destructor)
4737a84e134Smrg		{
4747a84e134Smrg		  data->dlclass
4757a84e134Smrg		    ->data_destructor(DisplayOfScreen(dlist->screen),
4767a84e134Smrg				      data->dlclass->name,  data->data);
4777a84e134Smrg		  data->data = NULL;
4787a84e134Smrg		}
4797a84e134Smrg	    }
4807a84e134Smrg	}
4817a84e134Smrg
4827a84e134Smrg      for (j = 0; j < proc->num_params; j++)
4835ec34c4cSmrg	XtFree((char *)proc->params[j]);
4847a84e134Smrg      if (proc->num_params)
4857a84e134Smrg	XtFree((char *)proc->params);
4867a84e134Smrg      XtFree((char *)proc);
4877a84e134Smrg    }
4887a84e134Smrg
4897a84e134Smrg  if (dlist->num_procs)
4907a84e134Smrg    XtFree((char *)dlist->procs);
4917a84e134Smrg
4927a84e134Smrg  XtFree((char *)dlist);
4937a84e134Smrg}
4947a84e134Smrg
4957a84e134Smrg/**********************************************************************
4967a84e134Smrg * If you want to implement your own class of procedures, look at
4975b16253fSmrg * the code below.
4987a84e134Smrg **********************************************************************/
4997a84e134Smrg/* Start of Implementation of class "xlib" */
5007a84e134Smrgtypedef struct _XawXlibData {
5017a84e134Smrg  GC gc;
5027a84e134Smrg  unsigned long mask;
5037a84e134Smrg  XGCValues values;
5047a84e134Smrg  int shape;
5057a84e134Smrg  int mode;
5067a84e134Smrg  char *dashes;
5077a84e134Smrg  /* these fields can be used for optimization, to
5087a84e134Smrg   * avoid unnecessary coordinates recalculation.
5097a84e134Smrg   */
5107a84e134Smrg  Position x, y;
5117a84e134Smrg  Dimension width, height;
5127a84e134Smrg} XawXlibData;
5137a84e134Smrg
5147a84e134Smrgtypedef struct _XawDLPosition {
5157a84e134Smrg  Position pos;
5167a84e134Smrg  short denom;
5177a84e134Smrg  Boolean high;
5187a84e134Smrg} XawDLPosition;
5197a84e134Smrg
5207a84e134Smrgtypedef struct _XawDLPositionPtr {
5217a84e134Smrg  XawDLPosition *pos;
5227a84e134Smrg  Cardinal num_pos;
5237a84e134Smrg} XawDLPositionPtr;
5247a84e134Smrg
5257a84e134Smrgtypedef struct _XawDLArcArgs {
5267a84e134Smrg  XawDLPosition pos[4];
5277a84e134Smrg  int angle1;
5287a84e134Smrg  int angle2;
5297a84e134Smrg} XawDLArcArgs;
5307a84e134Smrg
5317a84e134Smrgtypedef struct _XawDLStringArgs {
5327a84e134Smrg  XawDLPosition pos[2];
5337a84e134Smrg  char *string;
5347a84e134Smrg  int length;
5357a84e134Smrg} XawDLStringArgs;
5367a84e134Smrg
5377a84e134Smrgtypedef struct _XawDLCopyArgs {
5387a84e134Smrg  XawPixmap *pixmap;
5397a84e134Smrg  XawDLPosition pos[6];
5407a84e134Smrg  int plane;
5417a84e134Smrg} XawDLCopyArgs;
5427a84e134Smrg
5437a84e134Smrgtypedef struct _XawDLImageArgs {
5447a84e134Smrg  XawPixmap *pixmap;
5457a84e134Smrg  XawDLPosition pos[4];
5467a84e134Smrg  int depth;
5477a84e134Smrg} XawDLImageArgs;
5487a84e134Smrg
5495ec34c4cSmrg#define X_ARG(x) ((Position)(((x).denom != 0) ?				      \
5507a84e134Smrg		  ((float)XtWidth(w) * ((float)(x).pos / (float)(x).denom)) : \
5515ec34c4cSmrg		  (float)((x).high ? XtWidth(w) - (x).pos : (x).pos)))
5525ec34c4cSmrg#define Y_ARG(x) ((Position)(((x).denom != 0) ?				      \
5537a84e134Smrg		  ((float)XtHeight(w) * ((float)(x).pos / (float)(x).denom)): \
5545ec34c4cSmrg		  (float)((x).high ? XtHeight(w) - (x).pos : (x).pos)))
5557a84e134Smrg#define DRECT		0
5567a84e134Smrg#define FRECT		1
5577a84e134Smrg#define LINE		2
5587a84e134Smrg#define GCFG		3
5597a84e134Smrg#define GCBG		4
5607a84e134Smrg#define FPOLY		5
5617a84e134Smrg#define DARC		6
5627a84e134Smrg#define FARC		7
5637a84e134Smrg#define DLINES		8
5647a84e134Smrg#define MASK		9
5657a84e134Smrg#define UMASK		10
5667a84e134Smrg#define LWIDTH		11
5677a84e134Smrg#define POINT		12
5687a84e134Smrg#define POINTS		13
5697a84e134Smrg#define SEGMENTS	14
5707a84e134Smrg#define ARCMODE		15
5717a84e134Smrg#define COORDMODE	16
5727a84e134Smrg#define SHAPEMODE	17
5737a84e134Smrg#define LINESTYLE	18
5747a84e134Smrg#define CAPSTYLE	19
5757a84e134Smrg#define JOINSTYLE	20
5767a84e134Smrg#define FILLSTYLE	21
5777a84e134Smrg#define FILLRULE	22
5787a84e134Smrg#define	TILE		23
5797a84e134Smrg#define STIPPLE		24
5807a84e134Smrg#define TSORIGIN	25
5817a84e134Smrg#define FUNCTION	26
5827a84e134Smrg#define PLANEMASK	27
5837a84e134Smrg#define DSTRING		28
5847a84e134Smrg#define PSTRING		29
5857a84e134Smrg#define FONT		30
5867a84e134Smrg#define DASHES		31
5877a84e134Smrg#define SUBWMODE	32
5887a84e134Smrg#define EXPOSURES	33
5897a84e134Smrg#define CLIPORIGIN	34
5907a84e134Smrg#define CLIPMASK	35
5917a84e134Smrg#define CLIPRECTS	36
5927a84e134Smrg#define COPYAREA	37
5937a84e134Smrg#define COPYPLANE	38
5947a84e134Smrg#define IMAGE		39
5957a84e134Smrg
5967a84e134Smrgstatic void
5977a84e134SmrgDl1Point(Widget w, XtPointer args, XtPointer data, int id)
5987a84e134Smrg{
5997a84e134Smrg  XawDLPosition *pos = (XawDLPosition *)args;
6007a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
6017a84e134Smrg  Display *display;
6027a84e134Smrg  Window window;
6037a84e134Smrg  Position x, y;
6047a84e134Smrg
6055ec34c4cSmrg  x = (Position)(X_ARG(pos[0]));
6065ec34c4cSmrg  y = (Position)(Y_ARG(pos[1]));
6077a84e134Smrg
6087a84e134Smrg  if (!XtIsWidget(w))
6097a84e134Smrg    {
6107a84e134Smrg      Position xpad, ypad;
6117a84e134Smrg
6125ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
6135ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
6145ec34c4cSmrg      x = (Position)(x + xpad);
6155ec34c4cSmrg      y = (Position)(y + ypad);
6167a84e134Smrg      display = XtDisplayOfObject(w);
6177a84e134Smrg      window = XtWindowOfObject(w);
6187a84e134Smrg    }
6197a84e134Smrg  else
6207a84e134Smrg    {
6217a84e134Smrg      display = XtDisplay(w);
6227a84e134Smrg      window = XtWindow(w);
6237a84e134Smrg    }
6247a84e134Smrg
6257a84e134Smrg  if (id == POINT)
6267a84e134Smrg    XDrawPoint(display, window, xdata->gc, x, y);
6277a84e134Smrg  else if (id == TSORIGIN)
6287a84e134Smrg    {
6297a84e134Smrg      xdata->values.ts_x_origin = x;
6307a84e134Smrg      xdata->values.ts_y_origin = y;
6317a84e134Smrg      xdata->mask |= GCTileStipXOrigin | GCTileStipYOrigin;
6327a84e134Smrg      XSetTSOrigin(display, xdata->gc, x, y);
6337a84e134Smrg    }
6347a84e134Smrg  else if (id == CLIPORIGIN)
6357a84e134Smrg    {
6367a84e134Smrg      xdata->values.clip_x_origin = x;
6377a84e134Smrg      xdata->values.clip_y_origin = y;
6387a84e134Smrg      xdata->mask |= GCClipXOrigin | GCClipYOrigin;
6397a84e134Smrg      XSetClipOrigin(display, xdata->gc, x, y);
6407a84e134Smrg    }
6417a84e134Smrg}
6427a84e134Smrg
6437a84e134Smrgstatic void
6447a84e134SmrgDl2Points(Widget w, XtPointer args, XtPointer data, int id)
6457a84e134Smrg{
6467a84e134Smrg  XawDLPosition *pos = (XawDLPosition *)args;
6477a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
6487a84e134Smrg  Display *display;
6497a84e134Smrg  Window window;
6507a84e134Smrg  Position x1, y1, x2, y2;
6517a84e134Smrg
6527a84e134Smrg  x1 = X_ARG(pos[0]);
6537a84e134Smrg  y1 = Y_ARG(pos[1]);
6547a84e134Smrg  x2 = X_ARG(pos[2]);
6557a84e134Smrg  y2 = Y_ARG(pos[3]);
6567a84e134Smrg
6577a84e134Smrg  if (!XtIsWidget(w))
6587a84e134Smrg    {
6597a84e134Smrg      Position xpad, ypad;
6607a84e134Smrg
6615ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
6625ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
6635ec34c4cSmrg      x1 = (Position)(x1 + xpad); y1 = (Position)(y1 + ypad);
6645ec34c4cSmrg      x2 = (Position)(x2 + xpad); y2 = (Position)(y2 + ypad);
6657a84e134Smrg      display = XtDisplayOfObject(w);
6667a84e134Smrg      window = XtWindowOfObject(w);
6677a84e134Smrg    }
6687a84e134Smrg  else
6697a84e134Smrg    {
6707a84e134Smrg      display = XtDisplay(w);
6717a84e134Smrg      window = XtWindow(w);
6727a84e134Smrg    }
6737a84e134Smrg
6747a84e134Smrg  if (id == DRECT)
6755ec34c4cSmrg    XDrawRectangle(display, window, xdata->gc, x1, y1, (unsigned)(x2 - x1), (unsigned)(y2 - y1));
6767a84e134Smrg  else if (id == FRECT)
6775ec34c4cSmrg    XFillRectangle(display, window, xdata->gc, x1, y1, (unsigned)(x2 - x1), (unsigned)(y2 - y1));
6787a84e134Smrg  else if (id == LINE)
6797a84e134Smrg    XDrawLine(display, window, xdata->gc, x1, y1, x2, y2);
6807a84e134Smrg}
6817a84e134Smrg
6827a84e134Smrg/* ARGSUSED */
6837a84e134Smrgstatic void
6845ec34c4cSmrgDlLine(Widget w, XtPointer args, XtPointer data, XEvent *event _X_UNUSED, Region region _X_UNUSED)
6857a84e134Smrg{
6867a84e134Smrg  Dl2Points(w, args, data, LINE);
6877a84e134Smrg}
6887a84e134Smrg
6897a84e134Smrg/* ARGSUSED */
6907a84e134Smrgstatic void
6917a84e134SmrgDlDrawRectangle(Widget w, XtPointer args, XtPointer data,
6925ec34c4cSmrg		XEvent *event _X_UNUSED, Region region _X_UNUSED)
6937a84e134Smrg{
6947a84e134Smrg  Dl2Points(w, args, data, DRECT);
6957a84e134Smrg}
6967a84e134Smrg
6977a84e134Smrg/* ARGSUSED */
6987a84e134Smrgstatic void
6997a84e134SmrgDlFillRectangle(Widget w, XtPointer args, XtPointer data,
7005ec34c4cSmrg		XEvent *event _X_UNUSED, Region region _X_UNUSED)
7017a84e134Smrg{
7027a84e134Smrg  Dl2Points(w, args, data, FRECT);
7037a84e134Smrg}
7047a84e134Smrg
7057a84e134Smrgstatic void
7067a84e134SmrgDlXPoints(Widget w, XtPointer args, XtPointer data, int id)
7077a84e134Smrg{
7087a84e134Smrg  XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
7097a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
7107a84e134Smrg  XawDLPosition *pos;
7117a84e134Smrg  XPoint points_buf[16];
7127a84e134Smrg  XPoint *points;
7137a84e134Smrg  Display *display;
7147a84e134Smrg  Window window;
7157a84e134Smrg  Cardinal num_points, i, j;
7167a84e134Smrg
7177a84e134Smrg  num_points = pos_ptr->num_pos>>1;
7187a84e134Smrg  points = (XPoint *)XawStackAlloc(sizeof(XPoint) * num_points, points_buf);
7197a84e134Smrg
7207a84e134Smrg  for (i = j = 0; i < num_points; i++, j = i << 1)
7217a84e134Smrg    {
7227a84e134Smrg      pos = &pos_ptr->pos[j];
7237a84e134Smrg      points[i].x = X_ARG(pos[0]);
7247a84e134Smrg      points[i].y = Y_ARG(pos[1]);
7257a84e134Smrg    }
7267a84e134Smrg
7277a84e134Smrg  if (!XtIsWidget(w))
7287a84e134Smrg    {
7297a84e134Smrg      Position xpad, ypad;
7307a84e134Smrg
7315ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
7325ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
7337a84e134Smrg      if (xdata->mode != CoordModePrevious)
7347a84e134Smrg	{
7357a84e134Smrg	  for (i = 0; i < num_points; i++)
7367a84e134Smrg	    {
7375ec34c4cSmrg	      points[i].x = (short)(points[i].x + xpad);
7385ec34c4cSmrg	      points[i].y = (short)(points[i].y + ypad);
7397a84e134Smrg	    }
7407a84e134Smrg	}
7417a84e134Smrg      else
7427a84e134Smrg	{
7435ec34c4cSmrg	  points[0].x = (short)(points[0].x + xpad);
7445ec34c4cSmrg	  points[0].y = (short)(points[0].y + ypad);
7457a84e134Smrg	}
7467a84e134Smrg      display = XtDisplayOfObject(w);
7477a84e134Smrg      window = XtWindowOfObject(w);
7487a84e134Smrg    }
7497a84e134Smrg  else
7507a84e134Smrg    {
7517a84e134Smrg      display = XtDisplay(w);
7527a84e134Smrg      window = XtWindow(w);
7537a84e134Smrg    }
7547a84e134Smrg
7557a84e134Smrg  if (id == FPOLY)
7565ec34c4cSmrg    XFillPolygon(display, window, xdata->gc, points, (int)num_points,
7577a84e134Smrg		 xdata->shape, xdata->mode);
7587a84e134Smrg  else if (id == DLINES)
7595ec34c4cSmrg    XDrawLines(display, window, xdata->gc, points, (int)num_points, xdata->mode);
7607a84e134Smrg  else if (id == POINTS)
7615ec34c4cSmrg    XDrawPoints(display, window, xdata->gc, points, (int)num_points, xdata->mode);
7627a84e134Smrg
7637a84e134Smrg  XawStackFree(points, points_buf);
7647a84e134Smrg}
7657a84e134Smrg
7667a84e134Smrg/* ARGSUSED */
7677a84e134Smrgstatic void
7687a84e134SmrgDlFillPolygon(Widget w, XtPointer args, XtPointer data,
7695ec34c4cSmrg	      XEvent *event _X_UNUSED, Region region _X_UNUSED)
7707a84e134Smrg{
7717a84e134Smrg  DlXPoints(w, args, data, FPOLY);
7727a84e134Smrg}
7737a84e134Smrg
7747a84e134Smrg/* ARGSUSED */
7757a84e134Smrgstatic void
7767a84e134SmrgDlDrawLines(Widget w, XtPointer args, XtPointer data,
7775ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
7787a84e134Smrg{
7797a84e134Smrg  DlXPoints(w, args, data, DLINES);
7807a84e134Smrg}
7817a84e134Smrg
7827a84e134Smrg/* ARGSUSED */
7837a84e134Smrgstatic void
7847a84e134SmrgDlDrawPoints(Widget w, XtPointer args, XtPointer data,
7855ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
7867a84e134Smrg{
7877a84e134Smrg  DlXPoints(w, args, data, POINTS);
7887a84e134Smrg}
7897a84e134Smrg
7907a84e134Smrg/* ARGSUSED */
7917a84e134Smrgstatic void
7927a84e134SmrgDlForeground(Widget w, XtPointer args, XtPointer data,
7935ec34c4cSmrg	     XEvent *event _X_UNUSED, Region region _X_UNUSED)
7947a84e134Smrg{
7957a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
7967a84e134Smrg  Pixel foreground = (Pixel)args;
7977a84e134Smrg
7987a84e134Smrg  if (xdata->values.foreground != foreground)
7997a84e134Smrg    {
8007a84e134Smrg      xdata->mask |= GCForeground;
8017a84e134Smrg      xdata->values.foreground = foreground;
8027a84e134Smrg      XSetForeground(XtDisplayOfObject(w), xdata->gc, foreground);
8037a84e134Smrg    }
8047a84e134Smrg}
8057a84e134Smrg
8067a84e134Smrg/* ARGSUSED */
8077a84e134Smrgstatic void
8087a84e134SmrgDlBackground(Widget w, XtPointer args, XtPointer data,
8095ec34c4cSmrg	     XEvent *event _X_UNUSED, Region region _X_UNUSED)
8107a84e134Smrg{
8117a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
8127a84e134Smrg  Pixel background = (Pixel)args;
8137a84e134Smrg
8147a84e134Smrg  if (xdata->values.background != background)
8157a84e134Smrg    {
8167a84e134Smrg      xdata->mask |= GCBackground;
8177a84e134Smrg      xdata->values.background = background;
8187a84e134Smrg      XSetBackground(XtDisplayOfObject(w), xdata->gc, background);
8197a84e134Smrg    }
8207a84e134Smrg}
8217a84e134Smrg
8227a84e134Smrgstatic void
8237a84e134SmrgDlArc(Widget w, XtPointer args, XtPointer data, Bool fill)
8247a84e134Smrg{
8257a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
8267a84e134Smrg  XawDLArcArgs *arc = (XawDLArcArgs *)args;
8277a84e134Smrg  Position x1, y1, x2, y2;
8287a84e134Smrg  Display *display;
8297a84e134Smrg  Window window;
8307a84e134Smrg
8317a84e134Smrg  x1 = X_ARG(arc->pos[0]);
8327a84e134Smrg  y1 = Y_ARG(arc->pos[1]);
8337a84e134Smrg  x2 = X_ARG(arc->pos[2]);
8347a84e134Smrg  y2 = Y_ARG(arc->pos[3]);
8357a84e134Smrg
8367a84e134Smrg  if (!XtIsWidget(w))
8377a84e134Smrg    {
8387a84e134Smrg      Position xpad, ypad;
8397a84e134Smrg
8405ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
8415ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
8425ec34c4cSmrg      x1 = (Position)(x1 + xpad);
8435ec34c4cSmrg      y1 = (Position)(y1 + ypad);
8445ec34c4cSmrg      x2 = (Position)(x2 + xpad);
8455ec34c4cSmrg      y2 = (Position)(y2 + ypad);
8467a84e134Smrg      display = XtDisplayOfObject(w);
8477a84e134Smrg      window = XtWindowOfObject(w);
8487a84e134Smrg    }
8497a84e134Smrg  else
8507a84e134Smrg    {
8517a84e134Smrg      display = XtDisplay(w);
8527a84e134Smrg      window = XtWindow(w);
8537a84e134Smrg    }
8547a84e134Smrg
8557a84e134Smrg  if (fill)
8565ec34c4cSmrg    XFillArc(display, window, xdata->gc, x1, y1, (unsigned)(x2 - x1), (unsigned)(y2 - y1),
8577a84e134Smrg	     arc->angle1, arc->angle2);
8587a84e134Smrg  else
8595ec34c4cSmrg    XDrawArc(display, window, xdata->gc, x1, y1, (unsigned)(x2 - x1), (unsigned)(y2 - y1),
8607a84e134Smrg	     arc->angle1, arc->angle2);
8617a84e134Smrg}
8627a84e134Smrg
8637a84e134Smrg/* ARGSUSED */
8647a84e134Smrgstatic void
8657a84e134SmrgDlDrawArc(Widget w, XtPointer args, XtPointer data,
8665ec34c4cSmrg	  XEvent *event _X_UNUSED, Region region _X_UNUSED)
8677a84e134Smrg{
8687a84e134Smrg  DlArc(w, args, data, False);
8697a84e134Smrg}
8707a84e134Smrg
8717a84e134Smrg/* ARGSUSED */
8727a84e134Smrgstatic void
8737a84e134SmrgDlFillArc(Widget w, XtPointer args, XtPointer data,
8745ec34c4cSmrg	  XEvent *event _X_UNUSED, Region region _X_UNUSED)
8757a84e134Smrg{
8767a84e134Smrg  DlArc(w, args, data, True);
8777a84e134Smrg}
8787a84e134Smrg
8797a84e134Smrg/*ARGSUSED*/
8807a84e134Smrgstatic void
8815ec34c4cSmrgDlMask(Widget w, XtPointer args _X_UNUSED, XtPointer data,
8827a84e134Smrg       XEvent *event, Region region)
8837a84e134Smrg{
8847a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
8857a84e134Smrg  Display *display = XtDisplayOfObject(w);
8867a84e134Smrg
8877a84e134Smrg  if (region)
8887a84e134Smrg    XSetRegion(display, xdata->gc, region);
8897a84e134Smrg  else if (event)
8907a84e134Smrg    {
8917a84e134Smrg      XRectangle rect;
8927a84e134Smrg
8935ec34c4cSmrg      rect.x = (short)event->xexpose.x;
8945ec34c4cSmrg      rect.y = (short)event->xexpose.y;
8955ec34c4cSmrg      rect.width = (unsigned short)event->xexpose.width;
8965ec34c4cSmrg      rect.height = (unsigned short)event->xexpose.height;
8977a84e134Smrg      XSetClipRectangles(display, xdata->gc, 0, 0, &rect, 1, Unsorted);
8987a84e134Smrg    }
8997a84e134Smrg}
9007a84e134Smrg
9017a84e134Smrg/* ARGSUSED */
9027a84e134Smrgstatic void
9035ec34c4cSmrgDlUmask(Widget w, XtPointer args _X_UNUSED, XtPointer data,
9045ec34c4cSmrg	XEvent *event _X_UNUSED, Region region _X_UNUSED)
9057a84e134Smrg{
9067a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
9077a84e134Smrg
9087a84e134Smrg  XSetClipMask(XtDisplayOfObject(w), xdata->gc, None);
9097a84e134Smrg}
9107a84e134Smrg
9117a84e134Smrg/* ARGSUSED */
9127a84e134Smrgstatic void
9137a84e134SmrgDlLineWidth(Widget w, XtPointer args, XtPointer data,
9145ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
9157a84e134Smrg{
9167a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
9175ec34c4cSmrg  unsigned line_width = (unsigned)(unsigned long)args;
9187a84e134Smrg
9197a84e134Smrg  if (xdata->values.line_width != line_width)
9207a84e134Smrg    {
9217a84e134Smrg      xdata->mask |= GCLineWidth;
9225ec34c4cSmrg      xdata->values.line_width = (int)line_width;
9237a84e134Smrg      XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineWidth, &xdata->values);
9247a84e134Smrg    }
9257a84e134Smrg}
9267a84e134Smrg
9277a84e134Smrg/* ARGSUSED */
9287a84e134Smrgstatic void
9295ec34c4cSmrgDlDrawPoint(Widget w, XtPointer args, XtPointer data, XEvent *event _X_UNUSED, Region region _X_UNUSED)
9307a84e134Smrg{
9317a84e134Smrg  Dl1Point(w, args, data, POINT);
9327a84e134Smrg}
9337a84e134Smrg
9347a84e134Smrg/* ARGSUSED */
9357a84e134Smrgstatic void
9367a84e134SmrgDlDrawSegments(Widget w, XtPointer args, XtPointer data,
9375ec34c4cSmrg	       XEvent *event _X_UNUSED, Region region _X_UNUSED)
9387a84e134Smrg{
9397a84e134Smrg  XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
9407a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
9417a84e134Smrg  XawDLPosition *pos;
9427a84e134Smrg  XSegment *segments;
9437a84e134Smrg  XSegment segments_buf[8];
9447a84e134Smrg  Display *display;
9457a84e134Smrg  Window window;
9467a84e134Smrg  Cardinal num_segments, i, j;
9477a84e134Smrg
9487a84e134Smrg  num_segments = pos_ptr->num_pos>>2;
9497a84e134Smrg  segments = (XSegment *)XawStackAlloc(sizeof(XSegment) * num_segments, segments_buf);
9507a84e134Smrg
9517a84e134Smrg  for (i = j = 0; i < num_segments; i++, j = i << 2)
9527a84e134Smrg    {
9537a84e134Smrg      pos = &pos_ptr->pos[j];
9547a84e134Smrg      segments[i].x1 = X_ARG(pos[0]);
9557a84e134Smrg      segments[i].y1 = Y_ARG(pos[1]);
9567a84e134Smrg      segments[i].x2 = X_ARG(pos[2]);
9577a84e134Smrg      segments[i].y2 = Y_ARG(pos[3]);
9587a84e134Smrg    }
9597a84e134Smrg
9607a84e134Smrg  if (!XtIsWidget(w))
9617a84e134Smrg    {
9627a84e134Smrg      Position xpad, ypad;
9637a84e134Smrg
9645ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
9655ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
9667a84e134Smrg      for (i = 0; i < num_segments; i++)
9677a84e134Smrg	{
9685ec34c4cSmrg	  segments[i].x1 = (short)(segments[i].x1 + xpad);
9695ec34c4cSmrg	  segments[i].y1 = (short)(segments[i].y1 + ypad);
9705ec34c4cSmrg	  segments[i].x2 = (short)(segments[i].x2 + xpad);
9715ec34c4cSmrg	  segments[i].y2 = (short)(segments[i].y2 + ypad);
9727a84e134Smrg	}
9737a84e134Smrg      display = XtDisplayOfObject(w);
9747a84e134Smrg      window = XtWindowOfObject(w);
9757a84e134Smrg    }
9767a84e134Smrg  else
9777a84e134Smrg    {
9787a84e134Smrg      display = XtDisplay(w);
9797a84e134Smrg      window = XtWindow(w);
9807a84e134Smrg    }
9817a84e134Smrg
9825ec34c4cSmrg  XDrawSegments(display, window, xdata->gc, segments, (int)num_segments);
9837a84e134Smrg
9847a84e134Smrg  XawStackFree(segments, segments_buf);
9857a84e134Smrg}
9867a84e134Smrg
9877a84e134Smrg/* ARGSUSED */
9887a84e134Smrgstatic void
9897a84e134SmrgDlArcMode(Widget w, XtPointer args, XtPointer data,
9905ec34c4cSmrg	  XEvent *event _X_UNUSED, Region region _X_UNUSED)
9917a84e134Smrg{
9927a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
9935ec34c4cSmrg  int arc_mode  = (int)(long)args;
9947a84e134Smrg
9957a84e134Smrg  if (xdata->values.arc_mode != arc_mode)
9967a84e134Smrg    {
9977a84e134Smrg      xdata->mask |= GCArcMode;
9987a84e134Smrg      xdata->values.arc_mode = arc_mode;
9997a84e134Smrg      XSetArcMode(XtDisplayOfObject(w), xdata->gc, arc_mode);
10007a84e134Smrg    }
10017a84e134Smrg}
10027a84e134Smrg
10037a84e134Smrg/* ARGSUSED */
10047a84e134Smrgstatic void
10055ec34c4cSmrgDlCoordMode(Widget w _X_UNUSED, XtPointer args, XtPointer data,
10065ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
10077a84e134Smrg{
10087a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10095ec34c4cSmrg  int mode  = (int)(long)args;
10107a84e134Smrg
10117a84e134Smrg  xdata->mode = mode;
10127a84e134Smrg}
10137a84e134Smrg
10147a84e134Smrg/* ARGSUSED */
10157a84e134Smrgstatic void
10165ec34c4cSmrgDlShapeMode(Widget w _X_UNUSED, XtPointer args, XtPointer data,
10175ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
10187a84e134Smrg{
10197a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10205ec34c4cSmrg  int shape  = (int)(long)args;
10217a84e134Smrg
10227a84e134Smrg  xdata->shape = shape;
10237a84e134Smrg}
10247a84e134Smrg
10257a84e134Smrg/* ARGSUSED */
10267a84e134Smrgstatic void
10277a84e134SmrgDlLineStyle(Widget w, XtPointer args, XtPointer data,
10285ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
10297a84e134Smrg{
10307a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10315ec34c4cSmrg  int line_style = (int)(long)args;
10327a84e134Smrg
10337a84e134Smrg  if (xdata->values.line_style != line_style)
10347a84e134Smrg    {
10357a84e134Smrg      xdata->mask |= GCLineStyle;
10367a84e134Smrg      xdata->values.line_style = line_style;
10377a84e134Smrg      XChangeGC(XtDisplayOfObject(w), xdata->gc, GCLineStyle, &xdata->values);
10387a84e134Smrg    }
10397a84e134Smrg}
10407a84e134Smrg
10417a84e134Smrg/* ARGSUSED */
10427a84e134Smrgstatic void
10437a84e134SmrgDlCapStyle(Widget w, XtPointer args, XtPointer data,
10445ec34c4cSmrg	   XEvent *event _X_UNUSED, Region region _X_UNUSED)
10457a84e134Smrg{
10467a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10475ec34c4cSmrg  int cap_style = (int)(long)args;
10487a84e134Smrg
10497a84e134Smrg  if (xdata->values.cap_style != cap_style)
10507a84e134Smrg    {
10517a84e134Smrg      xdata->mask |= GCCapStyle;
10527a84e134Smrg      xdata->values.cap_style = cap_style;
10537a84e134Smrg      XChangeGC(XtDisplayOfObject(w), xdata->gc, GCCapStyle, &xdata->values);
10547a84e134Smrg    }
10557a84e134Smrg}
10567a84e134Smrg
10577a84e134Smrg/* ARGSUSED */
10587a84e134Smrgstatic void
10597a84e134SmrgDlJoinStyle(Widget w, XtPointer args, XtPointer data,
10605ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
10617a84e134Smrg{
10627a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10635ec34c4cSmrg  int join_style = (int)(long)args;
10647a84e134Smrg
10657a84e134Smrg  if (xdata->values.join_style != join_style)
10667a84e134Smrg    {
10677a84e134Smrg      xdata->mask |= GCJoinStyle;
10687a84e134Smrg      xdata->values.join_style = join_style;
10697a84e134Smrg      XChangeGC(XtDisplayOfObject(w), xdata->gc, GCJoinStyle, &xdata->values);
10707a84e134Smrg    }
10717a84e134Smrg}
10727a84e134Smrg
10737a84e134Smrg/* ARGSUSED */
10747a84e134Smrgstatic void
10757a84e134SmrgDlFillStyle(Widget w, XtPointer args, XtPointer data,
10765ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
10777a84e134Smrg{
10787a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10795ec34c4cSmrg  int fill_style = (int)(long)args;
10807a84e134Smrg
10817a84e134Smrg  if (xdata->values.fill_style != fill_style)
10827a84e134Smrg    {
10837a84e134Smrg      xdata->mask |= GCFillStyle;
10847a84e134Smrg      xdata->values.fill_style = fill_style;
10857a84e134Smrg      XSetFillStyle(XtDisplayOfObject(w), xdata->gc, fill_style);
10867a84e134Smrg    }
10877a84e134Smrg}
10887a84e134Smrg
10897a84e134Smrg/* ARGSUSED */
10907a84e134Smrgstatic void
10917a84e134SmrgDlFillRule(Widget w, XtPointer args, XtPointer data,
10925ec34c4cSmrg	   XEvent *event _X_UNUSED, Region region _X_UNUSED)
10937a84e134Smrg{
10947a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
10955ec34c4cSmrg  int fill_rule = (int)(long)args;
10967a84e134Smrg
10977a84e134Smrg  if (xdata->values.fill_rule != fill_rule)
10987a84e134Smrg    {
10997a84e134Smrg      xdata->mask |= GCFillRule;
11007a84e134Smrg      xdata->values.fill_rule = fill_rule;
11017a84e134Smrg      XSetFillRule(XtDisplayOfObject(w), xdata->gc, fill_rule);
11027a84e134Smrg    }
11037a84e134Smrg}
11047a84e134Smrg
11057a84e134Smrg/* ARGSUSED */
11067a84e134Smrgstatic void
11077a84e134SmrgDlTile(Widget w, XtPointer args, XtPointer data,
11085ec34c4cSmrg       XEvent *event _X_UNUSED, Region region _X_UNUSED)
11097a84e134Smrg{
11107a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
11117a84e134Smrg  XawPixmap *pixmap = (XawPixmap *)args;
11127a84e134Smrg
11137a84e134Smrg  if (pixmap && xdata->values.tile != pixmap->pixmap)
11147a84e134Smrg    {
11157a84e134Smrg      xdata->mask |= GCTile;
11167a84e134Smrg      xdata->values.tile = pixmap->pixmap;
11177a84e134Smrg      XSetTile(XtDisplayOfObject(w), xdata->gc, xdata->values.tile);
11187a84e134Smrg    }
11197a84e134Smrg}
11207a84e134Smrg
11217a84e134Smrg/* ARGSUSED */
11227a84e134Smrgstatic void
11237a84e134SmrgDlStipple(Widget w, XtPointer args, XtPointer data,
11245ec34c4cSmrg	  XEvent *event _X_UNUSED, Region region _X_UNUSED)
11257a84e134Smrg{
11267a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
11277a84e134Smrg  XawPixmap *pixmap = (XawPixmap *)args;
11287a84e134Smrg
11297a84e134Smrg  if (pixmap && xdata->values.stipple != pixmap->pixmap)
11307a84e134Smrg    {
11317a84e134Smrg      xdata->mask |= GCStipple;
11327a84e134Smrg      xdata->values.stipple = pixmap->pixmap;
11337a84e134Smrg      XSetStipple(XtDisplayOfObject(w), xdata->gc, xdata->values.stipple);
11347a84e134Smrg    }
11357a84e134Smrg}
11367a84e134Smrg
11377a84e134Smrg/* ARGSUSED */
11387a84e134Smrgstatic void
11395ec34c4cSmrgDlTSOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event _X_UNUSED, Region region _X_UNUSED)
11407a84e134Smrg{
11417a84e134Smrg  Dl1Point(w, args, data, TSORIGIN);
11427a84e134Smrg}
11437a84e134Smrg
11447a84e134Smrg/* ARGSUSED */
11457a84e134Smrgstatic void
11467a84e134SmrgDlFunction(Widget w, XtPointer args, XtPointer data,
11475ec34c4cSmrg	   XEvent *event _X_UNUSED, Region region _X_UNUSED)
11487a84e134Smrg{
11497a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
11505ec34c4cSmrg  int function = (int)(long)args;
11517a84e134Smrg
11527a84e134Smrg  if (function != xdata->values.function)
11537a84e134Smrg    {
11547a84e134Smrg      xdata->mask |= GCFunction;
11557a84e134Smrg      xdata->values.function = function;
11567a84e134Smrg      XSetFunction(XtDisplayOfObject(w), xdata->gc, function);
11577a84e134Smrg    }
11587a84e134Smrg}
11597a84e134Smrg
11607a84e134Smrg/* ARGSUSED */
11617a84e134Smrgstatic void
11627a84e134SmrgDlPlaneMask(Widget w, XtPointer args, XtPointer data,
11635ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
11647a84e134Smrg{
11657a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
11667a84e134Smrg  unsigned long plane_mask = (unsigned long)args;
11677a84e134Smrg
11687a84e134Smrg  if (xdata->values.plane_mask != plane_mask)
11697a84e134Smrg    {
11707a84e134Smrg      xdata->mask |= GCPlaneMask;
11717a84e134Smrg      xdata->values.plane_mask = plane_mask;
11727a84e134Smrg      XSetPlaneMask(XtDisplayOfObject(w), xdata->gc, plane_mask);
11737a84e134Smrg    }
11747a84e134Smrg}
11757a84e134Smrg
11767a84e134Smrgstatic void
11777a84e134SmrgDlString(Widget w, XtPointer args, XtPointer data, Bool image)
11787a84e134Smrg{
11797a84e134Smrg  XawDLStringArgs *string = (XawDLStringArgs *)args;
11807a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
11817a84e134Smrg  Display *display;
11827a84e134Smrg  Window window;
11837a84e134Smrg  Position x, y;
11847a84e134Smrg
11855ec34c4cSmrg  x = (Position)(X_ARG(string->pos[0]));
11865ec34c4cSmrg  y = (Position)(Y_ARG(string->pos[1]));
11877a84e134Smrg
11887a84e134Smrg  if (!XtIsWidget(w))
11897a84e134Smrg    {
11907a84e134Smrg      Position xpad, ypad;
11917a84e134Smrg
11925ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
11935ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
11945ec34c4cSmrg      x = (Position)(x + xpad);
11955ec34c4cSmrg      y = (Position)(y + ypad);
11967a84e134Smrg      display = XtDisplayOfObject(w);
11977a84e134Smrg      window = XtWindowOfObject(w);
11987a84e134Smrg    }
11997a84e134Smrg  else
12007a84e134Smrg    {
12017a84e134Smrg      display = XtDisplay(w);
12027a84e134Smrg      window = XtWindow(w);
12037a84e134Smrg    }
12047a84e134Smrg
12057a84e134Smrg  if (image)
12067a84e134Smrg    XDrawImageString(display, window, xdata->gc, x, y, string->string, string->length);
12077a84e134Smrg  else
12087a84e134Smrg    XDrawString(display, window, xdata->gc, x, y, string->string, string->length);
12097a84e134Smrg}
12107a84e134Smrg
12117a84e134Smrg/* ARGSUSED */
12127a84e134Smrgstatic void
12137a84e134SmrgDlDrawString(Widget w, XtPointer args, XtPointer data,
12145ec34c4cSmrg	     XEvent *event _X_UNUSED, Region region _X_UNUSED)
12157a84e134Smrg{
12167a84e134Smrg  DlString(w, args, data, False);
12177a84e134Smrg}
12187a84e134Smrg
12197a84e134Smrg/* ARGSUSED */
12207a84e134Smrgstatic void
12217a84e134SmrgDlPaintString(Widget w, XtPointer args, XtPointer data,
12225ec34c4cSmrg	      XEvent *event _X_UNUSED, Region region _X_UNUSED)
12237a84e134Smrg{
12247a84e134Smrg  DlString(w, args, data, True);
12257a84e134Smrg}
12267a84e134Smrg
12277a84e134Smrg/* ARGSUSED */
12287a84e134Smrgstatic void
12297a84e134SmrgDlFont(Widget w, XtPointer args, XtPointer data,
12305ec34c4cSmrg       XEvent *event _X_UNUSED, Region region _X_UNUSED)
12317a84e134Smrg{
12327a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
12337a84e134Smrg  Font font = (Font)args;
12347a84e134Smrg
12357a84e134Smrg  if (xdata->values.font != font)
12367a84e134Smrg    {
12377a84e134Smrg      xdata->mask |= GCFont;
12387a84e134Smrg      xdata->values.font = font;
12397a84e134Smrg      XSetFont(XtDisplayOfObject(w), xdata->gc, font);
12407a84e134Smrg    }
12417a84e134Smrg}
12427a84e134Smrg
12437a84e134Smrg/* ARGSUSED */
12447a84e134Smrgstatic void
12457a84e134SmrgDlDashes(Widget w, XtPointer args, XtPointer data,
12465ec34c4cSmrg	 XEvent *event _X_UNUSED, Region region _X_UNUSED)
12477a84e134Smrg{
12487a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
12497a84e134Smrg  char *dashes = args;
12507a84e134Smrg
12517a84e134Smrg  if (xdata->dashes != dashes)
12527a84e134Smrg    {
12537a84e134Smrg      xdata->mask |= GCDashOffset | GCDashList;
12547a84e134Smrg      xdata->dashes = dashes;
12557a84e134Smrg      XSetDashes(XtDisplayOfObject(w), xdata->gc, 0, dashes + 1, *dashes);
12567a84e134Smrg    }
12577a84e134Smrg}
12587a84e134Smrg
12597a84e134Smrg/* ARGSUSED */
12607a84e134Smrgstatic void
12617a84e134SmrgDlSubwindowMode(Widget w, XtPointer args, XtPointer data,
12625ec34c4cSmrg		XEvent *event _X_UNUSED, Region region _X_UNUSED)
12637a84e134Smrg{
12647a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
12655ec34c4cSmrg  int subwindow_mode = (int)(long)args;
12667a84e134Smrg
12677a84e134Smrg  if (xdata->values.subwindow_mode != subwindow_mode)
12687a84e134Smrg    {
12697a84e134Smrg      xdata->mask |= GCSubwindowMode;
12707a84e134Smrg      xdata->values.subwindow_mode = subwindow_mode;
12717a84e134Smrg      XSetSubwindowMode(XtDisplayOfObject(w), xdata->gc, subwindow_mode);
12727a84e134Smrg    }
12737a84e134Smrg}
12747a84e134Smrg
12757a84e134Smrg/* ARGSUSED */
12767a84e134Smrgstatic void
12777a84e134SmrgDlExposures(Widget w, XtPointer args, XtPointer data,
12785ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
12797a84e134Smrg{
12807a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
12817a84e134Smrg  Bool graphics_exposures = (Bool)(long)args;
12827a84e134Smrg
12837a84e134Smrg  if (xdata->values.graphics_exposures != graphics_exposures)
12847a84e134Smrg    {
12857a84e134Smrg      xdata->mask |= GCGraphicsExposures;
12867a84e134Smrg      xdata->values.graphics_exposures = graphics_exposures;
12877a84e134Smrg      XSetGraphicsExposures(XtDisplayOfObject(w), xdata->gc, graphics_exposures);
12887a84e134Smrg    }
12897a84e134Smrg}
12907a84e134Smrg
12917a84e134Smrg/* ARGSUSED */
12927a84e134Smrgstatic void
12935ec34c4cSmrgDlClipOrigin(Widget w, XtPointer args, XtPointer data, XEvent *event _X_UNUSED, Region region _X_UNUSED)
12947a84e134Smrg{
12957a84e134Smrg  Dl1Point(w, args, data, CLIPORIGIN);
12967a84e134Smrg}
12977a84e134Smrg
12987a84e134Smrg/* ARGSUSED */
12997a84e134Smrgstatic void
13007a84e134SmrgDlClipMask(Widget w, XtPointer args, XtPointer data,
13015ec34c4cSmrg	   XEvent *event _X_UNUSED, Region region _X_UNUSED)
13027a84e134Smrg{
13037a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
13047a84e134Smrg  XawPixmap *pixmap = (XawPixmap *)args;
13057a84e134Smrg  Pixmap clip_mask;
13067a84e134Smrg
13077a84e134Smrg  if (pixmap)
13087a84e134Smrg    clip_mask = pixmap->mask ? pixmap->mask : pixmap->pixmap;
13097a84e134Smrg  else
13107a84e134Smrg    clip_mask = None;
13117a84e134Smrg
13127a84e134Smrg  if (xdata->values.clip_mask != clip_mask)
13137a84e134Smrg    {
13147a84e134Smrg      xdata->mask |= GCClipMask;
13157a84e134Smrg      XSetClipMask(XtDisplayOfObject(w), xdata->gc, clip_mask);
13167a84e134Smrg    }
13177a84e134Smrg}
13187a84e134Smrg
13197a84e134Smrg/* ARGSUSED */
13207a84e134Smrgstatic void
13217a84e134SmrgDlClipRectangles(Widget w, XtPointer args, XtPointer data,
13225ec34c4cSmrg		 XEvent *event _X_UNUSED, Region region _X_UNUSED)
13237a84e134Smrg{
13247a84e134Smrg  XawDLPositionPtr *pos_ptr = (XawDLPositionPtr *)args;
13257a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
13267a84e134Smrg  XawDLPosition *pos;
13277a84e134Smrg  XRectangle *rects;
13287a84e134Smrg  XRectangle rects_buf[8];
13297a84e134Smrg  Position x1, y1, x2, y2;
13307a84e134Smrg  Cardinal num_rects, i, j;
13317a84e134Smrg
13327a84e134Smrg  num_rects = pos_ptr->num_pos>>2;
13337a84e134Smrg  rects = (XRectangle *)XawStackAlloc(sizeof(XRectangle) * num_rects, rects_buf);
13347a84e134Smrg
13357a84e134Smrg  for (i = j = 0; i < num_rects; i++, j = i << 2)
13367a84e134Smrg    {
13377a84e134Smrg      pos = &pos_ptr->pos[j];
13387a84e134Smrg      x1 = X_ARG(pos[0]);
13397a84e134Smrg      y1 = Y_ARG(pos[1]);
13407a84e134Smrg      x2 = X_ARG(pos[2]);
13417a84e134Smrg      y2 = Y_ARG(pos[3]);
13427a84e134Smrg      rects[i].x = XawMin(x1, x2);
13437a84e134Smrg      rects[i].y = XawMin(y1, y2);
13445ec34c4cSmrg      rects[i].width = (unsigned short)(XawMax(x1, x2) - rects[i].x);
13455ec34c4cSmrg      rects[i].height = (unsigned short)(XawMax(y1, y2) - rects[i].y);
13467a84e134Smrg    }
13477a84e134Smrg
13487a84e134Smrg  if (!XtIsWidget(w))
13497a84e134Smrg    {
13507a84e134Smrg      Position xpad, ypad;
13517a84e134Smrg
13525ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
13535ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
13547a84e134Smrg      for (i = 0; i < num_rects; i++)
13557a84e134Smrg	{
13565ec34c4cSmrg	  rects[i].x = (short)(rects[i].x + xpad);
13575ec34c4cSmrg	  rects[i].y = (short)(rects[i].y + ypad);
13587a84e134Smrg	}
13597a84e134Smrg    }
13607a84e134Smrg
13615ec34c4cSmrg  XSetClipRectangles(XtDisplayOfObject(w), xdata->gc, 0, 0, rects, (int)num_rects, Unsorted);
13627a84e134Smrg
13637a84e134Smrg  XawStackFree(rects, rects_buf);
13647a84e134Smrg}
13657a84e134Smrg
13667a84e134Smrgstatic void
13677a84e134SmrgDlCopy(Widget w, XtPointer args, XtPointer data, Bool plane)
13687a84e134Smrg{
13697a84e134Smrg  XawDLCopyArgs *copy = (XawDLCopyArgs *)args;
13707a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
13717a84e134Smrg  int src_x, src_y, dst_x, dst_y, width, height, tmp1, tmp2;
13727a84e134Smrg
13737a84e134Smrg  tmp1 = X_ARG(copy->pos[0]);
13747a84e134Smrg  tmp2 = X_ARG(copy->pos[2]);
13757a84e134Smrg  dst_x = XawMin(tmp1, tmp2);
13767a84e134Smrg  width = XawMax(tmp1, tmp2) - dst_x;
13777a84e134Smrg
13787a84e134Smrg  tmp1 = Y_ARG(copy->pos[1]);
13797a84e134Smrg  tmp2 = Y_ARG(copy->pos[3]);
13807a84e134Smrg  dst_y = XawMin(tmp1, tmp2);
13817a84e134Smrg  height = XawMax(tmp1, tmp2) - dst_y;
13827a84e134Smrg
13837a84e134Smrg  src_x = X_ARG(copy->pos[4]);
13847a84e134Smrg  src_y = Y_ARG(copy->pos[5]);
13857a84e134Smrg
13867a84e134Smrg  if (width <= 0)
13877a84e134Smrg    {
13887a84e134Smrg      if (copy->pixmap)
13897a84e134Smrg	width = copy->pixmap->width;
13907a84e134Smrg      else
13917a84e134Smrg	{
13927a84e134Smrg	  if ((width = XtWidth(w) - src_x) < 0)
13937a84e134Smrg	    width = 0;
13947a84e134Smrg	}
13957a84e134Smrg    }
13967a84e134Smrg  if (height <= 0)
13977a84e134Smrg    {
13987a84e134Smrg      if (copy->pixmap)
13997a84e134Smrg	height = copy->pixmap->height;
14007a84e134Smrg      else
14017a84e134Smrg	{
14027a84e134Smrg	  if ((height = XtHeight(w) - src_y) < 0)
14037a84e134Smrg	    height = 0;
14047a84e134Smrg	}
14057a84e134Smrg    }
14067a84e134Smrg
14077a84e134Smrg  if (!XtIsWidget(w))
14087a84e134Smrg    {
14097a84e134Smrg      Position xpad, ypad;
14107a84e134Smrg
14115ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
14125ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
14137a84e134Smrg      src_x += xpad;
14147a84e134Smrg      src_y += ypad;
14157a84e134Smrg      dst_x += xpad;
14167a84e134Smrg      dst_y += ypad;
14177a84e134Smrg    }
14187a84e134Smrg
14197a84e134Smrg  if (plane)
14207a84e134Smrg    XCopyPlane(XtDisplayOfObject(w), XtWindowOfObject(w),
14217a84e134Smrg	       copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w),
14225ec34c4cSmrg	       xdata->gc, src_x, src_y, (unsigned)width, (unsigned)height, dst_x, dst_y,
14235ec34c4cSmrg	       (unsigned long)(copy->plane ? copy->plane : 1));
14247a84e134Smrg  else
14257a84e134Smrg    XCopyArea(XtDisplayOfObject(w),
14267a84e134Smrg	      copy->pixmap ? copy->pixmap->pixmap : XtWindowOfObject(w),
14275ec34c4cSmrg	      XtWindowOfObject(w), xdata->gc, src_x, src_y, (unsigned)width, (unsigned)height, dst_x, dst_y);
14287a84e134Smrg}
14297a84e134Smrg
14307a84e134Smrg/* ARGSUSED */
14317a84e134Smrgstatic void
14327a84e134SmrgDlCopyArea(Widget w, XtPointer args, XtPointer data,
14335ec34c4cSmrg	   XEvent *event _X_UNUSED, Region region _X_UNUSED)
14347a84e134Smrg{
14357a84e134Smrg  DlCopy(w, args, data, False);
14367a84e134Smrg}
14377a84e134Smrg
14387a84e134Smrg/* ARGSUSED */
14397a84e134Smrgstatic void
14407a84e134SmrgDlCopyPlane(Widget w, XtPointer args, XtPointer data,
14415ec34c4cSmrg	    XEvent *event _X_UNUSED, Region region _X_UNUSED)
14427a84e134Smrg{
14437a84e134Smrg  DlCopy(w, args, data, True);
14447a84e134Smrg}
14457a84e134Smrg
14467a84e134Smrg/*ARGSUSED*/
14477a84e134Smrg/* Note:
14487a84e134Smrg *	  This function is destructive if you set the ts_x_origin, ts_y_origin,
14497a84e134Smrg *	and/or clip-mask. It is meant to be the only function used in a display
14507a84e134Smrg *	list. If you need to use other functions (and those values), be sure to
14517a84e134Smrg *	set them after calling this function.
14527a84e134Smrg */
14537a84e134Smrgstatic void
14545ec34c4cSmrgDlImage(Widget w, XtPointer args, XtPointer data, XEvent *event _X_UNUSED, Region region _X_UNUSED)
14557a84e134Smrg{
14567a84e134Smrg  XawDLImageArgs *image = (XawDLImageArgs *)args;
14577a84e134Smrg  XawXlibData *xdata = (XawXlibData *)data;
14587a84e134Smrg  int x, y, xs, ys, xe, ye, width, height;
14597a84e134Smrg  Display *display;
14607a84e134Smrg  Window window;
14617a84e134Smrg
14627a84e134Smrg  width = image->pixmap->width;
14637a84e134Smrg  height = image->pixmap->height;
14647a84e134Smrg  xs = X_ARG(image->pos[0]);
14657a84e134Smrg  ys = Y_ARG(image->pos[1]);
14667a84e134Smrg  xe = X_ARG(image->pos[2]);
14677a84e134Smrg  ye = Y_ARG(image->pos[3]);
14687a84e134Smrg
14697a84e134Smrg  if (xe <= 0)
14707a84e134Smrg    xe = xs + width;
14717a84e134Smrg  if (ye <= 0)
14727a84e134Smrg    ye = ys + height;
14737a84e134Smrg
14747a84e134Smrg  if (!XtIsWidget(w))
14757a84e134Smrg    {
14767a84e134Smrg      Position xpad, ypad;
14777a84e134Smrg
14785ec34c4cSmrg      xpad = (Position)(XtX(w) + XtBorderWidth(w));
14795ec34c4cSmrg      ypad = (Position)(XtY(w) + XtBorderWidth(w));
14807a84e134Smrg      xe += xpad;
14817a84e134Smrg      ye += ypad;
14827a84e134Smrg      xe += xpad;
14837a84e134Smrg      ye += ypad;
14847a84e134Smrg      display = XtDisplayOfObject(w);
14857a84e134Smrg      window = XtWindowOfObject(w);
14867a84e134Smrg    }
14877a84e134Smrg  else
14887a84e134Smrg    {
14897a84e134Smrg      display = XtDisplay(w);
14907a84e134Smrg      window = XtWindow(w);
14917a84e134Smrg    }
14927a84e134Smrg
14937a84e134Smrg  for (y = ys; y < ye; y += height)
14947a84e134Smrg    for (x = xs; x < xe; x += width)
14957a84e134Smrg      {
14967a84e134Smrg	XSetClipOrigin(display, xdata->gc, x, y);
14977a84e134Smrg	if (image->pixmap->mask)
14987a84e134Smrg	  XSetClipMask(display, xdata->gc, image->pixmap->mask);
14997a84e134Smrg	if (image->depth == 1)
15007a84e134Smrg	  XCopyPlane(display, image->pixmap->pixmap, window, xdata->gc,
15015ec34c4cSmrg		     0, 0, (unsigned)XawMin(width, xe - x), (unsigned)XawMin(height, ye - y),
15027a84e134Smrg		     x, y, 1L);
15037a84e134Smrg	else
15047a84e134Smrg	  XCopyArea(display, image->pixmap->pixmap, window, xdata->gc, 0, 0,
15055ec34c4cSmrg		     (unsigned)XawMin(width, xe - x), (unsigned)XawMin(height, ye - y), x, y);
15067a84e134Smrg      }
15077a84e134Smrg
15087a84e134Smrg  XSetClipMask(display, xdata->gc, None);
15097a84e134Smrg}
15107a84e134Smrg
15117a84e134Smrgtypedef struct _Dl_init Dl_init;
15127a84e134Smrgstruct _Dl_init {
15137a84e134Smrg  String name;
15147a84e134Smrg  XawDisplayListProc proc;
15157a84e134Smrg  Cardinal id;
15167a84e134Smrg};
15177a84e134Smrg
15187a84e134Smrgstatic Dl_init dl_init[] =
15197a84e134Smrg{
15207a84e134Smrg  {"arc-mode",		DlArcMode,		ARCMODE},
15217a84e134Smrg  {"background",	DlBackground,		GCBG},
15227a84e134Smrg  {"bg",		DlBackground,		GCBG},
15237a84e134Smrg  {"cap-style",		DlCapStyle,		CAPSTYLE},
15247a84e134Smrg  {"clip-mask",		DlClipMask,		CLIPMASK},
15257a84e134Smrg  {"clip-origin",	DlClipOrigin,		CLIPORIGIN},
15267a84e134Smrg  {"clip-rectangles",	DlClipRectangles,	CLIPRECTS},
15277a84e134Smrg  {"clip-rects",	DlClipRectangles,	CLIPRECTS},
15287a84e134Smrg  {"coord-mode",	DlCoordMode,		COORDMODE},
15297a84e134Smrg  {"copy-area",		DlCopyArea,		COPYAREA},
15307a84e134Smrg  {"copy-plane",	DlCopyPlane,		COPYPLANE},
15317a84e134Smrg  {"dashes",		DlDashes,		DASHES},
15327a84e134Smrg  {"draw-arc",		DlDrawArc,		DARC},
15337a84e134Smrg  {"draw-line",		DlLine,			LINE},
15347a84e134Smrg  {"draw-lines",	DlDrawLines,		DLINES},
15357a84e134Smrg  {"draw-point",	DlDrawPoint,		POINT},
15367a84e134Smrg  {"draw-points",	DlDrawPoints,		POINTS},
15377a84e134Smrg  {"draw-rect",		DlDrawRectangle,	DRECT},
15387a84e134Smrg  {"draw-rectangle",	DlDrawRectangle,	DRECT},
15397a84e134Smrg  {"draw-segments",	DlDrawSegments,		SEGMENTS},
15407a84e134Smrg  {"draw-string",	DlDrawString,		DSTRING},
15417a84e134Smrg  {"exposures",		DlExposures,		EXPOSURES},
15427a84e134Smrg  {"fg",		DlForeground,		GCFG},
15437a84e134Smrg  {"fill-arc",		DlFillArc,		FARC},
15447a84e134Smrg  {"fill-poly",		DlFillPolygon,		FPOLY},
15457a84e134Smrg  {"fill-polygon",	DlFillPolygon,		FPOLY},
15467a84e134Smrg  {"fill-rect",		DlFillRectangle,	FRECT},
15477a84e134Smrg  {"fill-rectangle",	DlFillRectangle,	FRECT},
15487a84e134Smrg  {"fill-rule",		DlFillRule,		FILLRULE},
15497a84e134Smrg  {"fill-style",	DlFillStyle,		FILLSTYLE},
15507a84e134Smrg  {"font",		DlFont,			FONT},
15517a84e134Smrg  {"foreground",	DlForeground,		GCFG},
15527a84e134Smrg  {"function",		DlFunction,		FUNCTION},
15537a84e134Smrg  {"image",		DlImage,		IMAGE},
15547a84e134Smrg  {"join-style",	DlJoinStyle,		JOINSTYLE},
15557a84e134Smrg  {"line",		DlLine,			LINE},
15567a84e134Smrg  {"line-style",	DlLineStyle,		LINESTYLE},
15577a84e134Smrg  {"line-width",	DlLineWidth,		LWIDTH},
15587a84e134Smrg  {"lines",		DlDrawLines,		DLINES},
15597a84e134Smrg  {"mask",		DlMask,			MASK},
15607a84e134Smrg  {"paint-string",	DlPaintString,		PSTRING},
15617a84e134Smrg  {"plane-mask",	DlPlaneMask,		PLANEMASK},
15627a84e134Smrg  {"point",		DlDrawPoint,		POINT},
15637a84e134Smrg  {"points",		DlDrawPoints,		POINTS},
15647a84e134Smrg  {"segments",		DlDrawSegments,		SEGMENTS},
15657a84e134Smrg  {"shape-mode",	DlShapeMode,		SHAPEMODE},
15667a84e134Smrg  {"stipple",		DlStipple,		STIPPLE},
15677a84e134Smrg  {"subwindow-mode",	DlSubwindowMode,	SUBWMODE},
15687a84e134Smrg  {"tile",		DlTile,			TILE},
15697a84e134Smrg  {"ts-origin",		DlTSOrigin,		TSORIGIN},
15707a84e134Smrg  {"umask",		DlUmask,		UMASK},
15717a84e134Smrg};
15727a84e134Smrg
15737a84e134Smrgvoid
15747a84e134SmrgXawDisplayListInitialize(void)
15757a84e134Smrg{
15767a84e134Smrg  static Bool first_time = True;
15777a84e134Smrg  XawDLClass *lc;
15787a84e134Smrg  Cardinal i;
15797a84e134Smrg
15807a84e134Smrg  if (first_time == False)
15817a84e134Smrg    return;
15827a84e134Smrg
15837a84e134Smrg  first_time = False;
15847a84e134Smrg
15857a84e134Smrg  lc = XawCreateDisplayListClass(xlib,
15867a84e134Smrg				 _Xaw_Xlib_ArgsInitProc,
15877a84e134Smrg				 _Xaw_Xlib_ArgsDestructor,
15887a84e134Smrg				 _Xaw_Xlib_DataInitProc,
15897a84e134Smrg				 _Xaw_Xlib_DataDestructor);
15907a84e134Smrg  for (i = 0; i < sizeof(dl_init) / sizeof(dl_init[0]); i++)
15917a84e134Smrg    (void)XawDeclareDisplayListProc(lc, dl_init[i].name, dl_init[i].proc);
15927a84e134Smrg}
15937a84e134Smrg
15947a84e134Smrgstatic int
15957a84e134Smrgbcmp_cvt_proc(register _Xconst void *string,
15967a84e134Smrg	      register _Xconst void *dlinfo)
15977a84e134Smrg{
15987a84e134Smrg  return (strcmp((String)string, ((Dl_init*)dlinfo)->name));
15997a84e134Smrg}
16007a84e134Smrg
16017a84e134Smrgstatic long
16027a84e134Smrgread_int(char *cp, char **cpp)
16037a84e134Smrg{
16047a84e134Smrg  long value = 0, sign = 1;
16057a84e134Smrg
16067a84e134Smrg  if (*cp == '-')
16077a84e134Smrg    {
16087a84e134Smrg      sign = -1;
16097a84e134Smrg      ++cp;
16107a84e134Smrg    }
16117a84e134Smrg  else if (*cp == '+')
16127a84e134Smrg    ++cp;
16137a84e134Smrg  value = 0;
16147a84e134Smrg  while (*cp >= '0' && *cp <= '9')
16157a84e134Smrg    {
16167a84e134Smrg      value = value * 10 + *cp - '0';
16177a84e134Smrg      ++cp;
16187a84e134Smrg    }
16197a84e134Smrg  if (cpp)
16207a84e134Smrg    *cpp = cp;
16217a84e134Smrg  return (value * sign);
16227a84e134Smrg}
16237a84e134Smrg
16247a84e134Smrgstatic void
16257a84e134Smrgread_position(char *arg, XawDLPosition *pos)
16267a84e134Smrg{
16277a84e134Smrg  int ch;
16287a84e134Smrg  char *str = arg;
16297a84e134Smrg
16307a84e134Smrg  ch = *str;
16317a84e134Smrg  if (ch == '-' || ch == '+')
16327a84e134Smrg    {
16337a84e134Smrg      ++str;
16347a84e134Smrg      if (ch == '-')
16357a84e134Smrg	pos->high = True;
16365ec34c4cSmrg      pos->pos = (Position)read_int(str, NULL);
16377a84e134Smrg    }
16387a84e134Smrg  else if (isdigit(ch))
16397a84e134Smrg    {
16405ec34c4cSmrg      pos->pos = (Position)read_int(str, &str);
16417a84e134Smrg      ch = *str++;
16427a84e134Smrg      if (ch == '/')
16435ec34c4cSmrg	pos->denom = (Position)read_int(str, NULL);
16447a84e134Smrg    }
16457a84e134Smrg}
16467a84e134Smrg
16477a84e134Smrg/* ARGSUSED */
16487a84e134Smrgstatic void *
16497a84e134Smrg_Xaw_Xlib_ArgsInitProc(String proc_name, String *params, Cardinal *num_params,
16507a84e134Smrg		       Screen *screen, Colormap colormap, int depth)
16517a84e134Smrg{
16527a84e134Smrg  Cardinal id, i;
16537a84e134Smrg  Dl_init *init;
16547a84e134Smrg  void *retval = XAWDL_CONVERT_ERROR;
16557a84e134Smrg
16567a84e134Smrg  init = (Dl_init *)bsearch(proc_name, dl_init,
16577a84e134Smrg			    sizeof(dl_init) / sizeof(dl_init[0]),
16587a84e134Smrg			    sizeof(dl_init[0]),
16597a84e134Smrg			    bcmp_cvt_proc);
16607a84e134Smrg
16617a84e134Smrg  id = init->id;
16627a84e134Smrg
16637a84e134Smrg  switch (id)
16647a84e134Smrg    {
16657a84e134Smrg    case LINE:
16667a84e134Smrg    case DRECT:
16677a84e134Smrg    case FRECT:
16687a84e134Smrg      if (*num_params == 4)
16697a84e134Smrg	{
16707a84e134Smrg	  XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 4);
16717a84e134Smrg
16727a84e134Smrg	  for (i = 0; i < 4; i++)
16735ec34c4cSmrg	    read_position((char *)params[i], &pos[i]);
16747a84e134Smrg	  retval = (void *)pos;
16757a84e134Smrg	}
16767a84e134Smrg      break;
16777a84e134Smrg    case POINT:
16787a84e134Smrg    case TSORIGIN:
16797a84e134Smrg    case CLIPORIGIN:
16807a84e134Smrg      if (*num_params == 2)
16817a84e134Smrg	{
16827a84e134Smrg	  XawDLPosition *pos = (XawDLPosition *)XtCalloc(1, sizeof(XawDLPosition) * 2);
16837a84e134Smrg
16845ec34c4cSmrg	  read_position((char *)params[0], &pos[0]);
16855ec34c4cSmrg	  read_position((char *)params[1], &pos[1]);
16867a84e134Smrg	  retval = (void *)pos;
16877a84e134Smrg	}
16887a84e134Smrg      break;
16897a84e134Smrg    case DLINES:
16907a84e134Smrg    case FPOLY:
16917a84e134Smrg    case POINTS:
16927a84e134Smrg      if (*num_params >= 4 && !(*num_params & 1))
16937a84e134Smrg	{
16947a84e134Smrg	  XawDLPositionPtr *pos = XtNew(XawDLPositionPtr);
16957a84e134Smrg
16965ec34c4cSmrg	  pos->pos = (XawDLPosition *)XtCalloc(1, (Cardinal)(sizeof(XawDLPosition) *
16975ec34c4cSmrg					       (size_t)*num_params));
16987a84e134Smrg	  pos->num_pos = *num_params;
16997a84e134Smrg	  for (i = 0; i < *num_params; i++)
17005ec34c4cSmrg	    read_position((char *)params[i], &pos->pos[i]);
17017a84e134Smrg	  retval = (void *)pos;
17027a84e134Smrg	}
17037a84e134Smrg      break;
17047a84e134Smrg    case SEGMENTS:
17057a84e134Smrg    case CLIPRECTS:
17067a84e134Smrg      if (*num_params >= 4 && !(*num_params % 4))
17077a84e134Smrg	{
17087a84e134Smrg	  XawDLPositionPtr *pos = XtNew(XawDLPositionPtr);
17097a84e134Smrg
17105ec34c4cSmrg	  pos->pos = (XawDLPosition *)XtCalloc(1, (Cardinal)(sizeof(XawDLPosition) *
17115ec34c4cSmrg					       (size_t)*num_params));
17127a84e134Smrg	  pos->num_pos = *num_params;
17137a84e134Smrg	  for (i = 0; i < *num_params; i++)
17145ec34c4cSmrg	    read_position((char *)params[i], &pos->pos[i]);
17157a84e134Smrg	  retval = (void *)pos;
17167a84e134Smrg	}
17177a84e134Smrg      break;
17187a84e134Smrg    case DARC:
17197a84e134Smrg    case FARC:
17207a84e134Smrg      if (*num_params >= 4 && *num_params <= 6)
17217a84e134Smrg	{
17227a84e134Smrg	  XawDLArcArgs *args = (XawDLArcArgs *)XtCalloc(1, sizeof(XawDLArcArgs));
17237a84e134Smrg
17247a84e134Smrg	  args->angle1 = 0;
17257a84e134Smrg	  args->angle2 = 360;
17267a84e134Smrg	  for (i = 0; i < 4; i++)
17275ec34c4cSmrg	    read_position((char *)params[i], &args->pos[i]);
17287a84e134Smrg	  if (*num_params > 4)
17295ec34c4cSmrg	    args->angle1 = (int)read_int((char *)params[4], NULL);
17307a84e134Smrg	  if (*num_params > 5)
17315ec34c4cSmrg	    args->angle2 = (int)read_int((char *)params[5], NULL);
17327a84e134Smrg	  args->angle1 *= 64;
17337a84e134Smrg	  args->angle2 *= 64;
17347a84e134Smrg	  retval = (void *)args;
17357a84e134Smrg	}
17367a84e134Smrg      break;
17377a84e134Smrg    case GCFG:
17387a84e134Smrg    case GCBG:
17397a84e134Smrg      {
17407a84e134Smrg	XColor xcolor;
17417a84e134Smrg
17427a84e134Smrg	if (*num_params == 1 &&
17437a84e134Smrg	    XAllocNamedColor(DisplayOfScreen(screen), colormap,
17447a84e134Smrg			     params[0], &xcolor, &xcolor))
17457a84e134Smrg	  retval = (void *)xcolor.pixel;
17467a84e134Smrg      } break;
17477a84e134Smrg    case MASK:
17487a84e134Smrg    case UMASK:
17497a84e134Smrg      if (*num_params == 0)
17507a84e134Smrg	retval = NULL;
17517a84e134Smrg      break;
17527a84e134Smrg    case LWIDTH:
17537a84e134Smrg      if (*num_params == 1)
17545ec34c4cSmrg	retval = (void *)read_int((char *)params[0], NULL);
17557a84e134Smrg      break;
17567a84e134Smrg    case ARCMODE:
17577a84e134Smrg      if (*num_params == 1)
17587a84e134Smrg	{
17597a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "pieslice") == 0)
17607a84e134Smrg	    retval = (void *)ArcPieSlice;
17617a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "chord") == 0)
17627a84e134Smrg	    retval = (void *)ArcChord;
17637a84e134Smrg	}
17647a84e134Smrg      break;
17657a84e134Smrg    case COORDMODE:
17667a84e134Smrg      if (*num_params == 1)
17677a84e134Smrg	{
17687a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "origin") == 0)
17697a84e134Smrg	    retval = (void *)CoordModeOrigin;
17707a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "previous") == 0)
17717a84e134Smrg	    retval = (void *)CoordModePrevious;
17727a84e134Smrg	}
17737a84e134Smrg      break;
17747a84e134Smrg    case SHAPEMODE:
17757a84e134Smrg      if (*num_params == 1)
17767a84e134Smrg	{
17777a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "complex") == 0)
17787a84e134Smrg	    retval = (void *)Complex;
17797a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "convex") == 0)
17807a84e134Smrg	    retval = (void *)Convex;
17817a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "nonconvex") == 0)
17827a84e134Smrg	    retval = (void *)Nonconvex;
17837a84e134Smrg	}
17847a84e134Smrg      break;
17857a84e134Smrg    case LINESTYLE:
17867a84e134Smrg      if (*num_params == 1)
17877a84e134Smrg	{
17887a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "solid") == 0)
17897a84e134Smrg	    retval = (void *)LineSolid;
17907a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "onoffdash") == 0)
17917a84e134Smrg	    retval = (void *)LineOnOffDash;
17927a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "doubledash") == 0)
17937a84e134Smrg	    retval = (void *)LineDoubleDash;
17947a84e134Smrg	}
17957a84e134Smrg      break;
17967a84e134Smrg    case CAPSTYLE:
17977a84e134Smrg      if (*num_params == 1)
17987a84e134Smrg	{
17997a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "notlast") == 0)
18007a84e134Smrg	    retval = (void *)CapNotLast;
18017a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "butt") == 0)
18027a84e134Smrg	    retval = (void *)CapButt;
18037a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "round") == 0)
18047a84e134Smrg	    retval = (void *)CapRound;
18057a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "projecting") == 0)
18067a84e134Smrg	    retval = (void *)CapProjecting;
18077a84e134Smrg	}
18087a84e134Smrg      break;
18097a84e134Smrg    case JOINSTYLE:
18107a84e134Smrg      if (*num_params == 1)
18117a84e134Smrg	{
18127a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "miter") == 0)
18137a84e134Smrg	    retval = (void *)JoinMiter;
18147a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "round") == 0)
18157a84e134Smrg	    retval = (void *)JoinRound;
18167a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "bevel") == 0)
18177a84e134Smrg	    retval = (void *)JoinBevel;
18187a84e134Smrg	}
18197a84e134Smrg      break;
18207a84e134Smrg    case FILLSTYLE:
18217a84e134Smrg      if (*num_params == 1)
18227a84e134Smrg	{
18237a84e134Smrg	  if (*num_params && XmuCompareISOLatin1(params[0], "solid") == 0)
18247a84e134Smrg	    retval = (void *)FillSolid;
18257a84e134Smrg	  else if (*num_params && XmuCompareISOLatin1(params[0], "tiled") == 0)
18267a84e134Smrg	    retval = (void *)FillTiled;
18277a84e134Smrg	  else if (*num_params && XmuCompareISOLatin1(params[0], "stippled") == 0)
18287a84e134Smrg	    retval = (void *)FillStippled;
18297a84e134Smrg	  else if (*num_params && XmuCompareISOLatin1(params[0], "opaquestippled") == 0)
18307a84e134Smrg	    retval = (void *)FillOpaqueStippled;
18317a84e134Smrg	}
18327a84e134Smrg      break;
18337a84e134Smrg    case FILLRULE:
18347a84e134Smrg      if (*num_params == 1)
18357a84e134Smrg	{
18367a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "evenodd") == 0)
18377a84e134Smrg	    retval = (void *)EvenOddRule;
18387a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "winding") == 0)
18397a84e134Smrg	    retval = (void *)WindingRule;
18407a84e134Smrg	}
18417a84e134Smrg      break;
18427a84e134Smrg    case TILE:
18437a84e134Smrg      if (*num_params == 1)
18447a84e134Smrg	retval = (void *)XawLoadPixmap(params[0], screen, colormap, depth);
18457a84e134Smrg      if (retval == NULL)
18467a84e134Smrg	{
18477a84e134Smrg	  XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
18487a84e134Smrg					   XtRPixmap);
18497a84e134Smrg	  retval = XAWDL_CONVERT_ERROR;
18507a84e134Smrg	}
18517a84e134Smrg      break;
18527a84e134Smrg    case STIPPLE:
18537a84e134Smrg      if (*num_params == 1)
18547a84e134Smrg	retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1);
18557a84e134Smrg      if (retval == NULL)
18567a84e134Smrg	{
18577a84e134Smrg	  XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
18587a84e134Smrg					   XtRBitmap);
18597a84e134Smrg	  retval = XAWDL_CONVERT_ERROR;
18607a84e134Smrg	}
18617a84e134Smrg      break;
18627a84e134Smrg    case FUNCTION:
18637a84e134Smrg      if (*num_params == 1)
18647a84e134Smrg	{
18657a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "set") == 0)
18667a84e134Smrg	    retval = (void *)GXset;
18677a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "clear") == 0)
18687a84e134Smrg	    retval = (void *)GXclear;
18697a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "and") == 0)
18707a84e134Smrg	    retval = (void *)GXand;
18717a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "andreverse") == 0)
18727a84e134Smrg	    retval = (void *)GXandReverse;
18737a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "copy") == 0)
18747a84e134Smrg	    retval = (void *)GXcopy;
18757a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "andinverted") == 0)
18767a84e134Smrg	    retval = (void *)GXandInverted;
18777a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "noop") == 0)
18787a84e134Smrg	    retval = (void *)GXnoop;
18797a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "xor") == 0)
18807a84e134Smrg	    retval = (void *)GXxor;
18817a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "or") == 0)
18827a84e134Smrg	    retval = (void *)GXor;
18837a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "nor") == 0)
18847a84e134Smrg	    retval = (void *)GXnor;
18857a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "equiv") == 0)
18867a84e134Smrg	    retval = (void *)GXequiv;
18877a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "invert") == 0)
18887a84e134Smrg	    retval = (void *)GXinvert;
18897a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "orreverse") == 0)
18907a84e134Smrg	    retval = (void *)GXorReverse;
18917a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "copyinverted") == 0)
18927a84e134Smrg	    retval = (void *)GXcopyInverted;
18937a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "nand") == 0)
18947a84e134Smrg	    retval = (void *)GXnand;
18957a84e134Smrg	}
18967a84e134Smrg      break;
18977a84e134Smrg    case PLANEMASK:
18987a84e134Smrg      if (*num_params == 1)
18995ec34c4cSmrg	retval = (void *)read_int((char *)params[0], NULL);
19007a84e134Smrg      break;
19017a84e134Smrg    case DSTRING:
19027a84e134Smrg    case PSTRING:
19037a84e134Smrg      if (*num_params == 3)
19047a84e134Smrg	{
19057a84e134Smrg	  XawDLStringArgs *string = (XawDLStringArgs *)
19067a84e134Smrg		XtCalloc(1, sizeof(XawDLStringArgs));
19077a84e134Smrg
19085ec34c4cSmrg	  read_position((char *)params[0], &string->pos[0]);
19095ec34c4cSmrg	  read_position((char *)params[1], &string->pos[1]);
19107a84e134Smrg	  string->string = XtNewString(params[2]);
19115ec34c4cSmrg	  string->length = (int)strlen(string->string);
19127a84e134Smrg	  retval = string;
19137a84e134Smrg	}
19147a84e134Smrg      break;
19157a84e134Smrg    case FONT:
19167a84e134Smrg      if (*num_params == 1)
19177a84e134Smrg	retval = (void *)XLoadFont(DisplayOfScreen(screen), params[0]);
19187a84e134Smrg      break;
19197a84e134Smrg    case DASHES:
19207a84e134Smrg      if (*num_params && *num_params < 127)
19217a84e134Smrg	{
19227a84e134Smrg	  char *dashes;
19237a84e134Smrg
19247a84e134Smrg	  dashes = XtMalloc(*num_params + 1);
19257a84e134Smrg
19267a84e134Smrg	  for (i = 0; i < *num_params; i++)
19275ec34c4cSmrg	    dashes[i + 1] = (char)read_int((char *)params[i], NULL);
19285ec34c4cSmrg	  *dashes = (char)*num_params;
19297a84e134Smrg	  retval = dashes;
19307a84e134Smrg	}
19317a84e134Smrg      break;
19327a84e134Smrg    case SUBWMODE:
19337a84e134Smrg      if (*num_params == 1)
19347a84e134Smrg	{
19357a84e134Smrg	  if (XmuCompareISOLatin1(params[0], "clipbychildren") == 0)
19367a84e134Smrg	    retval = (void *)ClipByChildren;
19377a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "includeinferiors") == 0)
19387a84e134Smrg	    retval = (void *)IncludeInferiors;
19397a84e134Smrg	}
19407a84e134Smrg      break;
19417a84e134Smrg    case EXPOSURES:
19427a84e134Smrg      if (*num_params == 1)
19437a84e134Smrg	{
19445b16253fSmrg	  if (isdigit((unsigned char)params[0][0]) || params[0][0] == '+' || params[0][0] == '-')
19455ec34c4cSmrg	    retval = (void *)read_int((char *)params[0], NULL);
19467a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "true") == 0 ||
19477a84e134Smrg	    XmuCompareISOLatin1(params[0], "on") == 0)
19487a84e134Smrg	    retval = (void *)True;
19497a84e134Smrg	  else if (XmuCompareISOLatin1(params[0], "false") == 0 ||
19507a84e134Smrg	    XmuCompareISOLatin1(params[0], "off") == 0)
19517a84e134Smrg	    retval = (void *)False;
19527a84e134Smrg	}
19537a84e134Smrg      break;
19547a84e134Smrg    case CLIPMASK:
19557a84e134Smrg      if (*num_params == 1)
19567a84e134Smrg	retval = (void *)XawLoadPixmap(params[0], screen, colormap, 1);
19577a84e134Smrg      if (retval == NULL)
19587a84e134Smrg	{
19597a84e134Smrg	  retval = XAWDL_CONVERT_ERROR;
19607a84e134Smrg	  XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
19617a84e134Smrg					   XtRPixmap);
19627a84e134Smrg	}
19637a84e134Smrg      break;
19647a84e134Smrg    case COPYAREA:
19657a84e134Smrg    case COPYPLANE:
19667a84e134Smrg      if (*num_params > 2 && *num_params <= 7 + (id == COPYPLANE))
19677a84e134Smrg	{
19687a84e134Smrg	  XawDLCopyArgs *args = (XawDLCopyArgs *)
19697a84e134Smrg		XtCalloc(1, sizeof(XawDLCopyArgs));
19707a84e134Smrg
19717a84e134Smrg	  retval = args;
19727a84e134Smrg	  if (params[0][0] == '\0' || strcmp(params[0], ".") == 0)
19737a84e134Smrg	    args->pixmap = NULL;
19747a84e134Smrg	  else
19757a84e134Smrg	   {
19767a84e134Smrg	     args->pixmap = XawLoadPixmap(params[0], screen, colormap, id == COPYPLANE ? 1 : depth);
19777a84e134Smrg	     if (args->pixmap == NULL)
19787a84e134Smrg	      {
19797a84e134Smrg		XtDisplayStringConversionWarning(DisplayOfScreen(screen), (String)params[0],
19807a84e134Smrg						 XtRBitmap);
19817a84e134Smrg		retval = XAWDL_CONVERT_ERROR;
19827a84e134Smrg		XtFree((char *)args);
19837a84e134Smrg	      }
19847a84e134Smrg	  }
19857a84e134Smrg	  if (retval != XAWDL_CONVERT_ERROR)
19867a84e134Smrg	    {
19877a84e134Smrg	      for (i = 1; i < *num_params && i < 7; i++)
19885ec34c4cSmrg		read_position((char *)params[i], &args->pos[i - 1]);
19897a84e134Smrg	      if (*num_params > 7)
19905ec34c4cSmrg		args->plane = (int)read_int((char *)params[7], NULL);
19917a84e134Smrg	    }
19927a84e134Smrg	}
19937a84e134Smrg      break;
19947a84e134Smrg    case IMAGE:
19957a84e134Smrg      if (*num_params > 2 && *num_params <= 7)
19967a84e134Smrg	{
19977a84e134Smrg	  XawDLImageArgs *args = (XawDLImageArgs *)
19987a84e134Smrg		XtCalloc(1, sizeof(XawDLImageArgs));
19997a84e134Smrg
20007a84e134Smrg	  retval = args;
20017a84e134Smrg	  args->pixmap = XawLoadPixmap(params[0], screen, colormap, depth);
20027a84e134Smrg	  if (args->pixmap == NULL)
20037a84e134Smrg	    {
20047a84e134Smrg	      XtDisplayStringConversionWarning(DisplayOfScreen(screen),
20057a84e134Smrg					       (String)params[0], XtRPixmap);
20067a84e134Smrg	      retval = XAWDL_CONVERT_ERROR;
20077a84e134Smrg	      XtFree((char *)args);
20087a84e134Smrg	    }
20097a84e134Smrg	  else
20107a84e134Smrg	    {
20117a84e134Smrg	      args->depth = depth;
20127a84e134Smrg	      for (i = 1; i < *num_params && i < 5; i++)
20135ec34c4cSmrg		read_position((char *)params[i], &args->pos[i - 1]);
20147a84e134Smrg	    }
20157a84e134Smrg	}
20167a84e134Smrg      break;
20177a84e134Smrg    }
20187a84e134Smrg
20197a84e134Smrg  return (retval);
20207a84e134Smrg}
20217a84e134Smrg
20227a84e134Smrg/* ARGSUSED */
20237a84e134Smrgstatic void *
20245ec34c4cSmrg_Xaw_Xlib_DataInitProc(String class_name _X_UNUSED,
20255ec34c4cSmrg		       Screen *screen _X_UNUSED, Colormap colormap _X_UNUSED, int depth)
20267a84e134Smrg{
20277a84e134Smrg  XawXlibData *data;
20287a84e134Smrg  Window tmp_win;
20297a84e134Smrg
20307a84e134Smrg  data = (XawXlibData *)XtMalloc(sizeof(XawXlibData));
20317a84e134Smrg
20327a84e134Smrg  tmp_win = XCreateWindow(DisplayOfScreen(screen),
20337a84e134Smrg			  RootWindowOfScreen(screen),
20347a84e134Smrg			  0, 0, 1, 1, 1, depth,
2035775e7de9Smrg			  InputOutput, (Visual *)CopyFromParent, 0, NULL);
20367a84e134Smrg  data->mask = 0;
20377a84e134Smrg  data->gc = XCreateGC(DisplayOfScreen(screen), tmp_win, 0, &data->values);
20387a84e134Smrg  XDestroyWindow(DisplayOfScreen(screen), tmp_win);
20397a84e134Smrg  data->shape = Complex;
20407a84e134Smrg  data->mode = CoordModeOrigin;
20417a84e134Smrg  data->dashes = NULL;
20427a84e134Smrg
20437a84e134Smrg  return ((void *)data);
20447a84e134Smrg}
20457a84e134Smrg
20467a84e134Smrg/* ARGSUSED */
20477a84e134Smrgstatic void
20485ec34c4cSmrg_Xaw_Xlib_ArgsDestructor(Display *display _X_UNUSED, String proc_name, XtPointer args,
20495ec34c4cSmrg			 String *params _X_UNUSED, Cardinal *num_params _X_UNUSED)
20507a84e134Smrg{
20517a84e134Smrg  Cardinal id;
20527a84e134Smrg  Dl_init *init;
20537a84e134Smrg
20547a84e134Smrg  init = (Dl_init *)bsearch(proc_name, dl_init,
20557a84e134Smrg			    sizeof(dl_init) / sizeof(dl_init[0]),
20567a84e134Smrg			    sizeof(dl_init[0]),
20577a84e134Smrg			    bcmp_cvt_proc);
20587a84e134Smrg
20597a84e134Smrg  id = init->id;
20607a84e134Smrg
20617a84e134Smrg  switch (id)
20627a84e134Smrg    {
20637a84e134Smrg    case LINE:
20647a84e134Smrg    case DRECT:
20657a84e134Smrg    case FRECT:
20667a84e134Smrg    case DARC:
20677a84e134Smrg    case FARC:
20687a84e134Smrg    case POINT:
20697a84e134Smrg    case TSORIGIN:
20707a84e134Smrg    case DASHES:
20717a84e134Smrg    case CLIPORIGIN:
20727a84e134Smrg    case COPYAREA:
20737a84e134Smrg    case COPYPLANE:
20747a84e134Smrg    case IMAGE:
20757a84e134Smrg      XtFree(args);
20767a84e134Smrg      break;
20777a84e134Smrg    case DSTRING:
20787a84e134Smrg    case PSTRING:
20797a84e134Smrg      {
20807a84e134Smrg	XawDLStringArgs *string = (XawDLStringArgs *)args;
20817a84e134Smrg	XtFree(string->string);
20827a84e134Smrg	XtFree(args);
20837a84e134Smrg      } break;
20847a84e134Smrg    case DLINES:
20857a84e134Smrg    case FPOLY:
20867a84e134Smrg    case POINTS:
20877a84e134Smrg    case SEGMENTS:
20887a84e134Smrg    case CLIPRECTS:
20897a84e134Smrg      {
20907a84e134Smrg	XawDLPositionPtr *ptr = (XawDLPositionPtr *)args;
20917a84e134Smrg
20927a84e134Smrg	XtFree((char *)ptr->pos);
20937a84e134Smrg	XtFree(args);
20947a84e134Smrg      } break;
20957a84e134Smrg    }
20967a84e134Smrg}
20977a84e134Smrg
20987a84e134Smrg/* ARGSUSED */
20997a84e134Smrgstatic void
21005ec34c4cSmrg_Xaw_Xlib_DataDestructor(Display *display, String class_name _X_UNUSED, XtPointer data)
21017a84e134Smrg{
21027a84e134Smrg  if (data)
21037a84e134Smrg    {
21047a84e134Smrg      XawXlibData *xdata = (XawXlibData *)data;
21057a84e134Smrg
21067a84e134Smrg      XFreeGC(display, xdata->gc);
21077a84e134Smrg      if (xdata->dashes)
21087a84e134Smrg	XtFree(xdata->dashes);
21097a84e134Smrg      XtFree((char *)data);
21107a84e134Smrg    }
21117a84e134Smrg}
21127a84e134Smrg
21137a84e134Smrg/* Start of DLInfo Management Functions */
21147a84e134Smrgstatic int
21157a84e134Smrgqcmp_dlist_info(register _Xconst void *left, register _Xconst void *right)
21167a84e134Smrg{
21177a84e134Smrg  return (strcmp((*(XawDLInfo **)left)->name, (*(XawDLInfo **)right)->name));
21187a84e134Smrg}
21197a84e134Smrg
21207a84e134SmrgBool XawDeclareDisplayListProc(XawDLClass *lc, String name,
21217a84e134Smrg				  XawDisplayListProc proc)
21227a84e134Smrg{
21237a84e134Smrg  XawDLInfo *info;
21247a84e134Smrg
21257a84e134Smrg  if (!lc || !proc || !name || name[0] == '\0')
21267a84e134Smrg    return (False);
21277a84e134Smrg
21287a84e134Smrg  if ((info = _XawFindDLInfo(lc, name)) != NULL)
21297a84e134Smrg    /* Since the data structures to the displayList classes are(should be)
21307a84e134Smrg     * opaque, it is not a good idea to allow overriding a displayList
21317a84e134Smrg     * procedure; it's better to choose another name or class name!
21327a84e134Smrg     */
21337a84e134Smrg    return (False);
21347a84e134Smrg
21357a84e134Smrg  info = (XawDLInfo *)XtMalloc(sizeof(XawDLInfo));
21367a84e134Smrg  info->name = XtNewString(name);
21377a84e134Smrg  info->qname = XrmStringToQuark(info->name);
21387a84e134Smrg  info->proc = proc;
21397a84e134Smrg
21407a84e134Smrg  if (!lc->num_infos)
21417a84e134Smrg    {
21427a84e134Smrg      lc->num_infos = 1;
21437a84e134Smrg      lc->infos = (XawDLInfo **)XtMalloc(sizeof(XawDLInfo*));
21447a84e134Smrg    }
21457a84e134Smrg  else
21467a84e134Smrg    {
21477a84e134Smrg      ++lc->num_infos;
21487a84e134Smrg      lc->infos = (XawDLInfo **)
21495ec34c4cSmrg	XtRealloc((char *)lc->infos, (Cardinal)(sizeof(XawDLInfo*) * (size_t)lc->num_infos));
21507a84e134Smrg    }
21517a84e134Smrg  lc->infos[lc->num_infos - 1] = info;
21527a84e134Smrg
21537a84e134Smrg  if (lc->num_infos > 1)
21547a84e134Smrg    qsort(lc->infos, lc->num_infos, sizeof(XawDLInfo*), qcmp_dlist_info);
21557a84e134Smrg
21567a84e134Smrg  return (True);
21577a84e134Smrg}
21587a84e134Smrg
21597a84e134Smrgstatic int
21607a84e134Smrgbcmp_dlist_info(register _Xconst void *string,
21617a84e134Smrg		register _Xconst void *dlinfo)
21627a84e134Smrg{
21637a84e134Smrg  return (strcmp((String)string, (*(XawDLClass **)dlinfo)->name));
21647a84e134Smrg}
21657a84e134Smrg
21667a84e134Smrgstatic XawDLInfo *
21677a84e134Smrg_XawFindDLInfo(XawDLClass *lc, String name)
21687a84e134Smrg{
21697a84e134Smrg  XawDLInfo **info;
21707a84e134Smrg
21717a84e134Smrg  if (!lc->infos)
21727a84e134Smrg    return (NULL);
21737a84e134Smrg
21747a84e134Smrg  info = (XawDLInfo **)bsearch(name, lc->infos, lc->num_infos,
21757a84e134Smrg			       sizeof(XawDLInfo*), bcmp_dlist_info);
21767a84e134Smrg
21777a84e134Smrg  return (info ? *info : NULL);
21787a84e134Smrg}
21797a84e134Smrg
21807a84e134Smrg/* Start of DLClass Management Functions */
21817a84e134SmrgXawDLClass *
21827a84e134SmrgXawGetDisplayListClass(String name)
21837a84e134Smrg{
21847a84e134Smrg  return (_XawFindDLClass(name));
21857a84e134Smrg}
21867a84e134Smrg
21877a84e134Smrgstatic int
21887a84e134Smrgqcmp_dlist_class(register _Xconst void *left, register _Xconst void *right)
21897a84e134Smrg{
21907a84e134Smrg  return (strcmp((*(XawDLClass **)left)->name, (*(XawDLClass **)right)->name));
21917a84e134Smrg}
21927a84e134Smrg
21937a84e134SmrgXawDLClass *
21947a84e134SmrgXawCreateDisplayListClass(String name,
21957a84e134Smrg			  XawDLArgsInitProc args_init,
21967a84e134Smrg			  XawDLArgsDestructor args_destructor,
21977a84e134Smrg			  XawDLDataInitProc data_init,
21987a84e134Smrg			  XawDLDataDestructor data_destructor)
21997a84e134Smrg{
22007a84e134Smrg  XawDLClass *lc;
22017a84e134Smrg
22027a84e134Smrg  if (!name || name[0] == '\0')
22037a84e134Smrg    return (NULL);
22047a84e134Smrg
22057a84e134Smrg  lc = (XawDLClass *)XtMalloc(sizeof(XawDLClass));
22067a84e134Smrg  lc->name = XtNewString(name);
22077a84e134Smrg  lc->infos = NULL;
22087a84e134Smrg  lc->num_infos = 0;
22097a84e134Smrg  lc->args_init = args_init;
22107a84e134Smrg  lc->args_destructor = args_destructor;
22117a84e134Smrg  lc->data_init = data_init;
22127a84e134Smrg  lc->data_destructor = data_destructor;
22137a84e134Smrg
22147a84e134Smrg  if (!classes)
22157a84e134Smrg    {
22167a84e134Smrg      num_classes = 1;
22177a84e134Smrg      classes = (XawDLClass **)XtMalloc(sizeof(XawDLClass));
22187a84e134Smrg    }
22197a84e134Smrg  else
22207a84e134Smrg    {
22217a84e134Smrg      ++num_classes;
22227a84e134Smrg      classes = (XawDLClass **)XtRealloc((char *)classes,
22235ec34c4cSmrg					 (Cardinal)(sizeof(XawDLClass) * (size_t)num_classes));
22247a84e134Smrg    }
22257a84e134Smrg  classes[num_classes - 1] = lc;
22267a84e134Smrg
22277a84e134Smrg  if (num_classes > 1)
22287a84e134Smrg    qsort(&classes[0], num_classes, sizeof(XawDLClass*), qcmp_dlist_class);
22297a84e134Smrg
22307a84e134Smrg  return (lc);
22317a84e134Smrg}
22327a84e134Smrg
22337a84e134Smrgstatic int
22347a84e134Smrgbcmp_dlist_class(register _Xconst void *string,
22357a84e134Smrg		 register _Xconst void *dlist)
22367a84e134Smrg{
22377a84e134Smrg  return (strcmp((String)string, (*(XawDLClass **)dlist)->name));
22387a84e134Smrg}
22397a84e134Smrg
22407a84e134Smrgstatic XawDLClass *
22417a84e134Smrg_XawFindDLClass(String name)
22427a84e134Smrg{
22437a84e134Smrg  XawDLClass **lc;
22447a84e134Smrg
22457a84e134Smrg  if (!classes)
22467a84e134Smrg    return (NULL);
22477a84e134Smrg
22487a84e134Smrg  lc = (XawDLClass **)bsearch(name, &classes[0], num_classes,
22497a84e134Smrg			      sizeof(XawDLClass*), bcmp_dlist_class);
22507a84e134Smrg
22517a84e134Smrg  return (lc ? *lc : NULL);
22527a84e134Smrg}
22537a84e134Smrg
22547a84e134Smrg#endif /* OLDXAW */
2255