Resources.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 271477040fSmrgPermission to use, copy, modify, and distribute this software and its 281477040fSmrgdocumentation for any purpose and without fee is hereby granted, 29444c061aSmrgprovided that the above copyright notice appear in all copies and that 301477040fSmrgboth 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 331477040fSmrgsoftware 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#ifdef HAVE_CONFIG_H 73444c061aSmrg#include <config.h> 74444c061aSmrg#endif 75444c061aSmrg#include "IntrinsicI.h" 76444c061aSmrg#include "VarargsI.h" 77444c061aSmrg#include "Shell.h" 78444c061aSmrg#include "ShellP.h" 79444c061aSmrg#include "StringDefs.h" 80444c061aSmrg#include <stdio.h> 81444c061aSmrg 82444c061aSmrgstatic XrmClass QBoolean, QString, QCallProc, QImmediate; 83444c061aSmrgstatic XrmName QinitialResourcesPersistent, QInitialResourcesPersistent; 84444c061aSmrgstatic XrmClass QTranslations, QTranslationTable; 85444c061aSmrgstatic XrmName Qtranslations, QbaseTranslations; 86444c061aSmrgstatic XrmName Qscreen; 87444c061aSmrgstatic XrmClass QScreen; 88444c061aSmrg 89444c061aSmrg#ifdef CRAY 90444c061aSmrgvoid Cjump(); 91444c061aSmrgchar *Cjumpp = (char *) Cjump; 92444c061aSmrgvoid Cjump() {} 93444c061aSmrg#endif 94444c061aSmrg 95444c061aSmrgvoid _XtCopyFromParent( 96444c061aSmrg Widget widget, 97444c061aSmrg int offset, 98444c061aSmrg XrmValue *value) 99444c061aSmrg{ 100444c061aSmrg if (widget->core.parent == NULL) { 101444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 102444c061aSmrg "invalidParent","xtCopyFromParent",XtCXtToolkitError, 103444c061aSmrg "CopyFromParent must have non-NULL parent", 104444c061aSmrg (String *)NULL, (Cardinal *)NULL); 105444c061aSmrg value->addr = NULL; 106444c061aSmrg return; 107444c061aSmrg } 108444c061aSmrg value->addr = (XPointer)(((char *)widget->core.parent) + offset); 109444c061aSmrg} /* _XtCopyFromParent */ 110444c061aSmrg 111444c061aSmrg 112444c061aSmrg/* If the alignment characteristics of your machine are right, these may be 113444c061aSmrg faster */ 114444c061aSmrg 115444c061aSmrg#ifdef UNALIGNED 116444c061aSmrg 117444c061aSmrgvoid _XtCopyFromArg( 118444c061aSmrg XtArgVal src, 119444c061aSmrg char* dst, 120444c061aSmrg register unsigned int size) 121444c061aSmrg{ 122444c061aSmrg if (size == sizeof(long)) *(long *)dst = (long)src; 123444c061aSmrg else if (size == sizeof(short)) *(short *)dst = (short)src; 124444c061aSmrg else if (size == sizeof(char)) *(char *)dst = (char)src; 125444c061aSmrg else if (size == sizeof(XtPointer)) *(XtPointer *)dst = (XtPointer)src; 126444c061aSmrg else if (size == sizeof(char*)) *(char **)dst = (char*)src; 127444c061aSmrg else if (size == sizeof(XtArgVal)) *(XtArgVal *)dst = src; 128444c061aSmrg else if (size > sizeof(XtArgVal)) 129444c061aSmrg (void) memmove((char *) dst, (char *) src, (int) size); 130444c061aSmrg else 131444c061aSmrg (void) memmove((char *) dst, (char *) &src, (int) size); 132444c061aSmrg} /* _XtCopyFromArg */ 133444c061aSmrg 134444c061aSmrgvoid _XtCopyToArg( 135444c061aSmrg char* src, 136444c061aSmrg XtArgVal *dst, 137444c061aSmrg register unsigned int size) 138444c061aSmrg{ 139444c061aSmrg if (! (*dst)) { 140444c061aSmrg#ifdef GETVALUES_BUG 141444c061aSmrg /* old GetValues semantics (storing directly into arglists) are bad, 142444c061aSmrg * but preserve for compatibility as long as arglist contains NULL. 143444c061aSmrg */ 144444c061aSmrg if (size == sizeof(long)) *dst = (XtArgVal)*(long*)src; 145444c061aSmrg else if (size == sizeof(short)) *dst = (XtArgVal)*(short*)src; 146444c061aSmrg else if (size == sizeof(char)) *dst = (XtArgVal)*(char*)src; 147444c061aSmrg else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src; 148444c061aSmrg else if (size == sizeof(char*)) *dst = (XtArgVal)*(char**)src; 149444c061aSmrg else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src; 150444c061aSmrg else (void) memmove((char*)dst, (char*)src, (int)size); 151444c061aSmrg#else 152444c061aSmrg XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError, 153444c061aSmrg "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL); 154444c061aSmrg#endif 155444c061aSmrg } 156444c061aSmrg else { 157444c061aSmrg /* proper GetValues semantics: argval is pointer to destination */ 158444c061aSmrg if (size == sizeof(long)) *((long*)*dst) = *(long*)src; 159444c061aSmrg else if (size == sizeof(short)) *((short*)*dst) = *(short*)src; 160444c061aSmrg else if (size == sizeof(char)) *((char*)*dst) = *(char*)src; 161444c061aSmrg else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src; 162444c061aSmrg else if (size == sizeof(char*)) *((char**)*dst) = *(char**)src; 163444c061aSmrg else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src; 164444c061aSmrg else (void) memmove((char*)*dst, (char*)src, (int)size); 165444c061aSmrg } 166444c061aSmrg} /* _XtCopyToArg */ 167444c061aSmrg 168444c061aSmrgstatic void CopyToArg( 169444c061aSmrg char* src, 170444c061aSmrg XtArgVal *dst, 171444c061aSmrg register unsigned int size) 172444c061aSmrg{ 173444c061aSmrg if (! (*dst)) { 174444c061aSmrg /* old GetValues semantics (storing directly into arglists) are bad, 175444c061aSmrg * but preserve for compatibility as long as arglist contains NULL. 176444c061aSmrg */ 177444c061aSmrg if (size == sizeof(long)) *dst = (XtArgVal)*(long*)src; 178444c061aSmrg else if (size == sizeof(short)) *dst = (XtArgVal)*(short*)src; 179444c061aSmrg else if (size == sizeof(char)) *dst = (XtArgVal)*(char*)src; 180444c061aSmrg else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src; 181444c061aSmrg else if (size == sizeof(char*)) *dst = (XtArgVal)*(char**)src; 182444c061aSmrg else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src; 183444c061aSmrg else (void) memmove((char*)dst, (char*)src, (int)size); 184444c061aSmrg } 185444c061aSmrg else { 186444c061aSmrg /* proper GetValues semantics: argval is pointer to destination */ 187444c061aSmrg if (size == sizeof(long)) *((long*)*dst) = *(long*)src; 188444c061aSmrg else if (size == sizeof(short)) *((short*)*dst) = *(short*)src; 189444c061aSmrg else if (size == sizeof(char)) *((char*)*dst) = *(char*)src; 190444c061aSmrg else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src; 191444c061aSmrg else if (size == sizeof(char*)) *((char**)*dst) = *(char**)src; 192444c061aSmrg else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src; 193444c061aSmrg else (void) memmove((char*)*dst, (char*)src, (int)size); 194444c061aSmrg } 195444c061aSmrg} /* CopyToArg */ 196444c061aSmrg 197444c061aSmrg#else 198444c061aSmrgvoid _XtCopyFromArg( 199444c061aSmrg XtArgVal src, 200444c061aSmrg char* dst, 201444c061aSmrg register unsigned int size) 202444c061aSmrg{ 203444c061aSmrg if (size > sizeof(XtArgVal)) 204444c061aSmrg (void) memmove((char *) dst, (char *) src, (int) size); 205444c061aSmrg else { 206444c061aSmrg union { 207444c061aSmrg long longval; 208444c061aSmrg#ifdef LONG64 209444c061aSmrg int intval; 210444c061aSmrg#endif 211444c061aSmrg short shortval; 212444c061aSmrg char charval; 213444c061aSmrg char* charptr; 214444c061aSmrg XtPointer ptr; 215444c061aSmrg } u; 216444c061aSmrg char *p = (char*)&u; 217444c061aSmrg if (size == sizeof(long)) u.longval = (long)src; 218444c061aSmrg#ifdef LONG64 219444c061aSmrg else if (size == sizeof(int)) u.intval = (int)src; 220444c061aSmrg#endif 221444c061aSmrg else if (size == sizeof(short)) u.shortval = (short)src; 222444c061aSmrg else if (size == sizeof(char)) u.charval = (char)src; 223444c061aSmrg else if (size == sizeof(XtPointer)) u.ptr = (XtPointer)src; 224444c061aSmrg else if (size == sizeof(char*)) u.charptr = (char*)src; 225444c061aSmrg else p = (char*)&src; 226444c061aSmrg 227444c061aSmrg (void) memmove(dst, p, (int) size); 228444c061aSmrg } 229444c061aSmrg} /* _XtCopyFromArg */ 230444c061aSmrg 231444c061aSmrgvoid _XtCopyToArg( 232444c061aSmrg char* src, 233444c061aSmrg XtArgVal *dst, 234444c061aSmrg register unsigned int size) 235444c061aSmrg{ 236444c061aSmrg if (!*dst) { 237444c061aSmrg#ifdef GETVALUES_BUG 238444c061aSmrg /* old GetValues semantics (storing directly into arglists) are bad, 239444c061aSmrg * but preserve for compatibility as long as arglist contains NULL. 240444c061aSmrg */ 241444c061aSmrg union { 242444c061aSmrg long longval; 243444c061aSmrg#ifdef LONG64 244444c061aSmrg int intval; 245444c061aSmrg#endif 246444c061aSmrg short shortval; 247444c061aSmrg char charval; 248444c061aSmrg char* charptr; 249444c061aSmrg XtPointer ptr; 250444c061aSmrg } u; 251444c061aSmrg if (size <= sizeof(XtArgVal)) { 252444c061aSmrg (void) memmove((char*)&u, (char*)src, (int)size ); 253444c061aSmrg if (size == sizeof(long)) *dst = (XtArgVal)u.longval; 254444c061aSmrg#ifdef LONG64 255444c061aSmrg else if (size == sizeof(int)) *dst = (XtArgVal)u.intval; 256444c061aSmrg#endif 257444c061aSmrg else if (size == sizeof(short)) *dst = (XtArgVal)u.shortval; 258444c061aSmrg else if (size == sizeof(char)) *dst = (XtArgVal)u.charval; 259444c061aSmrg else if (size == sizeof(char*)) *dst = (XtArgVal)u.charptr; 260444c061aSmrg else if (size == sizeof(XtPointer)) *dst = (XtArgVal)u.ptr; 261444c061aSmrg else (void) memmove((char*)dst, (char*)src, (int)size ); 262444c061aSmrg } 263444c061aSmrg else 264444c061aSmrg (void) memmove((char*)dst, (char*)src, (int)size ); 265444c061aSmrg#else 266444c061aSmrg XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError, 267444c061aSmrg "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL); 268444c061aSmrg#endif 269444c061aSmrg } 270444c061aSmrg else { 271444c061aSmrg /* proper GetValues semantics: argval is pointer to destination */ 272444c061aSmrg (void) memmove((char*)*dst, (char*)src, (int)size ); 273444c061aSmrg } 274444c061aSmrg} /* _XtCopyToArg */ 275444c061aSmrg 276444c061aSmrgstatic void CopyToArg( 277444c061aSmrg char* src, 278444c061aSmrg XtArgVal *dst, 279444c061aSmrg register unsigned int size) 280444c061aSmrg{ 281444c061aSmrg if (!*dst) { 282444c061aSmrg /* old GetValues semantics (storing directly into arglists) are bad, 283444c061aSmrg * but preserve for compatibility as long as arglist contains NULL. 284444c061aSmrg */ 285444c061aSmrg union { 286444c061aSmrg long longval; 287444c061aSmrg#ifdef LONG64 288444c061aSmrg int intval; 289444c061aSmrg#endif 290444c061aSmrg short shortval; 291444c061aSmrg char charval; 292444c061aSmrg char* charptr; 293444c061aSmrg XtPointer ptr; 294444c061aSmrg } u; 295444c061aSmrg if (size <= sizeof(XtArgVal)) { 296444c061aSmrg (void) memmove((char*)&u, (char*)src, (int)size ); 297444c061aSmrg if (size == sizeof(long)) *dst = (XtArgVal)u.longval; 298444c061aSmrg#ifdef LONG64 299444c061aSmrg else if (size == sizeof(int)) *dst = (XtArgVal)u.intval; 300444c061aSmrg#endif 301444c061aSmrg else if (size == sizeof(short)) *dst = (XtArgVal)u.shortval; 302444c061aSmrg else if (size == sizeof(char)) *dst = (XtArgVal)u.charval; 303444c061aSmrg else if (size == sizeof(char*)) *dst = (XtArgVal)u.charptr; 304444c061aSmrg else if (size == sizeof(XtPointer)) *dst = (XtArgVal)u.ptr; 305444c061aSmrg else (void) memmove((char*)dst, (char*)src, (int)size ); 306444c061aSmrg } 307444c061aSmrg else 308444c061aSmrg (void) memmove((char*)dst, (char*)src, (int)size ); 309444c061aSmrg } 310444c061aSmrg else { 311444c061aSmrg /* proper GetValues semantics: argval is pointer to destination */ 312444c061aSmrg (void) memmove((char*)*dst, (char*)src, (int)size ); 313444c061aSmrg } 314444c061aSmrg} /* CopyToArg */ 315444c061aSmrg 316444c061aSmrg#endif 317444c061aSmrg 318444c061aSmrgstatic Cardinal CountTreeDepth( 319444c061aSmrg Widget w) 320444c061aSmrg{ 321444c061aSmrg Cardinal count; 322444c061aSmrg 323444c061aSmrg for (count = 1; w != NULL; w = (Widget) w->core.parent) 324444c061aSmrg count++; 325444c061aSmrg 326444c061aSmrg return count; 327444c061aSmrg} 328444c061aSmrg 329444c061aSmrgstatic void GetNamesAndClasses( 330444c061aSmrg register Widget w, 331444c061aSmrg register XrmNameList names, 332444c061aSmrg register XrmClassList classes) 333444c061aSmrg{ 334444c061aSmrg register Cardinal length, j; 335444c061aSmrg register XrmQuark t; 336444c061aSmrg WidgetClass class; 337444c061aSmrg 338444c061aSmrg /* Return null-terminated quark arrays, with length the number of 339444c061aSmrg quarks (not including NULL) */ 340444c061aSmrg 341444c061aSmrg LOCK_PROCESS; 342444c061aSmrg for (length = 0; w != NULL; w = (Widget) w->core.parent) { 343444c061aSmrg names[length] = w->core.xrm_name; 344444c061aSmrg class = XtClass(w); 345444c061aSmrg /* KLUDGE KLUDGE KLUDGE KLUDGE */ 346444c061aSmrg if (w->core.parent == NULL && XtIsApplicationShell(w)) { 347444c061aSmrg classes[length] = 348444c061aSmrg ((ApplicationShellWidget) w)->application.xrm_class; 349444c061aSmrg } else classes[length] = class->core_class.xrm_class; 350444c061aSmrg length++; 351444c061aSmrg } 352444c061aSmrg UNLOCK_PROCESS; 353444c061aSmrg /* They're in backwards order, flop them around */ 354444c061aSmrg for (j = 0; j < length/2; j++) { 355444c061aSmrg t = names[j]; 356444c061aSmrg names[j] = names[length-j-1]; 357444c061aSmrg names[length-j-1] = t; 358444c061aSmrg t = classes[j]; 359444c061aSmrg classes[j] = classes[length-j-1]; 360444c061aSmrg classes[length-j-1] = t; 361444c061aSmrg } 362444c061aSmrg names[length] = NULLQUARK; 363444c061aSmrg classes[length] = NULLQUARK; 364444c061aSmrg} /* GetNamesAndClasses */ 365444c061aSmrg 366444c061aSmrg 367444c061aSmrg/* Spiffy fast compiled form of resource list. */ 368444c061aSmrg/* XtResourceLists are compiled in-place into XrmResourceLists */ 369444c061aSmrg/* All atoms are replaced by quarks, and offsets are -offset-1 to */ 370444c061aSmrg/* indicate that this list has been compiled already */ 371444c061aSmrg 372444c061aSmrgvoid _XtCompileResourceList( 373444c061aSmrg register XtResourceList resources, 374444c061aSmrg Cardinal num_resources) 375444c061aSmrg{ 376444c061aSmrg register Cardinal count; 377444c061aSmrg 378444c061aSmrg#define xrmres ((XrmResourceList) resources) 379444c061aSmrg#define PSToQ XrmPermStringToQuark 380444c061aSmrg 381444c061aSmrg for (count = 0; count < num_resources; resources++, count++) { 382444c061aSmrg xrmres->xrm_name = PSToQ(resources->resource_name); 383444c061aSmrg xrmres->xrm_class = PSToQ(resources->resource_class); 384444c061aSmrg xrmres->xrm_type = PSToQ(resources->resource_type); 385444c061aSmrg xrmres->xrm_offset = (Cardinal) 386444c061aSmrg (-(int)resources->resource_offset - 1); 387444c061aSmrg xrmres->xrm_default_type = PSToQ(resources->default_type); 388444c061aSmrg } 389444c061aSmrg#undef PSToQ 390444c061aSmrg#undef xrmres 391444c061aSmrg} /* _XtCompileResourceList */ 392444c061aSmrg 393444c061aSmrg/* Like _XtCompileResourceList, but strings are not permanent */ 394444c061aSmrgstatic void XrmCompileResourceListEphem( 395444c061aSmrg register XtResourceList resources, 396444c061aSmrg Cardinal num_resources) 397444c061aSmrg{ 398444c061aSmrg register Cardinal count; 399444c061aSmrg 400444c061aSmrg#define xrmres ((XrmResourceList) resources) 401444c061aSmrg 402444c061aSmrg for (count = 0; count < num_resources; resources++, count++) { 403444c061aSmrg xrmres->xrm_name = StringToName(resources->resource_name); 404444c061aSmrg xrmres->xrm_class = StringToClass(resources->resource_class); 405444c061aSmrg xrmres->xrm_type = StringToQuark(resources->resource_type); 406444c061aSmrg xrmres->xrm_offset = (Cardinal) 407444c061aSmrg (-(int)resources->resource_offset - 1); 408444c061aSmrg xrmres->xrm_default_type = StringToQuark(resources->default_type); 409444c061aSmrg } 410444c061aSmrg#undef xrmres 411444c061aSmrg} /* XrmCompileResourceListEphem */ 412444c061aSmrg 413444c061aSmrgstatic void BadSize( 414444c061aSmrg Cardinal size, 415444c061aSmrg XrmQuark name) 416444c061aSmrg{ 417444c061aSmrg String params[2]; 418444c061aSmrg Cardinal num_params = 2; 419444c061aSmrg 420444c061aSmrg params[0] = (String)(long) size; 421444c061aSmrg params[1] = XrmQuarkToString(name); 422444c061aSmrg XtWarningMsg("invalidSizeOverride", "xtDependencies", XtCXtToolkitError, 423444c061aSmrg "Representation size %d must match superclass's to override %s", 424444c061aSmrg params, &num_params); 425444c061aSmrg} /* BadType */ 426444c061aSmrg 427444c061aSmrg/* 428444c061aSmrg * Create a new resource list, with the class resources following the 429444c061aSmrg * superclass's resources. If a resource in the class list overrides 430444c061aSmrg * a superclass resource, then just replace the superclass entry in place. 431444c061aSmrg * 432444c061aSmrg * At the same time, add a level of indirection to the XtResourceList to 433444c061aSmrg * create and XrmResourceList. 434444c061aSmrg */ 435444c061aSmrgvoid _XtDependencies( 436444c061aSmrg XtResourceList *class_resp, /* VAR */ 437444c061aSmrg Cardinal *class_num_resp, /* VAR */ 438444c061aSmrg XrmResourceList *super_res, 439444c061aSmrg Cardinal super_num_res, 440444c061aSmrg Cardinal super_widget_size) 441444c061aSmrg{ 442444c061aSmrg register XrmResourceList *new_res; 443444c061aSmrg Cardinal new_num_res; 444444c061aSmrg XrmResourceList class_res = (XrmResourceList) *class_resp; 445444c061aSmrg Cardinal class_num_res = *class_num_resp; 446444c061aSmrg register Cardinal i, j; 447444c061aSmrg Cardinal new_next; 448444c061aSmrg 449444c061aSmrg if (class_num_res == 0) { 450444c061aSmrg /* Just point to superclass resource list */ 451444c061aSmrg *class_resp = (XtResourceList) super_res; 452444c061aSmrg *class_num_resp = super_num_res; 453444c061aSmrg return; 454444c061aSmrg } 455444c061aSmrg 456444c061aSmrg /* Allocate and initialize new_res with superclass resource pointers */ 457444c061aSmrg new_num_res = super_num_res + class_num_res; 458444c061aSmrg new_res = (XrmResourceList *) __XtMalloc(new_num_res*sizeof(XrmResourceList)); 459444c061aSmrg if (super_num_res > 0) 460444c061aSmrg XtMemmove(new_res, super_res, super_num_res * sizeof(XrmResourceList)); 461444c061aSmrg 462444c061aSmrg /* Put pointers to class resource entries into new_res */ 463444c061aSmrg new_next = super_num_res; 464444c061aSmrg for (i = 0; i < class_num_res; i++) { 465444c061aSmrg if ((Cardinal)(-class_res[i].xrm_offset-1) < super_widget_size) { 466444c061aSmrg /* Probably an override of superclass resources--look for overlap */ 467444c061aSmrg for (j = 0; j < super_num_res; j++) { 468444c061aSmrg if (class_res[i].xrm_offset == new_res[j]->xrm_offset) { 469444c061aSmrg /* Spec is silent on what fields subclass can override. 470444c061aSmrg * The only two of real concern are type & size. 471444c061aSmrg * Although allowing type to be over-ridden introduces 472444c061aSmrg * the possibility of errors, it's at present the only 473444c061aSmrg * reasonable way to allow a subclass to force a private 474444c061aSmrg * converter to be invoked for a subset of fields. 475444c061aSmrg */ 476444c061aSmrg /* We do insist that size be identical to superclass */ 477444c061aSmrg if (class_res[i].xrm_size != new_res[j]->xrm_size) { 478444c061aSmrg BadSize(class_res[i].xrm_size, 479444c061aSmrg (XrmQuark) class_res[i].xrm_name); 480444c061aSmrg class_res[i].xrm_size = new_res[j]->xrm_size; 481444c061aSmrg } 482444c061aSmrg new_res[j] = &(class_res[i]); 483444c061aSmrg new_num_res--; 484444c061aSmrg goto NextResource; 485444c061aSmrg } 486444c061aSmrg } /* for j */ 487444c061aSmrg } 488444c061aSmrg /* Not an overlap, add an entry to new_res */ 489444c061aSmrg new_res[new_next++] = &(class_res[i]); 490444c061aSmrgNextResource:; 491444c061aSmrg } /* for i */ 492444c061aSmrg 493444c061aSmrg /* Okay, stuff new resources back into class record */ 494444c061aSmrg *class_resp = (XtResourceList) new_res; 495444c061aSmrg *class_num_resp = new_num_res; 496444c061aSmrg} /* _XtDependencies */ 497444c061aSmrg 498444c061aSmrg 499444c061aSmrgvoid _XtResourceDependencies( 500444c061aSmrg WidgetClass wc) 501444c061aSmrg{ 502444c061aSmrg WidgetClass sc; 503444c061aSmrg 504444c061aSmrg sc = wc->core_class.superclass; 505444c061aSmrg if (sc == NULL) { 506444c061aSmrg _XtDependencies(&(wc->core_class.resources), 507444c061aSmrg &(wc->core_class.num_resources), 508444c061aSmrg (XrmResourceList *) NULL, (unsigned)0, (unsigned)0); 509444c061aSmrg } else { 510444c061aSmrg _XtDependencies(&(wc->core_class.resources), 511444c061aSmrg &(wc->core_class.num_resources), 512444c061aSmrg (XrmResourceList *) sc->core_class.resources, 513444c061aSmrg sc->core_class.num_resources, 514444c061aSmrg sc->core_class.widget_size); 515444c061aSmrg } 516444c061aSmrg} /* _XtResourceDependencies */ 517444c061aSmrg 518444c061aSmrgvoid _XtConstraintResDependencies( 519444c061aSmrg ConstraintWidgetClass wc) 520444c061aSmrg{ 521444c061aSmrg ConstraintWidgetClass sc; 522444c061aSmrg 523444c061aSmrg if (wc == (ConstraintWidgetClass) constraintWidgetClass) { 524444c061aSmrg _XtDependencies(&(wc->constraint_class.resources), 525444c061aSmrg &(wc->constraint_class.num_resources), 526444c061aSmrg (XrmResourceList *)NULL, (unsigned)0, (unsigned)0); 527444c061aSmrg } else { 528444c061aSmrg sc = (ConstraintWidgetClass) wc->core_class.superclass; 529444c061aSmrg _XtDependencies(&(wc->constraint_class.resources), 530444c061aSmrg &(wc->constraint_class.num_resources), 531444c061aSmrg (XrmResourceList *) sc->constraint_class.resources, 532444c061aSmrg sc->constraint_class.num_resources, 533444c061aSmrg sc->constraint_class.constraint_size); 534444c061aSmrg } 535444c061aSmrg} /* _XtConstraintResDependencies */ 536444c061aSmrg 537444c061aSmrg 538444c061aSmrg 539444c061aSmrg 540444c061aSmrgXrmResourceList* _XtCreateIndirectionTable ( 541444c061aSmrg XtResourceList resources, 542444c061aSmrg Cardinal num_resources) 543444c061aSmrg{ 544444c061aSmrg register Cardinal idx; 545444c061aSmrg XrmResourceList* table; 546444c061aSmrg 547444c061aSmrg table = (XrmResourceList*)__XtMalloc(num_resources * sizeof(XrmResourceList)); 548444c061aSmrg for (idx = 0; idx < num_resources; idx++) 549444c061aSmrg table[idx] = (XrmResourceList)(&(resources[idx])); 550444c061aSmrg return table; 551444c061aSmrg} 552444c061aSmrg 553444c061aSmrgstatic XtCacheRef *GetResources( 554444c061aSmrg Widget widget, /* Widget resources are associated with */ 555444c061aSmrg char* base, /* Base address of memory to write to */ 556444c061aSmrg XrmNameList names, /* Full inheritance name of widget */ 557444c061aSmrg XrmClassList classes, /* Full inheritance class of widget */ 558444c061aSmrg XrmResourceList* table, /* The list of resources required. */ 559444c061aSmrg unsigned num_resources, /* number of items in resource list */ 560444c061aSmrg XrmQuarkList quark_args, /* Arg names quarkified */ 561444c061aSmrg ArgList args, /* ArgList to override resources */ 562444c061aSmrg unsigned num_args, /* number of items in arg list */ 563444c061aSmrg XtTypedArgList typed_args, /* Typed arg list to override resources */ 564444c061aSmrg Cardinal* pNumTypedArgs, /* number of items in typed arg list */ 565444c061aSmrg Boolean tm_hack) /* do baseTranslations */ 566444c061aSmrg{ 567444c061aSmrg/* 568444c061aSmrg * assert: *pNumTypedArgs == 0 if num_args > 0 569444c061aSmrg * assert: num_args == 0 if *pNumTypedArgs > 0 570444c061aSmrg */ 571444c061aSmrg#define SEARCHLISTLEN 100 572444c061aSmrg#define MAXRESOURCES 400 573444c061aSmrg 574444c061aSmrg XrmValue value; 575444c061aSmrg XrmQuark rawType; 576444c061aSmrg XrmValue convValue; 577444c061aSmrg XrmHashTable stackSearchList[SEARCHLISTLEN]; 578444c061aSmrg XrmHashTable *searchList = stackSearchList; 579444c061aSmrg unsigned int searchListSize = SEARCHLISTLEN; 580444c061aSmrg Boolean found[MAXRESOURCES]; 581444c061aSmrg int typed[MAXRESOURCES]; 582444c061aSmrg XtCacheRef cache_ref[MAXRESOURCES]; 583444c061aSmrg XtCacheRef *cache_ptr, *cache_base; 584444c061aSmrg Boolean persistent_resources = True; 585444c061aSmrg Boolean found_persistence = False; 586444c061aSmrg int num_typed_args = *pNumTypedArgs; 587444c061aSmrg XrmDatabase db; 588444c061aSmrg Boolean do_tm_hack = False; 589444c061aSmrg 590444c061aSmrg if ((args == NULL) && (num_args != 0)) { 591444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 592444c061aSmrg "invalidArgCount","getResources",XtCXtToolkitError, 593444c061aSmrg "argument count > 0 on NULL argument list", 594444c061aSmrg (String *)NULL, (Cardinal *)NULL); 595444c061aSmrg num_args = 0; 596444c061aSmrg } 597444c061aSmrg if (num_resources == 0) { 598444c061aSmrg return NULL; 599444c061aSmrg } else if (num_resources >= MAXRESOURCES) { 600444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 601444c061aSmrg "invalidResourceCount","getResources",XtCXtToolkitError, 602444c061aSmrg "too many resources", 603444c061aSmrg (String *)NULL, (Cardinal *)NULL); 604444c061aSmrg return NULL; 605444c061aSmrg } else if (table == NULL) { 606444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 607444c061aSmrg "invalidResourceCount","getResources",XtCXtToolkitError, 608444c061aSmrg "resource count > 0 on NULL resource list", 609444c061aSmrg (String *)NULL, (Cardinal *)NULL); 610444c061aSmrg return NULL; 611444c061aSmrg } 612444c061aSmrg 613444c061aSmrg /* Mark each resource as not found on arg list */ 614444c061aSmrg bzero((char *) found, (int) (num_resources * sizeof(Boolean))); 615444c061aSmrg bzero((char *) typed, (int) (num_resources * sizeof(int))); 616444c061aSmrg 617444c061aSmrg /* Copy the args into the resources, mark each as found */ 618444c061aSmrg { 619444c061aSmrg register ArgList arg; 620444c061aSmrg register XtTypedArgList typed_arg; 621444c061aSmrg register XrmName argName; 622444c061aSmrg register Cardinal j; 623444c061aSmrg register int i; 624444c061aSmrg register XrmResourceList rx; 625444c061aSmrg register XrmResourceList *res; 626444c061aSmrg for (arg = args, i = 0; (Cardinal)i < num_args; i++, arg++) { 627444c061aSmrg argName = quark_args[i]; 628444c061aSmrg if (argName == QinitialResourcesPersistent) { 629444c061aSmrg persistent_resources = (Boolean)arg->value; 630444c061aSmrg found_persistence = True; 631444c061aSmrg continue; 632444c061aSmrg } 633444c061aSmrg for (j = 0, res = table; j < num_resources; j++, res++) { 634444c061aSmrg rx = *res; 635444c061aSmrg if (argName == rx->xrm_name) { 636444c061aSmrg _XtCopyFromArg( 637444c061aSmrg arg->value, 638444c061aSmrg base - rx->xrm_offset - 1, 639444c061aSmrg rx->xrm_size); 640444c061aSmrg found[j] = TRUE; 641444c061aSmrg break; 642444c061aSmrg } 643444c061aSmrg } 644444c061aSmrg } 645444c061aSmrg for (typed_arg = typed_args, i = 0; i < num_typed_args; 646444c061aSmrg i++, typed_arg++) { 647444c061aSmrg register XrmRepresentation argType; 648444c061aSmrg argName = quark_args[i]; 649444c061aSmrg argType = (typed_arg->type == NULL) ? NULLQUARK 650444c061aSmrg : XrmStringToRepresentation(typed_arg->type); 651444c061aSmrg if (argName == QinitialResourcesPersistent) { 652444c061aSmrg persistent_resources = (Boolean)typed_arg->value; 653444c061aSmrg found_persistence = True; 654444c061aSmrg break; 655444c061aSmrg } 656444c061aSmrg for (j = 0, res = table; j < num_resources; j++, res++) { 657444c061aSmrg rx = *res; 658444c061aSmrg if (argName == rx->xrm_name) { 659444c061aSmrg if (argType != NULLQUARK && argType != rx->xrm_type) { 660444c061aSmrg typed[j] = i + 1; 661444c061aSmrg } else { 662444c061aSmrg _XtCopyFromArg( 663444c061aSmrg typed_arg->value, 664444c061aSmrg base - rx->xrm_offset - 1, 665444c061aSmrg rx->xrm_size); 666444c061aSmrg } 667444c061aSmrg found[j] = TRUE; 668444c061aSmrg break; 669444c061aSmrg } 670444c061aSmrg } 671444c061aSmrg } 672444c061aSmrg } 673444c061aSmrg 674444c061aSmrg /* Ask resource manager for a list of database levels that we can 675444c061aSmrg do a single-level search on each resource */ 676444c061aSmrg 677444c061aSmrg db = XtScreenDatabase(XtScreenOfObject(widget)); 678444c061aSmrg while (!XrmQGetSearchList(db, names, classes, 679444c061aSmrg searchList, searchListSize)) { 680444c061aSmrg if (searchList == stackSearchList) 681444c061aSmrg searchList = NULL; 682444c061aSmrg searchList = (XrmHashTable*)XtRealloc((char*)searchList, 683444c061aSmrg sizeof(XrmHashTable) * 684444c061aSmrg (searchListSize *= 2)); 685444c061aSmrg } 686444c061aSmrg 687444c061aSmrg if (persistent_resources) 688444c061aSmrg cache_base = NULL; 689444c061aSmrg else 690444c061aSmrg cache_base = cache_ref; 691444c061aSmrg /* geez, this is an ugly mess */ 692444c061aSmrg if (XtIsShell(widget)) { 693444c061aSmrg register XrmResourceList *res; 694444c061aSmrg register Cardinal j; 695444c061aSmrg Screen *oldscreen = widget->core.screen; 696444c061aSmrg 697444c061aSmrg /* look up screen resource first, since real rdb depends on it */ 698444c061aSmrg for (res = table, j = 0; j < num_resources; j++, res++) { 699444c061aSmrg if ((*res)->xrm_name != Qscreen) 700444c061aSmrg continue; 701444c061aSmrg if (typed[j]) { 702444c061aSmrg register XtTypedArg* arg = typed_args + typed[j] - 1; 703444c061aSmrg XrmQuark from_type; 704444c061aSmrg XrmValue from_val, to_val; 705444c061aSmrg 706444c061aSmrg from_type = StringToQuark(arg->type); 707444c061aSmrg from_val.size = arg->size; 708444c061aSmrg if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal))) 709444c061aSmrg from_val.addr = (XPointer)arg->value; 710444c061aSmrg else 711444c061aSmrg from_val.addr = (XPointer)&arg->value; 712444c061aSmrg to_val.size = sizeof(Screen*); 713444c061aSmrg to_val.addr = (XPointer)&widget->core.screen; 714444c061aSmrg found[j] = _XtConvert(widget, from_type, &from_val, 715444c061aSmrg QScreen, &to_val, cache_base); 716444c061aSmrg if (cache_base && *cache_base) 717444c061aSmrg cache_base++; 718444c061aSmrg } 719444c061aSmrg if (!found[j]) { 720444c061aSmrg if (XrmQGetSearchResource(searchList, Qscreen, QScreen, 721444c061aSmrg &rawType, &value)) { 722444c061aSmrg if (rawType != QScreen) { 723444c061aSmrg convValue.size = sizeof(Screen*); 724444c061aSmrg convValue.addr = (XPointer)&widget->core.screen; 725444c061aSmrg (void)_XtConvert(widget, rawType, &value, 726444c061aSmrg QScreen, &convValue, cache_base); 727444c061aSmrg if (cache_base && *cache_base) 728444c061aSmrg cache_base++; 729444c061aSmrg } else { 730444c061aSmrg widget->core.screen = *((Screen **)value.addr); 731444c061aSmrg } 732444c061aSmrg } 733444c061aSmrg } 734444c061aSmrg break; 735444c061aSmrg } 736444c061aSmrg /* now get the database to use for the rest of the resources */ 737444c061aSmrg if (widget->core.screen != oldscreen) { 738444c061aSmrg db = XtScreenDatabase(widget->core.screen); 739444c061aSmrg while (!XrmQGetSearchList(db, names, classes, 740444c061aSmrg searchList, searchListSize)) { 741444c061aSmrg if (searchList == stackSearchList) 742444c061aSmrg searchList = NULL; 743444c061aSmrg searchList = (XrmHashTable*)XtRealloc((char*)searchList, 744444c061aSmrg sizeof(XrmHashTable) * 745444c061aSmrg (searchListSize *= 2)); 746444c061aSmrg } 747444c061aSmrg } 748444c061aSmrg } 749444c061aSmrg 750444c061aSmrg /* go to the resource manager for those resources not found yet */ 751444c061aSmrg /* if it's not in the resource database use the default value */ 752444c061aSmrg 753444c061aSmrg { 754444c061aSmrg register XrmResourceList rx; 755444c061aSmrg register XrmResourceList *res; 756444c061aSmrg register Cardinal j; 757444c061aSmrg register XrmRepresentation xrm_type; 758444c061aSmrg register XrmRepresentation xrm_default_type; 759444c061aSmrg char char_val; 760444c061aSmrg short short_val; 761444c061aSmrg int int_val; 762444c061aSmrg long long_val; 763444c061aSmrg char* char_ptr; 764444c061aSmrg 765444c061aSmrg if (!found_persistence) { 766444c061aSmrg if (XrmQGetSearchResource(searchList, QinitialResourcesPersistent, 767444c061aSmrg QInitialResourcesPersistent, &rawType, &value)) { 768444c061aSmrg if (rawType != QBoolean) { 769444c061aSmrg convValue.size = sizeof(Boolean); 770444c061aSmrg convValue.addr = (XPointer)&persistent_resources; 771444c061aSmrg (void)_XtConvert(widget, rawType, &value, QBoolean, 772444c061aSmrg &convValue, NULL); 773444c061aSmrg } 774444c061aSmrg else 775444c061aSmrg persistent_resources = *(Boolean*)value.addr; 776444c061aSmrg } 777444c061aSmrg } 778444c061aSmrg if (persistent_resources) 779444c061aSmrg cache_ptr = NULL; 780444c061aSmrg else if (cache_base) 781444c061aSmrg cache_ptr = cache_base; 782444c061aSmrg else 783444c061aSmrg cache_ptr = cache_ref; 784444c061aSmrg 785444c061aSmrg for (res = table, j = 0; j < num_resources; j++, res++) { 786444c061aSmrg rx = *res; 787444c061aSmrg xrm_type = rx->xrm_type; 788444c061aSmrg if (typed[j]) { 789444c061aSmrg register XtTypedArg* arg = typed_args + typed[j] - 1; 790444c061aSmrg 791444c061aSmrg /* 792444c061aSmrg * This resource value has been specified as a typed arg and 793444c061aSmrg * has to be converted. Typed arg conversions are done here 794444c061aSmrg * to correctly interpose them with normal resource conversions. 795444c061aSmrg */ 796444c061aSmrg XrmQuark from_type; 797444c061aSmrg XrmValue from_val, to_val; 798444c061aSmrg Boolean converted; 799444c061aSmrg 800444c061aSmrg from_type = StringToQuark(arg->type); 801444c061aSmrg from_val.size = arg->size; 802444c061aSmrg if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal))) 803444c061aSmrg from_val.addr = (XPointer)arg->value; 804444c061aSmrg else 805444c061aSmrg from_val.addr = (XPointer)&arg->value; 806444c061aSmrg to_val.size = rx->xrm_size; 807444c061aSmrg to_val.addr = base - rx->xrm_offset - 1; 808444c061aSmrg converted = _XtConvert(widget, from_type, &from_val, 809444c061aSmrg xrm_type, &to_val, cache_ptr); 810444c061aSmrg if (converted) { 811444c061aSmrg 812444c061aSmrg /* Copy the converted value back into the typed argument. 813444c061aSmrg * normally the data should be <= sizeof(XtArgVal) and 814444c061aSmrg * is stored directly into the 'value' field .... BUT 815444c061aSmrg * if the resource size is greater than sizeof(XtArgVal) 816444c061aSmrg * then we dynamically alloc a block of store to hold the 817444c061aSmrg * data and zap a copy in there !!! .... freeing it later 818444c061aSmrg * the size field in the typed arg is negated to indicate 819444c061aSmrg * that the store pointed to by the value field is 820444c061aSmrg * dynamic ....... 821444c061aSmrg * "freeing" happens in the case of _XtCreate after the 822444c061aSmrg * CallInitialize ..... other clients of GetResources 823444c061aSmrg * using typed args should be aware of the need to free 824444c061aSmrg * this store ..... 825444c061aSmrg */ 826444c061aSmrg 827444c061aSmrg if(rx->xrm_size > sizeof(XtArgVal)) { 828444c061aSmrg arg->value = (XtArgVal) __XtMalloc(rx->xrm_size); 829444c061aSmrg arg->size = -(arg->size); 830444c061aSmrg } else { /* will fit - copy directly into value field */ 831444c061aSmrg arg->value = (XtArgVal) NULL; 832444c061aSmrg } 833444c061aSmrg CopyToArg((char *)(base - rx->xrm_offset - 1), 834444c061aSmrg &arg->value, rx->xrm_size); 835444c061aSmrg 836444c061aSmrg } else { 837444c061aSmrg /* Conversion failed. Get default value. */ 838444c061aSmrg found[j] = False; 839444c061aSmrg } 840444c061aSmrg 841444c061aSmrg if (cache_ptr && *cache_ptr) 842444c061aSmrg cache_ptr++; 843444c061aSmrg } 844444c061aSmrg 845444c061aSmrg if (!found[j]) { 846444c061aSmrg Boolean already_copied = False; 847444c061aSmrg Boolean have_value = False; 848444c061aSmrg 849444c061aSmrg if (XrmQGetSearchResource(searchList, 850444c061aSmrg rx->xrm_name, rx->xrm_class, &rawType, &value)) { 851444c061aSmrg if (rawType != xrm_type) { 852444c061aSmrg convValue.size = rx->xrm_size; 853444c061aSmrg convValue.addr = (XPointer)(base - rx->xrm_offset - 1); 854444c061aSmrg already_copied = have_value = 855444c061aSmrg _XtConvert(widget, rawType, &value, 856444c061aSmrg xrm_type, &convValue, cache_ptr); 857444c061aSmrg if (cache_ptr && *cache_ptr) 858444c061aSmrg cache_ptr++; 859444c061aSmrg } else have_value = True; 860444c061aSmrg if (have_value && rx->xrm_name == Qtranslations) 861444c061aSmrg do_tm_hack = True; 862444c061aSmrg } 863444c061aSmrg LOCK_PROCESS; 864444c061aSmrg if (!have_value 865444c061aSmrg && ((rx->xrm_default_type == QImmediate) 866444c061aSmrg || (rx->xrm_default_type == xrm_type) 867444c061aSmrg || (rx->xrm_default_addr != NULL))) { 868444c061aSmrg /* Convert default value to proper type */ 869444c061aSmrg xrm_default_type = rx->xrm_default_type; 870444c061aSmrg if (xrm_default_type == QCallProc) { 871444c061aSmrg#ifdef CRAY 872444c061aSmrg if ( (int) Cjumpp != (int) Cjump) 873444c061aSmrg (*(XtResourceDefaultProc) 874444c061aSmrg (((int)(rx->xrm_default_addr))<<2))( 875444c061aSmrg widget,-(rx->xrm_offset+1), &value); 876444c061aSmrg else 877444c061aSmrg#endif 878444c061aSmrg (*(XtResourceDefaultProc)(rx->xrm_default_addr))( 879444c061aSmrg widget,-(rx->xrm_offset+1), &value); 880444c061aSmrg 881444c061aSmrg } else if (xrm_default_type == QImmediate) { 882444c061aSmrg /* XtRImmediate == XtRString for type XtRString */ 883444c061aSmrg if (xrm_type == QString) { 884444c061aSmrg value.addr = rx->xrm_default_addr; 885444c061aSmrg } else if (rx->xrm_size == sizeof(int)) { 886444c061aSmrg int_val = (int)(long)rx->xrm_default_addr; 887444c061aSmrg value.addr = (XPointer) &int_val; 888444c061aSmrg } else if (rx->xrm_size == sizeof(short)) { 889444c061aSmrg short_val = (short)(long)rx->xrm_default_addr; 890444c061aSmrg value.addr = (XPointer) &short_val; 891444c061aSmrg } else if (rx->xrm_size == sizeof(char)) { 892444c061aSmrg char_val = (char)(long)rx->xrm_default_addr; 893444c061aSmrg value.addr = (XPointer) &char_val; 894444c061aSmrg } else if (rx->xrm_size == sizeof(long)) { 895444c061aSmrg long_val = (long)rx->xrm_default_addr; 896444c061aSmrg value.addr = (XPointer) &long_val; 897444c061aSmrg } else if (rx->xrm_size == sizeof(char*)) { 898444c061aSmrg char_ptr = (char*)rx->xrm_default_addr; 899444c061aSmrg value.addr = (XPointer) &char_ptr; 900444c061aSmrg } else { 901444c061aSmrg value.addr = (XPointer) &(rx->xrm_default_addr); 902444c061aSmrg } 903444c061aSmrg } else if (xrm_default_type == xrm_type) { 904444c061aSmrg value.addr = rx->xrm_default_addr; 905444c061aSmrg } else { 906444c061aSmrg value.addr = rx->xrm_default_addr; 907444c061aSmrg if (xrm_default_type == QString) { 908444c061aSmrg value.size = strlen((char *)value.addr) + 1; 909444c061aSmrg } else { 910444c061aSmrg value.size = sizeof(XtPointer); 911444c061aSmrg } 912444c061aSmrg convValue.size = rx->xrm_size; 913444c061aSmrg convValue.addr = (XPointer)(base - rx->xrm_offset - 1); 914444c061aSmrg already_copied = 915444c061aSmrg _XtConvert(widget, xrm_default_type, &value, 916444c061aSmrg xrm_type, &convValue, cache_ptr); 917444c061aSmrg if (!already_copied) 918444c061aSmrg value.addr = NULL; 919444c061aSmrg if (cache_ptr && *cache_ptr) 920444c061aSmrg cache_ptr++; 921444c061aSmrg } 922444c061aSmrg } 923444c061aSmrg if (!already_copied) { 924444c061aSmrg if (xrm_type == QString) { 925444c061aSmrg *((String*)(base - rx->xrm_offset - 1)) = value.addr; 926444c061aSmrg } else { 927444c061aSmrg if (value.addr != NULL) { 928444c061aSmrg XtMemmove(base - rx->xrm_offset - 1, 929444c061aSmrg value.addr, rx->xrm_size); 930444c061aSmrg } else { 931444c061aSmrg /* didn't get value, initialize to NULL... */ 932444c061aSmrg XtBZero(base - rx->xrm_offset - 1, rx->xrm_size); 933444c061aSmrg } 934444c061aSmrg } 935444c061aSmrg } 936444c061aSmrg UNLOCK_PROCESS; 937444c061aSmrg 938444c061aSmrg if (typed[j]) { 939444c061aSmrg /* 940444c061aSmrg * This resource value was specified as a typed arg. 941444c061aSmrg * However, the default value is being used here since 942444c061aSmrg * type type conversion failed, so we compress the list. 943444c061aSmrg */ 944444c061aSmrg register XtTypedArg* arg = typed_args + typed[j] - 1; 945444c061aSmrg register int i; 946444c061aSmrg 947444c061aSmrg for (i = num_typed_args - typed[j]; i; i--, arg++) { 948444c061aSmrg *arg = *(arg+1); 949444c061aSmrg } 950444c061aSmrg num_typed_args--; 951444c061aSmrg } 952444c061aSmrg } 953444c061aSmrg } 954444c061aSmrg if (tm_hack) 955444c061aSmrg widget->core.tm.current_state = NULL; 956444c061aSmrg if (tm_hack && 957444c061aSmrg (!widget->core.tm.translations || 958444c061aSmrg (do_tm_hack && 959444c061aSmrg widget->core.tm.translations->operation != XtTableReplace)) && 960444c061aSmrg XrmQGetSearchResource(searchList, QbaseTranslations, 961444c061aSmrg QTranslations, &rawType, &value)) { 962444c061aSmrg if (rawType != QTranslationTable) { 963444c061aSmrg convValue.size = sizeof(XtTranslations); 964444c061aSmrg convValue.addr = (XPointer)&widget->core.tm.current_state; 965444c061aSmrg (void)_XtConvert(widget, rawType, &value, 966444c061aSmrg QTranslationTable, &convValue, cache_ptr); 967444c061aSmrg if (cache_ptr && *cache_ptr) 968444c061aSmrg cache_ptr++; 969444c061aSmrg } else { 970444c061aSmrg *((XtTranslations *)&widget->core.tm.current_state) = 971444c061aSmrg *((XtTranslations *)value.addr); 972444c061aSmrg } 973444c061aSmrg } 974444c061aSmrg } 975444c061aSmrg if ((Cardinal)num_typed_args != *pNumTypedArgs) *pNumTypedArgs = num_typed_args; 976444c061aSmrg if (searchList != stackSearchList) XtFree((char*)searchList); 977444c061aSmrg if (!cache_ptr) 978444c061aSmrg cache_ptr = cache_base; 979444c061aSmrg if (cache_ptr && cache_ptr != cache_ref) { 980444c061aSmrg int cache_ref_size = cache_ptr - cache_ref; 981444c061aSmrg XtCacheRef *refs = (XtCacheRef*) 982444c061aSmrg __XtMalloc((unsigned)sizeof(XtCacheRef)*(cache_ref_size + 1)); 983444c061aSmrg (void) memmove(refs, cache_ref, sizeof(XtCacheRef)*cache_ref_size ); 984444c061aSmrg refs[cache_ref_size] = NULL; 985444c061aSmrg return refs; 986444c061aSmrg } 987444c061aSmrg return (XtCacheRef*)NULL; 988444c061aSmrg} 989444c061aSmrg 990444c061aSmrg 991444c061aSmrg 992444c061aSmrgstatic void CacheArgs( 993444c061aSmrg ArgList args, 994444c061aSmrg Cardinal num_args, 995444c061aSmrg XtTypedArgList typed_args, 996444c061aSmrg Cardinal num_typed_args, 997444c061aSmrg XrmQuarkList quark_cache, 998444c061aSmrg Cardinal num_quarks, 999444c061aSmrg XrmQuarkList *pQuarks) /* RETURN */ 1000444c061aSmrg{ 1001444c061aSmrg register XrmQuarkList quarks; 1002444c061aSmrg register Cardinal i; 1003444c061aSmrg register Cardinal count; 1004444c061aSmrg 1005444c061aSmrg count = (args != NULL) ? num_args : num_typed_args; 1006444c061aSmrg 1007444c061aSmrg if (num_quarks < count) { 1008444c061aSmrg quarks = (XrmQuarkList) __XtMalloc(count * sizeof(XrmQuark)); 1009444c061aSmrg } else { 1010444c061aSmrg quarks = quark_cache; 1011444c061aSmrg } 1012444c061aSmrg *pQuarks = quarks; 1013444c061aSmrg 1014444c061aSmrg if (args != NULL) { 1015444c061aSmrg for (i = count; i; i--) 1016444c061aSmrg *quarks++ = StringToQuark((args++)->name); 1017444c061aSmrg } 1018444c061aSmrg else { 1019444c061aSmrg for (i = count; i; i--) 1020444c061aSmrg *quarks++ = StringToQuark((typed_args++)->name); 1021444c061aSmrg } 1022444c061aSmrg} 1023444c061aSmrg 1024444c061aSmrg#define FreeCache(cache, pointer) \ 1025444c061aSmrg if (cache != pointer) XtFree((char *)pointer) 1026444c061aSmrg 1027444c061aSmrg 1028444c061aSmrgXtCacheRef *_XtGetResources( 1029444c061aSmrg register Widget w, 1030444c061aSmrg ArgList args, 1031444c061aSmrg Cardinal num_args, 1032444c061aSmrg XtTypedArgList typed_args, 1033444c061aSmrg Cardinal* num_typed_args) 1034444c061aSmrg{ 1035444c061aSmrg XrmName *names, names_s[50]; 1036444c061aSmrg XrmClass *classes, classes_s[50]; 1037444c061aSmrg XrmQuark quark_cache[100]; 1038444c061aSmrg XrmQuarkList quark_args; 1039444c061aSmrg WidgetClass wc; 1040444c061aSmrg ConstraintWidgetClass cwc; 1041444c061aSmrg XtCacheRef *cache_refs, *cache_refs_core; 1042444c061aSmrg Cardinal count; 1043444c061aSmrg 1044444c061aSmrg wc = XtClass(w); 1045444c061aSmrg 1046444c061aSmrg count = CountTreeDepth(w); 1047444c061aSmrg names = (XrmName*) XtStackAlloc (count * sizeof(XrmName), names_s); 1048444c061aSmrg classes = (XrmClass*) XtStackAlloc (count * sizeof(XrmClass), classes_s); 1049444c061aSmrg if (names == NULL || classes == NULL) _XtAllocError(NULL); 1050444c061aSmrg 1051444c061aSmrg /* Get names, classes for widget and ancestors */ 1052444c061aSmrg GetNamesAndClasses(w, names, classes); 1053444c061aSmrg 1054444c061aSmrg /* Compile arg list into quarks */ 1055444c061aSmrg CacheArgs(args, num_args, typed_args, *num_typed_args, quark_cache, 1056444c061aSmrg XtNumber(quark_cache), &quark_args); 1057444c061aSmrg 1058444c061aSmrg /* Get normal resources */ 1059444c061aSmrg LOCK_PROCESS; 1060444c061aSmrg cache_refs = GetResources(w, (char*)w, names, classes, 1061444c061aSmrg (XrmResourceList *) wc->core_class.resources, 1062444c061aSmrg wc->core_class.num_resources, quark_args, args, num_args, 1063444c061aSmrg typed_args, num_typed_args, XtIsWidget(w)); 1064444c061aSmrg 1065444c061aSmrg if (w->core.constraints != NULL) { 1066444c061aSmrg cwc = (ConstraintWidgetClass) XtClass(w->core.parent); 1067444c061aSmrg cache_refs_core = 1068444c061aSmrg GetResources(w, (char*)w->core.constraints, names, classes, 1069444c061aSmrg (XrmResourceList *) cwc->constraint_class.resources, 1070444c061aSmrg cwc->constraint_class.num_resources, 1071444c061aSmrg quark_args, args, num_args, typed_args, num_typed_args, False); 1072444c061aSmrg if (cache_refs_core) { 1073444c061aSmrg XtFree((char *)cache_refs_core); 1074444c061aSmrg } 1075444c061aSmrg } 1076444c061aSmrg FreeCache(quark_cache, quark_args); 1077444c061aSmrg UNLOCK_PROCESS; 1078444c061aSmrg XtStackFree((XtPointer)names, names_s); 1079444c061aSmrg XtStackFree((XtPointer)classes, classes_s); 1080444c061aSmrg return cache_refs; 1081444c061aSmrg} /* _XtGetResources */ 1082444c061aSmrg 1083444c061aSmrg 1084444c061aSmrgvoid _XtGetSubresources ( 1085444c061aSmrg Widget w, /* Widget "parent" of subobject */ 1086444c061aSmrg XtPointer base, /* Base address to write to */ 1087444c061aSmrg const char* name, /* name of subobject */ 1088444c061aSmrg const char* class, /* class of subobject */ 1089444c061aSmrg XtResourceList resources, /* resource list for subobject */ 1090444c061aSmrg Cardinal num_resources, 1091444c061aSmrg ArgList args, /* arg list to override resources */ 1092444c061aSmrg Cardinal num_args, 1093444c061aSmrg XtTypedArgList typed_args, 1094444c061aSmrg Cardinal num_typed_args) 1095444c061aSmrg{ 1096444c061aSmrg XrmName *names, names_s[50]; 1097444c061aSmrg XrmClass *classes, classes_s[50]; 1098444c061aSmrg XrmQuark quark_cache[100]; 1099444c061aSmrg XrmQuarkList quark_args; 1100444c061aSmrg XrmResourceList* table; 1101444c061aSmrg Cardinal count, ntyped_args = num_typed_args; 1102444c061aSmrg XtCacheRef *Resrc = NULL; 1103444c061aSmrg WIDGET_TO_APPCON(w); 1104444c061aSmrg 1105444c061aSmrg if (num_resources == 0) return; 1106444c061aSmrg 1107444c061aSmrg LOCK_APP(app); 1108444c061aSmrg count = CountTreeDepth(w); 1109444c061aSmrg count++; /* make sure there's enough room for name and class */ 1110444c061aSmrg names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s); 1111444c061aSmrg classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s); 1112444c061aSmrg if (names == NULL || classes == NULL) _XtAllocError(NULL); 1113444c061aSmrg 1114444c061aSmrg /* Get full name, class of subobject */ 1115444c061aSmrg GetNamesAndClasses(w, names, classes); 1116444c061aSmrg count -= 2; 1117444c061aSmrg names[count] = StringToName(name); 1118444c061aSmrg classes[count] = StringToClass(class); 1119444c061aSmrg count++; 1120444c061aSmrg names[count] = NULLQUARK; 1121444c061aSmrg classes[count] = NULLQUARK; 1122444c061aSmrg 1123444c061aSmrg /* Compile arg list into quarks */ 1124444c061aSmrg CacheArgs(args, num_args, typed_args, num_typed_args, 1125444c061aSmrg quark_cache, XtNumber(quark_cache), &quark_args); 1126444c061aSmrg 1127444c061aSmrg /* Compile resource list if needed */ 1128444c061aSmrg if (((int) resources->resource_offset) >= 0) { 1129444c061aSmrg XrmCompileResourceListEphem(resources, num_resources); 1130444c061aSmrg } 1131444c061aSmrg table = _XtCreateIndirectionTable(resources, num_resources); 1132444c061aSmrg Resrc = GetResources(w, (char*)base, names, classes, table, num_resources, 1133444c061aSmrg quark_args, args, num_args, 1134444c061aSmrg typed_args, &ntyped_args, False); 1135444c061aSmrg FreeCache(quark_cache, quark_args); 1136444c061aSmrg XtFree((char *)table); 1137444c061aSmrg XtFree((char *)Resrc); 1138444c061aSmrg XtStackFree((XtPointer)names, names_s); 1139444c061aSmrg XtStackFree((XtPointer)classes, classes_s); 1140444c061aSmrg UNLOCK_APP(app); 1141444c061aSmrg} 1142444c061aSmrg 1143444c061aSmrgvoid XtGetSubresources ( 1144444c061aSmrg Widget w, /* Widget "parent" of subobject */ 1145444c061aSmrg XtPointer base, /* Base address to write to */ 1146444c061aSmrg _Xconst char* name, /* name of subobject */ 1147444c061aSmrg _Xconst char* class, /* class of subobject */ 1148444c061aSmrg XtResourceList resources, /* resource list for subobject */ 1149444c061aSmrg Cardinal num_resources, 1150444c061aSmrg ArgList args, /* arg list to override resources */ 1151444c061aSmrg Cardinal num_args) 1152444c061aSmrg{ 1153444c061aSmrg _XtGetSubresources (w, base, name, class, resources, num_resources, args, num_args, NULL, 0); 1154444c061aSmrg} 1155444c061aSmrg 1156444c061aSmrg 1157444c061aSmrgvoid _XtGetApplicationResources ( 1158444c061aSmrg Widget w, /* Application shell widget */ 1159444c061aSmrg XtPointer base, /* Base address to write to */ 1160444c061aSmrg XtResourceList resources, /* resource list for subobject */ 1161444c061aSmrg Cardinal num_resources, 1162444c061aSmrg ArgList args, /* arg list to override resources */ 1163444c061aSmrg Cardinal num_args, 1164444c061aSmrg XtTypedArgList typed_args, 1165444c061aSmrg Cardinal num_typed_args) 1166444c061aSmrg{ 1167444c061aSmrg XrmName *names, names_s[50]; 1168444c061aSmrg XrmClass *classes, classes_s[50]; 1169444c061aSmrg XrmQuark quark_cache[100]; 1170444c061aSmrg XrmQuarkList quark_args; 1171444c061aSmrg XrmResourceList* table; 1172444c061aSmrg Cardinal count, ntyped_args = num_typed_args; 1173444c061aSmrg#ifdef XTHREADS 1174444c061aSmrg XtAppContext app; 1175444c061aSmrg#endif 1176444c061aSmrg XtCacheRef *Resrc = NULL; 1177444c061aSmrg 1178444c061aSmrg if (num_resources == 0) return; 1179444c061aSmrg 1180444c061aSmrg#ifdef XTHREADS 1181444c061aSmrg if (w == NULL) app = _XtDefaultAppContext(); 1182444c061aSmrg else app = XtWidgetToApplicationContext(w); 1183444c061aSmrg#endif 1184444c061aSmrg 1185444c061aSmrg LOCK_APP(app); 1186444c061aSmrg /* Get full name, class of application */ 1187444c061aSmrg if (w == NULL) { 1188444c061aSmrg /* hack for R2 compatibility */ 1189444c061aSmrg XtPerDisplay pd = _XtGetPerDisplay(_XtDefaultAppContext()->list[0]); 1190444c061aSmrg names = (XrmName*) XtStackAlloc (2 * sizeof(XrmName), names_s); 1191444c061aSmrg classes = (XrmClass*) XtStackAlloc (2 * sizeof(XrmClass), classes_s); 1192444c061aSmrg names[0] = pd->name; 1193444c061aSmrg names[1] = NULLQUARK; 1194444c061aSmrg classes[0] = pd->class; 1195444c061aSmrg classes[1] = NULLQUARK; 1196444c061aSmrg } 1197444c061aSmrg else { 1198444c061aSmrg count = CountTreeDepth(w); 1199444c061aSmrg names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s); 1200444c061aSmrg classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s); 1201444c061aSmrg if (names == NULL || classes == NULL) _XtAllocError(NULL); 1202444c061aSmrg GetNamesAndClasses(w, names, classes); 1203444c061aSmrg } 1204444c061aSmrg 1205444c061aSmrg /* Compile arg list into quarks */ 1206444c061aSmrg CacheArgs(args, num_args, typed_args, num_typed_args, quark_cache, 1207444c061aSmrg XtNumber(quark_cache), &quark_args); 1208444c061aSmrg /* Compile resource list if needed */ 1209444c061aSmrg if (((int) resources->resource_offset) >= 0) { 1210444c061aSmrg#ifdef CRAY2 1211444c061aSmrg if (base == 0) { /* this client is non-portable, but... */ 1212444c061aSmrg int count; 1213444c061aSmrg XtResourceList res = resources; 1214444c061aSmrg for (count = 0; count < num_resources; res++, count++) { 1215444c061aSmrg res->resource_offset *= sizeof(long); 1216444c061aSmrg } 1217444c061aSmrg } 1218444c061aSmrg#endif /* CRAY2 */ 1219444c061aSmrg XrmCompileResourceListEphem(resources, num_resources); 1220444c061aSmrg } 1221444c061aSmrg table = _XtCreateIndirectionTable(resources,num_resources); 1222444c061aSmrg 1223444c061aSmrg Resrc = GetResources(w, (char*)base, names, classes, table, num_resources, 1224444c061aSmrg quark_args, args, num_args, 1225444c061aSmrg typed_args, &ntyped_args, False); 1226444c061aSmrg FreeCache(quark_cache, quark_args); 1227444c061aSmrg XtFree((char *)table); 1228444c061aSmrg XtFree((char *)Resrc); 1229444c061aSmrg if (w != NULL) { 1230444c061aSmrg XtStackFree((XtPointer)names, names_s); 1231444c061aSmrg XtStackFree((XtPointer)classes, classes_s); 1232444c061aSmrg } 1233444c061aSmrg UNLOCK_APP(app); 1234444c061aSmrg} 1235444c061aSmrg 1236444c061aSmrgvoid XtGetApplicationResources ( 1237444c061aSmrg Widget w, /* Application shell widget */ 1238444c061aSmrg XtPointer base, /* Base address to write to */ 1239444c061aSmrg XtResourceList resources, /* resource list for subobject */ 1240444c061aSmrg Cardinal num_resources, 1241444c061aSmrg ArgList args, /* arg list to override resources */ 1242444c061aSmrg Cardinal num_args) 1243444c061aSmrg{ 1244444c061aSmrg _XtGetApplicationResources(w, base, resources, num_resources, args, num_args, NULL, 0); 1245444c061aSmrg} 1246444c061aSmrg 1247444c061aSmrgstatic Boolean initialized = FALSE; 1248444c061aSmrg 1249444c061aSmrgvoid _XtResourceListInitialize(void) 1250444c061aSmrg{ 1251444c061aSmrg LOCK_PROCESS; 1252444c061aSmrg if (initialized) { 1253444c061aSmrg XtWarningMsg("initializationError","xtInitialize",XtCXtToolkitError, 1254444c061aSmrg "Initializing Resource Lists twice", 1255444c061aSmrg (String *)NULL, (Cardinal *)NULL); 1256444c061aSmrg UNLOCK_PROCESS; 1257444c061aSmrg return; 1258444c061aSmrg } 1259444c061aSmrg initialized = TRUE; 1260444c061aSmrg UNLOCK_PROCESS; 1261444c061aSmrg 1262444c061aSmrg QBoolean = XrmPermStringToQuark(XtCBoolean); 1263444c061aSmrg QString = XrmPermStringToQuark(XtCString); 1264444c061aSmrg QCallProc = XrmPermStringToQuark(XtRCallProc); 1265444c061aSmrg QImmediate = XrmPermStringToQuark(XtRImmediate); 1266444c061aSmrg QinitialResourcesPersistent = XrmPermStringToQuark(XtNinitialResourcesPersistent); 1267444c061aSmrg QInitialResourcesPersistent = XrmPermStringToQuark(XtCInitialResourcesPersistent); 1268444c061aSmrg Qtranslations = XrmPermStringToQuark(XtNtranslations); 1269444c061aSmrg QbaseTranslations = XrmPermStringToQuark("baseTranslations"); 1270444c061aSmrg QTranslations = XrmPermStringToQuark(XtCTranslations); 1271444c061aSmrg QTranslationTable = XrmPermStringToQuark(XtRTranslationTable); 1272444c061aSmrg Qscreen = XrmPermStringToQuark(XtNscreen); 1273444c061aSmrg QScreen = XrmPermStringToQuark(XtCScreen); 1274444c061aSmrg} 1275