home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume13 / xrainbow / part03 < prev    next >
Internet Message Format  |  1991-06-27  |  80KB

  1. Path: uunet!lll-winken!sun-barr!cronkite!newstop!exodus!maxine.WPI.EDU
  2. From: daven@maxine.WPI.EDU (Dave Nedde)
  3. Newsgroups: comp.sources.x
  4. Subject: v13i065: xrainbow, Part03/05
  5. Message-ID: <15965@exodus.Eng.Sun.COM>
  6. Date: 28 Jun 91 01:04:35 GMT
  7. References: <csx-13i063-xrainbow@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 2176
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: daven@maxine.WPI.EDU (Dave Nedde)
  13. Posting-number: Volume 13, Issue 65
  14. Archive-name: xrainbow/part03
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then unpack
  18. # it by saving it into a file and typing "sh file".  To overwrite existing
  19. # files, type "sh file -c".  You can also feed this as standard input via
  20. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  21. # will see the following message at the end:
  22. #        "End of archive 3 (of 5)."
  23. # Contents:  xrainbow/Wc1_05/Wc/WcConvert.c
  24. #   xrainbow/Wc1_05/Wc/WcCreate.c xrainbow/Wc1_05/Wc/WcCreate.h
  25. #   xrainbow/Wc1_05/Wc/WcCreateP.h
  26. #   xrainbow/include/X11/Xaw_d/DrawingA.h
  27. # Wrapped by daven@ash on Mon Jun  3 12:33:23 1991
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'xrainbow/Wc1_05/Wc/WcConvert.c' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcConvert.c'\"
  31. else
  32. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcConvert.c'\" \(21715 characters\)
  33. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcConvert.c' <<'END_OF_FILE'
  34. X/*
  35. X** Copyright (c) 1990 David E. Smyth
  36. X**
  37. X** This file was derived from work performed by Martin Brunecky at
  38. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  39. X** following copyright:
  40. X**
  41. X*******************************************************************************
  42. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  43. X*
  44. X*                        All Rights Reserved
  45. X*
  46. X* Permission to use, copy, modify, and distribute this software and its
  47. X* documentation for any purpose and without fee is hereby granted, provided
  48. X* that the above copyright notice appears on all copies and that both the
  49. X* copyright and this permission notice appear in supporting documentation
  50. X* and that the name of Auto-trol not be used in advertising or publicity
  51. X* pertaining to distribution of the software without specific, prior written
  52. X* permission.
  53. X*
  54. X* Auto-trol disclaims all warranties with regard to this software, including
  55. X* all implied warranties of merchantability and fitness, in no event shall
  56. X* Auto-trol be liable for any special, indirect or consequential damages or
  57. X* any damages whatsoever resulting from loss of use, data or profits, whether
  58. X* in an action of contract, negligence or other tortious action, arising out
  59. X* of or in connection with the use or performance of this software.
  60. X*******************************************************************************
  61. X**
  62. X** Redistribution and use in source and binary forms are permitted
  63. X** provided that the above copyright notice and this paragraph are
  64. X** duplicated in all such forms and that any documentation, advertising
  65. X** materials, and other materials related to such distribution and use
  66. X** acknowledge that the software was developed by David E. Smyth.  The
  67. X** name of David E. Smyth may not be used to endorse or promote products
  68. X** derived from this software without specific prior written permission.
  69. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  70. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  71. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  72. X**
  73. X*/
  74. X
  75. X/*
  76. X* SCCS_data: @(#)WcConvert.c 1.1 ( 19 Nov 90 )
  77. X*
  78. X* Subsystem_group:
  79. X*
  80. X*     Widget Creation Library
  81. X*
  82. X* Module_description:
  83. X*
  84. X*     This module contains Xt converter functions which convert strings,
  85. X*     as found in the Xrm database, into useful types.  
  86. X*
  87. X*     It also contains the routine which registers all Wc converters.
  88. X*
  89. X*     The CvtStringToWidget converter takes a pathname which starts 
  90. X*     from the application shell an proceeds to a specific widget.  The
  91. X*     widget must already have been created.   Note that this converter
  92. X*     needs to be used INSTEAD of the XmuCvtStringToWidget which gets
  93. X*     registered by the Athena widgets.  The Xmu converter is not so
  94. X*     user friendly.  This means this file also declares an external
  95. X*     function XmuCvtStringToWidget() which is really CvtStringToWidget,
  96. X*     and this needs to be linked before Xmu.
  97. X*
  98. X*     The CvtStringToCallback converter parses the resource string in 
  99. X*     the format:
  100. X*
  101. X*       ...path:   name[(args)][,name[(args)]]...
  102. X*
  103. X*     where:  name:   specifies the registered callback function name
  104. X*             args:   specifies the string passed to a callback as
  105. X*              "client data".
  106. X*
  107. X*     Multiple callbacks can be specified for a single callback list
  108. X*     resource.  Any callbacks must be "registered" by the application
  109. X*     prior converter invocation (.i.e.prior widget creation).
  110. X*     If no "args" string is provided, the default "client data" 
  111. X*     specified at callback registration are used.
  112. X*
  113. X*     The CvtStringToConstructor converter searches the Constructor
  114. X*     cache for a registered constructor.  
  115. X*
  116. X*     The CvtStringToClass converter searches the Class cache for a 
  117. X*     registered object (widget) class pointer name.
  118. X*
  119. X*     The CvtStringToClassName converter searches the ClassName cache
  120. X*     for a registered object (widget) class name.
  121. X
  122. X*
  123. X* Module_interface_summary: 
  124. X*
  125. X*     Resource converter is invoked indirectly by the toolkit. The
  126. X*     converter is added to the toolkit by widgets calling
  127. X*     WcAddConverters() in the Wc intialization code.
  128. X*
  129. X* Module_history:
  130. X*                                                  
  131. X*   mm/dd/yy  initials  function  action
  132. X*   --------  --------  --------  ---------------------------------------------
  133. X*   06/08/90  D.Smyth   Class, ClassName, and Constructor converters.
  134. X*   05/24/90  D.Smyth   WcAddConverters created from something similar
  135. X*   04/03/90  MarBru    CvtStr..  Fixed argument termination with a NUL char
  136. X*   02/26/90  MarBru    All       Created
  137. X*
  138. X* Design_notes:
  139. X*
  140. X*   For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
  141. X*   (runtime) binding. But since most UNIX systems lack such capability,
  142. X*   we stick to the concept of "registration" routines.
  143. X*
  144. X*   One time, I considered applying conversion to callback argument, which
  145. X*   would take the burden of conversion from the callback code (runtime)
  146. X*   to the callback  conversion (one time initialization). The problem is
  147. X*   that some conversions are widget context specific (color to pixel needs
  148. X*   display connection), and at the time of callback conversion I do not
  149. X*   have a widget. I could require the widget argument, but this would kill
  150. X*   caching of the conversion result.
  151. X*
  152. X*   The sequential search of the callback cache is far from optimal. I should
  153. X*   use binary search, or the R4 conversion cache.  I can't use the R4 cache
  154. X*   until Motif 1.1 is released which will (supposedly) run on R4 Intrinsics.
  155. X*   
  156. X*******************************************************************************
  157. X*/
  158. X/*
  159. X*******************************************************************************
  160. X* Include_files.
  161. X*******************************************************************************
  162. X*/
  163. X
  164. X#include <ctype.h>    /* isupper() and tolower macros */
  165. X#include <stdio.h>
  166. X
  167. X/*  -- X Window System includes */
  168. X#include <X11/Intrinsic.h>
  169. X#include <X11/StringDefs.h> 
  170. X
  171. X/*  -- Widget Creation Library includes */
  172. X#include "WcCreate.h"
  173. X#include "WcCreateP.h"
  174. X
  175. X/*
  176. X*******************************************************************************
  177. X* Private_constant_declarations.
  178. X*******************************************************************************
  179. X*/
  180. X
  181. X/*
  182. X*******************************************************************************
  183. X* Private_type_declarations.
  184. X*******************************************************************************
  185. X*/
  186. X
  187. X/*
  188. X*******************************************************************************
  189. X* Private_macro_definitions.
  190. X*******************************************************************************
  191. X*/
  192. X
  193. X#define done( type, value )             \
  194. X{                        \
  195. X    if ( toVal->addr != NULL )            \
  196. X    {                        \
  197. X    if ( toVal->size < sizeof( type ) )    \
  198. X    {                    \
  199. X        toVal->size = sizeof( type );    \
  200. X        return;                \
  201. X    }                    \
  202. X    *(type*)(toVal->addr) = (value);    \
  203. X    }                        \
  204. X    else                    \
  205. X    {                        \
  206. X    static type static_val;            \
  207. X    static_val = (value);            \
  208. X    toVal->addr = (caddr_t)&static_val;    \
  209. X    }                        \
  210. X    toVal->size = sizeof(type);            \
  211. X    return;                    \
  212. X}
  213. X
  214. X/*
  215. X*******************************************************************************
  216. X* Private_data_definitions.
  217. X*******************************************************************************
  218. X*/
  219. X
  220. X/*
  221. X*******************************************************************************
  222. X* Private_function_declarations.
  223. X*******************************************************************************
  224. X*/
  225. X
  226. X/*
  227. X    -- Convert String To ClassPtr
  228. X*******************************************************************************
  229. X    This conversion searches the Object Class cache for the appropriate
  230. X    Cache record.  The resource database string is simply the name
  231. X    of the class pointer, case insensitive.  The value provided is the
  232. X    widget class pointer, as passed to XtCreateWidget().
  233. X*/
  234. X
  235. Xvoid CvtStringToClassPtr (args, num_args, fromVal, toVal )
  236. X    XrmValue  *args;
  237. X    Cardinal  *num_args;
  238. X    XrmValue  *fromVal;
  239. X    XrmValue  *toVal;
  240. X{
  241. X    char*       string = (char *) fromVal->addr;
  242. X    char        cleanName[MAX_XRMSTRING];
  243. X    char*       lowerCase;
  244. X    XrmQuark    quark;
  245. X    int         i;
  246. X
  247. X    (void)WcCleanName ( string, cleanName );
  248. X    lowerCase = WcLowerCaseCopy ( cleanName );
  249. X    quark = XrmStringToQuark ( lowerCase );
  250. X    XtFree ( lowerCase );
  251. X
  252. X    for (i=0; i<classes_num; i++)
  253. X    {
  254. X        if ( classes_ptr[i].quark == quark )
  255. X        {
  256. X            done( WidgetClass, classes_ptr[i].class );
  257. X        }
  258. X    }
  259. X    XtStringConversionWarning (cleanName, "Object Class, not registered.");
  260. X}
  261. X
  262. X/*
  263. X    -- Convert String To ClassName
  264. X*******************************************************************************
  265. X    This conversion searches the Class Name cache for the appropriate
  266. X    Cache record.  The resource database string is simply the name
  267. X    of the class, case insensitive.  The value provided is the widget 
  268. X    class pointer, as passed to XtCreateWidget().
  269. X*/
  270. X
  271. Xvoid CvtStringToClassName (args, num_args, fromVal, toVal )
  272. X    XrmValue  *args;
  273. X    Cardinal  *num_args;
  274. X    XrmValue  *fromVal;
  275. X    XrmValue  *toVal;
  276. X{
  277. X    char*    string = (char *) fromVal->addr;
  278. X    char    cleanName[MAX_XRMSTRING];
  279. X    char*     lowerCase;
  280. X    XrmQuark    quark;
  281. X    int        i;
  282. X
  283. X    (void)WcCleanName ( string, cleanName );
  284. X    lowerCase = WcLowerCaseCopy ( cleanName );
  285. X    quark = XrmStringToQuark ( lowerCase );
  286. X    XtFree ( lowerCase );
  287. X
  288. X    for (i=0; i<cl_nm_num; i++)
  289. X    {
  290. X        if ( cl_nm_ptr[i].quark == quark )
  291. X        {
  292. X        done( WidgetClass, cl_nm_ptr[i].class );
  293. X        }
  294. X    }
  295. X    XtStringConversionWarning (cleanName, "Class Name, not registered.");
  296. X}
  297. X
  298. X/*
  299. X    -- Convert String To Constructor
  300. X*******************************************************************************
  301. X    This conversion searches the Constructor Cache for the appropriate
  302. X    Cache record.  The resource database string is simply the name
  303. X    of the constructor, case insensitive.  The value provided is a
  304. X    Contrstructor Cache Record.  The constructor (func ptr) itself is
  305. X    not provided, as the user of this value (generally WcCreateDatabaseChild)
  306. X    also likes to have the constructor name as registered for error messages.
  307. X*/
  308. X
  309. Xvoid CvtStringToConstructor (args, num_args, fromVal, toVal)
  310. X    XrmValue *args;
  311. X    Cardinal *num_args;
  312. X    XrmValue *fromVal;
  313. X    XrmValue *toVal;
  314. X{
  315. X    char*       string = (char *) fromVal->addr;
  316. X    char        cleanName[MAX_XRMSTRING];
  317. X    char*       lowerCase;
  318. X    XrmQuark    quark;
  319. X    int         i;
  320. X
  321. X    (void)WcCleanName ( string, cleanName );
  322. X    lowerCase = WcLowerCaseCopy ( cleanName );
  323. X    quark = XrmStringToQuark ( lowerCase );
  324. X    XtFree ( lowerCase );
  325. X
  326. X    for (i=0; i<constrs_num; i++)
  327. X    {
  328. X    if ( constrs_ptr[i].quark == quark )
  329. X    {
  330. X        done( ConCacheRec*, &(constrs_ptr[i]) );
  331. X    }
  332. X    }
  333. X    XtStringConversionWarning (cleanName, "Constructor, not registered.");
  334. X}
  335. X
  336. X/*
  337. X    -- Convert String To Callback
  338. X*******************************************************************************
  339. X    This conversion creates a callback list structure from the X resource
  340. X    database string in format:
  341. X
  342. X    name(arg),name(arg).....
  343. X
  344. X    Note "name" is not case sensitive, while "arg" may be - it is passed to
  345. X    a callback as client data as a null terminated string (first level
  346. X    parenthesis stripped off).  Even if nothing is specified e.g.,
  347. X    SomeCallback() there is a null terminated string passed as client
  348. X    data to the callback.  If it is empty, then it is the null string.
  349. X
  350. X    Note also that the argument CANNOT be converted at this point: frequently,
  351. X    the argument refers to a widget which has not yet been created, or
  352. X    uses the context of the callback (i.e., WcUnmanageCB( this ) uses the
  353. X    widget which invoked the callback).  
  354. X*/
  355. X
  356. Xtypedef struct
  357. X{
  358. X    char *name_start, *name_end;    /* callback name start, end */
  359. X    char *arg_start,  *arg_end;     /* argument string start, end */
  360. X} Segment;
  361. X
  362. X#ifdef FUNCTION_PROTOTYPES
  363. Xstatic int ParseCallbackString( char*, Segment*, int );
  364. Xstatic XtCallbackRec* BuildCallbackList( Segment* );
  365. Xstatic int GetCallbackAddrFromCache(char*, char*, XtCallbackRec* );
  366. Xstatic void CopyArgsToCallbackClosure( char*, char*, XtCallbackRec* );
  367. X#else
  368. Xstatic int ParseCallbackString();
  369. Xstatic XtCallbackRec* BuildCallbackList();
  370. Xstatic int GetCallbackAddrFromCache();
  371. Xstatic void CopyArgsToCallbackClosure();
  372. X#endif
  373. X
  374. X/*
  375. X    -- Convert String To Callback
  376. X*******************************************************************************
  377. X*/
  378. X
  379. Xvoid CvtStringToCallback (args, num_args, fromVal, toVal)
  380. X    XrmValue *args;
  381. X    Cardinal *num_args;
  382. X    XrmValue *fromVal;
  383. X    XrmValue *toVal;
  384. X{
  385. X    static XtCallbackRec* retval;    /* return value MUST be static */
  386. X
  387. X    Segment    name_arg_segments[MAX_CALLBACKS];    
  388. X    char*    string = (char *) fromVal->addr;
  389. X
  390. X/*  -- assume error or undefined input argument */
  391. X    toVal->size = 0;
  392. X    toVal->addr = (caddr_t) NULL;
  393. X
  394. X    if (ParseCallbackString( string, name_arg_segments, MAX_CALLBACKS ))
  395. X    return;
  396. X
  397. X    /* name_arg_segments[MAX_CALLBACKS-1].name_start MUST be NULL 
  398. X    */
  399. X    retval = BuildCallbackList( name_arg_segments );
  400. X
  401. X    toVal->size = sizeof(XtCallbackRec*);
  402. X    toVal->addr = (caddr_t)&retval;
  403. X}
  404. X
  405. X/*
  406. X    -- Parse string into name+argument segments: returns 1 if failed
  407. X*******************************************************************************
  408. X*/
  409. X
  410. Xstatic int ParseCallbackString( string, seg, num_segs )
  411. X    char*    string;
  412. X    Segment*    seg;
  413. X    int        num_segs;
  414. X{
  415. X    register char*     cp = string;
  416. X    register char*     ws;
  417. X    register int    in_parens = 0;
  418. X
  419. X/*  -- Don't need to do anything if there is nothing interesting in string */
  420. X    if ( cp == NULL) return 1;
  421. X    if (*cp == NULL) return 1;
  422. X
  423. X    /* skip leading whitespace */
  424. X    while( *cp <= ' ' )
  425. X    if (*++cp == NULL) return 1;
  426. X
  427. X/*  -- Always end the parse on a null to make life easier */
  428. X#define NEXT_CHAR if (*++cp == NULL) goto end_of_parse;
  429. X#define BARF(str) { XtStringConversionWarning( string, str ); return 1; }
  430. X
  431. X    while (1)        /* parsing loop */
  432. X    {
  433. X    /* start new segment: we've got the start of the callback name,
  434. X    ** and nothing else.
  435. X    */
  436. X    seg->name_start = cp;    
  437. X        seg->name_end = seg->arg_start = seg->arg_end = (char*)NULL;
  438. X
  439. X
  440. X    /* take care of possible error - barf if *cp is left paren or comma */
  441. X    if ( *cp == '(' || *cp == ',' )
  442. X        BARF( "Callback, name cannot start with `(' or `,'" )
  443. X
  444. X    /* name is everything up to whitespace, a left paren, or comma */
  445. X    while(   ' ' < *cp    &&    *cp != '('    &&    *cp != ','   )
  446. X        NEXT_CHAR
  447. X
  448. X    seg->name_end = cp-1;    /* found end of the callback name */
  449. X
  450. X    /* There may be whitespace between name and left paren or comma */
  451. X    while( *cp <= ' ' )
  452. X            NEXT_CHAR
  453. X
  454. X    /* if we've found a left paren, collect the argument */
  455. X    if ( *cp == '(' )
  456. X    {
  457. X        ws = cp;    /* actually points at initial left paren */
  458. X        in_parens = 1;
  459. X        while (in_parens)
  460. X        {
  461. X        NEXT_CHAR    /* 1st time skips the initial left paren */
  462. X        if ( '(' == *cp ) in_parens++;
  463. X        if ( ')' == *cp ) in_parens--;
  464. X        }
  465. X        /* Now cp actually points at final right paren.  Lets get rid of
  466. X        ** leading and trailing argument whitespace.  If only whitespace
  467. X        ** then leave seg->arg_start == seg->arg_end == NULL 
  468. X        */
  469. X        do {
  470. X        ws++;    /* skip initial '(', will hit ')' at cp if no arg */
  471. X        } while ( *ws <= ' ' );
  472. X        if (ws != cp)
  473. X        {
  474. X        seg->arg_start = ws; /* first non-whitespace of argument */
  475. X        ws = cp;         /* now look at the final right paren */
  476. X        do {
  477. X            ws--;
  478. X        } while ( *ws <= ' ' );
  479. X        seg->arg_end = ws;
  480. X        }
  481. X        NEXT_CHAR        /* skip final right paren */
  482. X    }
  483. X    /* Skip optional comma separator, then do next segment */
  484. X    while( *cp <= ' ' || *cp == ',' )
  485. X        NEXT_CHAR
  486. X
  487. X    seg++;
  488. X    /* NB: we must have space for following `NULL' segment */
  489. X    if ( --num_segs < 2 )
  490. X        BARF( "Callback, Too many callbacks" );
  491. X    }
  492. X
  493. Xend_of_parse:
  494. X    /* Got here because we've detected the NULL terminator.  We
  495. X    ** could have hit the NULL at any of the "NEXT_CHAR" invocations.
  496. X    */
  497. X
  498. X    if (seg->name_start && !seg->name_end)
  499. X    seg->name_end = cp-1;            /* callback name */
  500. X    else if ( in_parens )
  501. X    BARF( "Callback, Unbalanced parens in callback argument" )
  502. X
  503. X    seg++; seg->name_start = (char*)NULL;    /* following seg is NULL */
  504. X
  505. X    return 0; /* sucessful parse */
  506. X}
  507. X
  508. X/*
  509. X    -- Build XtCallbackList based on name+arg segments
  510. X*******************************************************************************
  511. X*/
  512. X
  513. Xstatic XtCallbackRec* BuildCallbackList( seg )
  514. X    Segment* seg;
  515. X{
  516. X    XtCallbackRec    callback_list[MAX_CALLBACKS];    /* temporary */
  517. X    XtCallbackRec*    rec = callback_list;
  518. X    int                 callback_list_len = 0;
  519. X    int            bytes;
  520. X
  521. X/*  -- process individual callback string segments "name(arg)" */
  522. X    for( ;  seg->name_start  ;  seg++ )
  523. X    {
  524. X    if ( GetCallbackAddrFromCache( seg->name_start, seg->name_end, rec ) )
  525. X    {
  526. X        CopyArgsToCallbackClosure( seg->arg_start,  seg->arg_end,  rec );
  527. X        rec++;
  528. X        callback_list_len++;
  529. X    }
  530. X    }
  531. X
  532. X/*  -- terminate the callback list */
  533. X    {
  534. X        rec->callback = NULL;
  535. X    rec->closure  = NULL;
  536. X    callback_list_len++;
  537. X    }
  538. X
  539. X/*  -- make a permanent copy of the new callback list, and return a pointer */
  540. X    bytes = callback_list_len * sizeof(XtCallbackRec);
  541. X    rec = (XtCallbackRec*)XtMalloc( bytes );
  542. X    memcpy ( (char*)rec, (char*)callback_list,  bytes );
  543. X    return rec;
  544. X}
  545. X
  546. X/*
  547. X    -- Find named callback in callback cache: TRUE if found
  548. X*******************************************************************************
  549. X    Searches the Callback cache, gets the address of the callback
  550. X    function, and the default closure data as registered.
  551. X*/
  552. X
  553. Xstatic int GetCallbackAddrFromCache( name_start, name_end, rec )
  554. X    char*          name_start;
  555. X    char*          name_end;
  556. X    XtCallbackRec* rec;
  557. X{
  558. X    static   char  lowerCaseName[MAX_XRMSTRING];
  559. X    register char* cp   = name_start;
  560. X    register char* dest = lowerCaseName;
  561. X    register int   i;
  562. X    XrmQuark       quark;
  563. X
  564. X    /* our callback cache names are case insensitive */
  565. X    while( cp <= name_end )
  566. X        *dest++ = (isupper(*cp) ) ? tolower (*cp++) : *cp++;
  567. X    *dest = NUL;
  568. X
  569. X    /* try to locate callback in our cache of callbacks */
  570. X    quark = XrmStringToQuark (lowerCaseName);
  571. X
  572. X    for ( i=0 ; i < callbacks_num ; i++ )
  573. X    {
  574. X        if ( callbacks_ptr[i].quark == quark )
  575. X    {
  576. X        rec->callback = callbacks_ptr[i].callback;
  577. X        rec->closure  = callbacks_ptr[i].closure; /* default closure */
  578. X        return 1;
  579. X    }
  580. X    }
  581. X    XtStringConversionWarning ( lowerCaseName,
  582. X    "Callback, unknown callback name");
  583. X    return 0;
  584. X}
  585. X
  586. X/*
  587. X    -- Copy arguments from segment into XtCallbackList
  588. X*******************************************************************************
  589. X*/
  590. X
  591. Xstatic void CopyArgsToCallbackClosure( arg_start,  arg_end,  rec )
  592. X    char*          arg_start;
  593. X    char*          arg_end;
  594. X    XtCallbackRec* rec;
  595. X{
  596. X    register char *arg;
  597. X    register int   alen;
  598. X       
  599. X    if ( arg_start )
  600. X    {
  601. X    /* arg in parens - pass as string replacing default closure */
  602. X    alen = 1 + (int)arg_end - (int)arg_start;
  603. X    arg  = XtMalloc(alen+1);
  604. X    strncpy ( arg, arg_start, alen );
  605. X    arg[alen]    = NUL;
  606. X    rec->closure = (caddr_t)arg;
  607. X    }
  608. X    else
  609. X    {
  610. X    /* no arg in parens.  Make sure closure is something -
  611. X    ** do NOT return NULL in any event.  Causes SEGV too
  612. X    ** easily.  
  613. X    */
  614. X    if (rec->closure == NULL)
  615. X        rec->closure = (caddr_t)"";
  616. X    }
  617. X}
  618. X
  619. X/*
  620. X    -- Convert String To Widget
  621. X*******************************************************************************
  622. X    This conversion creates a Widget id from the X resource database string.
  623. X    The conversion will fail, and WcFullNameToWidget() will issue a warning,
  624. X    if the widget so named has not been created when this converter is called.
  625. X    For example, if a widget refers to itself for some reason, during
  626. X    its creation when this converter is called, it is not yet created: 
  627. X    therefore, the converter will fail.
  628. X*/
  629. X
  630. Xvoid XmuCvtStringToWidget (args, num_args, fromVal, toVal)
  631. X    XrmValue *args;
  632. X    Cardinal *num_args;
  633. X    XrmValue *fromVal;
  634. X    XrmValue *toVal;
  635. X{
  636. X    toVal->addr = 
  637. X    (caddr_t) WcFullNameToWidget( WcRootWidget(NULL), fromVal->addr);
  638. X    toVal->size = sizeof(Widget);
  639. X}
  640. X
  641. X/*
  642. X*******************************************************************************
  643. X* Public_function_declarations.
  644. X*******************************************************************************
  645. X*/
  646. X
  647. X/*
  648. X    -- Add String To ... Convertors
  649. X*******************************************************************************
  650. X*/
  651. X
  652. Xvoid WcAddConverters ( app )
  653. X    XtAppContext app;
  654. X{
  655. X    ONCE_PER_XtAppContext( app );
  656. X
  657. X    XtAddConverter       (XtRString,
  658. X                          WcRClassPtr,
  659. X                          CvtStringToClassPtr,
  660. X                          (XtConvertArgList)NULL,
  661. X                          (Cardinal)0);
  662. X
  663. X    XtAddConverter       (XtRString,
  664. X                          WcRClassName,
  665. X                          CvtStringToClassName,
  666. X                          (XtConvertArgList)NULL,
  667. X                          (Cardinal)0);
  668. X
  669. X    XtAddConverter       (XtRString,
  670. X                          WcRConstructor,
  671. X                          CvtStringToConstructor,
  672. X                          (XtConvertArgList)NULL,
  673. X                          (Cardinal)0);
  674. X
  675. X    XtAddConverter       (XtRString, 
  676. X                          XtRCallback,
  677. X                          CvtStringToCallback,
  678. X                          (XtConvertArgList)NULL,
  679. X                          (Cardinal)0);
  680. X
  681. X    XtAddConverter       (XtRString,
  682. X                          XtRWidget,
  683. X                          XmuCvtStringToWidget,
  684. X                          (XtConvertArgList)NULL,
  685. X                          (Cardinal)0);
  686. X}
  687. END_OF_FILE
  688. if test 21715 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcConvert.c'`; then
  689.     echo shar: \"'xrainbow/Wc1_05/Wc/WcConvert.c'\" unpacked with wrong size!
  690. fi
  691. # end of 'xrainbow/Wc1_05/Wc/WcConvert.c'
  692. fi
  693. if test -f 'xrainbow/Wc1_05/Wc/WcCreate.c' -a "${1}" != "-c" ; then 
  694.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreate.c'\"
  695. else
  696. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreate.c'\" \(27716 characters\)
  697. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreate.c' <<'END_OF_FILE'
  698. X/*
  699. X** Copyright (c) 1990 David E. Smyth
  700. X**
  701. X** This file was derived from work performed by Martin Brunecky at
  702. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  703. X** following copyright:
  704. X**
  705. X*******************************************************************************
  706. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  707. X*
  708. X*                        All Rights Reserved
  709. X*
  710. X* Permission to use, copy, modify, and distribute this software and its
  711. X* documentation for any purpose and without fee is hereby granted, provided
  712. X* that the above copyright notice appears on all copies and that both the
  713. X* copyright and this permission notice appear in supporting documentation
  714. X* and that the name of Auto-trol not be used in advertising or publicity
  715. X* pertaining to distribution of the software without specific, prior written
  716. X* permission.
  717. X*
  718. X* Auto-trol disclaims all warranties with regard to this software, including
  719. X* all implied warranties of merchantability and fitness, in no event shall
  720. X* Auto-trol be liable for any special, indirect or consequential damages or
  721. X* any damages whatsoever resulting from loss of use, data or profits, whether
  722. X* in an action of contract, negligence or other tortious action, arising out
  723. X* of or in connection with the use or performance of this software.
  724. X*******************************************************************************
  725. X**
  726. X** Redistribution and use in source and binary forms are permitted
  727. X** provided that the above copyright notice and this paragraph are
  728. X** duplicated in all such forms and that any documentation, advertising
  729. X** materials, and other materials related to such distribution and use
  730. X** acknowledge that the software was developed by David E. Smyth.  The
  731. X** name of David E. Smyth may not be used to endorse or promote products
  732. X** derived from this software without specific prior written permission.
  733. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  734. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  735. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  736. X**
  737. X*/
  738. X
  739. X/*
  740. X* SCCS_data: @(#)WcCreate.c 1.1 ( 19 Nov 90 )
  741. X*
  742. X* Subsystem_group:
  743. X*
  744. X*     Widget Creation Library
  745. X*
  746. X* Module_description:
  747. X*
  748. X*     This module contains the functions used to create and manage 
  749. X*     a widget tree using the Xrm database.
  750. X
  751. X*     The Xrm database format used to prescribe widget's children
  752. X*     is as follows:
  753. X*
  754. X*     ...parent.wcChildren:         childName1, childName2, ...
  755. X*
  756. X*     The type of each child must be specified.  There are three
  757. X*     ways of doing this: (1) by widget class (class pointer name),
  758. X*     (2) by widget class name, and (3) by widget constructor 
  759. X*     function name.  The resource value given is case insensitive,
  760. X*     although one is encouraged to use the capitalization given
  761. X*     in the reference manuals simply on stylistic grounds.  The 
  762. X*     three examples below are effectively equivalent:
  763. X*
  764. X*     ...drawing.wcClass:    xmDrawingAreaWidgetClass
  765. X*     ...drawing.wcClassName:    XmDrawingArea
  766. X*     ...drawing.wcConstructor: XmCreateDrawingArea
  767. X*
  768. X*     Since there are multiple ways of specifying the widget type,
  769. X*     a precedence is defined: wcClass is the highest precedence,
  770. X*     and wcClass > wcClassName > wcConstructor.
  771. X*
  772. X*     Currently, the Motif widget set defines many constructors, such 
  773. X*     as XmCreateForm or XmCreateFileSelectionBox.  Constructors are 
  774. X*     somtimes called Convenience Functions or even Confusion Functions.  
  775. X*     It is highly recommended that you use the WcTrace resource when
  776. X*     first using Constructors in order to see the resulting widget
  777. X*     heirarchy more clearly.  The WcTrace resource is specified as:
  778. X*
  779. X*     ...drawing.wcTrace:    True
  780. X
  781. X*     By default, all widgets created from the Xrm resource database
  782. X*     are managed.  In some cases, this is not what is desired: for
  783. X*     example, pop-up menus are generally not managed when they are
  784. X*     created, rather they are managed due to some mouse event.  In
  785. X*     such cases, the WcManaged resource should be set False, as below:
  786. X*
  787. X*     *fileMenu.wcManaged:    False
  788. X
  789. X*     It is possible to bind one or more callback functions to the
  790. X*     creation of a widget by using the WcCallback resource.  For 
  791. X*     example, using the Motif widget set, when a menu bar is created 
  792. X*     as a child of an XmMainWindow, the menuBar resource of the 
  793. X*     XmMainWindow needs to be set to refer to the menu bar.  For 
  794. X*     example:
  795. X*
  796. X*     App.main.wcClassName:    XmMainWindow
  797. X*     App.main.wcChildren:    mbar
  798. X*     *mbar.wcConstructor:    XmCreateMenuBar
  799. X*     *mbar.wcCallback:        WcSetResourceCB( *main.menuBar: this)
  800. X
  801. X*     Sometimes widget heirarchies are dynamic: many of the widgets
  802. X*     are created at initialization time, but others need to be created
  803. X*     at run time.  Simply do not include the names of the dynamic
  804. X*     created widgets in any wcChildren resource.  They will then still
  805. X*     be defined in the Xrm database, but they will not be created
  806. X*     during the initial widget tree creation.
  807. X
  808. X*     The WcDeferred resource is an obsolete mechanism which should no
  809. X*     longer be used.
  810. X
  811. X*     For example, let's say your interface includes a box world, where
  812. X*     the user can create an arbitrary number of various types of boxes:
  813. X
  814. X*     *box_world.wcClass:    MyBoxWorldWidgetClass
  815. X*
  816. X*     *box_type1.wcClass:    MyBoxType1WidgetClass
  817. X*     *box_type2.wcClass:    MyBoxType2WidgetClass
  818. X*     *box_type3.wcClass:    MyBoxType3WidgetClass
  819. X*     *box_type3.wcChildren:    child1, child2, child3, child4
  820. X*
  821. X*     *button1.callback:    WcCreateChildrenCB( *box_world, box_type1 )
  822. X*     *button2.callback:    WcCreateChildrenCB( *box_world, box_type2 )
  823. X*     *button3.callback:    WcCreateChildrenCB( *box_world, box_type3 )
  824. X*
  825. X*     Initially, when box_world is created, it will have no children.
  826. X*     Each time button1 is pressed, another instance of box_type1 will
  827. X*     be created as a child of box_world, and managed (since wcManaged
  828. X*     is by default True).  Similarly, everytime button2 is pressed
  829. X*     another box_type2 will be created, and everytime button3 is
  830. X*     pressed another box_type3 will be created, along with children
  831. X*     named child1, child2, child3, and child4, and their children as 
  832. X*     applicable.
  833. X
  834. X*     User interfaces are often rather complex.  Since the Widget
  835. X*     Creation Library allows much more of the interface to be
  836. X*     specified in resource files than in prehistoric days of
  837. X*     Widget application programming, it becomes necessary to allow
  838. X*     interfaces to be specified in a collection of resource files.
  839. X*     
  840. X*     It is very desirable that anything in the interface can be
  841. X*     tailored by the user.  Therefore, each resource filename
  842. X*     loaded to describe an interface must be searched for in 
  843. X*     all the locations defined by the Xt Intrinsics.  This is
  844. X*     exactly the same as the initial resource file.
  845. X*
  846. X*     Since a resource file may override any of the resources on
  847. X*     a given widget, including other creation resources, the
  848. X*     resource file name is first fetched before any of the other
  849. X*     wc* resources.
  850. X*
  851. X*     A resource file name is specified as follows:
  852. X*
  853. X*     *menuBar.wcResFile:    MenuBar
  854. X*
  855. X*     Each of the standard directories will be searched in order
  856. X*     for a file named MenuBar, and each merged into the resource database.
  857. X
  858. X*     The following is the complete set of resources which are 
  859. X*     interpreted by the Widget Creation Library:
  860. X*
  861. X*     ...widget.wcChildren:    childName1, childName2, ...
  862. X*     ...widget.wcClass:    classPointerName
  863. X*     ...widget.wcClassName:    className
  864. X*     ...widget.wcConstructor:  constructorFunctionName
  865. X*     ...widget.wcTrace:    true/false (default = false)
  866. X*     ...widget.wcManaged:    true/false (default = true)
  867. X*     ...widget.wcCallback:    callback1(args), callback2(args), ...
  868. X*     ...widget.wcResFile:    filename
  869. X*
  870. X*     In all cases, the Widget Creation resource names can be
  871. X*     specified as Wc<name> or wc<name>, with the capitalized
  872. X*     form having looser binding (representing the resource class).
  873. X
  874. X*     Example:
  875. X*
  876. X*        HelloWorld.wcChildren:  push
  877. X*
  878. X*        *push.wcClass:          xmPushButtonWidgetClass
  879. X*        *push.labelString:      Hello World
  880. X*        *push.activateCallback: WcExitCB(1)
  881. X
  882. X*     Since (for portability reasons) we can not assume runtime binding,
  883. X*     all widget classes or creation routines (constructors) must be 
  884. X*     "registered"  by the application BEFORE widget tree creation.
  885. X*
  886. X*     The widget tree creation is performed by the WcCreateDatabaseChild()
  887. X*     function, which descends the widget tree recursively until no more
  888. X*     children are found, or a non-composite widget/object is found.
  889. X*
  890. X*     Several convenience callbacks are provided with the package, allowing 
  891. X*     deferred widget creation, control (manage/unmanage) and other utility
  892. X*     functions.  These are found in WcCallb.c
  893. X*
  894. X* Module_history:
  895. X                                                  
  896. X*   mm/dd/yy  initials  function  action
  897. X*   --------  --------  --------  ---------------------------------------------
  898. X*   13Aug90   D.Smyth    Got rid of WcDefered stuff
  899. X*   11Jul90   D.Smyth   Added wcResFile resource
  900. X*   30Jun90   R.Whitby    WcWidgetCreation added call to WcRegisterWcActions
  901. X*   19Jun90   D.Smyth    Version 1.0
  902. X*   04/18/90  MarBru    many..    Changed w->core.name to XrmQuarkToString...
  903. X*   03/27/90  MarBru    Creation  Converted to a completely new syntax
  904. X*   02/16/90  MarBru    Create..  Limited creation to composite widgets/objects
  905. X*
  906. X* Design_notes:
  907. X*
  908. X*******************************************************************************
  909. X*/
  910. X/*
  911. X*******************************************************************************
  912. X* Include_files.
  913. X*******************************************************************************
  914. X*/
  915. X
  916. X/*  -- Operating system includes */
  917. X#include <stdio.h>
  918. X
  919. X/*  -- X Window System includes */
  920. X#include <X11/IntrinsicP.h>
  921. X#include <X11/StringDefs.h>
  922. X
  923. X/*  -- Widget Creation Includes */
  924. X#include "WcCreate.h"
  925. X#include "WcCreateP.h"
  926. X
  927. X/*
  928. X*******************************************************************************
  929. X* Private_data_definitions.
  930. X*******************************************************************************
  931. X*/
  932. X
  933. Xstatic char     msg[MAX_ERRMSG];
  934. X
  935. X/*  -- Creation resources 
  936. X    NOTE: All resource values are fetched at once, but if WcResFile
  937. X    is specified, then the resource files must be loaded and then
  938. X    the resources re-fetched.  This is an optimization: usually
  939. X    WcResFile is not specified, so two fetches from the Xrm database
  940. X    do not need to be done in the normal case.  If resource files are
  941. X    loaded and the resources are re-fetched, WcResFile is ignored.
  942. X    NOTE: The WcClass and WcClassName resources are both converted to
  943. X        a class pointer, as we can construct useful error messages using:
  944. X        class->core_class.class_name
  945. X    However, the Constructor must be the entire constructor cache
  946. X    record so we have the name of the constructor for the error
  947. X    messages.
  948. X    NOTE: WcClass and WcClassName write to different ResourceRec
  949. X    members, so we can provide better error messages.
  950. X*/
  951. X
  952. XXtResource wc_resources[] =
  953. X  {
  954. X    { WcNwcResFile,    WcCWcResFile,        XtRString,    sizeof(String),
  955. X      XtOffset(ResourceRecPtr, resFile ),    XtRImmediate,    (caddr_t) NULL
  956. X    },
  957. X    { WcNwcChildren,    WcCWcChildren,        XtRString,    sizeof(String),
  958. X      XtOffset(ResourceRecPtr, children ),    XtRImmediate,    (caddr_t) NULL
  959. X    },
  960. X    { WcNwcPopups,    WcCWcPopups,        XtRString,    sizeof(String),
  961. X      XtOffset(ResourceRecPtr, popups ),    XtRImmediate,    (caddr_t) NULL
  962. X    },
  963. X    { WcNwcClass,    WcCWcClass,        WcRClassPtr,    sizeof(caddr_t),
  964. X      XtOffset(ResourceRecPtr, class ),        XtRImmediate,    (caddr_t) NULL
  965. X    },
  966. X    { WcNwcClassName,    WcCWcClassName,        WcRClassName,    sizeof(caddr_t),
  967. X      XtOffset(ResourceRecPtr, classFromName ),    XtRImmediate,    (caddr_t) NULL
  968. X    },
  969. X    { WcNwcConstructor,    WcCWcConstructor,     WcRConstructor,    sizeof(caddr_t),
  970. X      XtOffset(ResourceRecPtr, constructor ),    XtRImmediate,    (caddr_t) NULL
  971. X    },
  972. X    { WcNwcManaged,    WcCWcManaged,        XtRBoolean,    sizeof(Boolean),
  973. X      XtOffset(ResourceRecPtr, managed),    XtRImmediate,    (caddr_t) TRUE
  974. X    },
  975. X    { WcNwcTrace,    WcCWcTrace,        XtRBoolean,    sizeof(Boolean),
  976. X      XtOffset(ResourceRecPtr, trace),        XtRImmediate,    (caddr_t) FALSE
  977. X    },
  978. X    { WcNwcCallback,    WcCWcCallback,    XtRCallback,    sizeof(XtCallbackList),
  979. X      XtOffset(ResourceRecPtr, callback ),    XtRImmediate,    (caddr_t) NULL
  980. X    }
  981. X  };
  982. X
  983. X/*
  984. X*******************************************************************************
  985. X* Private_function_declarations.
  986. X*******************************************************************************
  987. X*/
  988. X
  989. X#define TRACE_CREATION 1
  990. X#define TRACE_POPUP 2
  991. X
  992. X#ifdef FUNCTION_PROTOTYPES
  993. Xstatic void   GetWcResources( ResourceRec*, Widget, char* nm, char* class );
  994. Xstatic int    DuplicateType ( ResourceRec*, Widget, char* nm, char* callr );
  995. Xstatic Widget CreateWidget  ( ResourceRec*, Widget, char* nm, char* callr );
  996. Xstatic Widget CreatePopup   ( ResourceRec*, Widget, char* nm, char* callr );
  997. Xstatic void   CreationWarningMessage ( ResourceRec* rp, Widget pw, 
  998. X            char* name, char* caller, char* func );
  999. Xstatic void   PrintCreationTrace   ( ResourceRec*, Widget child, int traceTyp );
  1000. Xstatic void   CallCreationCallbacks( ResourceRec*, Widget child );
  1001. X#else
  1002. Xstatic void   GetWcResources();
  1003. Xstatic int    DuplicateType();
  1004. Xstatic Widget CreateWidget();
  1005. Xstatic Widget CreatePopup();
  1006. Xstatic void   CreationWarningMessage();
  1007. Xstatic void   PrintCreationTrace();
  1008. Xstatic void   CallCreationCallbacks();
  1009. X#endif
  1010. X
  1011. X/*
  1012. X*******************************************************************************
  1013. X* Public_function_declarations.
  1014. X*******************************************************************************
  1015. X*/
  1016. X
  1017. X/*
  1018. X    -- Create Widget Tree from Xrm Database
  1019. X*******************************************************************************
  1020. X    This routine creates widget children as defined in Xrm database.
  1021. X    It checks the widget resource "WcChildren", which is a list of
  1022. X    names of children to create. Each child must then be further defined
  1023. X    in the databse.
  1024. X
  1025. X    This function is frequently called from an application's main()
  1026. X    procedure after the application shell is created via XtInitialize().
  1027. X
  1028. X    Note that this function registers the converters for StringToWidget,
  1029. X    StringToCallback, and so forth.
  1030. X*/
  1031. X
  1032. Xvoid WcWidgetCreation ( root )
  1033. X    Widget       root;
  1034. X{
  1035. X    XtAppContext app = XtWidgetToApplicationContext( root );
  1036. X    char*     fullName = WcWidgetToFullName( root );    /* must be XtFree'd */
  1037. X    ResourceRec  res;
  1038. X
  1039. X    /* register the root of this widget */
  1040. X    (void)WcRootWidget(root);
  1041. X
  1042. X    /* register the Xt standard widgets */
  1043. X    WcRegisterIntrinsic ( app );
  1044. X
  1045. X    /* register the Wc converters */
  1046. X    WcAddConverters( app );
  1047. X
  1048. X    /* register the Wc callbacks */
  1049. X    WcRegisterWcCallbacks ( app );
  1050. X
  1051. X    /* register the Wc actions */
  1052. X    WcRegisterWcActions ( app );
  1053. X
  1054. X    if ( XtIsSubclass( root, compositeWidgetClass ) )
  1055. X    {
  1056. X        XtGetApplicationResources ( root, &res,
  1057. X              wc_resources, XtNumber(wc_resources), NULL, 0 );
  1058. X    
  1059. X    if ( res.popups || res.children )
  1060. X    {
  1061. X        if ( res.popups )
  1062. X        WcCreateNamedPopups ( root, res.popups );
  1063. X            if ( res.children )
  1064. X        WcCreateNamedChildren ( root, res.children );
  1065. X    }
  1066. X        else
  1067. X        {
  1068. X            sprintf( msg,
  1069. X            "WcWidgetCreation (%s) - Failed \n\
  1070. X             Problem: No children defined in Xrm database.\n\
  1071. X         Possible: resource file not found (XENVIRONEMENT not set?), \n\
  1072. X         Possible: top level widget in resource file not named %s",
  1073. X             fullName, root->core.name );
  1074. X            XtWarning( msg );
  1075. X    }
  1076. X    }
  1077. X
  1078. X     else
  1079. X    {
  1080. X        sprintf( msg,
  1081. X            "WcWidgetCreation (%s) - Failed \n\
  1082. X             Problem: %s is not a composite widget, cannot have children.",
  1083. X             fullName, fullName );
  1084. X        XtWarning( msg );
  1085. X    }
  1086. X
  1087. X    XtFree ( fullName );
  1088. X}
  1089. X
  1090. X/*
  1091. X    -- Create And Manage Named Children from Xrm Database
  1092. X*******************************************************************************
  1093. X    This function creates widget's children specified by names list,
  1094. X    by calling WcCreateDatabaseChild() for each of the names provided.
  1095. X
  1096. X    All the children are then managed, unless WcManaged resource is FALSE.
  1097. X
  1098. X    Note that widgets created by WcCreateDatabaseChild may or may not
  1099. X    be children of `pw' due to the use of constructors.  Only children
  1100. X    of `pw' may be managed via a call to XtManageChildren().  Other
  1101. X    widgets must be managed individually.  Usually, these widgets
  1102. X    are created by the XmCreateScrolled*() or XmCreate*Dialog confusion 
  1103. X    functions.
  1104. X*/
  1105. X
  1106. Xvoid WcCreateNamedChildren ( pw, names )
  1107. X    Widget      pw;         /* children's parent                            */
  1108. X    char*       names;      /* (list of) widget names to create             */
  1109. X{
  1110. X    Widget    child;
  1111. X    int        children = 0;
  1112. X    Widget    widget_children[MAX_CHILDREN];
  1113. X    int        other = 0;
  1114. X    Widget    widget_other[MAX_CHILDREN];
  1115. X    char    cleanName[MAX_XRMSTRING];
  1116. X    char*    next;
  1117. X    int        managed;
  1118. X    int        i;
  1119. X
  1120. X    if  ( !names ) return;
  1121. X
  1122. X    next = WcCleanName( names, cleanName );
  1123. X
  1124. X    while ( cleanName[0] )
  1125. X    {
  1126. X    child = WcCreateDatabaseChild ( pw, cleanName, &managed );
  1127. X    if ( child )
  1128. X    {
  1129. X        if ( managed && (XtParent( child ) == pw ) )
  1130. X        widget_children[children++] = child;
  1131. X        else if ( managed )
  1132. X        widget_other[other++] = child;
  1133. X    }
  1134. X    next = WcSkipWhitespace_Comma( next );
  1135. X    next = WcCleanName( next, cleanName );
  1136. X    }
  1137. X
  1138. X    if ( children ) 
  1139. X    XtManageChildren( widget_children, children );
  1140. X
  1141. X    for (i = 0 ; i < other ; i++)
  1142. X    XtManageChild( widget_other[i] );
  1143. X}
  1144. X
  1145. X/*
  1146. X    -- Create Named Popup Children from Xrm Database
  1147. X*******************************************************************************
  1148. X    This function creates widget's popup children specified by names list,
  1149. X    by calling WcCreateDatabasePopup() for each of the names provided.
  1150. X*/
  1151. X
  1152. Xvoid WcCreateNamedPopups ( pw, names )
  1153. X    Widget      pw;         /* children's parent                            */
  1154. X    char*       names;      /* (list of) names of popup widgets to create   */
  1155. X{
  1156. X    Widget      child;
  1157. X    char        cleanName[MAX_XRMSTRING];
  1158. X    char*       next;
  1159. X
  1160. X    if  ( !names ) return;
  1161. X
  1162. X    next = WcCleanName( names, cleanName );
  1163. X
  1164. X    while ( cleanName[0] )
  1165. X    {
  1166. X        child = WcCreateDatabasePopup ( pw, cleanName );
  1167. X        next = WcSkipWhitespace_Comma( next );
  1168. X        next = WcCleanName( next, cleanName );
  1169. X    }
  1170. X}
  1171. X
  1172. X/*
  1173. X    -- Create Widget from the Resource Database
  1174. X*******************************************************************************
  1175. X    WcCreateDatabaseChild() causes a normal child to be created.  This
  1176. X    implies that the parent widget is a composite widget.
  1177. X*/
  1178. X
  1179. XWidget WcCreateDatabaseChild ( pw, name, managed  )
  1180. X    Widget      pw;         /* child's parent */
  1181. X    char*       name;       /* child name to create */
  1182. X    int        *managed;    /* returned T/F: this child to be managed ? */
  1183. X{
  1184. X    ResourceRec res;        /* child's creation resources    */
  1185. X    Widget      child;        /* what we create        */
  1186. X    char*    className;    /* get after child is created    */
  1187. X
  1188. X    *managed = FALSE;        /* Assume error */
  1189. X
  1190. X    if ( !XtIsSubclass( pw, compositeWidgetClass ) )
  1191. X    {
  1192. X    /* child is not a manager widget, so cannot create children */
  1193. X    char* parentName = WcWidgetToFullName( pw );
  1194. X    sprintf( msg,
  1195. X            "WcCreateDatabaseChild (%s) - children ignored \n\
  1196. X             Problem: %s is not a composite, cannot have children.",
  1197. X             parentName, parentName );
  1198. X    XtWarning( msg );
  1199. X    XtFree( parentName );
  1200. X    return (Widget)NULL;
  1201. X    }
  1202. X
  1203. X    GetWcResources        ( &res, pw, name, name );
  1204. X    if (DuplicateType        ( &res, pw, name, "WcCreateDatabaseChild" ))
  1205. X    return (Widget)NULL;
  1206. X
  1207. X    child = CreateWidget    ( &res, pw, name, "WcCreateDatabaseChild" );
  1208. X
  1209. X    /* Now that widget is created, we can get the "class" resources */
  1210. X    className = child->core.widget_class->core_class.class_name;
  1211. X    GetWcResources        ( &res, pw, name, className );
  1212. X
  1213. X    if (res.trace)
  1214. X    PrintCreationTrace    ( &res, child, TRACE_CREATION );
  1215. X    if (res.callback)
  1216. X    CallCreationCallbacks    ( &res, child );
  1217. X
  1218. X    if (res.popups)
  1219. X    WcCreateNamedPopups    ( child, res.popups );
  1220. X    if (res.children)
  1221. X    WcCreateNamedChildren    ( child, res.children );
  1222. X
  1223. X    *managed = res.managed;
  1224. X    return child;
  1225. X}
  1226. X
  1227. X/*
  1228. X    -- Create Popup Widget from the Resource Database
  1229. X*******************************************************************************
  1230. X    WcCreateDatabasePopup() causes a popup widget to be created.  Any
  1231. X    widget can have popup chidren.
  1232. X*/
  1233. X
  1234. XWidget WcCreateDatabasePopup ( pw, name )
  1235. X    Widget      pw;         /* child's parent */
  1236. X    char*       name;       /* child name to create */
  1237. X{
  1238. X    ResourceRec res;            /* child's creation resources   */
  1239. X    Widget      child;          /* what we create               */
  1240. X    char*    className;    /* get after child is created    */
  1241. X
  1242. X    GetWcResources        ( &res, pw, name, name );
  1243. X    if (DuplicateType        ( &res, pw, name, "WcCreateDatabasePopup" ))
  1244. X    return (Widget)NULL;
  1245. X
  1246. X    child = CreatePopup        ( &res, pw, name, "WcCreateDatabasePopup" );
  1247. X
  1248. X    /* Now that widget is created, we can get the "class" resources */
  1249. X    className = child->core.widget_class->core_class.class_name;
  1250. X    GetWcResources        ( &res, pw, name, className );
  1251. X
  1252. X    if (res.trace)
  1253. X    PrintCreationTrace    ( &res, child, TRACE_POPUP );
  1254. X    if (res.callback)
  1255. X    CallCreationCallbacks    ( &res, child );
  1256. X
  1257. X    if (res.popups)
  1258. X    WcCreateNamedPopups    ( child, res.popups );
  1259. X    if (res.children)
  1260. X    WcCreateNamedChildren    ( child, res.children );
  1261. X
  1262. X    return child;
  1263. X}
  1264. X
  1265. X/*
  1266. X******************************************************************************* 
  1267. X**  Private functions used by WcCreateDatabaseChild and WcCreateDatabasePopup
  1268. X*******************************************************************************
  1269. X*/
  1270. X
  1271. X/*
  1272. X    -- Get Wc* Resources for named child of pw from Xrm resource database
  1273. X*******************************************************************************
  1274. X*/
  1275. X
  1276. Xstatic void GetWcResources( rp, pw, name, className )
  1277. X    ResourceRec* rp;
  1278. X    Widget       pw;
  1279. X    char*        name;
  1280. X    char*        className;
  1281. X{
  1282. X    /* Get creation resources for the child to be created.
  1283. X    ** After this XtGetSubresources() call, the resource structure `res'
  1284. X    ** contains resources specified in the Xrm database or the defaults.
  1285. X    */
  1286. X    XtGetSubresources ( pw, rp, name, className, 
  1287. X       wc_resources, XtNumber(wc_resources), NULL, 0 );
  1288. X
  1289. X    /* if a resource file is specified for this widget, first
  1290. X    ** load the resource file, then re-fetch the resources.
  1291. X    ** Notice that we don't check for resFile again.
  1292. X    */
  1293. X    if ( rp->resFile )
  1294. X    {
  1295. X    WcLoadResourceFileCB ( pw, rp->resFile, NULL );
  1296. X    XtGetSubresources ( pw, rp, name, className,
  1297. X       wc_resources, XtNumber(wc_resources), NULL, 0 );
  1298. X    }
  1299. X}
  1300. X
  1301. X/*
  1302. X    -- See if duplicate type resources are specified for this widget
  1303. X*******************************************************************************
  1304. X   Exactly one of WcClass, WcClassName, or WcConstructor must be
  1305. X   specified in order to create a widget.  If none are specified,
  1306. X   or if more than one is specified, then this is an error, and
  1307. X   this function returns TRUE, and the widget should not then be
  1308. X   created.
  1309. X*/
  1310. X
  1311. Xstatic int DuplicateType( rp, pw, name, caller )
  1312. X    ResourceRec* rp;
  1313. X    Widget     pw;
  1314. X    char*     name;
  1315. X    char*        caller;
  1316. X{
  1317. X    /* Booleans */
  1318. X    int class       = (NULL != rp->class);
  1319. X    int className   = (NULL != rp->classFromName);
  1320. X    int constructor = (NULL != rp->constructor);
  1321. X    char* reason;
  1322. X    char* parentName;
  1323. X    
  1324. X    if ( class + className + constructor == 0 )
  1325. X    reason = "No WcClass, WcClassName, nor WcConstructor";
  1326. X
  1327. X    else if ( class + className + constructor == 3 )
  1328. X    reason = "WcClass, WcClassName, and WcConstructor";
  1329. X
  1330. X    else if ( class + className == 2 )
  1331. X    reason = "WcClass and WcClassName";
  1332. X
  1333. X    else if ( class + constructor == 2 )
  1334. X    reason = "WcClass and WcConstructor";
  1335. X
  1336. X    else if ( className + constructor == 2 )
  1337. X    reason = "WcClassName and WcConstructor";
  1338. X
  1339. X    else
  1340. X    return 0; /* OK */
  1341. X
  1342. X    parentName = WcWidgetToFullName( pw );
  1343. X    sprintf( msg,
  1344. X            "%s (%s.%s) - Failed (Ambiguous) \n\
  1345. X             Problem: %s specified, \n\
  1346. X                      child %s.%s not created.",
  1347. X         caller, parentName, name, 
  1348. X         reason, 
  1349. X         parentName, name );
  1350. X    XtWarning( msg );
  1351. X    XtFree( parentName );
  1352. X    return 1;
  1353. X}
  1354. X
  1355. X/*
  1356. X    -- Create child widget using XtCreateWidget or constructor
  1357. X*******************************************************************************
  1358. X*/
  1359. X
  1360. Xstatic Widget CreateWidget ( rp, pw, name, caller )
  1361. X    ResourceRec* rp;
  1362. X    Widget       pw;
  1363. X    char*        name;
  1364. X    char*     caller;
  1365. X{
  1366. X    Widget child;
  1367. X
  1368. X    if ( rp->class )
  1369. X    child = XtCreateWidget ( name, rp->class, pw, NULL, 0 );
  1370. X    else if ( rp->classFromName )
  1371. X    child = XtCreateWidget ( name, rp->classFromName , pw, NULL, 0 );
  1372. X    else /* rp->constructor */
  1373. X    child = rp->constructor->constructor( pw, name, NULL, 0 );
  1374. X
  1375. X    if (child)
  1376. X    return child;
  1377. X    CreationWarningMessage( rp, pw, name, caller, "XtCreateWidget" );
  1378. X    return (Widget)NULL;
  1379. X}
  1380. X
  1381. X/*
  1382. X    -- Create child widget using XtCreateWidget or constructor
  1383. X*******************************************************************************
  1384. X*/
  1385. X
  1386. Xstatic Widget CreatePopup ( rp, pw, name, caller )
  1387. X    ResourceRec* rp;
  1388. X    Widget       pw;
  1389. X    char*        name;
  1390. X    char*        caller;
  1391. X{
  1392. X    Widget child;
  1393. X
  1394. X    if ( rp->class )
  1395. X        child = XtCreatePopupShell ( name, rp->class, pw, NULL, 0 );
  1396. X    else if ( rp->classFromName )
  1397. X        child = XtCreatePopupShell ( name, rp->classFromName , pw, NULL, 0 );
  1398. X    else /* rp->constructor */
  1399. X        child = rp->constructor->constructor( pw, name, NULL, 0 );
  1400. X
  1401. X    if (child)
  1402. X        return child;
  1403. X    CreationWarningMessage( rp, pw, name, caller, "XtCreatePopupShell" );
  1404. X    return (Widget)NULL;
  1405. X}
  1406. X
  1407. X/*
  1408. X    -- Print warning message when CreateWidget or CreatePopup fail
  1409. X*******************************************************************************
  1410. X*/
  1411. X
  1412. Xstatic void CreationWarningMessage ( rp, pw, name, caller, func )
  1413. X    ResourceRec* rp;
  1414. X    Widget       pw;
  1415. X    char*        name;
  1416. X    char*        caller;
  1417. X    char*     func;
  1418. X{
  1419. X    char* parentName = WcWidgetToFullName( pw );
  1420. X    static char funcWithArgs[1024];
  1421. X
  1422. X    if ( rp->class || rp->classFromName )
  1423. X    {
  1424. X        sprintf( funcWithArgs, "%s( %s, %s )", 
  1425. X                    func, name, rp->class->core_class.class_name );
  1426. X    }
  1427. X    else /* rp->constructor */
  1428. X    {
  1429. X        sprintf( funcWithArgs, "%s( %s )", rp->constructor->name, name );
  1430. X    }
  1431. X
  1432. X    sprintf( msg,
  1433. X            "%s (%s.%s) - Failed \n\
  1434. X             Problem: %s failed.",
  1435. X             caller, parentName, name, 
  1436. X         funcWithArgs );
  1437. X
  1438. X    XtWarning( msg );
  1439. X    XtFree( parentName );
  1440. X}
  1441. X
  1442. X/*
  1443. X    -- Print creation trace message
  1444. X*******************************************************************************
  1445. X*/
  1446. X
  1447. Xstatic void PrintCreationTrace( rp, child, traceType )
  1448. X    ResourceRec* rp;
  1449. X    Widget       child;
  1450. X    int         traceType;
  1451. X{
  1452. X    char* childName = WcWidgetToFullName( child );
  1453. X    char* trace;
  1454. X
  1455. X    if (traceType == TRACE_CREATION)
  1456. X    trace = (rp->managed) ? "  managed" : "unmanaged";
  1457. X    else
  1458. X    trace = "   pop-up";
  1459. X
  1460. X    fprintf(stderr,"Wc %s: %s of class %s\n",
  1461. X    trace,
  1462. X    childName, 
  1463. X    child->core.widget_class->core_class.class_name);
  1464. X
  1465. X    XtFree( childName  );
  1466. X}
  1467. X
  1468. X/*
  1469. X    -- Call creation time callbacks specified by WcCallbacks resource.
  1470. X*******************************************************************************
  1471. X*/
  1472. X
  1473. Xstatic void CallCreationCallbacks( rp, child )
  1474. X    ResourceRec* rp;
  1475. X    Widget       child;
  1476. X{
  1477. X    XtCallbackRec *cb = rp->callback;
  1478. X    for ( ; cb->callback; cb++ )
  1479. X        (*cb->callback)( child, cb->closure, NULL );
  1480. X}
  1481. END_OF_FILE
  1482. if test 27716 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreate.c'`; then
  1483.     echo shar: \"'xrainbow/Wc1_05/Wc/WcCreate.c'\" unpacked with wrong size!
  1484. fi
  1485. # end of 'xrainbow/Wc1_05/Wc/WcCreate.c'
  1486. fi
  1487. if test -f 'xrainbow/Wc1_05/Wc/WcCreate.h' -a "${1}" != "-c" ; then 
  1488.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreate.h'\"
  1489. else
  1490. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreate.h'\" \(7512 characters\)
  1491. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreate.h' <<'END_OF_FILE'
  1492. X/*
  1493. X** Copyright (c) 1990 David E. Smyth
  1494. X**
  1495. X** This file was derived from work performed by Martin Brunecky at
  1496. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  1497. X** following copyright:
  1498. X**
  1499. X*******************************************************************************
  1500. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  1501. X*
  1502. X*                        All Rights Reserved
  1503. X*
  1504. X* Permission to use, copy, modify, and distribute this software and its
  1505. X* documentation for any purpose and without fee is hereby granted, provided
  1506. X* that the above copyright notice appears on all copies and that both the
  1507. X* copyright and this permission notice appear in supporting documentation
  1508. X* and that the name of Auto-trol not be used in advertising or publicity
  1509. X* pertaining to distribution of the software without specific, prior written
  1510. X* permission.
  1511. X* 
  1512. X* Auto-trol disclaims all warranties with regard to this software, including
  1513. X* all implied warranties of merchantability and fitness, in no event shall
  1514. X* Auto-trol be liable for any special, indirect or consequential damages or
  1515. X* any damages whatsoever resulting from loss of use, data or profits, whether 
  1516. X* in an action of contract, negligence or other tortious action, arising out 
  1517. X* of or in connection with the use or performance of this software.
  1518. X*******************************************************************************
  1519. X**
  1520. X** Redistribution and use in source and binary forms are permitted
  1521. X** provided that the above copyright notice and this paragraph are
  1522. X** duplicated in all such forms and that any documentation, advertising
  1523. X** materials, and other materials related to such distribution and use
  1524. X** acknowledge that the software was developed by David E. Smyth.  The
  1525. X** name of David E. Smyth may not be used to endorse or promote products
  1526. X** derived from this software without specific prior written permission.
  1527. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1528. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1529. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1530. X**
  1531. X*/
  1532. X
  1533. X/*
  1534. X* SCCS_data: @(#)WcCreate.h 1.1 ( 19 Nov 90 )
  1535. X*
  1536. X* Include_name:
  1537. X*
  1538. X*     WcCreate.h
  1539. X*
  1540. X* Subsystem_group:
  1541. X*
  1542. X*     Widget Creation Library
  1543. X*
  1544. X* Include_description:
  1545. X*
  1546. X*     Public defines for the Widget Creation Library supporting widget 
  1547. X*     tree creation from the Xrm database.
  1548. X*
  1549. X* Include_history:
  1550. X*
  1551. X*   mm/dd/yy  initials  action
  1552. X*   --------  --------  -------------------------------------------------------
  1553. X*   07/16/90   D.Smyth  added WcAllowDuplicate*Reg... decls
  1554. X*   06/30/90   R.Whitby added WcRegisterWcActions declaration
  1555. X*   06/19/90   D.Smyth  Widget Creation Library version 1.0 Release
  1556. X*   04/04/90   marbru   updated, added new callbacks
  1557. X*   03/27/90   marbru   updated for new names
  1558. X*   03/02/90   marbru   created
  1559. X*
  1560. X*******************************************************************************
  1561. X*/
  1562. X#ifndef _WcCreate_h
  1563. X#define _WcCreate_h
  1564. X
  1565. X/*
  1566. X#include <X11/IntrinsicP.h>
  1567. X#include <X11/CoreP.h>
  1568. X#include <X11/ObjectP.h>
  1569. X*/
  1570. X
  1571. X#ifdef FUNCTION_PROTOTYPES
  1572. X/****************************** ANSI FUNC DECLS ******************************/
  1573. X
  1574. X#define APP XtAppContext
  1575. X#define EV extern void
  1576. X#define EW extern Widget
  1577. X#define EC extern char*
  1578. X
  1579. X/* -- Widget class, constructor, and callback proc registration routines */
  1580. X
  1581. XEV WcRegisterClassPtr   (APP, char* name,   WidgetClass class);
  1582. XEV WcRegisterClassName  (APP, char* name,   WidgetClass class);
  1583. XEV WcRegisterConstructor(APP, char* name,   Widget(*constructor) () );
  1584. XEV WcRegisterCallback   (APP, char* CBname, XtCallbackProc, caddr_t defCliData);
  1585. XEV WcRegisterAction    (APP, char* name,   XtActionProc proc );
  1586. XEV WcRegisterWcCallbacks(APP );
  1587. X
  1588. X/* -- Allow duplicate registration of classes, constructors, and callbacks */
  1589. X
  1590. XEV WcAllowDuplicateRegistration   ( int allowed );
  1591. XEV WcAllowDuplicateClassPtrReg    ( int allowed );
  1592. XEV WcAllowDuplicateClassNameReg   ( int allowed );
  1593. XEV WcAllowDuplicateConstructorReg ( int allowed );
  1594. XEV WcAllowDuplicateCallbackReg    ( int allowed );
  1595. X
  1596. X/* -- Widget action registration routine */
  1597. X
  1598. XEV WcRegisterWcActions   ( APP );
  1599. X
  1600. X/* -- Widget creation routines */
  1601. X
  1602. XEV WcWidgetCreation      ( Widget root );
  1603. XEV WcCreateNamedChildren ( Widget parent, char* names );
  1604. XEV WcCreateNamedPopups   ( Widget parent, char* names );
  1605. XEW WcCreateDatabaseChild ( Widget parent, char* name, int* managed );
  1606. XEW WcCreateDatabasePopup ( Widget parent, char* name );
  1607. X
  1608. X/* -- Widget name routines 
  1609. X**    The character buffer returned by WcNamesToWidgetList contains the
  1610. X**    names which could not be converted to widgets.  This buffer is static,
  1611. X**    so its contents are changed everytime WcNamesToWidgetList is called.
  1612. X**    The character buffer returned by WcWidgetToFullName must be XtFree'd
  1613. X**    by the caller.
  1614. X*/
  1615. X
  1616. XEW WcChildNameToWidget ( Widget w, char* childName );
  1617. XEW WcFullNameToWidget  ( Widget w, char* name );
  1618. XEC WcNamesToWidgetList ( Widget, char* names, Widget widgetList[], int* count);
  1619. XEC WcWidgetToFullName  ( Widget w );
  1620. X
  1621. X/*  -- Useful for argument parsing */
  1622. X
  1623. XEC WcLowerCaseCopy        ( char* in );            /* caller frees buf */
  1624. XEC WcSkipWhitespace       ( char* cp );
  1625. XEC WcSkipWhitespace_Comma ( char* cp );
  1626. XEC WcCleanName            ( char* in, char* out );    /* out[] must exist */
  1627. XEC WcStripWhitespaceFromBothEnds (char* name );        /* caller frees buf */
  1628. X
  1629. XEC WcGetResourceType          ( Widget, char* rName );    /* caller frees buf */
  1630. XEV WcSetValueFromString       ( Widget, char* rName, char* rVal );
  1631. XEV WcSetValueFromStringAndType( Widget, char* rName, char* rVal, char* rType );
  1632. X
  1633. XEC WcStrStr( char* searchThis, char* forThisPattern );    /* like ANSI strstr */
  1634. X
  1635. X#undef APP
  1636. X#undef EV
  1637. X#undef EW
  1638. X#undef EC
  1639. X
  1640. X#else
  1641. X/**************************** NON-ANSI FUNC DECLS ****************************/
  1642. X
  1643. X/* -- Widget constructor registration routine */
  1644. X
  1645. Xextern void WcRegisterClassPtr    ();
  1646. Xextern void WcRegisterClassName   ();
  1647. Xextern void WcRegisterConstructor ();
  1648. Xextern void WcRegisterCallback    ();
  1649. Xextern void WcRegisterAction      ();
  1650. Xextern void WcRegisterWcCallbacks ();
  1651. X
  1652. X/* -- Allow duplicate registration of classes, constructors, and callbacks */
  1653. X
  1654. Xextern void WcAllowDuplicateRegistration   ();
  1655. Xextern void WcAllowDuplicateClassPtrReg    ();
  1656. Xextern void WcAllowDuplicateClassNameReg   ();
  1657. Xextern void WcAllowDuplicateConstructorReg ();
  1658. Xextern void WcAllowDuplicateCallbackReg    ();
  1659. X
  1660. X/* -- Widget action registration routine */
  1661. X
  1662. Xextern void WcRegisterWcActions       ();
  1663. X
  1664. X/* -- Widget creation routines */
  1665. X
  1666. Xextern void   WcWidgetCreation         ();
  1667. Xextern void   WcCreateNamedChildren    ();
  1668. Xextern void   WcCreateNamedPopups    ();
  1669. Xextern Widget WcCreateDatabaseChild    ();
  1670. Xextern Widget WcCreateDatabasePopup    ();
  1671. X
  1672. X/* -- Widget name routine */
  1673. X
  1674. Xextern Widget WcChildNameToWidget    ();
  1675. Xextern Widget WcFullNameToWidget    ();
  1676. Xextern char*  WcNamesToWidgetList    ();    /* rets: names not converted */
  1677. Xextern char*  WcWidgetToFullName    ();    /* ret'd buff must be free'd */
  1678. X
  1679. Xextern char* WcLowerCaseCopy               ();    /* ret'd buff must be free'd */
  1680. Xextern char* WcSkipWhitespace              ();
  1681. Xextern char* WcSkipWhitespace_Comma        ();
  1682. Xextern char* WcCleanName                   ();
  1683. Xextern char* WcStripWhitespaceFromBothEnds ();    /* ret'd buff must be free'd */
  1684. X
  1685. Xextern char* WcGetResourceType             ();    /* ret'd buff must be free'd */
  1686. Xextern void  WcSetValueFromString          ();
  1687. Xextern void  WcSetValueFromStringAndType   ();
  1688. X
  1689. Xextern char* WcStrStr ();            /* same as ANSI strstr() */
  1690. X
  1691. X#endif /* FUNCTION_PROTOTYPES */
  1692. X
  1693. X#endif /* _WcCreate_h */
  1694. END_OF_FILE
  1695. if test 7512 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreate.h'`; then
  1696.     echo shar: \"'xrainbow/Wc1_05/Wc/WcCreate.h'\" unpacked with wrong size!
  1697. fi
  1698. # end of 'xrainbow/Wc1_05/Wc/WcCreate.h'
  1699. fi
  1700. if test -f 'xrainbow/Wc1_05/Wc/WcCreateP.h' -a "${1}" != "-c" ; then 
  1701.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\"
  1702. else
  1703. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\" \(15619 characters\)
  1704. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreateP.h' <<'END_OF_FILE'
  1705. X/*
  1706. X** Copyright (c) 1990 David E. Smyth
  1707. X**
  1708. X** This file was derived from work performed by Martin Brunecky at
  1709. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  1710. X** following copyright:
  1711. X**
  1712. X*******************************************************************************
  1713. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  1714. X*
  1715. X*                        All Rights Reserved
  1716. X*
  1717. X* Permission to use, copy, modify, and distribute this software and its
  1718. X* documentation for any purpose and without fee is hereby granted, provided
  1719. X* that the above copyright notice appears on all copies and that both the
  1720. X* copyright and this permission notice appear in supporting documentation
  1721. X* and that the name of Auto-trol not be used in advertising or publicity
  1722. X* pertaining to distribution of the software without specific, prior written
  1723. X* permission.
  1724. X*
  1725. X* Auto-trol disclaims all warranties with regard to this software, including
  1726. X* all implied warranties of merchantability and fitness, in no event shall
  1727. X* Auto-trol be liable for any special, indirect or consequential damages or
  1728. X* any damages whatsoever resulting from loss of use, data or profits, whether
  1729. X* in an action of contract, negligence or other tortious action, arising out
  1730. X* of or in connection with the use or performance of this software.
  1731. X*******************************************************************************
  1732. X**
  1733. X** Redistribution and use in source and binary forms are permitted
  1734. X** provided that the above copyright notice and this paragraph are
  1735. X** duplicated in all such forms and that any documentation, advertising
  1736. X** materials, and other materials related to such distribution and use
  1737. X** acknowledge that the software was developed by David E. Smyth.  The
  1738. X** name of David E. Smyth may not be used to endorse or promote products
  1739. X** derived from this software without specific prior written permission.
  1740. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1741. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1742. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1743. X**
  1744. X*/
  1745. X
  1746. X/*
  1747. X* SCCS_data: @(#)WcCreateP.h 1.1 ( 19 Nov 90 )
  1748. X*
  1749. X* Include_name:
  1750. X*
  1751. X*     WcCreateP.h
  1752. X*
  1753. X* Subsystem_group:
  1754. X*
  1755. X*     Widget Creation Library
  1756. X*
  1757. X* Include_description:
  1758. X*
  1759. X*     Private defines for the Widget Creation Library supporting widget
  1760. X*     tree creation from the Xrm database.
  1761. X*
  1762. X* Include_history:
  1763. X*
  1764. X*   mm/dd/yy  initials  action
  1765. X*   --------  --------  -------------------------------------------------------
  1766. X*   11/14/90   D.Smyth  Added popup resources
  1767. X*   06/30/90   R.Whitby added Action declarations
  1768. X*   05/24/90   D.Smyth  created from provate section of WsCreate.h
  1769. X*   03/02/90   marbru   created
  1770. X*
  1771. X*******************************************************************************
  1772. X*/
  1773. X#ifndef _WcCreateP_h
  1774. X#define _WcCreateP_h
  1775. X
  1776. X/*
  1777. X*******************************************************************************
  1778. X* Private_constant_declarations.
  1779. X*******************************************************************************
  1780. X*/
  1781. X#undef  NUL
  1782. X#define NUL '\0'
  1783. X#define MAX_XRMSTRING   4096        /* max length of the Xrm DB string  */
  1784. X#define MAX_ERRMSG      1024        /* max length of error message      */
  1785. X#define MAX_CHILDREN    1024        /* max number of widget's children  */
  1786. X#define MAX_PATHNAME    1024        /* max length of the pathname       */
  1787. X#define INCR_REGISTRY     32        /* incr of cl, con, cb registries   */
  1788. X#define MAX_CALLBACKS     64            /* max callbacks per Xrm resource   */
  1789. X#define MAX_WIDGETS      512        /* max depth of a widget tree       */
  1790. X#define MAX_ROOT_WIDGETS  32        /* max # separate widget trees        */
  1791. X#define MAX_RES_FILES    512        /* max # res file names per interf  */
  1792. X
  1793. X#define WcNwcResFile        "wcResFile"
  1794. X#define WcNwcChildren        "wcChildren"
  1795. X#define WcNwcPopups        "wcPopups"
  1796. X#define WcNwcClass        "wcClass"
  1797. X#define WcNwcClassName        "wcClassName"
  1798. X#define WcNwcConstructor    "wcConstructor"
  1799. X#define WcNwcManaged        "wcManaged"
  1800. X#define WcNwcTrace        "wcTrace"
  1801. X#define WcNwcCallback        "wcCallback"
  1802. X
  1803. X#define WcCWcResFile        "WcResFile"
  1804. X#define WcCWcChildren        "WcChildren"
  1805. X#define WcCWcPopups        "WcPopups"
  1806. X#define WcCWcClass        "WcClass"
  1807. X#define WcCWcClassName        "WcClassName"
  1808. X#define WcCWcConstructor    "WcConstructor"
  1809. X#define WcCWcManaged        "WcManaged"
  1810. X#define WcCWcTrace        "WcTrace"
  1811. X#define WcCWcCallback        "WcCallback"
  1812. X
  1813. X/* Motif 1.0 has a bug: widgets ask for Windows 
  1814. X** instead of Widgets for their resources...
  1815. X*/
  1816. X#define WcRWidget        "Window"
  1817. X#define WcRClassPtr        "ClassPtr"
  1818. X#define WcRClassName        "ClassName"
  1819. X#define WcRConstructor        "Constructor"
  1820. X/*
  1821. X*******************************************************************************
  1822. X* Private_type_declarations.
  1823. X*******************************************************************************
  1824. X*/
  1825. X
  1826. Xtypedef void   (*PtrFuncVoid)();    /* ptr to func returning void    */
  1827. Xtypedef Widget (*PtrFuncWidget)();    /* ptr to func returning Widget    */
  1828. X
  1829. X/* Registration structs: It is a good idea if the classes, class names,
  1830. X** constructors, and callbacks are registered with the same upper & lower 
  1831. X** case names as the names in the ref manuals and source files, as this 
  1832. X** makes the user error messages clearer.
  1833. X*/
  1834. X
  1835. Xtypedef struct                          /* Class cache record        */
  1836. X{
  1837. X    String       name;        /* class ptr name as registered    */
  1838. X    XrmQuark       quark;               /* quarkified class ptr name    */
  1839. X    WidgetClass    class;               /* widget class pointer        */
  1840. X} ClCacheRec;
  1841. X
  1842. Xtypedef struct                          /* Class Name cache record    */
  1843. X{
  1844. X    String       name;        /* class name as registered    */
  1845. X    XrmQuark       quark;               /* quarkified class name    */
  1846. X    WidgetClass    class;               /* widget class pointer        */
  1847. X} ClNameCacheRec;
  1848. X
  1849. Xtypedef struct                          /* Constructor cache record    */
  1850. X{
  1851. X    String       name;        /* constructor as registered    */
  1852. X    XrmQuark       quark;               /* quarkified constructor name    */
  1853. X    Widget         (*constructor)();    /* constructor function ptr    */
  1854. X} ConCacheRec;
  1855. X
  1856. Xtypedef struct                /* Callback cache record    */
  1857. X{
  1858. X    String         name;        /* name as registered         */
  1859. X    XrmQuark       quark;               /* quarkified callback name    */
  1860. X    XtCallbackProc callback;            /* callback procedure pointer    */
  1861. X    caddr_t       closure;        /* default client data        */
  1862. X} CBCacheRec;
  1863. X
  1864. Xtypedef struct  _ResourceRec
  1865. X{
  1866. X    String          resFile;            /* additional resource file name    */
  1867. X    String          children;           /* list of children names to create */
  1868. X    String          popups;             /* list of popup children to create */
  1869. X    WidgetClass     class;              /* widget class pointer             */
  1870. X    WidgetClass     classFromName;      /* widget class pointer             */
  1871. X    ConCacheRec*    constructor;    /* ptr to Constructo cache record   */
  1872. X    Boolean         managed;            /* created  managed (default TRUE)  */
  1873. X    Boolean         deferred;           /* deferred creation, (def FALSE)   */
  1874. X    Boolean         trace;              /* creation trace required          */
  1875. X    XtCallbackList  callback;           /* creation callback list           */
  1876. X} ResourceRec, *ResourceRecPtr;
  1877. X
  1878. X/*
  1879. X*******************************************************************************
  1880. X* Private_macro_definitions.
  1881. X*******************************************************************************
  1882. X    ONCE_PER_XtAppContext(app) should be invoked at the beginning of each 
  1883. X    function which performs registration, like MriRegisterMotif and 
  1884. X    AriRegisterAthena.  Note that this IS a macro: therefore, the return 
  1885. X    statement actually causes the return from the registration function.
  1886. X*/
  1887. X
  1888. X#define ONCE_PER_XtAppContext( app )    \
  1889. X{                    \
  1890. X    static XtAppContext already[1024];    \
  1891. X    static int numApps = 0;        \
  1892. X    int i;                \
  1893. X                    \
  1894. X    for (i = 0; i < numApps ; i++)    \
  1895. X        if (app == already[i])        \
  1896. X            return;            \
  1897. X                    \
  1898. X    already[numApps++] = app;        \
  1899. X}
  1900. X
  1901. X/*
  1902. X*******************************************************************************
  1903. X* Private_data_definitions.
  1904. X*******************************************************************************
  1905. X    The following cache/registry of known widget classes and contructors,
  1906. X    initially empty, are loaded by the application using "registration"
  1907. X    routines.
  1908. X    Assuming small numbers of constructors, the sequential search
  1909. X    of such cache is (initially) considered acceptable.
  1910. X*/
  1911. X
  1912. X/*  -- Named class pointer cache, intially empty */
  1913. X
  1914. Xextern int         classes_num;
  1915. Xextern int         classes_max;
  1916. Xextern ClCacheRec* classes_ptr;
  1917. X
  1918. X/*  -- Class name cache, intially empty */
  1919. X
  1920. Xextern int             cl_nm_num;
  1921. Xextern int             cl_nm_max;
  1922. Xextern ClNameCacheRec* cl_nm_ptr;
  1923. X
  1924. X/*  -- Named object constructor cache, intially empty */
  1925. X
  1926. Xextern int          constrs_num;
  1927. Xextern int          constrs_max;
  1928. Xextern ConCacheRec* constrs_ptr;
  1929. X
  1930. X/*  -- Callback function cache, initially empty */
  1931. X
  1932. Xextern int        callbacks_num;
  1933. Xextern int        callbacks_max;
  1934. Xextern CBCacheRec*  callbacks_ptr;
  1935. X/*  -- Widget Creation resources */
  1936. X
  1937. Xextern XtResource wc_resources[];
  1938. X
  1939. X/*
  1940. X*******************************************************************************
  1941. X* Private_function_declarations.
  1942. X*******************************************************************************
  1943. X    The following functions are generally private functions to the
  1944. X    WcCreate routines, but they may be defined in different files from
  1945. X    where they are used.  Client programs probably should not invoke
  1946. X    these functions directly.
  1947. X*/
  1948. X
  1949. X#ifdef FUNCTION_PROTOTYPES
  1950. X/****************************** ANSI FUNC DECLS ******************************/
  1951. X
  1952. X#define EV extern void
  1953. X
  1954. X/*  -- Resource converters */
  1955. X
  1956. XEV WcAddConverters     ( XtAppContext );
  1957. XEV CvtStringToClassPtr    ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
  1958. XEV CvtStringToClassName   ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
  1959. XEV CvtStringToConstructor ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
  1960. XEV CvtStringToCallback    ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
  1961. XEV XmuCvtStringToWidget   ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
  1962. X
  1963. X/*  -- Find root widget of argument, remember if never seen before */
  1964. X
  1965. Xextern Widget WcRootWidget    ( Widget );
  1966. X
  1967. X/*  -- Convenience Callbacks - Clients generally invoke these only
  1968. X       by binding them to widgets via the resource file.  They can
  1969. X       be programmatically bound, but generally should not be.
  1970. X*/
  1971. X
  1972. XEV WcCreateChildrenCB     (Widget w, char* parent_children, caddr_t unused   );
  1973. XEV WcCreatePopupsCB       (Widget w, char* parent_children, caddr_t unused   );
  1974. XEV WcManageCB             (Widget w, char* widgetNames,     caddr_t unused   );
  1975. XEV WcUnmanageCB           (Widget w, char* widgetNames,     caddr_t unused   );
  1976. XEV WcManageChildrenCB     (Widget w, char* parent_children, caddr_t unused   );
  1977. XEV WcUnmanageChildrenCB   (Widget w, char* parent_children, caddr_t unused   );
  1978. XEV WcDestroyCB            (Widget w, char* widgetNames,     caddr_t unused   );
  1979. XEV WcSetValueCB           (Widget w, char* name_res_resVal, caddr_t unused   );
  1980. XEV WcSetTypeValueCB       (Widget w, char* nm_res_type_val, caddr_t unused   );
  1981. XEV WcSetSensitiveCB       (Widget w, char* widgetNames,     caddr_t unused   );
  1982. XEV WcSetInsensitiveCB     (Widget w, char* widgetNames,     caddr_t unused   );
  1983. XEV WcLoadResourceFileCB   (Widget w, char* resFileName,     caddr_t unused   );
  1984. XEV WcTraceCB              (Widget w, char* annotation,      caddr_t unused   );
  1985. XEV WcPopupCB              (Widget w, char* widgetName,        caddr_t unused   );
  1986. XEV WcPopupGrabCB          (Widget w, char* widgetName,        caddr_t unused   );
  1987. XEV WcPopdownCB            (Widget w, char* widgetName,      caddr_t unused   );
  1988. XEV WcMapCB                (Widget w, char* widgetName,      caddr_t unused   );
  1989. XEV WcUnmapCB              (Widget w, char* widgetName,      caddr_t unused   );
  1990. XEV WcSystemCB             (Widget w, char* shellCmdString,  caddr_t unused   );
  1991. XEV WcExitCB               (Widget w, char* exitValue,       caddr_t unused   );
  1992. X
  1993. X/*  -- Convenience Actions - Clients generally invoke these only
  1994. X       by binding them to widgets via the resource file.  They can
  1995. X       be programmatically bound, but generally should not be.
  1996. X*/
  1997. X
  1998. X#define ACT_ARGS Widget w, XEvent *event, String *params, Cardinal *num_params
  1999. X
  2000. XEV WcCreateChildrenACT    ( ACT_ARGS );
  2001. XEV WcCreatePopupsACT      ( ACT_ARGS );
  2002. XEV WcManageACT            ( ACT_ARGS );
  2003. XEV WcUnmanageACT          ( ACT_ARGS );
  2004. XEV WcManageChildrenACT    ( ACT_ARGS );
  2005. XEV WcUnmanageChildrenACT  ( ACT_ARGS );
  2006. XEV WcDestroyACT           ( ACT_ARGS );
  2007. XEV WcSetValueACT          ( ACT_ARGS );
  2008. XEV WcSetTypeValueACT      ( ACT_ARGS );
  2009. XEV WcSetSensitiveACT      ( ACT_ARGS );
  2010. XEV WcSetInsensitiveACT    ( ACT_ARGS );
  2011. XEV WcLoadResourceFileACT  ( ACT_ARGS );
  2012. XEV WcTraceACT             ( ACT_ARGS );
  2013. XEV WcPopupACT             ( ACT_ARGS );
  2014. XEV WcPopupGrabACT         ( ACT_ARGS );
  2015. XEV WcPopdownACT           ( ACT_ARGS );
  2016. XEV WcMapACT               ( ACT_ARGS );
  2017. XEV WcUnmapACT             ( ACT_ARGS );
  2018. XEV WcSystemACT            ( ACT_ARGS );
  2019. XEV WcExitACT              ( ACT_ARGS );
  2020. X
  2021. X#undef ACT_ARGS
  2022. X#undef EV
  2023. X
  2024. X#else
  2025. X/**************************** NON-ANSI FUNC DECLS ****************************/
  2026. X
  2027. X/*  -- Resource converters */
  2028. X
  2029. Xextern void WcAddConverters        ();
  2030. Xextern void CvtStringToClassPtr    ();
  2031. Xextern void CvtStringToClassName    ();
  2032. Xextern void CvtStringToConstructor ();
  2033. Xextern void CvtStringToCallback    ();
  2034. Xextern void XmuCvtStringToWidget   ();    /* note naming! replace Xmu... */
  2035. X
  2036. X/*  -- Find root widget of argument, remember if never seen before */
  2037. X
  2038. Xextern Widget WcRootWidget ();
  2039. X
  2040. X/*  -- Convenience Callbacks - Clients generally invoke these only
  2041. X       by binding them to widgets via the resource file.  They can
  2042. X       be programmatically bound, but generally should not be.
  2043. X*/
  2044. X
  2045. Xextern void WcCreateChildrenCB     ();
  2046. Xextern void WcCreatePopupsCB       ();
  2047. Xextern void WcManageCB             ();
  2048. Xextern void WcUnmanageCB           ();
  2049. Xextern void WcManageChildrenCB     ();
  2050. Xextern void WcUnmanageChildrenCB   ();
  2051. Xextern void WcDestroyCB            ();
  2052. Xextern void WcSetValueCB           ();
  2053. Xextern void WcSetTypeValueCB       ();
  2054. Xextern void WcSetSensitiveCB       ();
  2055. Xextern void WcSetInsensitiveCB     ();
  2056. Xextern void WcLoadResourceFileCB   ();
  2057. Xextern void WcTraceCB              ();
  2058. Xextern void WcPopupCB              ();
  2059. Xextern void WcPopupGrabCB          ();
  2060. Xextern void WcPopdownCB            ();
  2061. Xextern void WcMapCB                ();
  2062. Xextern void WcUnmapCB              ();
  2063. Xextern void WcSystemCB             ();
  2064. Xextern void WcExitCB               ();
  2065. X
  2066. X/*  -- Convenience Actions - Clients generally invoke these only
  2067. X       by binding them to widgets via the resource file.  They can
  2068. X       be programmatically bound, but generally should not be.
  2069. X*/
  2070. X
  2071. Xextern void WcCreateChildrenACT    ();
  2072. Xextern void WcCreatePopupsACT      ();
  2073. Xextern void WcManageACT            ();
  2074. Xextern void WcUnmanageACT          ();
  2075. Xextern void WcManageChildrenACT    ();
  2076. Xextern void WcUnmanageChildrenACT  ();
  2077. Xextern void WcDestroyACT           ();
  2078. Xextern void WcSetValueACT          ();
  2079. Xextern void WcSetTypeValueACT      ();
  2080. Xextern void WcSetSensitiveACT      ();
  2081. Xextern void WcSetInsensitiveACT    ();
  2082. Xextern void WcLoadResourceFileACT  ();
  2083. Xextern void WcTraceACT             ();
  2084. Xextern void WcPopupACT             ();
  2085. Xextern void WcPopupGrabACT         ();
  2086. Xextern void WcPopdownACT           ();
  2087. Xextern void WcMapACT               ();
  2088. Xextern void WcUnmapACT             ();
  2089. Xextern void WcSystemACT            ();
  2090. Xextern void WcExitACT              ();
  2091. X
  2092. X#endif /* FUNCTION_PROTOTYPES */
  2093. X
  2094. X#endif /* _WcCreateP_h */
  2095. END_OF_FILE
  2096. if test 15619 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreateP.h'`; then
  2097.     echo shar: \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\" unpacked with wrong size!
  2098. fi
  2099. # end of 'xrainbow/Wc1_05/Wc/WcCreateP.h'
  2100. fi
  2101. if test -f 'xrainbow/include/X11/Xaw_d/DrawingA.h' -a "${1}" != "-c" ; then 
  2102.   echo shar: Will not clobber existing file \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\"
  2103. else
  2104. echo shar: Extracting \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\" \(1399 characters\)
  2105. sed "s/^X//" >'xrainbow/include/X11/Xaw_d/DrawingA.h' <<'END_OF_FILE'
  2106. X/* DrawingA.h - Public Header file */
  2107. X
  2108. X/* Copyright 1990, David Nedde
  2109. X/*
  2110. X/* Permission to use, copy, modify, and distribute this
  2111. X/* software and its documentation for any purpose and without fee
  2112. X/* is granted provided that the above copyright notice appears in all copies.
  2113. X/* It is provided "as is" without express or implied warranty.
  2114. X*/
  2115. X
  2116. X/* Define widget's class pointer and strings used to specify resources */
  2117. X
  2118. X#ifndef _XawDrawingArea_h
  2119. X#define _XawDrawingArea_h
  2120. X
  2121. X/* Resources ADDED to label widget:
  2122. X
  2123. X Name             Class        RepType        Default Value
  2124. X ----             -----        -------        -------------
  2125. X exposeCallback         Callback        Pointer        NULL
  2126. X inputCallback         Callback        Pointer        NULL
  2127. X motionCallback         Callback        Pointer        NULL
  2128. X resizeCallback         Callback        Pointer        NULL
  2129. X*/
  2130. X
  2131. X
  2132. Xextern WidgetClass drawingAreaWidgetClass;
  2133. X
  2134. Xtypedef struct _DrawingAreaClassRec *DrawingAreaWidgetClass;
  2135. Xtypedef struct _DrawingAreaRec        *DrawingAreaWidget;
  2136. X
  2137. X
  2138. X/* Resource strings */
  2139. X#define XtNexposeCallback    "exposeCallback"
  2140. X#define XtNinputCallback    "inputCallback"
  2141. X#define XtNmotionCallback    "motionCallback"
  2142. X#define XtNresizeCallback    "resizeCallback"
  2143. X
  2144. X
  2145. Xtypedef struct _XawDrawingAreaCallbackStruct {
  2146. X  int      reason;
  2147. X  XEvent *event;
  2148. X  Window  window;
  2149. X} XawDrawingAreaCallbackStruct;
  2150. X
  2151. X/* Reasons */
  2152. X#define XawCR_EXPOSE 1
  2153. X#define XawCR_INPUT  2
  2154. X#define XawCR_MOTION 3
  2155. X#define XawCR_RESIZE 4
  2156. X
  2157. X#endif /* _XawDrawingArea_h */
  2158. END_OF_FILE
  2159. if test 1399 -ne `wc -c <'xrainbow/include/X11/Xaw_d/DrawingA.h'`; then
  2160.     echo shar: \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\" unpacked with wrong size!
  2161. fi
  2162. # end of 'xrainbow/include/X11/Xaw_d/DrawingA.h'
  2163. fi
  2164. echo shar: End of archive 3 \(of 5\).
  2165. cp /dev/null ark3isdone
  2166. MISSING=""
  2167. for I in 1 2 3 4 5 ; do
  2168.     if test ! -f ark${I}isdone ; then
  2169.     MISSING="${MISSING} ${I}"
  2170.     fi
  2171. done
  2172. if test "${MISSING}" = "" ; then
  2173.     echo You have unpacked all 5 archives.
  2174.     echo "Please Read README"
  2175.     rm -f ark[1-9]isdone
  2176. else
  2177.     echo You still need to unpack the following archives:
  2178.     echo "        " ${MISSING}
  2179. fi
  2180. ##  End of shell archive.
  2181. exit 0
  2182.  
  2183. --
  2184. Dan Heller
  2185. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  2186. Senior Writer                President          comp-sources-x@uunet.uu.net
  2187. argv@ora.com                 argv@zipcode.com
  2188.