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