Converters.c revision 1477040f
1444c061aSmrg/* $Xorg: Converters.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */ 2444c061aSmrg 3444c061aSmrg/*********************************************************** 41477040fSmrgCopyright 1993 Sun Microsystems, Inc. All rights reserved. 51477040fSmrg 61477040fSmrgPermission is hereby granted, free of charge, to any person obtaining a 71477040fSmrgcopy of this software and associated documentation files (the "Software"), 81477040fSmrgto deal in the Software without restriction, including without limitation 91477040fSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense, 101477040fSmrgand/or sell copies of the Software, and to permit persons to whom the 111477040fSmrgSoftware is furnished to do so, subject to the following conditions: 121477040fSmrg 131477040fSmrgThe above copyright notice and this permission notice (including the next 141477040fSmrgparagraph) shall be included in all copies or substantial portions of the 151477040fSmrgSoftware. 161477040fSmrg 171477040fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 181477040fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 191477040fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 201477040fSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 211477040fSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 221477040fSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 231477040fSmrgDEALINGS IN THE SOFTWARE. 241477040fSmrg 251477040fSmrgCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. 26444c061aSmrg 27444c061aSmrg All Rights Reserved 28444c061aSmrg 29444c061aSmrgPermission to use, copy, modify, and distribute this software and its 30444c061aSmrgdocumentation for any purpose and without fee is hereby granted, 31444c061aSmrgprovided that the above copyright notice appear in all copies and that 32444c061aSmrgboth that copyright notice and this permission notice appear in 331477040fSmrgsupporting documentation, and that the name of Digital not be 34444c061aSmrgused in advertising or publicity pertaining to distribution of the 35444c061aSmrgsoftware without specific, written prior permission. 36444c061aSmrg 37444c061aSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 38444c061aSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 39444c061aSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 40444c061aSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 41444c061aSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 42444c061aSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 43444c061aSmrgSOFTWARE. 44444c061aSmrg 45444c061aSmrg******************************************************************/ 46444c061aSmrg/* $XFree86: xc/lib/Xt/Converters.c,v 3.14tsi Exp $ */ 47444c061aSmrg 48444c061aSmrg/* 49444c061aSmrg 50444c061aSmrgCopyright 1987, 1988, 1994, 1998 The Open Group 51444c061aSmrg 52444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its 53444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that 54444c061aSmrgthe above copyright notice appear in all copies and that both that 55444c061aSmrgcopyright notice and this permission notice appear in supporting 56444c061aSmrgdocumentation. 57444c061aSmrg 58444c061aSmrgThe above copyright notice and this permission notice shall be included in 59444c061aSmrgall copies or substantial portions of the Software. 60444c061aSmrg 61444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 62444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 63444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 64444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 65444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 66444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 67444c061aSmrg 68444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be 69444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings 70444c061aSmrgin this Software without prior written authorization from The Open Group. 71444c061aSmrg 72444c061aSmrg*/ 73444c061aSmrg 74444c061aSmrg/*LINTLIBRARY*/ 75444c061aSmrg/* Conversion.c - implementations of resource type conversion procs */ 76444c061aSmrg 77444c061aSmrg#ifdef HAVE_CONFIG_H 78444c061aSmrg#include <config.h> 79444c061aSmrg#endif 80444c061aSmrg#include "IntrinsicI.h" 81444c061aSmrg#include "StringDefs.h" 82444c061aSmrg#include "Shell.h" 83444c061aSmrg#include <stdio.h> 84444c061aSmrg#include <X11/cursorfont.h> 85444c061aSmrg#include <X11/keysym.h> 86444c061aSmrg#include <X11/Xlocale.h> 87444c061aSmrg#include <errno.h> /* for StringToDirectoryString */ 88444c061aSmrg 89444c061aSmrg#ifdef __UNIXOS2__ 90444c061aSmrg#define IsNewline(str) ((str) == '\n' || (str) == '\r') 91444c061aSmrg#define IsWhitespace(str) ((str)== ' ' || (str) == '\t' || (str) == '\r') 92444c061aSmrg#else 93444c061aSmrg#define IsNewline(str) ((str) == '\n') 94444c061aSmrg#define IsWhitespace(str) ((str)== ' ' || (str) == '\t') 95444c061aSmrg#endif 96444c061aSmrg 97444c061aSmrgstatic const String XtNwrongParameters = "wrongParameters"; 98444c061aSmrgstatic const String XtNconversionError = "conversionError"; 99444c061aSmrgstatic const String XtNmissingCharsetList = "missingCharsetList"; 100444c061aSmrg 101444c061aSmrg/* Representation types */ 102444c061aSmrg 103444c061aSmrg#define XtQAtom XrmPermStringToQuark(XtRAtom) 104444c061aSmrg#define XtQCommandArgArray XrmPermStringToQuark(XtRCommandArgArray) 105444c061aSmrg#define XtQCursor XrmPermStringToQuark(XtRCursor) 106444c061aSmrg#define XtQDirectoryString XrmPermStringToQuark(XtRDirectoryString) 107444c061aSmrg#define XtQDisplay XrmPermStringToQuark(XtRDisplay) 108444c061aSmrg#define XtQFile XrmPermStringToQuark(XtRFile) 109444c061aSmrg#define XtQFloat XrmPermStringToQuark(XtRFloat) 110444c061aSmrg#define XtQInitialState XrmPermStringToQuark(XtRInitialState) 111444c061aSmrg#define XtQPixmap XrmPermStringToQuark(XtRPixmap) 112444c061aSmrg#define XtQRestartStyle XrmPermStringToQuark(XtRRestartStyle) 113444c061aSmrg#define XtQShort XrmPermStringToQuark(XtRShort) 114444c061aSmrg#define XtQUnsignedChar XrmPermStringToQuark(XtRUnsignedChar) 115444c061aSmrg#define XtQVisual XrmPermStringToQuark(XtRVisual) 116444c061aSmrg 117444c061aSmrgstatic XrmQuark XtQBool; 118444c061aSmrgstatic XrmQuark XtQBoolean; 119444c061aSmrgstatic XrmQuark XtQColor; 120444c061aSmrgstatic XrmQuark XtQDimension; 121444c061aSmrgstatic XrmQuark XtQFont; 122444c061aSmrgstatic XrmQuark XtQFontSet; 123444c061aSmrgstatic XrmQuark XtQFontStruct; 124444c061aSmrgstatic XrmQuark XtQGravity; 125444c061aSmrgstatic XrmQuark XtQInt; 126444c061aSmrgstatic XrmQuark XtQPixel; 127444c061aSmrgstatic XrmQuark XtQPosition; 128444c061aSmrg#ifdef __UNIXOS2__ 129444c061aSmrgXrmQuark _XtQString = 0; 130444c061aSmrg#else 131444c061aSmrgXrmQuark _XtQString; 132444c061aSmrg#endif 133444c061aSmrg 134444c061aSmrgvoid _XtConvertInitialize(void) 135444c061aSmrg{ 136444c061aSmrg XtQBool = XrmPermStringToQuark(XtRBool); 137444c061aSmrg XtQBoolean = XrmPermStringToQuark(XtRBoolean); 138444c061aSmrg XtQColor = XrmPermStringToQuark(XtRColor); 139444c061aSmrg XtQDimension = XrmPermStringToQuark(XtRDimension); 140444c061aSmrg XtQFont = XrmPermStringToQuark(XtRFont); 141444c061aSmrg XtQFontSet = XrmPermStringToQuark(XtRFontSet); 142444c061aSmrg XtQFontStruct = XrmPermStringToQuark(XtRFontStruct); 143444c061aSmrg XtQGravity = XrmPermStringToQuark(XtRGravity); 144444c061aSmrg XtQInt = XrmPermStringToQuark(XtRInt); 145444c061aSmrg XtQPixel = XrmPermStringToQuark(XtRPixel); 146444c061aSmrg XtQPosition = XrmPermStringToQuark(XtRPosition); 147444c061aSmrg _XtQString = XrmPermStringToQuark(XtRString); 148444c061aSmrg} 149444c061aSmrg 150444c061aSmrg#define donestr(type, value, tstr) \ 151444c061aSmrg { \ 152444c061aSmrg if (toVal->addr != NULL) { \ 153444c061aSmrg if (toVal->size < sizeof(type)) { \ 154444c061aSmrg toVal->size = sizeof(type); \ 155444c061aSmrg XtDisplayStringConversionWarning(dpy, \ 156444c061aSmrg (char*) fromVal->addr, tstr); \ 157444c061aSmrg return False; \ 158444c061aSmrg } \ 159444c061aSmrg *(type*)(toVal->addr) = (value); \ 160444c061aSmrg } \ 161444c061aSmrg else { \ 162444c061aSmrg static type static_val; \ 163444c061aSmrg static_val = (value); \ 164444c061aSmrg toVal->addr = (XPointer)&static_val; \ 165444c061aSmrg } \ 166444c061aSmrg toVal->size = sizeof(type); \ 167444c061aSmrg return True; \ 168444c061aSmrg } 169444c061aSmrg 170444c061aSmrg#define done(type, value) \ 171444c061aSmrg { \ 172444c061aSmrg if (toVal->addr != NULL) { \ 173444c061aSmrg if (toVal->size < sizeof(type)) { \ 174444c061aSmrg toVal->size = sizeof(type); \ 175444c061aSmrg return False; \ 176444c061aSmrg } \ 177444c061aSmrg *(type*)(toVal->addr) = (value); \ 178444c061aSmrg } \ 179444c061aSmrg else { \ 180444c061aSmrg static type static_val; \ 181444c061aSmrg static_val = (value); \ 182444c061aSmrg toVal->addr = (XPointer)&static_val; \ 183444c061aSmrg } \ 184444c061aSmrg toVal->size = sizeof(type); \ 185444c061aSmrg return True; \ 186444c061aSmrg } 187444c061aSmrg 188444c061aSmrgvoid XtDisplayStringConversionWarning( 189444c061aSmrg Display* dpy, 190444c061aSmrg _Xconst char* from, 191444c061aSmrg _Xconst char* toType 192444c061aSmrg ) 193444c061aSmrg{ 194444c061aSmrg#ifndef NO_MIT_HACKS 195444c061aSmrg /* Allow suppression of conversion warnings. %%% Not specified. */ 196444c061aSmrg 197444c061aSmrg static enum {Check, Report, Ignore} report_it = Check; 198444c061aSmrg XtAppContext app = XtDisplayToApplicationContext(dpy); 199444c061aSmrg 200444c061aSmrg LOCK_APP(app); 201444c061aSmrg LOCK_PROCESS; 202444c061aSmrg if (report_it == Check) { 203444c061aSmrg XrmDatabase rdb = XtDatabase(dpy); 204444c061aSmrg XrmName xrm_name[2]; 205444c061aSmrg XrmClass xrm_class[2]; 206444c061aSmrg XrmRepresentation rep_type; 207444c061aSmrg XrmValue value; 208444c061aSmrg xrm_name[0] = XrmPermStringToQuark( "stringConversionWarnings" ); 209444c061aSmrg xrm_name[1] = 0; 210444c061aSmrg xrm_class[0] = XrmPermStringToQuark( "StringConversionWarnings" ); 211444c061aSmrg xrm_class[1] = 0; 212444c061aSmrg if (XrmQGetResource( rdb, xrm_name, xrm_class, 213444c061aSmrg &rep_type, &value )) 214444c061aSmrg { 215444c061aSmrg if (rep_type == XtQBoolean) 216444c061aSmrg report_it = *(Boolean*)value.addr ? Report : Ignore; 217444c061aSmrg else if (rep_type == _XtQString) { 218444c061aSmrg XrmValue toVal; 219444c061aSmrg Boolean report; 220444c061aSmrg toVal.addr = (XPointer)&report; 221444c061aSmrg toVal.size = sizeof(Boolean); 222444c061aSmrg if (XtCallConverter(dpy, XtCvtStringToBoolean, (XrmValuePtr)NULL, 223444c061aSmrg (Cardinal)0, &value, &toVal, 224444c061aSmrg (XtCacheRef*)NULL)) 225444c061aSmrg report_it = report ? Report : Ignore; 226444c061aSmrg } 227444c061aSmrg else report_it = Report; 228444c061aSmrg } 229444c061aSmrg else report_it = Report; 230444c061aSmrg } 231444c061aSmrg 232444c061aSmrg if (report_it == Report) { 233444c061aSmrg#endif /* ifndef NO_MIT_HACKS */ 234444c061aSmrg String params[2]; 235444c061aSmrg Cardinal num_params = 2; 236444c061aSmrg params[0] = (String)from; 237444c061aSmrg params[1] = (String)toType; 238444c061aSmrg XtAppWarningMsg(app, 239444c061aSmrg XtNconversionError,"string",XtCXtToolkitError, 240444c061aSmrg "Cannot convert string \"%s\" to type %s", 241444c061aSmrg params,&num_params); 242444c061aSmrg#ifndef NO_MIT_HACKS 243444c061aSmrg } 244444c061aSmrg#endif /* ifndef NO_MIT_HACKS */ 245444c061aSmrg UNLOCK_PROCESS; 246444c061aSmrg UNLOCK_APP(app); 247444c061aSmrg} 248444c061aSmrg 249444c061aSmrgvoid XtStringConversionWarning( 250444c061aSmrg _Xconst char* from, 251444c061aSmrg _Xconst char* toType 252444c061aSmrg ) 253444c061aSmrg{ 254444c061aSmrg String params[2]; 255444c061aSmrg Cardinal num_params = 2; 256444c061aSmrg params[0] = (String)from; 257444c061aSmrg params[1] = (String)toType; 258444c061aSmrg XtWarningMsg(XtNconversionError,"string",XtCXtToolkitError, 259444c061aSmrg "Cannot convert string \"%s\" to type %s", 260444c061aSmrg params,&num_params); 261444c061aSmrg} 262444c061aSmrg 263444c061aSmrgstatic int CompareISOLatin1(char *, char *); 264444c061aSmrg 265444c061aSmrg 266444c061aSmrgstatic Boolean IsInteger( 267444c061aSmrg String string, 268444c061aSmrg int *value) 269444c061aSmrg{ 270444c061aSmrg Boolean foundDigit = False; 271444c061aSmrg Boolean isNegative = False; 272444c061aSmrg Boolean isPositive = False; 273444c061aSmrg int val = 0; 274444c061aSmrg char ch; 275444c061aSmrg /* skip leading whitespace */ 276444c061aSmrg#ifndef __UNIXOS2__ 277444c061aSmrg while ((ch = *string) == ' ' || ch == '\t') string++; 278444c061aSmrg#else 279444c061aSmrg while ((ch = *string) == ' ' || ch == '\t' || ch == '\r') string++; 280444c061aSmrg#endif 281444c061aSmrg while ((ch = *string++)) { 282444c061aSmrg if (ch >= '0' && ch <= '9') { 283444c061aSmrg val *= 10; 284444c061aSmrg val += ch - '0'; 285444c061aSmrg foundDigit = True; 286444c061aSmrg continue; 287444c061aSmrg } 288444c061aSmrg if (IsWhitespace(ch)) { 289444c061aSmrg if (!foundDigit) return False; 290444c061aSmrg /* make sure only trailing whitespace */ 291444c061aSmrg while ((ch = *string++)) { 292444c061aSmrg if (!IsWhitespace(ch)) 293444c061aSmrg return False; 294444c061aSmrg } 295444c061aSmrg break; 296444c061aSmrg } 297444c061aSmrg if (ch == '-' && !foundDigit && !isNegative && !isPositive) { 298444c061aSmrg isNegative = True; 299444c061aSmrg continue; 300444c061aSmrg } 301444c061aSmrg if (ch == '+' && !foundDigit && !isNegative && !isPositive) { 302444c061aSmrg isPositive = True; 303444c061aSmrg continue; 304444c061aSmrg } 305444c061aSmrg return False; 306444c061aSmrg } 307444c061aSmrg if (ch == '\0') { 308444c061aSmrg if (isNegative) 309444c061aSmrg *value = -val; 310444c061aSmrg else 311444c061aSmrg *value = val; 312444c061aSmrg return True; 313444c061aSmrg } 314444c061aSmrg return False; 315444c061aSmrg} 316444c061aSmrg 317444c061aSmrg 318444c061aSmrg/*ARGSUSED*/ 319444c061aSmrgBoolean XtCvtIntToBoolean( 320444c061aSmrg Display* dpy, 321444c061aSmrg XrmValuePtr args, 322444c061aSmrg Cardinal *num_args, 323444c061aSmrg XrmValuePtr fromVal, 324444c061aSmrg XrmValuePtr toVal, 325444c061aSmrg XtPointer *closure_ret) 326444c061aSmrg{ 327444c061aSmrg if (*num_args != 0) 328444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 329444c061aSmrg XtNwrongParameters,"cvtIntToBoolean",XtCXtToolkitError, 330444c061aSmrg "Integer to Boolean conversion needs no extra arguments", 331444c061aSmrg (String *)NULL, (Cardinal *)NULL); 332444c061aSmrg done(Boolean, (*(int *)fromVal->addr != 0)); 333444c061aSmrg} 334444c061aSmrg 335444c061aSmrg 336444c061aSmrg/*ARGSUSED*/ 337444c061aSmrgBoolean XtCvtIntToShort( 338444c061aSmrg Display* dpy, 339444c061aSmrg XrmValuePtr args, 340444c061aSmrg Cardinal *num_args, 341444c061aSmrg XrmValuePtr fromVal, 342444c061aSmrg XrmValuePtr toVal, 343444c061aSmrg XtPointer *closure_ret) 344444c061aSmrg{ 345444c061aSmrg if (*num_args != 0) 346444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 347444c061aSmrg XtNwrongParameters,"cvtIntToShort",XtCXtToolkitError, 348444c061aSmrg "Integer to Short conversion needs no extra arguments", 349444c061aSmrg (String *)NULL, (Cardinal *)NULL); 350444c061aSmrg done(short, (*(int *)fromVal->addr)); 351444c061aSmrg} 352444c061aSmrg 353444c061aSmrg 354444c061aSmrg/*ARGSUSED*/ 355444c061aSmrgBoolean XtCvtStringToBoolean( 356444c061aSmrg Display* dpy, 357444c061aSmrg XrmValuePtr args, 358444c061aSmrg Cardinal *num_args, 359444c061aSmrg XrmValuePtr fromVal, 360444c061aSmrg XrmValuePtr toVal, 361444c061aSmrg XtPointer *closure_ret) 362444c061aSmrg{ 363444c061aSmrg String str = (String)fromVal->addr; 364444c061aSmrg if (*num_args != 0) 365444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 366444c061aSmrg XtNwrongParameters,"cvtStringToBoolean",XtCXtToolkitError, 367444c061aSmrg "String to Boolean conversion needs no extra arguments", 368444c061aSmrg (String *)NULL, (Cardinal *)NULL); 369444c061aSmrg 370444c061aSmrg if ( (CompareISOLatin1(str, "true") == 0) 371444c061aSmrg || (CompareISOLatin1(str, "yes") == 0) 372444c061aSmrg || (CompareISOLatin1(str, "on") == 0) 373444c061aSmrg || (CompareISOLatin1(str, "1") == 0)) donestr( Boolean, True, XtRBoolean ); 374444c061aSmrg 375444c061aSmrg if ( (CompareISOLatin1(str, "false") == 0) 376444c061aSmrg || (CompareISOLatin1(str, "no") == 0) 377444c061aSmrg || (CompareISOLatin1(str, "off") == 0) 378444c061aSmrg || (CompareISOLatin1(str, "0") == 0)) donestr( Boolean, False, XtRBoolean ); 379444c061aSmrg 380444c061aSmrg XtDisplayStringConversionWarning(dpy, str, XtRBoolean); 381444c061aSmrg return False; 382444c061aSmrg} 383444c061aSmrg 384444c061aSmrg 385444c061aSmrg/*ARGSUSED*/ 386444c061aSmrgBoolean XtCvtIntToBool( 387444c061aSmrg Display* dpy, 388444c061aSmrg XrmValuePtr args, 389444c061aSmrg Cardinal *num_args, 390444c061aSmrg XrmValuePtr fromVal, 391444c061aSmrg XrmValuePtr toVal, 392444c061aSmrg XtPointer *closure_ret) 393444c061aSmrg{ 394444c061aSmrg if (*num_args != 0) 395444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 396444c061aSmrg XtNwrongParameters,"cvtIntToBool",XtCXtToolkitError, 397444c061aSmrg "Integer to Bool conversion needs no extra arguments", 398444c061aSmrg (String *)NULL, (Cardinal *)NULL); 399444c061aSmrg done(Bool, (*(int *)fromVal->addr != 0)); 400444c061aSmrg} 401444c061aSmrg 402444c061aSmrg 403444c061aSmrg/*ARGSUSED*/ 404444c061aSmrgBoolean XtCvtStringToBool( 405444c061aSmrg Display* dpy, 406444c061aSmrg XrmValuePtr args, 407444c061aSmrg Cardinal *num_args, 408444c061aSmrg XrmValuePtr fromVal, 409444c061aSmrg XrmValuePtr toVal, 410444c061aSmrg XtPointer *closure_ret) 411444c061aSmrg{ 412444c061aSmrg String str = (String)fromVal->addr; 413444c061aSmrg if (*num_args != 0) 414444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 415444c061aSmrg XtNwrongParameters,"cvtStringToBool", 416444c061aSmrg XtCXtToolkitError, 417444c061aSmrg "String to Bool conversion needs no extra arguments", 418444c061aSmrg (String *)NULL, (Cardinal *)NULL); 419444c061aSmrg 420444c061aSmrg if ( (CompareISOLatin1(str, "true") == 0) 421444c061aSmrg || (CompareISOLatin1(str, "yes") == 0) 422444c061aSmrg || (CompareISOLatin1(str, "on") == 0) 423444c061aSmrg || (CompareISOLatin1(str, "1") == 0)) donestr( Bool, True, XtRBool ); 424444c061aSmrg 425444c061aSmrg if ( (CompareISOLatin1(str, "false") == 0) 426444c061aSmrg || (CompareISOLatin1(str, "no") == 0) 427444c061aSmrg || (CompareISOLatin1(str, "off") == 0) 428444c061aSmrg || (CompareISOLatin1(str, "0") == 0)) donestr( Bool, False, XtRBool ); 429444c061aSmrg 430444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRBool); 431444c061aSmrg return False; 432444c061aSmrg} 433444c061aSmrg 434444c061aSmrgXtConvertArgRec const colorConvertArgs[] = { 435444c061aSmrg {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen), 436444c061aSmrg sizeof(Screen *)}, 437444c061aSmrg {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap), 438444c061aSmrg sizeof(Colormap)} 439444c061aSmrg}; 440444c061aSmrg 441444c061aSmrg 442444c061aSmrg/* ARGSUSED */ 443444c061aSmrgBoolean XtCvtIntToColor( 444444c061aSmrg Display* dpy, 445444c061aSmrg XrmValuePtr args, 446444c061aSmrg Cardinal *num_args, 447444c061aSmrg XrmValuePtr fromVal, 448444c061aSmrg XrmValuePtr toVal, 449444c061aSmrg XtPointer *closure_ret) 450444c061aSmrg{ 451444c061aSmrg XColor c; 452444c061aSmrg Screen *screen; 453444c061aSmrg Colormap colormap; 454444c061aSmrg 455444c061aSmrg if (*num_args != 2) { 456444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 457444c061aSmrg XtNwrongParameters,"cvtIntOrPixelToXColor",XtCXtToolkitError, 458444c061aSmrg "Pixel to color conversion needs screen and colormap arguments", 459444c061aSmrg (String *)NULL, (Cardinal *)NULL); 460444c061aSmrg return False; 461444c061aSmrg } 462444c061aSmrg screen = *((Screen **) args[0].addr); 463444c061aSmrg colormap = *((Colormap *) args[1].addr); 464444c061aSmrg c.pixel = *(int *)fromVal->addr; 465444c061aSmrg 466444c061aSmrg XQueryColor(DisplayOfScreen(screen), colormap, &c); 467444c061aSmrg done(XColor, c); 468444c061aSmrg} 469444c061aSmrg 470444c061aSmrg 471444c061aSmrgBoolean XtCvtStringToPixel( 472444c061aSmrg Display* dpy, 473444c061aSmrg XrmValuePtr args, 474444c061aSmrg Cardinal *num_args, 475444c061aSmrg XrmValuePtr fromVal, 476444c061aSmrg XrmValuePtr toVal, 477444c061aSmrg XtPointer *closure_ret) 478444c061aSmrg{ 479444c061aSmrg String str = (String)fromVal->addr; 480444c061aSmrg XColor screenColor; 481444c061aSmrg XColor exactColor; 482444c061aSmrg Screen *screen; 483444c061aSmrg XtPerDisplay pd = _XtGetPerDisplay(dpy); 484444c061aSmrg Colormap colormap; 485444c061aSmrg Status status; 486444c061aSmrg String params[1]; 487444c061aSmrg Cardinal num_params=1; 488444c061aSmrg 489444c061aSmrg if (*num_args != 2) { 490444c061aSmrg XtAppWarningMsg(pd->appContext, XtNwrongParameters, "cvtStringToPixel", 491444c061aSmrg XtCXtToolkitError, 492444c061aSmrg "String to pixel conversion needs screen and colormap arguments", 493444c061aSmrg (String *)NULL, (Cardinal *)NULL); 494444c061aSmrg return False; 495444c061aSmrg } 496444c061aSmrg 497444c061aSmrg screen = *((Screen **) args[0].addr); 498444c061aSmrg colormap = *((Colormap *) args[1].addr); 499444c061aSmrg 500444c061aSmrg if (CompareISOLatin1(str, XtDefaultBackground) == 0) { 5012265a131Smrg *closure_ret = NULL; 502444c061aSmrg if (pd->rv) donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel) 503444c061aSmrg else donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel); 504444c061aSmrg } 505444c061aSmrg if (CompareISOLatin1(str, XtDefaultForeground) == 0) { 5062265a131Smrg *closure_ret = NULL; 507444c061aSmrg if (pd->rv) donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel) 508444c061aSmrg else donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel); 509444c061aSmrg } 510444c061aSmrg 511444c061aSmrg status = XAllocNamedColor(DisplayOfScreen(screen), colormap, 512444c061aSmrg (char*)str, &screenColor, &exactColor); 513444c061aSmrg if (status == 0) { 514444c061aSmrg String msg, type; 515444c061aSmrg params[0] = str; 516444c061aSmrg /* Server returns a specific error code but Xlib discards it. Ugh */ 517444c061aSmrg if (XLookupColor(DisplayOfScreen(screen), colormap, (char*)str, 518444c061aSmrg &exactColor, &screenColor)) { 519444c061aSmrg type = "noColormap"; 520444c061aSmrg msg = "Cannot allocate colormap entry for \"%s\""; 521444c061aSmrg } 522444c061aSmrg else { 523444c061aSmrg type = "badValue"; 524444c061aSmrg msg = "Color name \"%s\" is not defined"; 525444c061aSmrg } 526444c061aSmrg 527444c061aSmrg XtAppWarningMsg(pd->appContext, type, "cvtStringToPixel", 528444c061aSmrg XtCXtToolkitError, msg, params, &num_params); 5292265a131Smrg *closure_ret = NULL; 530444c061aSmrg return False; 531444c061aSmrg } else { 532444c061aSmrg *closure_ret = (char*)True; 533444c061aSmrg donestr(Pixel, screenColor.pixel, XtRPixel); 534444c061aSmrg } 535444c061aSmrg} 536444c061aSmrg 537444c061aSmrg/* ARGSUSED */ 538444c061aSmrgstatic void FreePixel( 539444c061aSmrg XtAppContext app, 540444c061aSmrg XrmValuePtr toVal, 541444c061aSmrg XtPointer closure, 542444c061aSmrg XrmValuePtr args, 543444c061aSmrg Cardinal *num_args) 544444c061aSmrg{ 545444c061aSmrg Screen *screen; 546444c061aSmrg Colormap colormap; 547444c061aSmrg 548444c061aSmrg if (*num_args != 2) { 549444c061aSmrg XtAppWarningMsg(app, XtNwrongParameters,"freePixel",XtCXtToolkitError, 550444c061aSmrg "Freeing a pixel requires screen and colormap arguments", 551444c061aSmrg (String *)NULL, (Cardinal *)NULL); 552444c061aSmrg return; 553444c061aSmrg } 554444c061aSmrg 555444c061aSmrg screen = *((Screen **) args[0].addr); 556444c061aSmrg colormap = *((Colormap *) args[1].addr); 557444c061aSmrg 558444c061aSmrg if (closure) { 559444c061aSmrg XFreeColors( DisplayOfScreen(screen), colormap, 560444c061aSmrg (unsigned long*)toVal->addr, 1, (unsigned long)0 561444c061aSmrg ); 562444c061aSmrg } 563444c061aSmrg} 564444c061aSmrg 565444c061aSmrg 566444c061aSmrg/* no longer used by Xt, but it's in the spec */ 567444c061aSmrgXtConvertArgRec const screenConvertArg[] = { 568444c061aSmrg {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen), 569444c061aSmrg sizeof(Screen *)} 570444c061aSmrg}; 571444c061aSmrg 572444c061aSmrg/*ARGSUSED*/ 573444c061aSmrgstatic void FetchDisplayArg( 574444c061aSmrg Widget widget, 575444c061aSmrg Cardinal *size, 576444c061aSmrg XrmValue* value) 577444c061aSmrg{ 578444c061aSmrg if (widget == NULL) 579444c061aSmrg XtErrorMsg("missingWidget", "fetchDisplayArg", XtCXtToolkitError, 580444c061aSmrg "FetchDisplayArg called without a widget to reference", 581444c061aSmrg (String*)NULL, (Cardinal*)NULL); 582444c061aSmrg /* can't return any useful Display and caller will de-ref NULL, 583444c061aSmrg so aborting is the only useful option */ 584444c061aSmrg 585444c061aSmrg value->size = sizeof(Display*); 586444c061aSmrg value->addr = (XPointer)&DisplayOfScreen(XtScreenOfObject(widget)); 587444c061aSmrg} 588444c061aSmrg 589444c061aSmrgstatic XtConvertArgRec const displayConvertArg[] = { 590444c061aSmrg {XtProcedureArg, (XtPointer)FetchDisplayArg, 0}, 591444c061aSmrg}; 592444c061aSmrg 593444c061aSmrg/*ARGSUSED*/ 594444c061aSmrgBoolean XtCvtStringToCursor( 595444c061aSmrg Display* dpy, 596444c061aSmrg XrmValuePtr args, 597444c061aSmrg Cardinal *num_args, 598444c061aSmrg XrmValuePtr fromVal, 599444c061aSmrg XrmValuePtr toVal, 600444c061aSmrg XtPointer *closure_ret) 601444c061aSmrg{ 602444c061aSmrg static const struct _CursorName { 603444c061aSmrg const char *name; 604444c061aSmrg unsigned int shape; 605444c061aSmrg } cursor_names[] = { 606444c061aSmrg {"X_cursor", XC_X_cursor}, 607444c061aSmrg {"arrow", XC_arrow}, 608444c061aSmrg {"based_arrow_down", XC_based_arrow_down}, 609444c061aSmrg {"based_arrow_up", XC_based_arrow_up}, 610444c061aSmrg {"boat", XC_boat}, 611444c061aSmrg {"bogosity", XC_bogosity}, 612444c061aSmrg {"bottom_left_corner", XC_bottom_left_corner}, 613444c061aSmrg {"bottom_right_corner", XC_bottom_right_corner}, 614444c061aSmrg {"bottom_side", XC_bottom_side}, 615444c061aSmrg {"bottom_tee", XC_bottom_tee}, 616444c061aSmrg {"box_spiral", XC_box_spiral}, 617444c061aSmrg {"center_ptr", XC_center_ptr}, 618444c061aSmrg {"circle", XC_circle}, 619444c061aSmrg {"clock", XC_clock}, 620444c061aSmrg {"coffee_mug", XC_coffee_mug}, 621444c061aSmrg {"cross", XC_cross}, 622444c061aSmrg {"cross_reverse", XC_cross_reverse}, 623444c061aSmrg {"crosshair", XC_crosshair}, 624444c061aSmrg {"diamond_cross", XC_diamond_cross}, 625444c061aSmrg {"dot", XC_dot}, 626444c061aSmrg {"dotbox", XC_dotbox}, 627444c061aSmrg {"double_arrow", XC_double_arrow}, 628444c061aSmrg {"draft_large", XC_draft_large}, 629444c061aSmrg {"draft_small", XC_draft_small}, 630444c061aSmrg {"draped_box", XC_draped_box}, 631444c061aSmrg {"exchange", XC_exchange}, 632444c061aSmrg {"fleur", XC_fleur}, 633444c061aSmrg {"gobbler", XC_gobbler}, 634444c061aSmrg {"gumby", XC_gumby}, 635444c061aSmrg {"hand1", XC_hand1}, 636444c061aSmrg {"hand2", XC_hand2}, 637444c061aSmrg {"heart", XC_heart}, 638444c061aSmrg {"icon", XC_icon}, 639444c061aSmrg {"iron_cross", XC_iron_cross}, 640444c061aSmrg {"left_ptr", XC_left_ptr}, 641444c061aSmrg {"left_side", XC_left_side}, 642444c061aSmrg {"left_tee", XC_left_tee}, 643444c061aSmrg {"leftbutton", XC_leftbutton}, 644444c061aSmrg {"ll_angle", XC_ll_angle}, 645444c061aSmrg {"lr_angle", XC_lr_angle}, 646444c061aSmrg {"man", XC_man}, 647444c061aSmrg {"middlebutton", XC_middlebutton}, 648444c061aSmrg {"mouse", XC_mouse}, 649444c061aSmrg {"pencil", XC_pencil}, 650444c061aSmrg {"pirate", XC_pirate}, 651444c061aSmrg {"plus", XC_plus}, 652444c061aSmrg {"question_arrow", XC_question_arrow}, 653444c061aSmrg {"right_ptr", XC_right_ptr}, 654444c061aSmrg {"right_side", XC_right_side}, 655444c061aSmrg {"right_tee", XC_right_tee}, 656444c061aSmrg {"rightbutton", XC_rightbutton}, 657444c061aSmrg {"rtl_logo", XC_rtl_logo}, 658444c061aSmrg {"sailboat", XC_sailboat}, 659444c061aSmrg {"sb_down_arrow", XC_sb_down_arrow}, 660444c061aSmrg {"sb_h_double_arrow", XC_sb_h_double_arrow}, 661444c061aSmrg {"sb_left_arrow", XC_sb_left_arrow}, 662444c061aSmrg {"sb_right_arrow", XC_sb_right_arrow}, 663444c061aSmrg {"sb_up_arrow", XC_sb_up_arrow}, 664444c061aSmrg {"sb_v_double_arrow", XC_sb_v_double_arrow}, 665444c061aSmrg {"shuttle", XC_shuttle}, 666444c061aSmrg {"sizing", XC_sizing}, 667444c061aSmrg {"spider", XC_spider}, 668444c061aSmrg {"spraycan", XC_spraycan}, 669444c061aSmrg {"star", XC_star}, 670444c061aSmrg {"target", XC_target}, 671444c061aSmrg {"tcross", XC_tcross}, 672444c061aSmrg {"top_left_arrow", XC_top_left_arrow}, 673444c061aSmrg {"top_left_corner", XC_top_left_corner}, 674444c061aSmrg {"top_right_corner", XC_top_right_corner}, 675444c061aSmrg {"top_side", XC_top_side}, 676444c061aSmrg {"top_tee", XC_top_tee}, 677444c061aSmrg {"trek", XC_trek}, 678444c061aSmrg {"ul_angle", XC_ul_angle}, 679444c061aSmrg {"umbrella", XC_umbrella}, 680444c061aSmrg {"ur_angle", XC_ur_angle}, 681444c061aSmrg {"watch", XC_watch}, 682444c061aSmrg {"xterm", XC_xterm}, 683444c061aSmrg }; 684444c061aSmrg const struct _CursorName *nP; 685444c061aSmrg char *name = (char *)fromVal->addr; 686444c061aSmrg register Cardinal i; 687444c061aSmrg 688444c061aSmrg if (*num_args != 1) { 689444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 690444c061aSmrg XtNwrongParameters,"cvtStringToCursor",XtCXtToolkitError, 691444c061aSmrg "String to cursor conversion needs display argument", 692444c061aSmrg (String *)NULL, (Cardinal *)NULL); 693444c061aSmrg return False; 694444c061aSmrg } 695444c061aSmrg 696444c061aSmrg for (i=0, nP=cursor_names; i < XtNumber(cursor_names); i++, nP++ ) { 697444c061aSmrg if (strcmp(name, nP->name) == 0) { 698444c061aSmrg Display *display = *(Display**)args[0].addr; 699444c061aSmrg Cursor cursor = XCreateFontCursor(display, nP->shape ); 700444c061aSmrg donestr(Cursor, cursor, XtRCursor); 701444c061aSmrg } 702444c061aSmrg } 703444c061aSmrg XtDisplayStringConversionWarning(dpy, name, XtRCursor); 704444c061aSmrg return False; 705444c061aSmrg} 706444c061aSmrg 707444c061aSmrg/* ARGSUSED */ 708444c061aSmrgstatic void FreeCursor( 709444c061aSmrg XtAppContext app, 710444c061aSmrg XrmValuePtr toVal, 711444c061aSmrg XtPointer closure, /* unused */ 712444c061aSmrg XrmValuePtr args, 713444c061aSmrg Cardinal *num_args) 714444c061aSmrg{ 715444c061aSmrg Display* display; 716444c061aSmrg 717444c061aSmrg if (*num_args != 1) { 718444c061aSmrg XtAppWarningMsg(app, 719444c061aSmrg XtNwrongParameters,"freeCursor",XtCXtToolkitError, 720444c061aSmrg "Free Cursor requires display argument", 721444c061aSmrg (String *)NULL, (Cardinal *)NULL); 722444c061aSmrg return; 723444c061aSmrg } 724444c061aSmrg 725444c061aSmrg display = *(Display**)args[0].addr; 726444c061aSmrg XFreeCursor( display, *(Cursor*)toVal->addr ); 727444c061aSmrg} 728444c061aSmrg 729444c061aSmrg/*ARGSUSED*/ 730444c061aSmrgBoolean XtCvtStringToDisplay( 731444c061aSmrg Display* dpy, 732444c061aSmrg XrmValuePtr args, 733444c061aSmrg Cardinal *num_args, 734444c061aSmrg XrmValuePtr fromVal, 735444c061aSmrg XrmValuePtr toVal, 736444c061aSmrg XtPointer *closure_ret) 737444c061aSmrg{ 738444c061aSmrg Display *d; 739444c061aSmrg 740444c061aSmrg if (*num_args != 0) 741444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 742444c061aSmrg XtNwrongParameters,"cvtStringToDisplay",XtCXtToolkitError, 743444c061aSmrg "String to Display conversion needs no extra arguments", 744444c061aSmrg (String *)NULL, (Cardinal *)NULL); 745444c061aSmrg 746444c061aSmrg d = XOpenDisplay((char *)fromVal->addr); 747444c061aSmrg if (d != NULL) 748444c061aSmrg donestr(Display*, d, XtRDisplay); 749444c061aSmrg 750444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDisplay); 751444c061aSmrg return False; 752444c061aSmrg} 753444c061aSmrg 754444c061aSmrg 755444c061aSmrg/*ARGSUSED*/ 756444c061aSmrgBoolean XtCvtStringToFile( 757444c061aSmrg Display* dpy, 758444c061aSmrg XrmValuePtr args, 759444c061aSmrg Cardinal *num_args, 760444c061aSmrg XrmValuePtr fromVal, 761444c061aSmrg XrmValuePtr toVal, 762444c061aSmrg XtPointer *closure_ret) 763444c061aSmrg{ 764444c061aSmrg FILE *f; 765444c061aSmrg 766444c061aSmrg if (*num_args != 0) 767444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 768444c061aSmrg XtNwrongParameters,"cvtStringToFile",XtCXtToolkitError, 769444c061aSmrg "String to File conversion needs no extra arguments", 770444c061aSmrg (String *) NULL, (Cardinal *)NULL); 771444c061aSmrg 772444c061aSmrg f = fopen((char *)fromVal->addr, "r"); 773444c061aSmrg if (f != NULL) 774444c061aSmrg donestr(FILE*, f, XtRFile); 775444c061aSmrg 776444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFile); 777444c061aSmrg return False; 778444c061aSmrg} 779444c061aSmrg 780444c061aSmrg/* ARGSUSED */ 781444c061aSmrgstatic void FreeFile( 782444c061aSmrg XtAppContext app, 783444c061aSmrg XrmValuePtr toVal, 784444c061aSmrg XtPointer closure, /* unused */ 785444c061aSmrg XrmValuePtr args, /* unused */ 786444c061aSmrg Cardinal *num_args) 787444c061aSmrg{ 788444c061aSmrg if (*num_args != 0) 789444c061aSmrg XtAppWarningMsg(app, 790444c061aSmrg XtNwrongParameters,"freeFile",XtCXtToolkitError, 791444c061aSmrg "Free File requires no extra arguments", 792444c061aSmrg (String *) NULL, (Cardinal *)NULL); 793444c061aSmrg 794444c061aSmrg fclose( *(FILE**)toVal->addr ); 795444c061aSmrg} 796444c061aSmrg 797444c061aSmrg/*ARGSUSED*/ 798444c061aSmrgBoolean XtCvtIntToFloat( 799444c061aSmrg Display* dpy, 800444c061aSmrg XrmValuePtr args, 801444c061aSmrg Cardinal *num_args, 802444c061aSmrg XrmValuePtr fromVal, 803444c061aSmrg XrmValuePtr toVal, 804444c061aSmrg XtPointer *closure_ret) 805444c061aSmrg{ 806444c061aSmrg if (*num_args != 0) 807444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 808444c061aSmrg XtNwrongParameters,"cvtIntToFloat",XtCXtToolkitError, 809444c061aSmrg "Integer to Float conversion needs no extra arguments", 810444c061aSmrg (String *)NULL, (Cardinal *)NULL); 811444c061aSmrg done(float, (*(int *)fromVal->addr)); 812444c061aSmrg} 813444c061aSmrg 814444c061aSmrg/*ARGSUSED*/ 815444c061aSmrgBoolean XtCvtStringToFloat( 816444c061aSmrg Display* dpy, 817444c061aSmrg XrmValuePtr args, 818444c061aSmrg Cardinal *num_args, 819444c061aSmrg XrmValuePtr fromVal, 820444c061aSmrg XrmValuePtr toVal, 821444c061aSmrg XtPointer *closure_ret) 822444c061aSmrg{ 823444c061aSmrg int ret; 824444c061aSmrg float f, nan; 825444c061aSmrg 826444c061aSmrg#ifndef ISC /* On ISC this generates a core dump :-( at least with gs */ 827444c061aSmrg /* depending on the system this may or may not do anything useful */ 828444c061aSmrg (void) sscanf ("NaNS", "%g", 829444c061aSmrg toVal->addr != NULL ? (float*) toVal->addr : &nan); 830444c061aSmrg#endif 831444c061aSmrg 832444c061aSmrg if (*num_args != 0) 833444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 834444c061aSmrg XtNwrongParameters,"cvtStringToFloat",XtCXtToolkitError, 835444c061aSmrg "String to Float conversion needs no extra arguments", 836444c061aSmrg (String *) NULL, (Cardinal *)NULL); 837444c061aSmrg 838444c061aSmrg ret = sscanf (fromVal->addr, "%g", &f); 839444c061aSmrg if (ret == 0) { 840444c061aSmrg if (toVal->addr != NULL && toVal->size == sizeof nan) 841444c061aSmrg *(float*)toVal->addr = nan; 842444c061aSmrg XtDisplayStringConversionWarning (dpy, (char*) fromVal->addr, XtRFloat); 843444c061aSmrg return False; 844444c061aSmrg } 845444c061aSmrg donestr(float, f, XtRFloat); 846444c061aSmrg} 847444c061aSmrg 848444c061aSmrg/*ARGSUSED*/ 849444c061aSmrgBoolean XtCvtStringToFont( 850444c061aSmrg Display* dpy, 851444c061aSmrg XrmValuePtr args, 852444c061aSmrg Cardinal *num_args, 853444c061aSmrg XrmValuePtr fromVal, 854444c061aSmrg XrmValuePtr toVal, 855444c061aSmrg XtPointer *closure_ret) 856444c061aSmrg{ 857444c061aSmrg Font f; 858444c061aSmrg Display* display; 859444c061aSmrg 860444c061aSmrg if (*num_args != 1) { 861444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 862444c061aSmrg XtNwrongParameters,"cvtStringToFont",XtCXtToolkitError, 863444c061aSmrg "String to font conversion needs display argument", 864444c061aSmrg (String *) NULL, (Cardinal *)NULL); 865444c061aSmrg return False; 866444c061aSmrg } 867444c061aSmrg 868444c061aSmrg display = *(Display**)args[0].addr; 869444c061aSmrg 870444c061aSmrg if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) { 871444c061aSmrg f = XLoadFont(display, (char *)fromVal->addr); 872444c061aSmrg if (f != 0) { 873444c061aSmrg Done: donestr( Font, f, XtRFont ); 874444c061aSmrg } 875444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFont); 876444c061aSmrg } 877444c061aSmrg /* try and get the default font */ 878444c061aSmrg 879444c061aSmrg { 880444c061aSmrg XrmName xrm_name[2]; 881444c061aSmrg XrmClass xrm_class[2]; 882444c061aSmrg XrmRepresentation rep_type; 883444c061aSmrg XrmValue value; 884444c061aSmrg 885444c061aSmrg xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont"); 886444c061aSmrg xrm_name[1] = 0; 887444c061aSmrg xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont"); 888444c061aSmrg xrm_class[1] = 0; 889444c061aSmrg if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class, 890444c061aSmrg &rep_type, &value)) { 891444c061aSmrg if (rep_type == _XtQString) { 892444c061aSmrg f = XLoadFont(display, (char *)value.addr); 893444c061aSmrg if (f != 0) 894444c061aSmrg goto Done; 895444c061aSmrg else 896444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *)value.addr, 897444c061aSmrg XtRFont); 898444c061aSmrg } else if (rep_type == XtQFont) { 899444c061aSmrg f = *(Font*)value.addr; 900444c061aSmrg goto Done; 901444c061aSmrg } else if (rep_type == XtQFontStruct) { 902444c061aSmrg f = ((XFontStruct*)value.addr)->fid; 903444c061aSmrg goto Done; 904444c061aSmrg } 905444c061aSmrg } 906444c061aSmrg } 907444c061aSmrg /* Should really do XListFonts, but most servers support this */ 908444c061aSmrg f = XLoadFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*"); 909444c061aSmrg if (f != 0) 910444c061aSmrg goto Done; 911444c061aSmrg 912444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 913444c061aSmrg "noFont","cvtStringToFont",XtCXtToolkitError, 914444c061aSmrg "Unable to load any usable ISO8859 font", 915444c061aSmrg (String *) NULL, (Cardinal *)NULL); 916444c061aSmrg 917444c061aSmrg return False; 918444c061aSmrg} 919444c061aSmrg 920444c061aSmrg/* ARGSUSED */ 921444c061aSmrgstatic void FreeFont( 922444c061aSmrg XtAppContext app, 923444c061aSmrg XrmValuePtr toVal, 924444c061aSmrg XtPointer closure, /* unused */ 925444c061aSmrg XrmValuePtr args, 926444c061aSmrg Cardinal *num_args) 927444c061aSmrg{ 928444c061aSmrg Display *display; 929444c061aSmrg if (*num_args != 1) { 930444c061aSmrg XtAppWarningMsg(app, 931444c061aSmrg XtNwrongParameters,"freeFont",XtCXtToolkitError, 932444c061aSmrg "Free Font needs display argument", 933444c061aSmrg (String *) NULL, (Cardinal *)NULL); 934444c061aSmrg return; 935444c061aSmrg } 936444c061aSmrg 937444c061aSmrg display = *(Display**)args[0].addr; 938444c061aSmrg XUnloadFont( display, *(Font*)toVal->addr ); 939444c061aSmrg} 940444c061aSmrg 941444c061aSmrg/*ARGSUSED*/ 942444c061aSmrgBoolean XtCvtIntToFont( 943444c061aSmrg Display* dpy, 944444c061aSmrg XrmValuePtr args, 945444c061aSmrg Cardinal *num_args, 946444c061aSmrg XrmValuePtr fromVal, 947444c061aSmrg XrmValuePtr toVal, 948444c061aSmrg XtPointer *closure_ret) 949444c061aSmrg{ 950444c061aSmrg if (*num_args != 0) 951444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 952444c061aSmrg XtNwrongParameters,"cvtIntToFont",XtCXtToolkitError, 953444c061aSmrg "Integer to Font conversion needs no extra arguments", 954444c061aSmrg (String *) NULL, (Cardinal *)NULL); 955444c061aSmrg done(Font, *(int*)fromVal->addr); 956444c061aSmrg} 957444c061aSmrg 958444c061aSmrg/*ARGSUSED*/ 959444c061aSmrgBoolean XtCvtStringToFontSet( 960444c061aSmrg Display* dpy, 961444c061aSmrg XrmValuePtr args, 962444c061aSmrg Cardinal *num_args, 963444c061aSmrg XrmValuePtr fromVal, 964444c061aSmrg XrmValuePtr toVal, 965444c061aSmrg XtPointer *closure_ret) 966444c061aSmrg{ 967444c061aSmrg XFontSet f; 968444c061aSmrg Display* display; 969444c061aSmrg char** missing_charset_list; 970444c061aSmrg int missing_charset_count; 971444c061aSmrg char* def_string; 972444c061aSmrg 973444c061aSmrg if (*num_args != 2) { 974444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 975444c061aSmrg XtNwrongParameters,"cvtStringToFontSet",XtCXtToolkitError, 976444c061aSmrg "String to FontSet conversion needs display and locale arguments", 977444c061aSmrg (String *) NULL, (Cardinal *)NULL); 978444c061aSmrg return False; 979444c061aSmrg } 980444c061aSmrg 981444c061aSmrg display = *(Display**)args[0].addr; 982444c061aSmrg 983444c061aSmrg if (CompareISOLatin1((String)fromVal->addr, XtDefaultFontSet) != 0) { 984444c061aSmrg f = XCreateFontSet(display, (char *)fromVal->addr, 985444c061aSmrg &missing_charset_list, &missing_charset_count, &def_string); 986444c061aSmrg /* Free any returned missing charset list */ 987444c061aSmrg if (missing_charset_count) { 988444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 989444c061aSmrg XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError, 990444c061aSmrg "Missing charsets in String to FontSet conversion", 991444c061aSmrg (String *) NULL, (Cardinal *)NULL); 992444c061aSmrg XFreeStringList(missing_charset_list); 993444c061aSmrg } 994444c061aSmrg if (f != NULL) { 995444c061aSmrg Done: donestr( XFontSet, f, XtRFontSet ); 996444c061aSmrg } 997444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRFontSet); 998444c061aSmrg } 999444c061aSmrg /* try and get the default fontset */ 1000444c061aSmrg 1001444c061aSmrg { 1002444c061aSmrg XrmName xrm_name[2]; 1003444c061aSmrg XrmClass xrm_class[2]; 1004444c061aSmrg XrmRepresentation rep_type; 1005444c061aSmrg XrmValue value; 1006444c061aSmrg 1007444c061aSmrg xrm_name[0] = XrmPermStringToQuark ("xtDefaultFontSet"); 1008444c061aSmrg xrm_name[1] = 0; 1009444c061aSmrg xrm_class[0] = XrmPermStringToQuark ("XtDefaultFontSet"); 1010444c061aSmrg xrm_class[1] = 0; 1011444c061aSmrg if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class, 1012444c061aSmrg &rep_type, &value)) { 1013444c061aSmrg if (rep_type == _XtQString) { 1014444c061aSmrg 1015444c061aSmrg f = XCreateFontSet(display, (char *)value.addr, 1016444c061aSmrg &missing_charset_list, &missing_charset_count, 1017444c061aSmrg &def_string); 1018444c061aSmrg /* Free any returned missing charset list */ 1019444c061aSmrg if (missing_charset_count) { 1020444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1021444c061aSmrg XtNmissingCharsetList,"cvtStringToFontSet", 1022444c061aSmrg XtCXtToolkitError, 1023444c061aSmrg "Missing charsets in String to FontSet conversion", 1024444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1025444c061aSmrg XFreeStringList(missing_charset_list); 1026444c061aSmrg } 1027444c061aSmrg if (f != NULL) 1028444c061aSmrg goto Done; 1029444c061aSmrg else 1030444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *)value.addr, 1031444c061aSmrg XtRFontSet); 1032444c061aSmrg } else if (rep_type == XtQFontSet) { 1033444c061aSmrg f = *(XFontSet*)value.addr; 1034444c061aSmrg goto Done; 1035444c061aSmrg } 1036444c061aSmrg } 1037444c061aSmrg } 1038444c061aSmrg 1039444c061aSmrg /* Should really do XListFonts, but most servers support this */ 1040444c061aSmrg f = XCreateFontSet(display, "-*-*-*-R-*-*-*-120-*-*-*-*,*", 1041444c061aSmrg &missing_charset_list, &missing_charset_count, &def_string); 1042444c061aSmrg 1043444c061aSmrg /* Free any returned missing charset list */ 1044444c061aSmrg if (missing_charset_count) { 1045444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1046444c061aSmrg XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError, 1047444c061aSmrg "Missing charsets in String to FontSet conversion", 1048444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1049444c061aSmrg XFreeStringList(missing_charset_list); 1050444c061aSmrg } 1051444c061aSmrg if (f != NULL) 1052444c061aSmrg goto Done; 1053444c061aSmrg 1054444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1055444c061aSmrg "noFont","cvtStringToFontSet",XtCXtToolkitError, 1056444c061aSmrg "Unable to load any usable fontset", 1057444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1058444c061aSmrg 1059444c061aSmrg return False; 1060444c061aSmrg} 1061444c061aSmrg 1062444c061aSmrg/*ARGSUSED*/ 1063444c061aSmrgstatic void FreeFontSet( 1064444c061aSmrg XtAppContext app, 1065444c061aSmrg XrmValuePtr toVal, 1066444c061aSmrg XtPointer closure, /* unused */ 1067444c061aSmrg XrmValuePtr args, 1068444c061aSmrg Cardinal *num_args) 1069444c061aSmrg{ 1070444c061aSmrg Display *display; 1071444c061aSmrg if (*num_args != 2) { 1072444c061aSmrg XtAppWarningMsg(app, 1073444c061aSmrg XtNwrongParameters,"freeFontSet",XtCXtToolkitError, 1074444c061aSmrg "FreeFontSet needs display and locale arguments", 1075444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1076444c061aSmrg return; 1077444c061aSmrg } 1078444c061aSmrg 1079444c061aSmrg display = *(Display**)args[0].addr; 1080444c061aSmrg XFreeFontSet( display, *(XFontSet*)toVal->addr ); 1081444c061aSmrg} 1082444c061aSmrg 1083444c061aSmrg/*ARGSUSED*/ 1084444c061aSmrgstatic void FetchLocaleArg( 1085444c061aSmrg Widget widget, /* unused */ 1086444c061aSmrg Cardinal *size, /* unused */ 1087444c061aSmrg XrmValue *value) 1088444c061aSmrg{ 1089444c061aSmrg static XrmString locale; 1090444c061aSmrg 1091444c061aSmrg locale = XrmQuarkToString(XrmStringToQuark 1092444c061aSmrg (setlocale(LC_CTYPE, (char*)NULL))); 1093444c061aSmrg value->size = sizeof(XrmString); 1094444c061aSmrg value->addr = (XPointer)&locale; 1095444c061aSmrg} 1096444c061aSmrg 1097444c061aSmrgstatic XtConvertArgRec const localeDisplayConvertArgs[] = { 1098444c061aSmrg {XtProcedureArg, (XtPointer)FetchDisplayArg, 0}, 1099444c061aSmrg {XtProcedureArg, (XtPointer)FetchLocaleArg, 0}, 1100444c061aSmrg}; 1101444c061aSmrg 1102444c061aSmrg 1103444c061aSmrg/*ARGSUSED*/ 1104444c061aSmrgBoolean 1105444c061aSmrgXtCvtStringToFontStruct( 1106444c061aSmrg Display* dpy, 1107444c061aSmrg XrmValuePtr args, 1108444c061aSmrg Cardinal *num_args, 1109444c061aSmrg XrmValuePtr fromVal, 1110444c061aSmrg XrmValuePtr toVal, 1111444c061aSmrg XtPointer *closure_ret) 1112444c061aSmrg{ 1113444c061aSmrg XFontStruct *f; 1114444c061aSmrg Display* display; 1115444c061aSmrg 1116444c061aSmrg if (*num_args != 1) { 1117444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1118444c061aSmrg XtNwrongParameters,"cvtStringToFontStruct",XtCXtToolkitError, 1119444c061aSmrg "String to font conversion needs display argument", 1120444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1121444c061aSmrg return False; 1122444c061aSmrg } 1123444c061aSmrg 1124444c061aSmrg display = *(Display**)args[0].addr; 1125444c061aSmrg 1126444c061aSmrg if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) { 1127444c061aSmrg f = XLoadQueryFont(display, (char *)fromVal->addr); 1128444c061aSmrg if (f != NULL) { 1129444c061aSmrg Done: donestr( XFontStruct*, f, XtRFontStruct); 1130444c061aSmrg } 1131444c061aSmrg 1132444c061aSmrg XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr, 1133444c061aSmrg XtRFontStruct); 1134444c061aSmrg } 1135444c061aSmrg 1136444c061aSmrg /* try and get the default font */ 1137444c061aSmrg 1138444c061aSmrg { 1139444c061aSmrg XrmName xrm_name[2]; 1140444c061aSmrg XrmClass xrm_class[2]; 1141444c061aSmrg XrmRepresentation rep_type; 1142444c061aSmrg XrmValue value; 1143444c061aSmrg 1144444c061aSmrg xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont"); 1145444c061aSmrg xrm_name[1] = 0; 1146444c061aSmrg xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont"); 1147444c061aSmrg xrm_class[1] = 0; 1148444c061aSmrg if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class, 1149444c061aSmrg &rep_type, &value)) { 1150444c061aSmrg if (rep_type == _XtQString) { 1151444c061aSmrg f = XLoadQueryFont(display, (char*)value.addr); 1152444c061aSmrg if (f != NULL) 1153444c061aSmrg goto Done; 1154444c061aSmrg else 1155444c061aSmrg XtDisplayStringConversionWarning(dpy, (char*)value.addr, 1156444c061aSmrg XtRFontStruct); 1157444c061aSmrg } else if (rep_type == XtQFont) { 1158444c061aSmrg f = XQueryFont(display, *(Font*)value.addr ); 1159444c061aSmrg if (f != NULL) goto Done; 1160444c061aSmrg } else if (rep_type == XtQFontStruct) { 1161444c061aSmrg f = (XFontStruct*)value.addr; 1162444c061aSmrg goto Done; 1163444c061aSmrg } 1164444c061aSmrg } 1165444c061aSmrg } 1166444c061aSmrg /* Should really do XListFonts, but most servers support this */ 1167444c061aSmrg f = XLoadQueryFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*"); 1168444c061aSmrg if (f != NULL) 1169444c061aSmrg goto Done; 1170444c061aSmrg 1171444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1172444c061aSmrg "noFont","cvtStringToFontStruct",XtCXtToolkitError, 1173444c061aSmrg "Unable to load any usable ISO8859 font", 1174444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1175444c061aSmrg 1176444c061aSmrg return False; 1177444c061aSmrg} 1178444c061aSmrg 1179444c061aSmrg/* ARGSUSED */ 1180444c061aSmrgstatic void FreeFontStruct( 1181444c061aSmrg XtAppContext app, 1182444c061aSmrg XrmValuePtr toVal, 1183444c061aSmrg XtPointer closure, /* unused */ 1184444c061aSmrg XrmValuePtr args, 1185444c061aSmrg Cardinal *num_args) 1186444c061aSmrg{ 1187444c061aSmrg Display *display; 1188444c061aSmrg if (*num_args != 1) { 1189444c061aSmrg XtAppWarningMsg(app, 1190444c061aSmrg XtNwrongParameters,"freeFontStruct",XtCXtToolkitError, 1191444c061aSmrg "Free FontStruct requires display argument", 1192444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1193444c061aSmrg return; 1194444c061aSmrg } 1195444c061aSmrg 1196444c061aSmrg display = *(Display**)args[0].addr; 1197444c061aSmrg XFreeFont( display, *(XFontStruct**)toVal->addr ); 1198444c061aSmrg} 1199444c061aSmrg 1200444c061aSmrg/*ARGSUSED*/ 1201444c061aSmrgBoolean XtCvtStringToInt( 1202444c061aSmrg Display* dpy, 1203444c061aSmrg XrmValuePtr args, 1204444c061aSmrg Cardinal *num_args, 1205444c061aSmrg XrmValuePtr fromVal, 1206444c061aSmrg XrmValuePtr toVal, 1207444c061aSmrg XtPointer *closure_ret) 1208444c061aSmrg{ 1209444c061aSmrg int i; 1210444c061aSmrg 1211444c061aSmrg if (*num_args != 0) 1212444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1213444c061aSmrg XtNwrongParameters,"cvtStringToInt",XtCXtToolkitError, 1214444c061aSmrg "String to Integer conversion needs no extra arguments", 1215444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1216444c061aSmrg if (IsInteger((String)fromVal->addr, &i)) 1217444c061aSmrg donestr(int, i, XtRInt); 1218444c061aSmrg 1219444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRInt); 1220444c061aSmrg return False; 1221444c061aSmrg} 1222444c061aSmrg 1223444c061aSmrg/*ARGSUSED*/ 1224444c061aSmrgBoolean XtCvtStringToShort( 1225444c061aSmrg Display* dpy, 1226444c061aSmrg XrmValuePtr args, 1227444c061aSmrg Cardinal *num_args, 1228444c061aSmrg XrmValuePtr fromVal, 1229444c061aSmrg XrmValuePtr toVal, 1230444c061aSmrg XtPointer *closure_ret) 1231444c061aSmrg{ 1232444c061aSmrg int i; 1233444c061aSmrg 1234444c061aSmrg if (*num_args != 0) 1235444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1236444c061aSmrg XtNwrongParameters,"cvtStringToShort",XtCXtToolkitError, 1237444c061aSmrg "String to Integer conversion needs no extra arguments", 1238444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1239444c061aSmrg if (IsInteger((String)fromVal->addr, &i)) 1240444c061aSmrg donestr(short, (short)i, XtRShort); 1241444c061aSmrg 1242444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRShort); 1243444c061aSmrg return False; 1244444c061aSmrg} 1245444c061aSmrg 1246444c061aSmrg/*ARGSUSED*/ 1247444c061aSmrgBoolean XtCvtStringToDimension( 1248444c061aSmrg Display* dpy, 1249444c061aSmrg XrmValuePtr args, 1250444c061aSmrg Cardinal *num_args, 1251444c061aSmrg XrmValuePtr fromVal, 1252444c061aSmrg XrmValuePtr toVal, 1253444c061aSmrg XtPointer *closure_ret) 1254444c061aSmrg{ 1255444c061aSmrg int i; 1256444c061aSmrg 1257444c061aSmrg if (*num_args != 0) 1258444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1259444c061aSmrg XtNwrongParameters,"cvtStringToDimension",XtCXtToolkitError, 1260444c061aSmrg "String to Dimension conversion needs no extra arguments", 1261444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1262444c061aSmrg if (IsInteger((String)fromVal->addr, &i)) { 1263444c061aSmrg if ( i < 0 ) 1264444c061aSmrg XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr, 1265444c061aSmrg XtRDimension); 1266444c061aSmrg donestr(Dimension, (Dimension)i, XtRDimension); 1267444c061aSmrg } 1268444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDimension); 1269444c061aSmrg return False; 1270444c061aSmrg} 1271444c061aSmrg 1272444c061aSmrg/*ARGSUSED*/ 1273444c061aSmrgBoolean XtCvtIntToUnsignedChar( 1274444c061aSmrg Display* dpy, 1275444c061aSmrg XrmValuePtr args, 1276444c061aSmrg Cardinal *num_args, 1277444c061aSmrg XrmValuePtr fromVal, 1278444c061aSmrg XrmValuePtr toVal, 1279444c061aSmrg XtPointer *closure_ret) 1280444c061aSmrg{ 1281444c061aSmrg if (*num_args != 0) 1282444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1283444c061aSmrg XtNwrongParameters,"cvtIntToUnsignedChar",XtCXtToolkitError, 1284444c061aSmrg "Integer to UnsignedChar conversion needs no extra arguments", 1285444c061aSmrg (String *)NULL, (Cardinal *)NULL); 1286444c061aSmrg done(unsigned char, (*(int *)fromVal->addr)); 1287444c061aSmrg} 1288444c061aSmrg 1289444c061aSmrg 1290444c061aSmrg/*ARGSUSED*/ 1291444c061aSmrgBoolean XtCvtStringToUnsignedChar( 1292444c061aSmrg Display* dpy, 1293444c061aSmrg XrmValuePtr args, 1294444c061aSmrg Cardinal *num_args, 1295444c061aSmrg XrmValuePtr fromVal, 1296444c061aSmrg XrmValuePtr toVal, 1297444c061aSmrg XtPointer *closure_ret) 1298444c061aSmrg{ 1299444c061aSmrg int i; 1300444c061aSmrg 1301444c061aSmrg if (*num_args != 0) 1302444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1303444c061aSmrg XtNwrongParameters,"cvtStringToUnsignedChar",XtCXtToolkitError, 1304444c061aSmrg "String to Integer conversion needs no extra arguments", 1305444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1306444c061aSmrg if (IsInteger((String)fromVal->addr, &i)) { 1307444c061aSmrg if ( i < 0 || i > 255 ) 1308444c061aSmrg XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr, 1309444c061aSmrg XtRUnsignedChar); 1310444c061aSmrg donestr(unsigned char, i, XtRUnsignedChar); 1311444c061aSmrg } 1312444c061aSmrg XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr, 1313444c061aSmrg XtRUnsignedChar); 1314444c061aSmrg return False; 1315444c061aSmrg} 1316444c061aSmrg 1317444c061aSmrg 1318444c061aSmrg/*ARGSUSED*/ 1319444c061aSmrgBoolean XtCvtColorToPixel( 1320444c061aSmrg Display* dpy, 1321444c061aSmrg XrmValuePtr args, 1322444c061aSmrg Cardinal *num_args, 1323444c061aSmrg XrmValuePtr fromVal, 1324444c061aSmrg XrmValuePtr toVal, 1325444c061aSmrg XtPointer *closure_ret) 1326444c061aSmrg{ 1327444c061aSmrg if (*num_args != 0) 1328444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1329444c061aSmrg XtNwrongParameters,"cvtXColorToPixel",XtCXtToolkitError, 1330444c061aSmrg "Color to Pixel conversion needs no extra arguments", 1331444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1332444c061aSmrg done(Pixel, ((XColor *)fromVal->addr)->pixel); 1333444c061aSmrg} 1334444c061aSmrg 1335444c061aSmrg/*ARGSUSED*/ 1336444c061aSmrgBoolean XtCvtIntToPixel( 1337444c061aSmrg Display* dpy, 1338444c061aSmrg XrmValuePtr args, 1339444c061aSmrg Cardinal *num_args, 1340444c061aSmrg XrmValuePtr fromVal, 1341444c061aSmrg XrmValuePtr toVal, 1342444c061aSmrg XtPointer *closure_ret) 1343444c061aSmrg{ 1344444c061aSmrg if (*num_args != 0) 1345444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1346444c061aSmrg XtNwrongParameters,"cvtIntToPixel",XtCXtToolkitError, 1347444c061aSmrg "Integer to Pixel conversion needs no extra arguments", 1348444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1349444c061aSmrg done(Pixel, *(int*)fromVal->addr); 1350444c061aSmrg} 1351444c061aSmrg 1352444c061aSmrg/*ARGSUSED*/ 1353444c061aSmrgBoolean XtCvtIntToPixmap( 1354444c061aSmrg Display* dpy, 1355444c061aSmrg XrmValuePtr args, 1356444c061aSmrg Cardinal *num_args, 1357444c061aSmrg XrmValuePtr fromVal, 1358444c061aSmrg XrmValuePtr toVal, 1359444c061aSmrg XtPointer *closure_ret) 1360444c061aSmrg{ 1361444c061aSmrg if (*num_args != 0) 1362444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1363444c061aSmrg XtNwrongParameters,"cvtIntToPixmap",XtCXtToolkitError, 1364444c061aSmrg "Integer to Pixmap conversion needs no extra arguments", 1365444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1366444c061aSmrg done(Pixmap, *(Pixmap*)fromVal->addr); 1367444c061aSmrg} 1368444c061aSmrg 1369444c061aSmrg#ifdef MOTIFBC 1370444c061aSmrgvoid LowerCase(register char *source, register *dest) 1371444c061aSmrg{ 1372444c061aSmrg register char ch; 1373444c061aSmrg int i; 1374444c061aSmrg 1375444c061aSmrg for (i = 0; (ch = *source) != 0 && i < 999; source++, dest++, i++) { 1376444c061aSmrg if ('A' <= ch && ch <= 'Z') 1377444c061aSmrg *dest = ch - 'A' + 'a'; 1378444c061aSmrg else 1379444c061aSmrg *dest = ch; 1380444c061aSmrg } 1381444c061aSmrg *dest = 0; 1382444c061aSmrg} 1383444c061aSmrg#endif 1384444c061aSmrg 1385444c061aSmrgstatic int CompareISOLatin1 (char *first, char *second) 1386444c061aSmrg{ 1387444c061aSmrg register unsigned char *ap, *bp; 1388444c061aSmrg 1389444c061aSmrg for (ap = (unsigned char *) first, bp = (unsigned char *) second; 1390444c061aSmrg *ap && *bp; ap++, bp++) { 1391444c061aSmrg register unsigned char a, b; 1392444c061aSmrg 1393444c061aSmrg if ((a = *ap) != (b = *bp)) { 1394444c061aSmrg /* try lowercasing and try again */ 1395444c061aSmrg 1396444c061aSmrg if ((a >= XK_A) && (a <= XK_Z)) 1397444c061aSmrg a += (XK_a - XK_A); 1398444c061aSmrg else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis)) 1399444c061aSmrg a += (XK_agrave - XK_Agrave); 1400444c061aSmrg else if ((a >= XK_Ooblique) && (a <= XK_Thorn)) 1401444c061aSmrg a += (XK_oslash - XK_Ooblique); 1402444c061aSmrg 1403444c061aSmrg if ((b >= XK_A) && (b <= XK_Z)) 1404444c061aSmrg b += (XK_a - XK_A); 1405444c061aSmrg else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis)) 1406444c061aSmrg b += (XK_agrave - XK_Agrave); 1407444c061aSmrg else if ((b >= XK_Ooblique) && (b <= XK_Thorn)) 1408444c061aSmrg b += (XK_oslash - XK_Ooblique); 1409444c061aSmrg 1410444c061aSmrg if (a != b) break; 1411444c061aSmrg } 1412444c061aSmrg } 1413444c061aSmrg return (((int) *bp) - ((int) *ap)); 1414444c061aSmrg} 1415444c061aSmrg 1416444c061aSmrgstatic void CopyISOLatin1Lowered(char *dst, char *src) 1417444c061aSmrg{ 1418444c061aSmrg unsigned char *dest, *source; 1419444c061aSmrg 1420444c061aSmrg dest = (unsigned char *) dst; source = (unsigned char *) src; 1421444c061aSmrg 1422444c061aSmrg for ( ; *source; source++, dest++) { 1423444c061aSmrg if (*source >= XK_A && *source <= XK_Z) 1424444c061aSmrg *dest = *source + (XK_a - XK_A); 1425444c061aSmrg else if (*source >= XK_Agrave && *source <= XK_Odiaeresis) 1426444c061aSmrg *dest = *source + (XK_agrave - XK_Agrave); 1427444c061aSmrg else if (*source >= XK_Ooblique && *source <= XK_Thorn) 1428444c061aSmrg *dest = *source + (XK_oslash - XK_Ooblique); 1429444c061aSmrg else 1430444c061aSmrg *dest = *source; 1431444c061aSmrg } 1432444c061aSmrg *dest = '\0'; 1433444c061aSmrg} 1434444c061aSmrg 1435444c061aSmrg/*ARGSUSED*/ 1436444c061aSmrgBoolean 1437444c061aSmrgXtCvtStringToInitialState( 1438444c061aSmrg Display* dpy, 1439444c061aSmrg XrmValuePtr args, 1440444c061aSmrg Cardinal *num_args, 1441444c061aSmrg XrmValuePtr fromVal, 1442444c061aSmrg XrmValuePtr toVal, 1443444c061aSmrg XtPointer *closure_ret) 1444444c061aSmrg{ 1445444c061aSmrg String str = (String)fromVal->addr; 1446444c061aSmrg if (*num_args != 0) 1447444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1448444c061aSmrg XtNwrongParameters,"cvtStringToInitialState",XtCXtToolkitError, 1449444c061aSmrg "String to InitialState conversion needs no extra arguments", 1450444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1451444c061aSmrg 1452444c061aSmrg if (CompareISOLatin1(str, "NormalState") == 0) donestr(int, NormalState, XtRInitialState); 1453444c061aSmrg if (CompareISOLatin1(str, "IconicState") == 0) donestr(int, IconicState, XtRInitialState); 1454444c061aSmrg { 1455444c061aSmrg int val; 1456444c061aSmrg if (IsInteger(str, &val)) donestr( int, val, XtRInitialState ); 1457444c061aSmrg } 1458444c061aSmrg XtDisplayStringConversionWarning(dpy, str, XtRInitialState); 1459444c061aSmrg return False; 1460444c061aSmrg} 1461444c061aSmrg 1462444c061aSmrgstatic XtConvertArgRec const visualConvertArgs[] = { 1463444c061aSmrg {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen), 1464444c061aSmrg sizeof(Screen *)}, 1465444c061aSmrg {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth), 1466444c061aSmrg sizeof(Cardinal)} 1467444c061aSmrg}; 1468444c061aSmrg 1469444c061aSmrg/*ARGSUSED*/ 1470444c061aSmrgBoolean XtCvtStringToVisual( 1471444c061aSmrg Display* dpy, 1472444c061aSmrg XrmValuePtr args, /* Screen, depth */ 1473444c061aSmrg Cardinal *num_args, /* 2 */ 1474444c061aSmrg XrmValuePtr fromVal, 1475444c061aSmrg XrmValuePtr toVal, 1476444c061aSmrg XtPointer *closure_ret) /* unused */ 1477444c061aSmrg{ 1478444c061aSmrg String str = (String)fromVal->addr; 1479444c061aSmrg int vc; 1480444c061aSmrg XVisualInfo vinfo; 1481444c061aSmrg if (*num_args != 2) { 1482444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1483444c061aSmrg XtNwrongParameters,"cvtStringToVisual",XtCXtToolkitError, 1484444c061aSmrg "String to Visual conversion needs screen and depth arguments", 1485444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1486444c061aSmrg return False; 1487444c061aSmrg } 1488444c061aSmrg 1489444c061aSmrg if (CompareISOLatin1(str, "StaticGray") == 0) vc = StaticGray; 1490444c061aSmrg else if (CompareISOLatin1(str, "StaticColor") == 0) vc = StaticColor; 1491444c061aSmrg else if (CompareISOLatin1(str, "TrueColor") == 0) vc = TrueColor; 1492444c061aSmrg else if (CompareISOLatin1(str, "GrayScale") == 0) vc = GrayScale; 1493444c061aSmrg else if (CompareISOLatin1(str, "PseudoColor") == 0) vc = PseudoColor; 1494444c061aSmrg else if (CompareISOLatin1(str, "DirectColor") == 0) vc = DirectColor; 1495444c061aSmrg else if (!IsInteger(str, &vc)) { 1496444c061aSmrg XtDisplayStringConversionWarning(dpy, str, "Visual class name"); 1497444c061aSmrg return False; 1498444c061aSmrg } 1499444c061aSmrg 1500444c061aSmrg if (XMatchVisualInfo( XDisplayOfScreen((Screen*)*(Screen**)args[0].addr), 1501444c061aSmrg XScreenNumberOfScreen((Screen*)*(Screen**)args[0].addr), 1502444c061aSmrg (int)*(int*)args[1].addr, 1503444c061aSmrg vc, 1504444c061aSmrg &vinfo) ) { 1505444c061aSmrg donestr( Visual*, vinfo.visual, XtRVisual ); 1506444c061aSmrg } 1507444c061aSmrg else { 1508444c061aSmrg String params[2]; 1509444c061aSmrg Cardinal num_params = 2; 1510444c061aSmrg params[0] = str; 1511444c061aSmrg params[1] = 1512444c061aSmrg DisplayString(XDisplayOfScreen((Screen*)*(Screen**)args[0].addr)); 1513444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1514444c061aSmrg XtNconversionError, "stringToVisual", XtCXtToolkitError, 1515444c061aSmrg "Cannot find Visual of class %s for display %s", 1516444c061aSmrg params, &num_params ); 1517444c061aSmrg return False; 1518444c061aSmrg } 1519444c061aSmrg} 1520444c061aSmrg 1521444c061aSmrg 1522444c061aSmrg/*ARGSUSED*/ 1523444c061aSmrgBoolean XtCvtStringToAtom( 1524444c061aSmrg Display* dpy, 1525444c061aSmrg XrmValuePtr args, 1526444c061aSmrg Cardinal *num_args, 1527444c061aSmrg XrmValuePtr fromVal, 1528444c061aSmrg XrmValuePtr toVal, 1529444c061aSmrg XtPointer *closure_ret) 1530444c061aSmrg{ 1531444c061aSmrg Atom atom; 1532444c061aSmrg if (*num_args != 1) { 1533444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1534444c061aSmrg XtNwrongParameters,"cvtStringToAtom",XtCXtToolkitError, 1535444c061aSmrg "String to Atom conversion needs Display argument", 1536444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1537444c061aSmrg return False; 1538444c061aSmrg } 1539444c061aSmrg 1540444c061aSmrg atom = XInternAtom( *(Display**)args->addr, (char*)fromVal->addr, False ); 1541444c061aSmrg donestr(Atom, atom, XtRAtom); 1542444c061aSmrg} 1543444c061aSmrg 1544444c061aSmrg/*ARGSUSED*/ 1545444c061aSmrgBoolean XtCvtStringToDirectoryString( 1546444c061aSmrg Display *dpy, 1547444c061aSmrg XrmValuePtr args, 1548444c061aSmrg Cardinal *num_args, 1549444c061aSmrg XrmValuePtr fromVal, 1550444c061aSmrg XrmValuePtr toVal, 1551444c061aSmrg XtPointer *closure_ret) 1552444c061aSmrg{ 1553444c061aSmrg String str; 1554444c061aSmrg char directory[PATH_MAX+1]; 1555444c061aSmrg 1556444c061aSmrg if (*num_args != 0) 1557444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1558444c061aSmrg XtNwrongParameters,"cvtStringToDirectoryString",XtCXtToolkitError, 1559444c061aSmrg "String to DirectoryString conversion needs no extra arguments", 1560444c061aSmrg (String *)NULL, (Cardinal *)NULL); 1561444c061aSmrg 1562444c061aSmrg str = (String)fromVal->addr; 1563444c061aSmrg if (CompareISOLatin1(str, "XtCurrentDirectory") == 0) { 1564444c061aSmrg /* uglier, but does not depend on compiler knowing return type */ 1565444c061aSmrg#if !defined(X_NOT_POSIX) || defined(SYSV) || defined(WIN32) 1566444c061aSmrg if (getcwd(directory, PATH_MAX + 1)) 1567444c061aSmrg str = directory; 1568444c061aSmrg#else 1569444c061aSmrg if (getwd(directory)) 1570444c061aSmrg str = directory; 1571444c061aSmrg#endif 1572444c061aSmrg if (!str) { 1573444c061aSmrg if (errno == EACCES) 1574444c061aSmrg errno = 0; /* reset errno */ 1575444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, 1576444c061aSmrg XtRDirectoryString); 1577444c061aSmrg return False; 1578444c061aSmrg } 1579444c061aSmrg } 1580444c061aSmrg 1581444c061aSmrg /* Since memory from the resource database or from static buffers of 1582444c061aSmrg * system libraries may be freed or overwritten, allocate memory. 1583444c061aSmrg * The memory is freed when all cache references are released. 1584444c061aSmrg */ 1585444c061aSmrg str = XtNewString(str); 1586444c061aSmrg donestr(String, str, XtRDirectoryString); 1587444c061aSmrg} 1588444c061aSmrg 1589444c061aSmrg/*ARGSUSED*/ 1590444c061aSmrgstatic void FreeDirectoryString( 1591444c061aSmrg XtAppContext app, 1592444c061aSmrg XrmValuePtr toVal, 1593444c061aSmrg XtPointer closure, /* unused */ 1594444c061aSmrg XrmValuePtr args, 1595444c061aSmrg Cardinal *num_args) 1596444c061aSmrg{ 1597444c061aSmrg if (*num_args != 0) 1598444c061aSmrg XtAppWarningMsg(app, 1599444c061aSmrg XtNwrongParameters,"freeDirectoryString",XtCXtToolkitError, 1600444c061aSmrg "Free Directory String requires no extra arguments", 1601444c061aSmrg (String *) NULL, (Cardinal *) NULL); 1602444c061aSmrg 1603444c061aSmrg XtFree((char *) toVal->addr); 1604444c061aSmrg} 1605444c061aSmrg 1606444c061aSmrg/*ARGSUSED*/ 1607444c061aSmrgBoolean XtCvtStringToRestartStyle( 1608444c061aSmrg Display *dpy, 1609444c061aSmrg XrmValuePtr args, 1610444c061aSmrg Cardinal *num_args, 1611444c061aSmrg XrmValuePtr fromVal, 1612444c061aSmrg XrmValuePtr toVal, 1613444c061aSmrg XtPointer *closure_ret) 1614444c061aSmrg{ 1615444c061aSmrg String str = (String)fromVal->addr; 1616444c061aSmrg if (*num_args != 0) 1617444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1618444c061aSmrg XtNwrongParameters,"cvtStringToRestartStyle",XtCXtToolkitError, 1619444c061aSmrg "String to RestartStyle conversion needs no extra arguments", 1620444c061aSmrg (String *)NULL, (Cardinal *)NULL); 1621444c061aSmrg 1622444c061aSmrg if (CompareISOLatin1(str, "RestartIfRunning") == 0) 1623444c061aSmrg donestr(unsigned char, SmRestartIfRunning, XtRRestartStyle); 1624444c061aSmrg if (CompareISOLatin1(str, "RestartAnyway") == 0) 1625444c061aSmrg donestr(unsigned char, SmRestartAnyway, XtRRestartStyle); 1626444c061aSmrg if (CompareISOLatin1(str, "RestartImmediately") == 0) 1627444c061aSmrg donestr(unsigned char, SmRestartImmediately, XtRRestartStyle); 1628444c061aSmrg if (CompareISOLatin1(str, "RestartNever") == 0) 1629444c061aSmrg donestr(unsigned char, SmRestartNever, XtRRestartStyle); 1630444c061aSmrg XtDisplayStringConversionWarning(dpy, str, XtRRestartStyle); 1631444c061aSmrg return False; 1632444c061aSmrg} 1633444c061aSmrg 1634444c061aSmrg/*ARGSUSED*/ 1635444c061aSmrgBoolean XtCvtStringToCommandArgArray( 1636444c061aSmrg Display *dpy, 1637444c061aSmrg XrmValuePtr args, 1638444c061aSmrg Cardinal *num_args, 1639444c061aSmrg XrmValuePtr fromVal, 1640444c061aSmrg XrmValuePtr toVal, 1641444c061aSmrg XtPointer *closure_ret) 1642444c061aSmrg{ 1643444c061aSmrg String *strarray, *ptr; 1644444c061aSmrg char *src; 1645444c061aSmrg char *dst, *dst_str; 1646444c061aSmrg char *start; 1647444c061aSmrg int tokens, len; 1648444c061aSmrg 1649444c061aSmrg if (*num_args != 0) 1650444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext(dpy), 1651444c061aSmrg XtNwrongParameters,"cvtStringToCommandArgArray",XtCXtToolkitError, 1652444c061aSmrg "String to CommandArgArray conversion needs no extra arguments", 1653444c061aSmrg (String *)NULL, (Cardinal *)NULL); 1654444c061aSmrg 1655444c061aSmrg src = fromVal->addr; 1656444c061aSmrg dst = dst_str = __XtMalloc((unsigned) strlen(src) + 1); 1657444c061aSmrg tokens = 0; 1658444c061aSmrg 1659444c061aSmrg while (*src != '\0') { 1660444c061aSmrg /* skip whitespace */ 1661444c061aSmrg while (IsWhitespace(*src) || IsNewline(*src)) 1662444c061aSmrg src++; 1663444c061aSmrg /* test for end of string */ 1664444c061aSmrg if (*src == '\0') 1665444c061aSmrg break; 1666444c061aSmrg 1667444c061aSmrg /* start new token */ 1668444c061aSmrg tokens++; 1669444c061aSmrg start = src; 1670444c061aSmrg while (*src != '\0' && !IsWhitespace(*src) && !IsNewline(*src)) { 1671444c061aSmrg if (*src == '\\' && 1672444c061aSmrg (IsWhitespace(*(src+1)) || IsNewline(*(src+1)))) { 1673444c061aSmrg len = src - start; 1674444c061aSmrg if (len) { 1675444c061aSmrg /* copy preceeding part of token */ 1676444c061aSmrg memcpy(dst, start, len); 1677444c061aSmrg dst += len; 1678444c061aSmrg } 1679444c061aSmrg /* skip backslash */ 1680444c061aSmrg src++; 1681444c061aSmrg /* next part of token starts at whitespace */ 1682444c061aSmrg start = src; 1683444c061aSmrg } 1684444c061aSmrg src++; 1685444c061aSmrg } 1686444c061aSmrg len = src - start; 1687444c061aSmrg if (len) { 1688444c061aSmrg /* copy last part of token */ 1689444c061aSmrg memcpy(dst, start, len); 1690444c061aSmrg dst += len; 1691444c061aSmrg } 1692444c061aSmrg *dst = '\0'; 1693444c061aSmrg if (*src != '\0') 1694444c061aSmrg dst++; 1695444c061aSmrg } 1696444c061aSmrg 1697444c061aSmrg ptr = strarray = (String*) __XtMalloc((Cardinal)(tokens+1) * sizeof(String)); 1698444c061aSmrg src = dst_str; 1699444c061aSmrg while (--tokens >= 0) { 1700444c061aSmrg *ptr = src; 1701444c061aSmrg ptr++; 1702444c061aSmrg if (tokens) { 1703444c061aSmrg len = strlen(src); 1704444c061aSmrg src = src + len + 1; 1705444c061aSmrg } 1706444c061aSmrg } 1707444c061aSmrg *ptr = NULL; 1708444c061aSmrg 1709444c061aSmrg *closure_ret = (XtPointer) strarray; 1710444c061aSmrg donestr(char**, strarray, XtRCommandArgArray) 1711444c061aSmrg} 1712444c061aSmrg 1713444c061aSmrg/*ARGSUSED*/ 1714444c061aSmrgstatic void ArgArrayDestructor( 1715444c061aSmrg XtAppContext app, 1716444c061aSmrg XrmValuePtr toVal, 1717444c061aSmrg XtPointer closure, 1718444c061aSmrg XrmValuePtr args, 1719444c061aSmrg Cardinal *num_args) 1720444c061aSmrg{ 1721444c061aSmrg String *strarray; 1722444c061aSmrg 1723444c061aSmrg if (closure) { 1724444c061aSmrg strarray = (String*) closure; 1725444c061aSmrg XtFree(*strarray); 1726444c061aSmrg XtFree((char *) strarray); 1727444c061aSmrg } 1728444c061aSmrg} 1729444c061aSmrg 1730444c061aSmrg/*ARGSUSED*/ 1731444c061aSmrgBoolean XtCvtStringToGravity ( 1732444c061aSmrg Display* dpy, 1733444c061aSmrg XrmValuePtr args, 1734444c061aSmrg Cardinal *num_args, 1735444c061aSmrg XrmValuePtr fromVal, 1736444c061aSmrg XrmValuePtr toVal, 1737444c061aSmrg XtPointer *closure_ret) 1738444c061aSmrg{ 1739444c061aSmrg static struct _namepair { 1740444c061aSmrg XrmQuark quark; 1741444c061aSmrg char *name; 1742444c061aSmrg int gravity; 1743444c061aSmrg } names[] = { 1744444c061aSmrg { NULLQUARK, "forget", ForgetGravity }, 1745444c061aSmrg { NULLQUARK, "northwest", NorthWestGravity }, 1746444c061aSmrg { NULLQUARK, "north", NorthGravity }, 1747444c061aSmrg { NULLQUARK, "northeast", NorthEastGravity }, 1748444c061aSmrg { NULLQUARK, "west", WestGravity }, 1749444c061aSmrg { NULLQUARK, "center", CenterGravity }, 1750444c061aSmrg { NULLQUARK, "east", EastGravity }, 1751444c061aSmrg { NULLQUARK, "southwest", SouthWestGravity }, 1752444c061aSmrg { NULLQUARK, "south", SouthGravity }, 1753444c061aSmrg { NULLQUARK, "southeast", SouthEastGravity }, 1754444c061aSmrg { NULLQUARK, "static", StaticGravity }, 1755444c061aSmrg { NULLQUARK, "unmap", UnmapGravity }, 1756444c061aSmrg { NULLQUARK, "0", ForgetGravity }, 1757444c061aSmrg { NULLQUARK, "1", NorthWestGravity }, 1758444c061aSmrg { NULLQUARK, "2", NorthGravity }, 1759444c061aSmrg { NULLQUARK, "3", NorthEastGravity }, 1760444c061aSmrg { NULLQUARK, "4", WestGravity }, 1761444c061aSmrg { NULLQUARK, "5", CenterGravity }, 1762444c061aSmrg { NULLQUARK, "6", EastGravity }, 1763444c061aSmrg { NULLQUARK, "7", SouthWestGravity }, 1764444c061aSmrg { NULLQUARK, "8", SouthGravity }, 1765444c061aSmrg { NULLQUARK, "9", SouthEastGravity }, 1766444c061aSmrg { NULLQUARK, "10", StaticGravity }, 1767444c061aSmrg { NULLQUARK, NULL, ForgetGravity } 1768444c061aSmrg }; 1769444c061aSmrg static Boolean haveQuarks = FALSE; 1770444c061aSmrg char lowerName[40]; 1771444c061aSmrg XrmQuark q; 1772444c061aSmrg char *s; 1773444c061aSmrg struct _namepair *np; 1774444c061aSmrg 1775444c061aSmrg if (*num_args != 0) { 1776444c061aSmrg XtAppWarningMsg(XtDisplayToApplicationContext (dpy), 1777444c061aSmrg "wrongParameters","cvtStringToGravity","XtToolkitError", 1778444c061aSmrg "String to Gravity conversion needs no extra arguments", 1779444c061aSmrg (String *) NULL, (Cardinal *)NULL); 1780444c061aSmrg return False; 1781444c061aSmrg } 1782444c061aSmrg if (!haveQuarks) { 1783444c061aSmrg for (np = names; np->name; np++) { 1784444c061aSmrg np->quark = XrmPermStringToQuark (np->name); 1785444c061aSmrg } 1786444c061aSmrg haveQuarks = TRUE; 1787444c061aSmrg } 1788444c061aSmrg s = (char *) fromVal->addr; 1789444c061aSmrg if (strlen(s) < sizeof lowerName) { 1790444c061aSmrg CopyISOLatin1Lowered (lowerName, s); 1791444c061aSmrg q = XrmStringToQuark (lowerName); 1792444c061aSmrg for (np = names; np->name; np++) 1793444c061aSmrg if (np->quark == q) donestr(int, np->gravity, XtRGravity); 1794444c061aSmrg } 1795444c061aSmrg XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRGravity); 1796444c061aSmrg return False; 1797444c061aSmrg} 1798444c061aSmrg 1799444c061aSmrgvoid _XtAddDefaultConverters( 1800444c061aSmrg ConverterTable table) 1801444c061aSmrg{ 1802444c061aSmrg#define Add(from, to, proc, convert_args, num_args, cache) \ 1803444c061aSmrg _XtTableAddConverter(table, from, to, proc, \ 1804444c061aSmrg (XtConvertArgList) convert_args, (Cardinal)num_args, \ 1805444c061aSmrg True, cache, (XtDestructor)NULL, True) 1806444c061aSmrg 1807444c061aSmrg#define Add2(from, to, proc, convert_args, num_args, cache, destructor) \ 1808444c061aSmrg _XtTableAddConverter(table, from, to, proc, \ 1809444c061aSmrg (XtConvertArgList) convert_args, (Cardinal)num_args, \ 1810444c061aSmrg True, cache, destructor, True) 1811444c061aSmrg 1812444c061aSmrg Add(XtQColor, XtQPixel, XtCvtColorToPixel, NULL, 0, XtCacheNone); 1813444c061aSmrg 1814444c061aSmrg Add(XtQInt, XtQBool, XtCvtIntToBool, NULL, 0, XtCacheNone); 1815444c061aSmrg Add(XtQInt, XtQBoolean, XtCvtIntToBoolean, NULL, 0, XtCacheNone); 1816444c061aSmrg Add(XtQInt, XtQColor, XtCvtIntToColor, 1817444c061aSmrg colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay); 1818444c061aSmrg Add(XtQInt, XtQDimension, XtCvtIntToShort, NULL, 0, XtCacheNone); 1819444c061aSmrg Add(XtQInt, XtQFloat, XtCvtIntToFloat, NULL, 0, XtCacheNone); 1820444c061aSmrg Add(XtQInt, XtQFont, XtCvtIntToFont, NULL, 0, XtCacheNone); 1821444c061aSmrg Add(XtQInt, XtQPixel, XtCvtIntToPixel, NULL, 0, XtCacheNone); 1822444c061aSmrg Add(XtQInt, XtQPixmap, XtCvtIntToPixmap, NULL, 0, XtCacheNone); 1823444c061aSmrg Add(XtQInt, XtQPosition, XtCvtIntToShort, NULL, 0, XtCacheNone); 1824444c061aSmrg Add(XtQInt, XtQShort, XtCvtIntToShort, NULL, 0, XtCacheNone); 1825444c061aSmrg Add(XtQInt, XtQUnsignedChar,XtCvtIntToUnsignedChar,NULL, 0, XtCacheNone); 1826444c061aSmrg 1827444c061aSmrg Add(XtQPixel, XtQColor, XtCvtIntToColor, 1828444c061aSmrg colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay); 1829444c061aSmrg 1830444c061aSmrg Add(_XtQString, XtQAtom, XtCvtStringToAtom, 1831444c061aSmrg displayConvertArg, XtNumber(displayConvertArg), XtCacheNone); 1832444c061aSmrg Add(_XtQString, XtQBool, XtCvtStringToBool, NULL, 0, XtCacheNone); 1833444c061aSmrg Add(_XtQString, XtQBoolean, XtCvtStringToBoolean, NULL, 0, XtCacheNone); 1834444c061aSmrg Add2(_XtQString, XtQCommandArgArray, XtCvtStringToCommandArgArray, 1835444c061aSmrg NULL, 0, XtCacheNone | XtCacheRefCount, ArgArrayDestructor); 1836444c061aSmrg Add2(_XtQString, XtQCursor, XtCvtStringToCursor, 1837444c061aSmrg displayConvertArg, XtNumber(displayConvertArg), 1838444c061aSmrg XtCacheByDisplay, FreeCursor); 1839444c061aSmrg Add(_XtQString, XtQDimension, XtCvtStringToDimension,NULL, 0, XtCacheNone); 1840444c061aSmrg Add2(_XtQString, XtQDirectoryString, XtCvtStringToDirectoryString, NULL, 0, 1841444c061aSmrg XtCacheNone | XtCacheRefCount, FreeDirectoryString); 1842444c061aSmrg Add(_XtQString, XtQDisplay, XtCvtStringToDisplay, NULL, 0, XtCacheAll); 1843444c061aSmrg Add2(_XtQString, XtQFile, XtCvtStringToFile, NULL, 0, 1844444c061aSmrg XtCacheAll | XtCacheRefCount, FreeFile); 1845444c061aSmrg Add(_XtQString, XtQFloat, XtCvtStringToFloat, NULL, 0, XtCacheNone); 1846444c061aSmrg 1847444c061aSmrg Add2(_XtQString, XtQFont, XtCvtStringToFont, 1848444c061aSmrg displayConvertArg, XtNumber(displayConvertArg), 1849444c061aSmrg XtCacheByDisplay, FreeFont); 1850444c061aSmrg Add2(_XtQString, XtQFontSet, XtCvtStringToFontSet, 1851444c061aSmrg localeDisplayConvertArgs, XtNumber(localeDisplayConvertArgs), 1852444c061aSmrg XtCacheByDisplay, FreeFontSet); 1853444c061aSmrg Add2(_XtQString, XtQFontStruct,XtCvtStringToFontStruct, 1854444c061aSmrg displayConvertArg, XtNumber(displayConvertArg), 1855444c061aSmrg XtCacheByDisplay, FreeFontStruct); 1856444c061aSmrg 1857444c061aSmrg Add(_XtQString, XtQGravity, XtCvtStringToGravity, NULL, 0, XtCacheNone); 1858444c061aSmrg Add(_XtQString, XtQInitialState, XtCvtStringToInitialState, NULL, 0, 1859444c061aSmrg XtCacheNone); 1860444c061aSmrg Add(_XtQString, XtQInt, XtCvtStringToInt, NULL, 0, XtCacheAll); 1861444c061aSmrg Add2(_XtQString, XtQPixel, XtCvtStringToPixel, 1862444c061aSmrg colorConvertArgs, XtNumber(colorConvertArgs), 1863444c061aSmrg XtCacheByDisplay, FreePixel); 1864444c061aSmrg Add(_XtQString, XtQPosition, XtCvtStringToShort, NULL, 0, XtCacheAll); 1865444c061aSmrg Add(_XtQString, XtQRestartStyle, XtCvtStringToRestartStyle, NULL, 0, 1866444c061aSmrg XtCacheNone); 1867444c061aSmrg Add(_XtQString, XtQShort, XtCvtStringToShort, NULL, 0, XtCacheAll); 1868444c061aSmrg Add(_XtQString, XtQUnsignedChar, XtCvtStringToUnsignedChar, 1869444c061aSmrg NULL, 0, XtCacheAll); 1870444c061aSmrg Add2(_XtQString, XtQVisual, XtCvtStringToVisual, 1871444c061aSmrg visualConvertArgs, XtNumber(visualConvertArgs), 1872444c061aSmrg XtCacheByDisplay, NULL); 1873444c061aSmrg 1874444c061aSmrg _XtAddTMConverters(table); 1875444c061aSmrg} 1876