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