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

  1. Path: uunet!elroy.jpl.nasa.gov!lll-winken!sun-barr!cronkite!newstop!jethro!exodus!maxine.WPI.EDU
  2. From: daven@maxine.WPI.EDU (Dave Nedde)
  3. Newsgroups: comp.sources.x
  4. Subject: v13i066: xrainbow, Part04/05
  5. Message-ID: <15966@exodus.Eng.Sun.COM>
  6. Date: 28 Jun 91 01:05:08 GMT
  7. References: <csx-13i063-xrainbow@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 2353
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: daven@maxine.WPI.EDU (Dave Nedde)
  13. Posting-number: Volume 13, Issue 66
  14. Archive-name: xrainbow/part04
  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 4 (of 5)."
  23. # Contents:  xrainbow/Wc1_05/Wc/WcName.c xrainbow/Wc1_05/Wc/WcReg.c
  24. #   xrainbow/Wc1_05/Wc/WcRegXt.c xrainbow/X11/Xaw_d/DrawingA.c
  25. #   xrainbow/X11/Xaw_d/DrawingA.doc xrainbow/include/Wc/WcCreate.h
  26. # Wrapped by daven@ash on Mon Jun  3 12:33:24 1991
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'xrainbow/Wc1_05/Wc/WcName.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcName.c'\"
  30. else
  31. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcName.c'\" \(30543 characters\)
  32. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcName.c' <<'END_OF_FILE'
  33. X/*
  34. X** Copyright (c) 1990 David E. Smyth
  35. X**
  36. X** Redistribution and use in source and binary forms are permitted
  37. X** provided that the above copyright notice and this paragraph are
  38. X** duplicated in all such forms and that any documentation, advertising
  39. X** materials, and other materials related to such distribution and use
  40. X** acknowledge that the software was developed by David E. Smyth.  The
  41. X** name of David E. Smyth may not be used to endorse or promote products
  42. X** derived from this software without specific prior written permission.
  43. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  44. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  45. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  46. X**
  47. X*/
  48. X
  49. X/******************************************************************************
  50. X** SCCS_data: @(#)WcName.c 1.1 ( 19 Nov 90 )
  51. X**
  52. X** Description:    Implements several name-to-widget and widget-to-name
  53. X**        functions which are generally useful, especially a name 
  54. X**        to widget function which really works:
  55. X**
  56. X**            Widget WcFullNameToWidget(char* widget_name)
  57. X**
  58. X**        The widget names understood by WcFullNameToWidget() are
  59. X**        a superset of those understood by XtNameToWidget in
  60. X**        the X11R4 version of libXt.  XtNameToWidget only knows
  61. X**        how to find children of a reference widget, and so the
  62. X**        names start _below- the refernce widget.  However,
  63. X**        WcFullNameToWidget knows how to find widgets anywhere
  64. X**        in the widget tree: it normally starts the name search
  65. X**        from the root of the widget tree, but it can also
  66. X**        perform the name search relatively from the reference
  67. X**        widget, both up and down the widget tree.
  68. X**
  69. X**        When name searches start at the root of the widget
  70. X**        tree, the same syntax as that understood by Xrm is
  71. X**        used.  Below are four examples of acceptable names:
  72. X**
  73. X**            *foo            *foo.XmRowColumn*glorp
  74. X**            Mri.some*other.foo    *Form.glorp
  75. X**
  76. X**        Note that components may be class names, such as
  77. X**        XmRowColumn, or may be instance names of the widgets.
  78. X**        Ambiguous names are resolved exactly as done by 
  79. X**        XtNameToWidget: shallowest wins, `.' binds tighter
  80. X**        than `*', instance names bind tighter than class
  81. X**        names.
  82. X**
  83. X**        In addition to resolving names from the root of the
  84. X**        widget tree, WcFullNameToWidget also can find widget
  85. X**        using a relative root prefix.  Three special characters
  86. X**        are used:
  87. X**
  88. X**            ^    means "parent"
  89. X**            ~    means the closest shell ancestor
  90. X**            .    means start at the reference widget
  91. X**
  92. X**        The relative root prefix characters are exactly that:
  93. X**        a prefix of a name which will then be passed to
  94. X**        XtNameToWidget.  Some examples:
  95. X**
  96. X**            .foo    a child of the reference widget
  97. X**            ^foo    a sibling of the reference widget
  98. X**            ^^foo    a sibling of the ref' widgets's parent
  99. X**            ~foo    a child of the shell ancestor.
  100. X**            ~~*foo    some child of the shell's shell ancestor.
  101. X**
  102. X**        The ^ and ~ prefix characters are only valid at the 
  103. X**        beginning.  They effectively operate on the reference
  104. X**        widget.
  105. X**
  106. X**        In all cases, the characters are scanned left to right.
  107. X**        So, the first character is acted upon, then the second,
  108. X**        and so on.
  109. X**        
  110. X** Notes:    Most of the "private" part of this file goes away when 
  111. X**        the bug in the Xt Intrinsics is fixed which causes 
  112. X**        XtNameToWidget() to dump core whenever a Gadget exists 
  113. X**        in the widget heirarchy...
  114. X**
  115. X******************************************************************************/
  116. X
  117. X/******************************************************************************
  118. X* Include_files.
  119. X******************************************************************************/
  120. X
  121. X#include <ctype.h>      /* isupper() and tolower macros */
  122. X
  123. X/*  -- X Window System includes */
  124. X#include <X11/IntrinsicP.h>
  125. X#include <X11/ObjectP.h>
  126. X#include <X11/StringDefs.h>
  127. X
  128. X/*  -- Widget Creation Library includes */
  129. X#include "WcCreate.h"
  130. X#include "WcCreateP.h"
  131. X
  132. X/*
  133. X*******************************************************************************
  134. X* Private_data_definitions.
  135. X*******************************************************************************
  136. X*/
  137. X
  138. X/* shared error message and name buffers
  139. X*******************************************************************************
  140. X** NOTE: These are shared arrays because they are large: i.e.,
  141. X** this is a performacne optimization intended to reduce page
  142. X** faults which can occur while making large extensions to the
  143. X** stack space.  Wait a minute: wouldn't this just happen
  144. X** once, and then the stack space is alloc'd?  Yes, but a
  145. X** huge stack space runs the risk of getting swapped, which causes
  146. X** page faults.  This is probably a nit-picky sort of optimization.
  147. X** Remember that D.Smyth is an old sys programmer from the stone
  148. X** ages, and pity him instead of flaming him.
  149. X** Be careful when filling msg not to call any funcs in here,
  150. X** so the message does not get garbled.
  151. X*/
  152. X
  153. Xstatic char     msg[MAX_ERRMSG];
  154. Xstatic char     cleanName[MAX_PATHNAME];
  155. X
  156. X/* Private Data involving the root widget list
  157. X*******************************************************************************
  158. X*/
  159. X
  160. Xstatic int    numRoots = 0;
  161. Xstatic Widget rootWidgets[MAX_ROOT_WIDGETS];
  162. X
  163. X/*
  164. X*******************************************************************************
  165. X* Private_function definitions.
  166. X*******************************************************************************
  167. X
  168. X/*
  169. X    The following implements XtNameToWidget() in a way which really works.
  170. X
  171. X    Note: the #if defined... assumes a FIXED version of R4.  The version
  172. X    even as of 19 June 1990 still is not correct (dumps core on Gadgets).
  173. X*/
  174. X
  175. X#if defined(XtSpecificationRelease) && XtSpecificationRelease > 4
  176. X
  177. XWidget WcChildNameToWidget( Widget ref, char* childName)
  178. X{
  179. X    return XtNameToWidget( ref, childName );
  180. X}
  181. X
  182. X#else
  183. X
  184. X/* NOTE: The Motif 1.0 XtNameToWidget is broken: it cannot find
  185. X** names with wild cards.  The R4 XtNameToWidget is also broken: it
  186. X** cannot handle encounters with Gadgets.
  187. X**
  188. X** Below is the code extracted from the X11R4 distribution, with very
  189. X** minor changes to make it independent from the rest of the R4 Intrinsics, 
  190. X** and to fix the bug in encountering Gadgets.
  191. X** 
  192. X** Fixes: Added the two lines following this comment block.
  193. X**      Renamed XtNameToWidget to WcChildNameToWidget to avoid warning.
  194. X**      Removed "register" from arg type decls, as dbx does these
  195. X**      incorrectly, and a decent compiler (gcc) does this anyway.
  196. X** -->      Before looking for children, see if a widget is a gadget.
  197. X**         Gadgets can't have children, in fact those fields are
  198. X**         something else entirely!!!
  199. X**
  200. X** Here is the Copyright notice in the X11R4 files from which the
  201. X** following section of code, through the line containing
  202. X**        #endif from X11R4
  203. X***********************************************************
  204. XCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
  205. Xand the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  206. X
  207. X                        All Rights Reserved
  208. X
  209. XPermission to use, copy, modify, and distribute this software and its
  210. Xdocumentation for any purpose and without fee is hereby granted,
  211. Xprovided that the above copyright notice appear in all copies and that
  212. Xboth that copyright notice and this permission notice appear in
  213. Xsupporting documentation, and that the names of Digital or MIT not be
  214. Xused in advertising or publicity pertaining to distribution of the
  215. Xsoftware without specific, written prior permission.
  216. X
  217. XDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  218. XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  219. XDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  220. XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  221. XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  222. XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  223. XSOFTWARE.
  224. X
  225. X******************************************************************
  226. X*/
  227. X
  228. X/*************** Begin source from X11R4 Xtos.h ***************/
  229. X
  230. X#ifndef ALLOCATE_LOCAL
  231. X#define ALLOCATE_LOCAL(size) XtMalloc((unsigned long)(size))
  232. X#define DEALLOCATE_LOCAL(ptr) XtFree((caddr_t)(ptr))
  233. X#endif /* ALLOCATE_LOCAL */
  234. X
  235. X/*************** End source from X11R4 Xtos.h ***************/
  236. X
  237. X#define _XtAllocError        XtError
  238. X
  239. X/*************** Begin source from X11R4 lib/Xt/Intrinsics.c ***************/
  240. X
  241. Xstatic Widget NameListToWidget();
  242. X
  243. Xtypedef Widget (*NameMatchProc)();
  244. X
  245. Xstatic Widget MatchExactChildren(names, bindings, children, num,
  246. X        in_depth, out_depth, found_depth)
  247. X    XrmNameList     names;
  248. X    XrmBindingList  bindings;
  249. X    WidgetList children;
  250. X    int num;
  251. X    int in_depth, *out_depth, *found_depth;
  252. X{
  253. X    Cardinal   i;
  254. X    XrmName    name = *names;
  255. X    Widget w, result = NULL;
  256. X    int d, min = 10000;
  257. X
  258. X    for (i = 0; i < num; i++) {
  259. X        if (name == children[i]->core.xrm_name) {
  260. X            w = NameListToWidget(children[i], &names[1], &bindings[1],
  261. X                    in_depth+1, &d, found_depth);
  262. X            if (w != NULL && d < min) {result = w; min = d;}
  263. X        }
  264. X    }
  265. X    *out_depth = min;
  266. X    return result;
  267. X}
  268. X
  269. Xstatic Widget MatchWildChildren(names, bindings, children, num,
  270. X        in_depth, out_depth, found_depth)
  271. X    XrmNameList     names;
  272. X    XrmBindingList  bindings;
  273. X    WidgetList children;
  274. X    int num;
  275. X    int in_depth, *out_depth, *found_depth;
  276. X{
  277. X    Cardinal   i;
  278. X    Widget w, result = NULL;
  279. X    int d, min = 10000;
  280. X
  281. X    for (i = 0; i < num; i++) {
  282. X        w = NameListToWidget(children[i], names, bindings,
  283. X                in_depth+1, &d, found_depth);
  284. X        if (w != NULL && d < min) {result = w; min = d;}
  285. X    }
  286. X    *out_depth = min;
  287. X    return result;
  288. X}
  289. X
  290. Xstatic Widget SearchChildren(root, names, bindings, matchproc,
  291. X        in_depth, out_depth, found_depth)
  292. X    Widget root;
  293. X    XrmNameList     names;
  294. X    XrmBindingList  bindings;
  295. X    NameMatchProc matchproc;
  296. X    int in_depth, *out_depth, *found_depth;
  297. X{
  298. X    Widget w1, w2;
  299. X    int d1, d2;
  300. X
  301. X    if (!XtIsWidget(root)) {
  302. X    *out_depth = 10000;    /* I don't know what this should be */
  303. X    return (Widget)NULL;
  304. X    }
  305. X    if (XtIsComposite(root)) {
  306. X        w1 = (*matchproc)(names, bindings,
  307. X                ((CompositeWidget) root)->composite.children,
  308. X                ((CompositeWidget) root)->composite.num_children,
  309. X                in_depth, &d1, found_depth);
  310. X    } else d1 = 10000;
  311. X    w2 = (*matchproc)(names, bindings, root->core.popup_list,
  312. X            root->core.num_popups, in_depth, &d2, found_depth);
  313. X    *out_depth = (d1 < d2 ? d1 : d2);
  314. X    return (d1 < d2 ? w1 : w2);
  315. X}
  316. X
  317. Xstatic Widget NameListToWidget(root, names, bindings,
  318. X        in_depth, out_depth, found_depth)
  319. X    Widget root;
  320. X    XrmNameList     names;
  321. X    XrmBindingList  bindings;
  322. X    int in_depth, *out_depth, *found_depth;
  323. X{
  324. X    Widget w1, w2;
  325. X    int d1, d2;
  326. X
  327. X    if (in_depth >= *found_depth) {
  328. X        *out_depth = 10000;
  329. X        return NULL;
  330. X    }
  331. X
  332. X    if (names[0] == NULLQUARK) {
  333. X        *out_depth = *found_depth = in_depth;
  334. X        return root;
  335. X    }
  336. X
  337. X    if (*bindings == XrmBindTightly) {
  338. X        return SearchChildren(root, names, bindings, MatchExactChildren,
  339. X                in_depth, out_depth, found_depth);
  340. X
  341. X    } else {    /* XrmBindLoosely */
  342. X        w1 = SearchChildren(root, names, bindings, MatchExactChildren,
  343. X                in_depth, &d1, found_depth);
  344. X        w2 = SearchChildren(root, names, bindings, MatchWildChildren,
  345. X                in_depth, &d2, found_depth);
  346. X        *out_depth = (d1 < d2 ? d1 : d2);
  347. X        return (d1 < d2 ? w1 : w2);
  348. X    }
  349. X} /* NameListToWidget */
  350. X
  351. XWidget WcChildNameToWidget( ref, name )  /* was XtNameToWidget */
  352. X    Widget ref;
  353. X    char*  name;
  354. X{
  355. X    XrmName *names;
  356. X    XrmBinding *bindings;
  357. X    int len, depth, found = 10000;
  358. X    Widget result;
  359. X
  360. X    len = strlen(name);
  361. X    if (len == 0) return NULL;
  362. X
  363. X    names = (XrmName *) ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmName));
  364. X    bindings = (XrmBinding *)
  365. X        ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmBinding));
  366. X    if (names == NULL || bindings == NULL) _XtAllocError("alloca");
  367. X
  368. X    XrmStringToBindingQuarkList(name, bindings, names);
  369. X    if (names[0] == NULLQUARK) {
  370. X        DEALLOCATE_LOCAL((char *) names);
  371. X        DEALLOCATE_LOCAL((char *) bindings);
  372. X        return NULL;
  373. X    }
  374. X
  375. X    result = NameListToWidget(ref, names, bindings, 0, &depth, &found);
  376. X
  377. X    DEALLOCATE_LOCAL((char *) names);
  378. X    DEALLOCATE_LOCAL((char *) bindings);
  379. X    return result;
  380. X} /* WcChildNameToWidget */
  381. X
  382. X/*************** End of source from X11R4 lib/Xt/Intrinsics.c ***************/
  383. X#endif /* from X11R4 */
  384. X
  385. X/******************************************************************************
  386. X** Public functions
  387. X******************************************************************************/
  388. X
  389. X/*******************************************************************************
  390. X** Allocate and return a lower case copy of the input string.
  391. X** Caller must free output string!
  392. X*******************************************************************************/
  393. X
  394. Xchar* WcLowerCaseCopy( in )
  395. X    char* in;
  396. X{
  397. X    char* retVal = (char*)XtMalloc( 1 + strlen ( in ) );
  398. X    char* cp = retVal;
  399. X
  400. X    while (*in)
  401. X    {
  402. X    *cp = (isupper(*in) ? tolower(*in) : *in );
  403. X    cp++ ; in++ ;
  404. X    }
  405. X    *cp = NUL;
  406. X    return retVal;
  407. X}
  408. X
  409. X/******************************************************************************
  410. X**  Return "clean" widget name, resource, or value from string
  411. X*******************************************************************************
  412. X    This function strips leading and trailing whitespace from the
  413. X    passed in char*.  Note that the caller must allocate and free
  414. X    the returned character buffer.
  415. X******************************************************************************/
  416. X
  417. Xchar* WcSkipWhitespace( cp )
  418. X    char* cp;
  419. X{
  420. X    while ( *cp && *cp <= ' ' )
  421. X        cp++;
  422. X    return cp;
  423. X}
  424. X
  425. Xchar* WcSkipWhitespace_Comma( cp )
  426. X    char* cp;
  427. X{
  428. X    while ( *cp && *cp <= ' ' )        /* cp = WcSkipWhitespace ( cp ); */
  429. X        cp++;
  430. X    if ( *cp == ',' )
  431. X        cp++;
  432. X    return cp;
  433. X}
  434. X
  435. Xchar* WcCleanName( in, out )
  436. X    char* in;
  437. X    char* out;
  438. X{
  439. X    /* copy from in[] into out[],
  440. X    ** ignore initial whitespace,
  441. X    ** stop at trailing whitespace or comma.
  442. X    ** Returns pointer to whitespace or comma following name.
  443. X    */
  444. X    while ( *in && *in <= ' ' )        /* in = WcSkipWhitespace( in ); */
  445. X    in++;
  446. X    for ( ; (*in > ' ' && *in != ',') ; in++ )
  447. X        *out++ = *in;
  448. X    *out = NUL;
  449. X    return in;  /* this points at 1st whitespace or comma following "out" */
  450. X}
  451. X
  452. X/* This function is necessary because XtNameToWidget cannot really
  453. X** take a widget name which begins at the top level shell, but rather
  454. X** only names which pretend the widget BELOW the top level shell is
  455. X** the top level shell.  I have no idea why some thought the
  456. X** Xt implementation is correct.  Quoting from the Xt manual:
  457. X**
  458. X**   XtNameToWidget returns the descendent [of root] ... according to
  459. X**   the following rules, ... :
  460. X**
  461. X**   o    ... qualifying the name of each object with the names of all
  462. X**    its ancestors up to _but_not_including_ the reference widget.
  463. X**
  464. X** Since this is not useful for our purposes, we need to first do some 
  465. X** screwing around to see if the user specified the widget name like one 
  466. X** would specify any other widget name in the resource file.
  467. X*/
  468. X
  469. Xchar* WcStripWhitespaceFromBothEnds( name )
  470. X    char* name;
  471. X{
  472. X    char* first; 
  473. X    char* last;
  474. X    char* buff;
  475. X    char* bp;
  476. X
  477. X    for ( first = name ; *first <= ' ' ; first ++ )
  478. X    ;
  479. X    for ( last = first ; *last ; last++ )
  480. X    ;
  481. X    for ( last-- ; *last <= ' ' ; last-- )
  482. X    ;
  483. X    buff = (char*)XtMalloc( (last - first) + 2 );
  484. X    for ( bp = buff ; first <= last ; bp++, first++ )
  485. X    *bp = *first;
  486. X    *bp = NUL;
  487. X
  488. X    return buff;
  489. X}
  490. X
  491. X/*
  492. X    -- Find the named widget
  493. X*******************************************************************************
  494. X
  495. X    This function uses WcChildNameToWidget to search a widget tree for a
  496. X    widget with the given name.  WcChildNameToWidget is basically
  497. X    XtNameToWidget from X11R4, but hacked so it works when there are
  498. X    Gadgets in the widget tree.
  499. X
  500. X    WcChildNameToWidget, like XtNameToWidget, starts searching for children
  501. X    of a reference widget.  WcFullNameToWidget examines the first few
  502. X    characters of the `name' argument in order to determine which widget is
  503. X    the reference whidget where the search will begin.
  504. X
  505. X    The possibilities are these:  The `name' can begin with one or more of
  506. X    the relative prefix characters: ^ or ~, which means the reference
  507. X    widget will be some relative node in the widget tree, such as the
  508. X    parent or the shell ancestor.  Otherwise, the  root widget will be the
  509. X    starting point.
  510. X*/
  511. X
  512. XWidget WcFullNameToWidget( w, name )
  513. X    Widget w;
  514. X    char*  name;
  515. X{
  516. X    Widget retWidget;
  517. X    char  *widgetName;
  518. X    char  *lowerName;
  519. X    int    i;
  520. X
  521. X    widgetName = WcStripWhitespaceFromBothEnds( name );    /* must be XtFree'd */
  522. X
  523. X    if ( widgetName[0] == '*' )
  524. X    {
  525. X    retWidget = WcChildNameToWidget( WcRootWidget(w), widgetName );
  526. X    XtFree( widgetName );
  527. X    return retWidget;
  528. X    }
  529. X
  530. X    if (widgetName[0] == '^' 
  531. X     || widgetName[0] == '~' 
  532. X     || widgetName[0] == '.')
  533. X    {
  534. X    i = 0;
  535. X    while (widgetName[i] == '^'     /* parent */
  536. X        || widgetName[i] == '~'     /* shell ancestor */
  537. X        || widgetName[i] == '.')    /* eaten and ignored */
  538. X    {
  539. X        if (widgetName[i] == '^')
  540. X        {
  541. X        w = XtParent( w );
  542. X        }
  543. X        else if (widgetName[i] == '~')
  544. X        {
  545. X        /* There is a bug in /usr/include/X11/IntrinsicP.h, in
  546. X        ** the XtIsShell() macro.  It does not parenthesize its
  547. X        ** argument when it uses it.  Therefore, the extra 
  548. X        ** parens are necessary here!
  549. X        */
  550. X        while (! XtIsShell( (w = XtParent(w)) ) )
  551. X            ;
  552. X        }
  553. X        i++;
  554. X    }
  555. X    if (widgetName[i] == '\0')
  556. X        retWidget = w;
  557. X    else
  558. X        retWidget = WcChildNameToWidget( w, &(widgetName[i]) );
  559. X    XtFree( widgetName );
  560. X    return retWidget;
  561. X    }
  562. X
  563. X    lowerName  = WcLowerCaseCopy( widgetName );         /* must be XtFree'd */
  564. X
  565. X    if ( 0 == strcmp( "this", lowerName ) )
  566. X    {
  567. X    XtFree( widgetName );
  568. X    XtFree( lowerName  );
  569. X    return w;
  570. X    }
  571. X
  572. X    /* Apparently, the widget name starts with a name.  We need to find
  573. X    ** which root widget has this name.  We need to go down the list of
  574. X    ** root widgets maintained by WcRootWidget().
  575. X    */
  576. X
  577. X    {
  578. X    Widget    root;
  579. X    Widget  root_of_w;
  580. X    char*    rootName;
  581. X    char*    lowerRootName;
  582. X    int     widgetNameLen = strlen(lowerName);
  583. X    int    rootNameLen;
  584. X    int    startsWithRootName;
  585. X    char*    stripped;
  586. X
  587. X    /* most of the time, a widget names something else in its
  588. X    ** own widget heirarchy.  Therefore, see if the naming starts
  589. X    ** at the root widget of `w' but don't check that widget again.
  590. X    */
  591. X    root_of_w = root = WcRootWidget( w ) ;
  592. X    i = -1;
  593. X
  594. X    while(1)
  595. X    {
  596. X        rootName = XrmQuarkToString( root->core.xrm_name );
  597. X        lowerRootName = WcLowerCaseCopy( rootName );       /* XtFree this */
  598. X        rootNameLen = strlen( lowerRootName );
  599. X        startsWithRootName = !strncmp(lowerName,lowerRootName,rootNameLen);
  600. X
  601. X        if ( startsWithRootName && widgetName[rootNameLen] == '*' )
  602. X        {
  603. X            /* the root widget name is followed by a `*' so strip the
  604. X        ** root name, but keep the star as it implies loose binding.
  605. X        */
  606. X        stripped = &widgetName[rootNameLen];
  607. X                retWidget = WcChildNameToWidget( root, stripped );
  608. X        XtFree( widgetName    );
  609. X        XtFree( lowerName     );
  610. X        XtFree( lowerRootName );
  611. X        return retWidget;
  612. X        }
  613. X
  614. X        else if ( startsWithRootName && widgetName[rootNameLen] == '.' )
  615. X        {
  616. X        /* the root widget name is followed by a `.' so strip the
  617. X        ** root name and the period to imply tight binding.
  618. X        */
  619. X        stripped = &widgetName[++rootNameLen];
  620. X        retWidget = WcChildNameToWidget( root, stripped );
  621. X        XtFree( widgetName    );
  622. X        XtFree( lowerName     );
  623. X        XtFree( lowerRootName );
  624. X        return retWidget;
  625. X        }
  626. X
  627. X        else if ( startsWithRootName && (widgetNameLen == rootNameLen) )
  628. X        {
  629. X        /* widgetName is the root widget. */
  630. X        XtFree( widgetName    );
  631. X                XtFree( lowerName     );
  632. X                XtFree( lowerRootName );
  633. X                return root;
  634. X        }
  635. X
  636. X        /* Did not find the root name.  Try the next, but skip the
  637. X        ** root_of_w which we checked first.
  638. X        */
  639. X        if (++i == numRoots)
  640. X        break;
  641. X        if (root_of_w == (root = rootWidgets[i]) )
  642. X        {
  643. X        if (++i == numRoots)
  644. X            break;
  645. X            root = rootWidgets[i];
  646. X        }
  647. X    }
  648. X
  649. X    /* Completely unsucessful in parsing this name. */
  650. X#ifdef DEBUG
  651. X    sprintf( msg,
  652. X        "WcFullNameToWidget cannot convert `%s' to widget \n\
  653. X         Problem: Widget name must start with `*' or `.' or `~' or `^'\n\
  654. X                  or `<aRoot>*' or `<aRoot>.' or be `this'" ,
  655. X         widgetName );
  656. X    XtWarning( msg ); 
  657. X#endif
  658. X
  659. X    XtFree( widgetName );
  660. X    XtFree( lowerName );
  661. X    XtFree( lowerRootName );
  662. X    return NULL;
  663. X    }
  664. X}
  665. X
  666. X/*
  667. X    -- Names to Widget List
  668. X******************************************************************************
  669. X    This routine converts a string of comma separated widget names
  670. X    (or widget paths) into a list of widget id's. Blank space ignored.
  671. X    If a NULL string is provided, NULL is put on the list.
  672. X
  673. X    The return value is the list of names which could NOT be
  674. X    converted.  Note that this list is fixed size, and is re-used.
  675. X*/
  676. X
  677. Xchar* WcNamesToWidgetList ( w, names, widget_list, widget_count )
  678. X    Widget      w;                  /* reference widget */
  679. X    char*       names;              /* string of widget names */
  680. X    Widget      widget_list[];      /* returned widget list */
  681. X    int           *widget_count;       /* in widget_list[len], out widget count */
  682. X{
  683. X    static char ignored[MAX_XRMSTRING];
  684. X    char*    next   = names;
  685. X    int        max    = *widget_count;
  686. X
  687. X/*  -- parse the input names "widgetpath [, widgetpath] ..." */
  688. X    ignored[0] = NUL;
  689. X    *widget_count = 0;
  690. X
  691. X    do 
  692. X    {
  693. X    next = WcCleanName ( next, cleanName );
  694. X
  695. X    if ( widget_list[*widget_count] = WcFullNameToWidget ( w, cleanName ) )
  696. X        (*widget_count)++;
  697. X    else
  698. X    {
  699. X        if (ignored[0] == NUL)
  700. X        strcpy(ignored, cleanName);
  701. X        else
  702. X        {
  703. X        strcat(ignored, ", ");
  704. X        strcat(ignored, cleanName);
  705. X        }
  706. X    }
  707. X    next = WcSkipWhitespace_Comma ( next );
  708. X
  709. X    } while ( *next && *widget_count < max) ;
  710. X
  711. X    return ignored;
  712. X}
  713. X
  714. X/*
  715. X    -- WidgetToFullName
  716. X*******************************************************************************
  717. X    Traverse up the widget tree, sprintf each name right up to
  718. X    the root of the widget tree.  sprintf the names to buffer.  Use
  719. X    recursion so order of names comes out right.  Client MUST free
  720. X    the char string alloc's and returned by WcWidgetToFullName().
  721. X
  722. X    Note: If using the Motif widget set, it is likely (almost inavoidable)
  723. X    that the "widget" may actually be a Gadget.  Well, Gadgets don't have
  724. X    many things, particularly a core.name member.  Therefore, if using
  725. X    Motif we must check to see if the "widget" is not actually an XmGadget.
  726. X    If is it, then we must use XrmQuarkToString(w->core.xrm_name) rather
  727. X    than core.name (unfortunately).  I'd rather not use the xrm name because
  728. X    the case has been flattened: everything is lower case.  Name something
  729. X    SomeComplexLongName and you get back somecomplexlongname.  The case
  730. X    is always insignificant, but the mixed case name is easier to read.
  731. X*/
  732. X
  733. Xstatic char* nextChar;
  734. X
  735. Xstatic int FullNameLen( w )
  736. X    Widget w;
  737. X{
  738. X    int len;
  739. X
  740. X    if ( XtIsWidget(w) )
  741. X    len = 1 + strlen ( w->core.name );
  742. X    else
  743. X    len = 1 + strlen ( XrmQuarkToString(w->core.xrm_name) );
  744. X
  745. X    if (w->core.parent)
  746. X    len += FullNameLen(w->core.parent);
  747. X    return len;
  748. X}
  749. X
  750. Xstatic void WidgetToFullName( w )
  751. X    Widget w;
  752. X{
  753. X    char* cp;
  754. X
  755. X    if (w->core.parent)
  756. X    {
  757. X        WidgetToFullName( w->core.parent );    /* nextChar AFTER parent name */
  758. X    *nextChar++ = '.';            /* inter-name `dot' */
  759. X    }
  760. X
  761. X    if ( XtIsWidget(w) )
  762. X        cp = w->core.name;
  763. X    else
  764. X    cp = XrmQuarkToString(w->core.xrm_name);
  765. X
  766. X    while (*cp)
  767. X    *nextChar++ = *cp++;
  768. X}
  769. X
  770. Xchar* WcWidgetToFullName( w )
  771. X    Widget w;
  772. X{
  773. X    char* buff = XtMalloc( FullNameLen( w ) );
  774. X
  775. X    nextChar = buff;
  776. X
  777. X    WidgetToFullName( w );
  778. X    *nextChar = NUL;
  779. X            
  780. X    return buff;
  781. X}
  782. X
  783. X/*
  784. X    -- Search widget's resource list for resource_type
  785. X*******************************************************************************
  786. X    Gets the XtResourceList from the widget, searches the list for
  787. X    the resource name to determine the type required, which is then
  788. X    returned to the caller.
  789. X*/
  790. X
  791. Xchar* WcGetResourceType( w, res_name )
  792. X    Widget w;
  793. X    char*  res_name;
  794. X{
  795. X    XtResource* res_list;
  796. X    int         i, num;
  797. X    char*    retstr;
  798. X
  799. X    XtGetResourceList( w->core.widget_class, &res_list, &num );
  800. X
  801. X    for ( i = 0 ; i < num ; i++ )
  802. X    {
  803. X        if (0 == strcmp( res_name, res_list[i].resource_name) 
  804. X     || 0 == strcmp( res_name, res_list[i].resource_class) )
  805. X    {
  806. X            retstr = XtNewString(res_list[i].resource_type);
  807. X        XtFree( res_list );
  808. X        return retstr;
  809. X    }
  810. X    }
  811. X
  812. X    w = XtParent( w );
  813. X    if (XtIsConstraint( w ))
  814. X    {
  815. X    XtGetConstraintResourceList( w->core.widget_class, &res_list, &num );
  816. X
  817. X    for ( i = 0 ; i < num ; i++ )
  818. X    {
  819. X        if (0 == strcmp( res_name, res_list[i].resource_name)
  820. X         || 0 == strcmp( res_name, res_list[i].resource_class) )
  821. X            {
  822. X                retstr = XtNewString(res_list[i].resource_type);
  823. X                XtFree( res_list );
  824. X                return retstr;
  825. X            }
  826. X    }
  827. X    }
  828. X
  829. X    return NULL;
  830. X}
  831. X
  832. X/*
  833. X    -- Convert resource value from string to whatever the widget needs
  834. X*******************************************************************************
  835. X    Gets the XtResourceList from the widget, searches the list for
  836. X    the resource name to determine the type required, then uses the
  837. X    resource manager to convert from string to the required type.
  838. X    Calls XtSetValue with converted type.
  839. X
  840. X    Note that if the widget does not have the specified resource
  841. X    type, it is not set.  WcGetResourceType() checks for both
  842. X    widget resources and constraint resources.
  843. X
  844. X    Note also that no converter-failed behavior is necessary,
  845. X    because converters generally give their own error messages.
  846. X*/
  847. X
  848. Xvoid WcSetValueFromString( w, res_name, res_val )
  849. X    Widget w;         /* MUST already be init'd */
  850. X    char*  res_name;
  851. X    char*  res_val;    /* NUL terminated, should NOT have whitespace */
  852. X{
  853. X    char*    res_type;    /* must be XtFree'd */
  854. X
  855. X    if ( res_type = WcGetResourceType( w, res_name ) )
  856. X    {
  857. X    /* This widget does know about this resource type */
  858. X    WcSetValueFromStringAndType( w, res_name, res_val, res_type );
  859. X    }
  860. X    XtFree( res_type );
  861. X}
  862. X
  863. Xvoid WcSetValueFromStringAndType( w, res_name, res_val, res_type )
  864. X    Widget w;
  865. X    char*  res_name;
  866. X    char*  res_val;
  867. X    char*  res_type;
  868. X{
  869. X    XrmValue    fr_val;
  870. X    XrmValue    to_val;
  871. X    Arg        arg[1];
  872. X
  873. X    fr_val.size = strlen(res_val) + 1;
  874. X    fr_val.addr = (caddr_t)res_val;
  875. X    to_val.size = 0;
  876. X    to_val.addr = NULL;
  877. X    XtConvert(
  878. X            w,        /* the widget */
  879. X            XtRString,    /* from type */
  880. X            &fr_val,    /* from value */
  881. X            res_type,    /* to type */
  882. X            &to_val        /* the converted value */
  883. X    );
  884. X
  885. X    if (to_val.addr)
  886. X    {
  887. X        /* Conversion worked.  */
  888. X    if ( 0 == strcmp(res_type, "String"))
  889. X        XtSetArg( arg[0], res_name, to_val.addr );
  890. X    else
  891. X    {
  892. X        switch(to_val.size)
  893. X            {
  894. X            case sizeof(char):
  895. X                XtSetArg( arg[0], res_name, *(char*)to_val.addr );
  896. X                break;
  897. X            case sizeof(short):
  898. X                XtSetArg( arg[0], res_name, *(short*)to_val.addr );
  899. X                break;
  900. X            case sizeof(int):
  901. X                XtSetArg( arg[0], res_name, *(int*)to_val.addr );
  902. X                break;
  903. X            default:
  904. X            XtSetArg( arg[0], res_name, to_val.addr );
  905. X            }
  906. X    }
  907. X        XtSetValues( w, arg, 1 );
  908. X    }
  909. X}
  910. X
  911. X/*
  912. X*******************************************************************************
  913. X* Private Data involving the root widget list, declared at top of this file
  914. X*    static int numRoots = 0;
  915. X*    static Widget rootWidgets[MAX_ROOT_WIDGETS];
  916. X*******************************************************************************
  917. X*/
  918. X
  919. X
  920. X/*
  921. X    -- Forget about a root widget
  922. X*******************************************************************************
  923. X    When a root widget gets destroyed, we need to take that widget out
  924. X    of our list of root widgets.  This is a destroy callback routine
  925. X    which is added to a root widget's destroy callback list by WcRootWidget.
  926. X*/
  927. X
  928. Xstatic void ForgetRoot ( w, client, call )
  929. X    Widget  w;
  930. X    caddr_t client;
  931. X    caddr_t call;
  932. X{
  933. X    int i;
  934. X    for (i = 0 ; i < numRoots ; i++ )
  935. X    {
  936. X        if ( w == rootWidgets[i] )
  937. X    {
  938. X        /* move all following widgets up to close the gap */
  939. X        for ( ; i < numRoots ; i++ )
  940. X        {
  941. X        rootWidgets[i] = rootWidgets[i+1];
  942. X        }
  943. X        numRoots-- ;
  944. X        return;
  945. X    }
  946. X    }
  947. X    /* should never get here */
  948. X}
  949. X
  950. X/*
  951. X    -- Find root widget
  952. X*******************************************************************************
  953. X    If a widget is passed, then find the root of that widget.  See if
  954. X    it is one of the root widgets we already know about.  Add to list
  955. X    if not.  Return the root widget.
  956. X
  957. X    If no widget is passed, then return the first root widget we know
  958. X    about.  If we know of no root widgets, then we will return a NULL
  959. X    since the rootWidgets[] array starts out filled with nulls, and
  960. X    gets re-filled as roots are destroyed.
  961. X*/
  962. X
  963. XWidget WcRootWidget( w )
  964. X    Widget w;
  965. X{
  966. X    int i;
  967. X
  968. X    if (w)
  969. X    {
  970. X    while ( XtParent(w) )
  971. X        w = XtParent(w);
  972. X
  973. X    for (i = 0 ; i < numRoots ; i++)
  974. X    {
  975. X        if ( w == rootWidgets[i] )
  976. X        return w;
  977. X    }
  978. X
  979. X    rootWidgets[i] = w;
  980. X    numRoots++;
  981. X    XtAddCallback( w, XtNdestroyCallback, ForgetRoot, NULL );
  982. X    return w;
  983. X    }
  984. X    else
  985. X    {
  986. X    return rootWidgets[0];
  987. X    }
  988. X}
  989. X
  990. X/*
  991. X   -- Equivalent to ANSI C library function strstr()
  992. X*******************************************************************************
  993. X   This function is only necessary on systems which do not have
  994. X   ANSI C libraries.  Soon, it looks like everybody will have
  995. X   such libraries, what with the recent SVR4 and OSF efforts
  996. X   to include everything for everybody.  In the meantime,
  997. X   this will always be included in the library.  Why not put
  998. X   #ifdef's around it?  because the problem really arises not
  999. X   when the library is built, but when applications are built.
  1000. X   I can't very well require all application writers in the
  1001. X   world to know what this library uses...
  1002. X*/
  1003. X
  1004. Xchar* WcStrStr( s1, s2 )
  1005. X    char* s1;
  1006. X    char* s2;
  1007. X{
  1008. X    while (*s1)
  1009. X    {
  1010. X    if (*s1 == *s2)
  1011. X    {
  1012. X        char* start = s1;
  1013. X        char* c = s2;
  1014. X        while (*++s1 & *++c && *s1 == *c)
  1015. X        ;
  1016. X        if (*c == '\0')
  1017. X        return start;
  1018. X        else
  1019. X        s1 = ++start;
  1020. X    }
  1021. X    else
  1022. X    {
  1023. X        s1++ ;
  1024. X    }
  1025. X    }
  1026. X    return (char*)0;
  1027. X}
  1028. END_OF_FILE
  1029. if test 30543 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcName.c'`; then
  1030.     echo shar: \"'xrainbow/Wc1_05/Wc/WcName.c'\" unpacked with wrong size!
  1031. fi
  1032. # end of 'xrainbow/Wc1_05/Wc/WcName.c'
  1033. fi
  1034. if test -f 'xrainbow/Wc1_05/Wc/WcReg.c' -a "${1}" != "-c" ; then 
  1035.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcReg.c'\"
  1036. else
  1037. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcReg.c'\" \(18492 characters\)
  1038. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcReg.c' <<'END_OF_FILE'
  1039. X/*
  1040. X** Copyright (c) 1990 David E. Smyth
  1041. X**
  1042. X** This file was derived from work performed by Martin Brunecky at
  1043. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  1044. X** following copyright:
  1045. X**
  1046. X*******************************************************************************
  1047. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  1048. X*
  1049. X*                        All Rights Reserved
  1050. X*
  1051. X* Permission to use, copy, modify, and distribute this software and its
  1052. X* documentation for any purpose and without fee is hereby granted, provided
  1053. X* that the above copyright notice appears on all copies and that both the
  1054. X* copyright and this permission notice appear in supporting documentation
  1055. X* and that the name of Auto-trol not be used in advertising or publicity
  1056. X* pertaining to distribution of the software without specific, prior written
  1057. X* permission.
  1058. X*
  1059. X* Auto-trol disclaims all warranties with regard to this software, including
  1060. X* all implied warranties of merchantability and fitness, in no event shall
  1061. X* Auto-trol be liable for any special, indirect or consequential damages or
  1062. X* any damages whatsoever resulting from loss of use, data or profits, whether
  1063. X* in an action of contract, negligence or other tortious action, arising out
  1064. X* of or in connection with the use or performance of this software.
  1065. X*******************************************************************************
  1066. X**
  1067. X** Redistribution and use in source and binary forms are permitted
  1068. X** provided that the above copyright notice and this paragraph are
  1069. X** duplicated in all such forms and that any documentation, advertising
  1070. X** materials, and other materials related to such distribution and use
  1071. X** acknowledge that the software was developed by David E. Smyth.  The
  1072. X** name of David E. Smyth may not be used to endorse or promote products
  1073. X** derived from this software without specific prior written permission.
  1074. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1075. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1076. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1077. X**
  1078. X*/
  1079. X
  1080. X/*
  1081. X* SCCS_data: @(#)WcReg.c 1.1 ( 19 Nov 90 )
  1082. X*
  1083. X* Subsystem_group:
  1084. X*
  1085. X*     Widget Creation Library
  1086. X*
  1087. X* Module_description:
  1088. X*
  1089. X*     Since (for portability reasons) we can not assume runtime binding,
  1090. X*     all widget classes, creation routines (constructors), and callbacks
  1091. X*     must be "registered"  by the application BEFORE widget tree creation.
  1092. X*
  1093. X*     All four of the functions defined in this module load dynamically
  1094. X*     allocated and extended arrays of structures.  The size increment
  1095. X*     of the arrays starts at a reasonably small size (INCR_REGISTRY,
  1096. X*     initially 32), and is doubled in size everytime a given registry is
  1097. X*     filled.  This allows registries to be small, yet to not have to be
  1098. X*     realloc'd frequently when they grow large.  
  1099. X*
  1100. X*     The registries are arrays of structs.  In all four cases, the
  1101. X*     structs are very similar: they contain a name string which holds the
  1102. X*     class, constructor, or callback name as it was registered; a quark
  1103. X*     which is based on an all lower case representation of the name, and
  1104. X*     class, constructor, or callback specific information.  The name
  1105. X*     as registered should be as shown in reference documents and source
  1106. X*     code, as it is used for user error messages.
  1107. X*
  1108. X*     The registries are intended to be used by string-to-whatever converters.
  1109. X*
  1110. X*     All four registration functions currently check for duplicate
  1111. X*     entries, but do no fancy hashing scheme, nor any ties to the
  1112. X*     application context.  Assumming a relatively small number of
  1113. X*     entries in these regestries, it is assumed that a sequential
  1114. X*     search using quarks will be adequate and simple.
  1115. X
  1116. X* Module_interface_summary: 
  1117. X*
  1118. X*       WcRegisterClassPtr(
  1119. X*        XtAppContext  app,        - application context
  1120. X*        String      name,        - class ptr name, as in ref manuals
  1121. X*        WidgetClass   class )   - class record pointer
  1122. X*
  1123. X*       WcRegisterClassName(
  1124. X*        XtAppContext  app,        - application context
  1125. X*        String      name,        - class name, as in ref manuals
  1126. X*        WidgetClass   class )   - class record pointer
  1127. X*
  1128. X*       WcRegisterConstructor(
  1129. X*        XtAppContext  app,        - application context
  1130. X*        String      name,        - constructor name, as in ref manuals
  1131. X*        (*Widget)()   const )   - constructor function pointer
  1132. X*
  1133. X*    WcRegisterCallback(
  1134. X*        XtAppContext  app,      - application context
  1135. X*           String        name,     - callback name, "nice" capitalization
  1136. X*        void (*func)() )        - pointer to callback function
  1137. X*
  1138. X*    WcRegisterAction(
  1139. X*        XtAppContext  app,      - application context
  1140. X*           String        name,     - action name
  1141. X*        XtActionProc  proc )    - action proc
  1142. X
  1143. X*    WcAllowDuplicateRegistration   ( int allowed )
  1144. X*    WcAllowDuplicateClassPtrReg    ( int allowed )
  1145. X*    WcAllowDuplicateClassNameReg   ( int allowed )
  1146. X*    WcAllowDuplicateConstructorReg ( int allowed )
  1147. X*    WcAllowDuplicateCallbackReg    ( int allowed )
  1148. X*
  1149. X* Module_history:
  1150. X
  1151. X*   mm/dd/yy  initials  function  action
  1152. X*   --------  --------  --------  ---------------------------------------------
  1153. X*   16Jul90   D.Smyth   Added WcAllowDuplicate*()
  1154. X*   19Jun90   D.Smyth   Version 1.0 Widget Creation Library
  1155. X*   06/08/90  D.Smyth   All Added "name" member for better user msgs.
  1156. X*   02/26/90  MarBru    All       Created
  1157. X*   02/16/90  MarBru    Create..  Limited creation to composite widgets/objects
  1158. X*
  1159. X* Design_notes:
  1160. X*
  1161. X*   For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
  1162. X*   (runtime) binding. But since most UNIX systems lack such capability,
  1163. X*   we stick to the concept of "registration" routines.
  1164. X*
  1165. X*******************************************************************************
  1166. X*/
  1167. X/*
  1168. X*******************************************************************************
  1169. X* Include_files.
  1170. X*******************************************************************************
  1171. X*/
  1172. X
  1173. X/*  -- X Window System Includes */
  1174. X#include <X11/Intrinsic.h>
  1175. X
  1176. X/*  -- Widget Creation Includes */
  1177. X#include "WcCreate.h"
  1178. X#include "WcCreateP.h"
  1179. X
  1180. X/*
  1181. X*******************************************************************************
  1182. X* Private_data_definitions.
  1183. X*******************************************************************************
  1184. X    The following cache/registry of known widget classes, contructors, 
  1185. X    and callbacks are initially empty, and are loaded by the application 
  1186. X    using "registration" routines.
  1187. X*/
  1188. X
  1189. Xstatic char     msg[MAX_ERRMSG];
  1190. X
  1191. Xstatic int allowDuplicateClassPtrReg    = FALSE;
  1192. Xstatic int allowDuplicateClassNameReg   = FALSE;
  1193. Xstatic int allowDuplicateConstructorReg = FALSE;
  1194. Xstatic int allowDuplicateCallbackReg    = FALSE;
  1195. X
  1196. X/*  -- Named class pointer cache, intially empty */
  1197. X
  1198. Xint         classes_num = 0;
  1199. Xint         classes_max = 0;
  1200. XClCacheRec *classes_ptr = NULL;
  1201. X
  1202. X/*  -- Class name cache, intially empty */
  1203. X
  1204. Xint             cl_nm_num = 0;
  1205. Xint             cl_nm_max = 0;
  1206. XClNameCacheRec* cl_nm_ptr = NULL;
  1207. X
  1208. X/*  -- Named object constructor cache, intially empty */
  1209. X
  1210. Xint          constrs_num = 0;
  1211. Xint          constrs_max = 0;
  1212. XConCacheRec *constrs_ptr = NULL;
  1213. X
  1214. X/*  -- Named callback procedures cache, intially empty */
  1215. X
  1216. Xint         callbacks_num = 0;
  1217. Xint         callbacks_max = 0;
  1218. XCBCacheRec *callbacks_ptr = NULL;
  1219. X
  1220. X/*
  1221. X*******************************************************************************
  1222. X* Private_function_declarations.
  1223. X*******************************************************************************
  1224. X*/
  1225. X
  1226. X/*
  1227. X*******************************************************************************
  1228. X* Public_function_declarations.
  1229. X*******************************************************************************
  1230. X*/
  1231. X
  1232. X/*
  1233. X    -- Allow or Disallow Duplicate Registrations
  1234. X*******************************************************************************
  1235. X    By default, the Widget Creation Library does not allow a
  1236. X    string-to-callback, string-to-class, etc bindings to be re-defined.
  1237. X    Some applications, most noticably user interface builders, need to be
  1238. X    able to change these bindings in order to provide additional
  1239. X    flexibility.  Therefore the following functions are provided.  The
  1240. X    typical user interface builder will make this single call:
  1241. X
  1242. X    WcAllowDuplicateRegistration( TRUE );
  1243. X
  1244. X    which allows class pointers, class names, constructors, and callbacks
  1245. X    to be changed during execution.
  1246. X*/
  1247. X
  1248. Xvoid WcAllowDuplicateRegistration( allowed )
  1249. X    int allowed;
  1250. X{
  1251. X    allowDuplicateClassPtrReg = allowed;
  1252. X    allowDuplicateClassNameReg = allowed;
  1253. X    allowDuplicateConstructorReg = allowed;
  1254. X    allowDuplicateCallbackReg = allowed;
  1255. X}
  1256. Xvoid WcAllowDuplicateClassPtrReg( allowed )
  1257. X    int allowed;
  1258. X{
  1259. X    allowDuplicateClassPtrReg = allowed;
  1260. X}
  1261. Xvoid WcAllowDuplicateClassNameReg( allowed )
  1262. X    int allowed;
  1263. X{
  1264. X    allowDuplicateClassNameReg = allowed;
  1265. X}
  1266. Xvoid WcAllowDuplicateConstructorReg( allowed )
  1267. X    int allowed;
  1268. X{
  1269. X    allowDuplicateConstructorReg = allowed;
  1270. X}
  1271. Xvoid WcAllowDuplicateCallbackReg( allowed )
  1272. X    int allowed;
  1273. X{
  1274. X    allowDuplicateCallbackReg = allowed;
  1275. X}
  1276. X
  1277. X/*
  1278. X    -- Register Class Pointer Name
  1279. X*******************************************************************************
  1280. X    This procedure adds class pointer name to our list of registered
  1281. X    classes. Note that the class ptr name is effectively case insensitive
  1282. X    as it is being quarkified.  However, one should register the class ptr
  1283. X    names using the "standard" capitalization (whatever is in the reference
  1284. X    manual for the widget set) as the name as registered is used for error
  1285. X    messages.
  1286. X
  1287. X   The registry is primarily used by CvtStringToClassPtr().
  1288. X*/
  1289. X
  1290. Xvoid WcRegisterClassPtr ( app, name, class )
  1291. X    XtAppContext        app;    /* not used (yet), must be present      */
  1292. X    char*               name;   /* class ptr name, case insensitive     */
  1293. X    WidgetClass         class;  /* Xt object class pointer              */
  1294. X{
  1295. X    char          *lowerCaseName;
  1296. X    XrmQuark       quark;
  1297. X    ClCacheRec    *rec;
  1298. X    int            i;
  1299. X
  1300. X    /* Might need to grow cache.  Note that growth increment is exponential:
  1301. X    ** if lots of classes, don't need to keep realloc'ing so often.
  1302. X    */
  1303. X    if (classes_num >= classes_max )
  1304. X    {
  1305. X        classes_max += (classes_max ? classes_max : INCR_REGISTRY);
  1306. X        classes_ptr  = (ClCacheRec*) XtRealloc((char*)classes_ptr,
  1307. X                             sizeof(ClCacheRec) * classes_max);
  1308. X    }
  1309. X
  1310. X    /* See if this object has been registered.  Compare quarks.
  1311. X    */
  1312. X    lowerCaseName = WcLowerCaseCopy( name );
  1313. X    quark = XrmStringToQuark ( lowerCaseName );
  1314. X    XtFree ( lowerCaseName );
  1315. X
  1316. X    for (i = 0 ; i < classes_num ; i++ )
  1317. X    {
  1318. X        if (classes_ptr[i].quark == quark)
  1319. X        {
  1320. X            /* already registered this class */
  1321. X        if ( allowDuplicateClassPtrReg )
  1322. X        {
  1323. X        rec = &classes_ptr[i];    /* overwrite this ClCacheRec */
  1324. X        goto found_rec;
  1325. X        }
  1326. X            sprintf(msg,
  1327. X            "WcRegisterClassPtr (%s) - Failed \n\
  1328. X             Problem: Duplicate class registration ignored.",
  1329. X             name );
  1330. X            XtWarning( msg );
  1331. X            return;
  1332. X        }
  1333. X    }
  1334. X
  1335. X    rec = &classes_ptr[classes_num++];    /* New ClCacheRec to be filled */
  1336. X
  1337. Xfound_rec:
  1338. X    rec->quark = quark;
  1339. X    rec->class = class;
  1340. X    rec->name  = XtMalloc( strlen(name) + 1 );
  1341. X    strcpy ( rec->name, name );
  1342. X}
  1343. X
  1344. X/*
  1345. X    -- Register Class Name
  1346. X*******************************************************************************
  1347. X    This procedure adds a class name to our list of registered
  1348. X    classes. Note that the class name is effectively case insensitive
  1349. X    as it is being quarkified.  However, one should register the class
  1350. X    names using the "standard" capitalization (whatever is in the reference
  1351. X    manual for the widget set) as the name as registered is used for error
  1352. X    messages.
  1353. X
  1354. X   The registry is primarily used by CvtStringToClassName().
  1355. X*/
  1356. X
  1357. Xvoid WcRegisterClassName ( app, name, class )
  1358. X    XtAppContext    app;    /* not used (yet), must be present      */
  1359. X    char*        name;    /* class name, case insensitive       */
  1360. X    WidgetClass        class;    /* Xt object class pointer              */
  1361. X{
  1362. X    char           *lowerCaseName;
  1363. X    XrmQuark        quark;
  1364. X    ClNameCacheRec *rec;
  1365. X    int            i;
  1366. X
  1367. X    /* Might need to grow cache.  Note that growth increment is exponential:
  1368. X    ** if lots of classes, don't need to keep realloc'ing so often.
  1369. X    */
  1370. X    if (cl_nm_num >= cl_nm_max )
  1371. X    {
  1372. X    cl_nm_max += (cl_nm_max ? cl_nm_max : INCR_REGISTRY);
  1373. X    cl_nm_ptr  = (ClNameCacheRec*) XtRealloc((char*)cl_nm_ptr, 
  1374. X                             sizeof(ClNameCacheRec) * cl_nm_max);
  1375. X    }
  1376. X
  1377. X    /* See if this object has been registered.  Compare quarks.
  1378. X    */
  1379. X    lowerCaseName = WcLowerCaseCopy( name );
  1380. X    quark = XrmStringToQuark ( lowerCaseName );
  1381. X    XtFree ( lowerCaseName );
  1382. X
  1383. X    for (i = 0 ; i < cl_nm_num ; i++ )
  1384. X    {
  1385. X    if (cl_nm_ptr[i].quark == quark)
  1386. X    {
  1387. X        /* already registered this class */
  1388. X        if ( allowDuplicateClassNameReg )
  1389. X        {
  1390. X        rec = &cl_nm_ptr[i];    /* overwrite this ClNameCacheRec */
  1391. X        goto found_rec;
  1392. X        }
  1393. X        sprintf(msg, 
  1394. X            "WcRegisterClassName (%s) - Failed \n\
  1395. X             Problem: Duplicate class registration ignored.",
  1396. X             name );
  1397. X            XtWarning( msg );
  1398. X        return;
  1399. X    }
  1400. X    }
  1401. X
  1402. X    rec = &cl_nm_ptr[cl_nm_num++];    /* New ClNameCacheRec to be filled */
  1403. X
  1404. Xfound_rec:
  1405. X    rec->quark = quark;
  1406. X    rec->class = class;
  1407. X    rec->name  = XtMalloc( strlen(name) + 1 );
  1408. X    strcpy ( rec->name, name );
  1409. X}
  1410. X
  1411. X/*
  1412. X    -- Register constructor
  1413. X*******************************************************************************
  1414. X    This procedure adds constructor procedure/name to our list of registered
  1415. X    constructors. Note that the name is effectively case insensitive
  1416. X    as it is being quarkified.  However, one should register the 
  1417. X    names using the "standard" capitalization (whatever is in the reference
  1418. X    manual for the widget set) as the name as registered is used for error
  1419. X    messages.
  1420. X
  1421. X    Note the constructor is a "Motif Style" widget creation routine,
  1422. X    commonly called a "confusion function."  
  1423. X
  1424. X   The registry is primarily used by CvtStringToConstructor().
  1425. X*/
  1426. X
  1427. Xvoid WcRegisterConstructor ( app, name, constructor )
  1428. X    XtAppContext app;            /* not used (yet), must be present      */
  1429. X    char*        name;            /* constructor name, case insensitive   */
  1430. X    Widget (*constructor) ();   /* pointer to a widget creation routine */
  1431. X{
  1432. X    char          *lowerCaseName;
  1433. X    XrmQuark       quark;
  1434. X    ConCacheRec   *rec;
  1435. X    int           i;
  1436. X
  1437. X    /* Might need to grow cache.  Note that growth increment is exponential:
  1438. X    ** if lots of constructors, don't need to keep realloc'ing so often.
  1439. X    */
  1440. X    if (constrs_num >= constrs_max )
  1441. X    {
  1442. X        constrs_max += (constrs_max ? constrs_max : INCR_REGISTRY);
  1443. X        constrs_ptr  = (ConCacheRec*) XtRealloc((char*)constrs_ptr,
  1444. X                             sizeof(ConCacheRec) * constrs_max);
  1445. X    }
  1446. X
  1447. X    /* See if this object has been registered.  Compare quarks.
  1448. X    */
  1449. X    lowerCaseName = WcLowerCaseCopy( name );
  1450. X    quark = XrmStringToQuark ( lowerCaseName );
  1451. X    XtFree ( lowerCaseName );
  1452. X
  1453. X    for (i = 0 ; i < constrs_num ; i++ )
  1454. X    {
  1455. X        if (constrs_ptr[i].quark == quark)
  1456. X        {
  1457. X            /* already registered this class */
  1458. X        if ( allowDuplicateConstructorReg )
  1459. X        {
  1460. X        rec = &constrs_ptr[i];    /* overwrite this ConCacheRec */
  1461. X        goto found_rec;
  1462. X        }
  1463. X            sprintf(msg,
  1464. X            "WcRegisterConstructor (%s) - Failed \n\
  1465. X             Problem: Duplicate constructor registration ignored.",
  1466. X             name );
  1467. X            XtWarning( msg );
  1468. X            return;
  1469. X        }
  1470. X    }
  1471. X
  1472. X    rec = &constrs_ptr[constrs_num++];    /* New ClCacheRec to be filled */
  1473. X
  1474. Xfound_rec:
  1475. X    rec->quark       = quark;
  1476. X    rec->constructor = constructor;
  1477. X    rec->name        = XtMalloc( strlen(name) + 1 );
  1478. X    strcpy ( rec->name, name );
  1479. X}
  1480. X
  1481. X/*
  1482. X  -- Register Callbacks
  1483. X*******************************************************************************
  1484. X    Register callback functions which can then be bound to widget
  1485. X    callback lists by the string-to-callback converter 
  1486. X    CvtStringToCallback().
  1487. X*/
  1488. X
  1489. Xvoid WcRegisterCallback ( app, name, callback, closure )
  1490. X    XtAppContext    app;        /* not used (yet), must be present      */
  1491. X    String          name;       /* callback name, case insensitive      */
  1492. X    XtCallbackProc  callback;   /* callback function pointer            */
  1493. X    caddr_t        closure;    /* default client data            */
  1494. X{
  1495. X    char          *lowerCaseName;
  1496. X    XrmQuark       quark;
  1497. X    CBCacheRec    *rec;
  1498. X    int           i;
  1499. X
  1500. X    /* Might need to grow cache.  Note that growth increment is exponential:
  1501. X    ** if lots of constructors, don't need to keep realloc'ing so often.
  1502. X    */
  1503. X    if (callbacks_num >= callbacks_max )
  1504. X    {
  1505. X        callbacks_max += (callbacks_max ? callbacks_max : INCR_REGISTRY);
  1506. X        callbacks_ptr  = (CBCacheRec*) XtRealloc((char*)callbacks_ptr,
  1507. X                             sizeof(CBCacheRec) * callbacks_max);
  1508. X    }
  1509. X
  1510. X    /* See if this callback has been registered.  Compare quarks.
  1511. X    */
  1512. X    lowerCaseName = WcLowerCaseCopy( name );
  1513. X    quark = XrmStringToQuark ( lowerCaseName );
  1514. X    XtFree ( lowerCaseName );
  1515. X
  1516. X    for (i = 0 ; i < callbacks_num ; i++ )
  1517. X    {
  1518. X        if (callbacks_ptr[i].quark == quark)
  1519. X        {
  1520. X            /* already registered this callback */
  1521. X        if ( allowDuplicateCallbackReg )
  1522. X        {
  1523. X        rec = &callbacks_ptr[i];    /* overwrite this CBCacheRec */
  1524. X        goto found_rec;
  1525. X        }
  1526. X            sprintf(msg,
  1527. X            "WcRegisterCallback (%s) - Failed \n\
  1528. X             Problem: Duplicate callback registration ignored.",
  1529. X             name );
  1530. X            XtWarning( msg );
  1531. X            return;
  1532. X        }
  1533. X    }
  1534. X
  1535. X    rec = &callbacks_ptr[callbacks_num++];   /* New ClCacheRec to be filled */
  1536. X
  1537. Xfound_rec:
  1538. X    rec->quark    = quark;
  1539. X    rec->callback = callback;
  1540. X    rec->closure  = closure;
  1541. X    rec->name     = XtMalloc( strlen(name) + 1 );
  1542. X    strcpy ( rec->name, name );
  1543. X}
  1544. X
  1545. X/*
  1546. X  -- Register Actions
  1547. X*******************************************************************************
  1548. X    A simple wrapper around XtAppAddActions().
  1549. X    Register action procs which can then be bound to widget
  1550. X    actions using standard Xt mechanisms.
  1551. X*/
  1552. X
  1553. Xvoid WcRegisterAction(app, name, proc)
  1554. X    XtAppContext app;
  1555. X    String       name;
  1556. X    XtActionProc proc;
  1557. X{
  1558. X    static XtActionsRec action_rec[] = {
  1559. X        { (String)NULL, (XtActionProc)NULL }
  1560. X    };
  1561. X
  1562. X    action_rec[0].string = name;
  1563. X    action_rec[0].proc = proc;
  1564. X    XtAppAddActions(app, action_rec, 1);
  1565. X}
  1566. END_OF_FILE
  1567. if test 18492 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcReg.c'`; then
  1568.     echo shar: \"'xrainbow/Wc1_05/Wc/WcReg.c'\" unpacked with wrong size!
  1569. fi
  1570. # end of 'xrainbow/Wc1_05/Wc/WcReg.c'
  1571. fi
  1572. if test -f 'xrainbow/Wc1_05/Wc/WcRegXt.c' -a "${1}" != "-c" ; then 
  1573.   echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcRegXt.c'\"
  1574. else
  1575. echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcRegXt.c'\" \(7530 characters\)
  1576. sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcRegXt.c' <<'END_OF_FILE'
  1577. X/*
  1578. X** Copyright (c) 1990 David E. Smyth
  1579. X**
  1580. X** Redistribution and use in source and binary forms are permitted
  1581. X** provided that the above copyright notice and this paragraph are
  1582. X** duplicated in all such forms and that any documentation, advertising
  1583. X** materials, and other materials related to such distribution and use
  1584. X** acknowledge that the software was developed by David E. Smyth.  The
  1585. X** name of David E. Smyth may not be used to endorse or promote products
  1586. X** derived from this software without specific prior written permission.
  1587. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1588. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1589. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1590. X**
  1591. X*/
  1592. X
  1593. X/*
  1594. X* SCCS_data: @(#)WcRegXt.c 1.1 ( 19 Nov 90 )
  1595. X*
  1596. X* Subsystem_group:
  1597. X*
  1598. X*     Widget Creation Library - Intrinsic Resource Interpreter
  1599. X*
  1600. X* Module_description:
  1601. X*
  1602. X*     This module contains registration routine for all Intrinsic
  1603. X*     widget constructors and classes.  
  1604. X*
  1605. X* Module_interface_summary: 
  1606. X*
  1607. X*     void WcRegisterIntrinsic ( XtAppContext app )
  1608. X*
  1609. X* Module_history:
  1610. X*                                                  
  1611. X*   mm/dd/yy  initials  function  action
  1612. X*   --------  --------  --------  ---------------------------------------------
  1613. X*   07/23/90  D.Smyth   cleaned up function return values.
  1614. X*   06/19/90  R.Whitby  all      create.
  1615. X*
  1616. X* Design_notes:
  1617. X*
  1618. X*******************************************************************************
  1619. X*/
  1620. X/*
  1621. X*******************************************************************************
  1622. X* Include_files.
  1623. X*******************************************************************************
  1624. X*/
  1625. X
  1626. X#include <X11/Intrinsic.h>
  1627. X
  1628. X#include <X11/Object.h>
  1629. X#include <X11/RectObj.h>
  1630. X#include <X11/Shell.h>
  1631. X#include <X11/Vendor.h>
  1632. X
  1633. X#include "WcCreateP.h"
  1634. X
  1635. X/* -- Widget constructor routines */
  1636. X
  1637. XWidget WcCreateApplicationShell    ();
  1638. XWidget WcCreateOverrideShell    ();
  1639. XWidget WcCreateShell        ();
  1640. XWidget WcCreateTopLevelShell    ();
  1641. XWidget WcCreateTransientShell    ();
  1642. XWidget WcCreateVendorShell    ();
  1643. XWidget WcCreateWMShell        ();
  1644. X
  1645. X
  1646. Xvoid WcRegisterIntrinsic ( app )
  1647. X    XtAppContext app;
  1648. X{
  1649. X    ONCE_PER_XtAppContext( app );
  1650. X
  1651. X#define RCN( name, class ) WcRegisterClassName ( app, name, class );
  1652. X#define RCP( name, class ) WcRegisterClassPtr  ( app, name, class );
  1653. X#define RCR( name, func )  WcRegisterConstructor(app, name, func  );
  1654. X
  1655. X    /* -- register all Intrinsic widget classes */
  1656. X
  1657. X    RCN("Object",            objectClass );
  1658. X    RCP("objectClass",            objectClass );
  1659. X    RCN("RectObj",            rectObjClass );
  1660. X    RCP("rectObjClass",            rectObjClass );
  1661. X    RCN("Core",                coreWidgetClass );
  1662. X    RCP("coreWidgetClass",        coreWidgetClass );
  1663. X    RCN("Composite",            compositeWidgetClass );
  1664. X    RCP("compositeWidgetClass",        compositeWidgetClass );
  1665. X    RCN("Constraint",            constraintWidgetClass );
  1666. X    RCP("constraintWidgetClass",    constraintWidgetClass );
  1667. X    RCN("ApplicationShell",        applicationShellWidgetClass );
  1668. X    RCP("applicationShellWidgetClass",    applicationShellWidgetClass );
  1669. X    RCN("OverrideShell",        overrideShellWidgetClass );
  1670. X    RCP("overrideShellWidgetClass",    overrideShellWidgetClass );
  1671. X    RCN("Shell",            shellWidgetClass );
  1672. X    RCP("shellWidgetClass",        shellWidgetClass );
  1673. X    RCN("TopLevelShell",        topLevelShellWidgetClass );
  1674. X    RCP("topLevelShellWidgetClass",    topLevelShellWidgetClass );
  1675. X    RCN("TransientShell",        transientShellWidgetClass );
  1676. X    RCP("transientShellWidgetClass",    transientShellWidgetClass );
  1677. X    RCN("VendorShell",            vendorShellWidgetClass );
  1678. X    RCP("vendorShellWidgetClass",    vendorShellWidgetClass );
  1679. X    RCN("WmShell",            wmShellWidgetClass );
  1680. X    RCP("wmShellWidgetClass",        wmShellWidgetClass );
  1681. X
  1682. X    /* -- register all Intrinsic constructors */
  1683. X
  1684. X    RCR("XtCreateApplicationShell",    WcCreateApplicationShell);
  1685. X    RCR("XtCreateOverrideShell",    WcCreateOverrideShell);
  1686. X    RCR("XtCreateShell",        WcCreateShell);
  1687. X    RCR("XtCreateTopLevelShell",    WcCreateTopLevelShell);
  1688. X    RCR("XtCreateTransientShell",    WcCreateTransientShell);
  1689. X    RCR("XtCreateWMShell",        WcCreateWMShell);
  1690. X    RCR("XtCreateVendorShell",        WcCreateVendorShell);
  1691. X}
  1692. X
  1693. X/*
  1694. X    -- Create Application Shell
  1695. X*******************************************************************************
  1696. X    This function creates an application shell widget.
  1697. X    
  1698. X*/
  1699. XWidget WcCreateApplicationShell ( pw, name, args, nargs )
  1700. X    Widget    pw;    /* children's parent                 */
  1701. X    String      name;    /* widget name to create             */
  1702. X    Arg        *args;    /* args for widget                */
  1703. X    Cardinal    nargs;    /* args count                    */
  1704. X{
  1705. X
  1706. X  return XtCreatePopupShell(name, applicationShellWidgetClass, pw, args, nargs);
  1707. X}
  1708. X
  1709. X/*
  1710. X    -- Create Override Shell
  1711. X*******************************************************************************
  1712. X    This function creates an override shell widget.
  1713. X    
  1714. X*/
  1715. XWidget WcCreateOverrideShell ( pw, name, args, nargs )
  1716. X    Widget    pw;    /* children's parent                 */
  1717. X    String      name;    /* widget name to create             */
  1718. X    Arg        *args;    /* args for widget                */
  1719. X    Cardinal    nargs;    /* args count                    */
  1720. X{
  1721. X  return XtCreatePopupShell(name, overrideShellWidgetClass, pw, args, nargs);
  1722. X}
  1723. X
  1724. X/*
  1725. X    -- Create Shell
  1726. X*******************************************************************************
  1727. X    This function creates a shell widget.
  1728. X    
  1729. X*/
  1730. XWidget WcCreateShell ( pw, name, args, nargs )
  1731. X    Widget    pw;    /* children's parent                 */
  1732. X    String      name;    /* widget name to create             */
  1733. X    Arg        *args;    /* args for widget                */
  1734. X    Cardinal    nargs;    /* args count                    */
  1735. X{
  1736. X  return XtCreatePopupShell(name, shellWidgetClass, pw, args, nargs);
  1737. X}
  1738. X
  1739. X/*
  1740. X    -- Create TopLevel Shell
  1741. X*******************************************************************************
  1742. X    This function creates a top level shell widget.
  1743. X    
  1744. X*/
  1745. XWidget WcCreateTopLevelShell ( pw, name, args, nargs )
  1746. X    Widget    pw;    /* children's parent                 */
  1747. X    String      name;    /* widget name to create             */
  1748. X    Arg        *args;    /* args for widget                */
  1749. X    Cardinal    nargs;    /* args count                    */
  1750. X{
  1751. X  return XtCreatePopupShell(name, topLevelShellWidgetClass, pw, args, nargs);
  1752. X}
  1753. X
  1754. X/*
  1755. X    -- Create Transient Shell
  1756. X*******************************************************************************
  1757. X    This function creates an transient shell widget.
  1758. X    
  1759. X*/
  1760. XWidget WcCreateTransientShell ( pw, name, args, nargs )
  1761. X    Widget    pw;    /* children's parent                 */
  1762. X    String      name;    /* widget name to create             */
  1763. X    Arg        *args;    /* args for widget                */
  1764. X    Cardinal    nargs;    /* args count                    */
  1765. X{
  1766. X  return XtCreatePopupShell(name, transientShellWidgetClass, pw, args, nargs);
  1767. X}
  1768. X
  1769. X/*
  1770. X    -- Create Vendor Shell
  1771. X*******************************************************************************
  1772. X    This function creates a vendor shell widget.
  1773. X    
  1774. X*/
  1775. XWidget WcCreateVendorShell ( pw, name, args, nargs )
  1776. X    Widget    pw;    /* children's parent                 */
  1777. X    String      name;    /* widget name to create             */
  1778. X    Arg        *args;    /* args for widget                */
  1779. X    Cardinal    nargs;    /* args count                    */
  1780. X{
  1781. X  return XtCreatePopupShell(name, vendorShellWidgetClass, pw, args, nargs);
  1782. X}
  1783. X
  1784. X/*
  1785. X    -- Create WM Shell
  1786. X*******************************************************************************
  1787. X    This function creates an WM shell widget.
  1788. X    
  1789. X*/
  1790. XWidget WcCreateWMShell ( pw, name, args, nargs )
  1791. X    Widget    pw;    /* children's parent                 */
  1792. X    String      name;    /* widget name to create             */
  1793. X    Arg        *args;    /* args for widget                */
  1794. X    Cardinal    nargs;    /* args count                    */
  1795. X{
  1796. X  return XtCreatePopupShell(name, wmShellWidgetClass, pw, args, nargs);
  1797. X}
  1798. END_OF_FILE
  1799. if test 7530 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcRegXt.c'`; then
  1800.     echo shar: \"'xrainbow/Wc1_05/Wc/WcRegXt.c'\" unpacked with wrong size!
  1801. fi
  1802. # end of 'xrainbow/Wc1_05/Wc/WcRegXt.c'
  1803. fi
  1804. if test -f 'xrainbow/X11/Xaw_d/DrawingA.c' -a "${1}" != "-c" ; then 
  1805.   echo shar: Will not clobber existing file \"'xrainbow/X11/Xaw_d/DrawingA.c'\"
  1806. else
  1807. echo shar: Extracting \"'xrainbow/X11/Xaw_d/DrawingA.c'\" \(5171 characters\)
  1808. sed "s/^X//" >'xrainbow/X11/Xaw_d/DrawingA.c' <<'END_OF_FILE'
  1809. X/* DrawingA.c: The DrawingArea Widget Methods */
  1810. X
  1811. X/* Copyright 1990, David Nedde
  1812. X/*
  1813. X/* Permission to use, copy, modify, and distribute this
  1814. X/* software and its documentation for any purpose and without fee
  1815. X/* is granted provided that the above copyright notice appears in all copies.
  1816. X/* It is provided "as is" without express or implied warranty.
  1817. X*/
  1818. X
  1819. X#include <X11/IntrinsicP.h>
  1820. X#include <X11/StringDefs.h>
  1821. X#include <X11/CoreP.h>
  1822. X#include <X11/Xaw/SimpleP.h>
  1823. X#include <X11/Xaw_d/DrawingAP.h>
  1824. X
  1825. Xstatic void    Initialize();
  1826. Xstatic void    Destroy();
  1827. Xstatic void    Redisplay();
  1828. Xstatic void    input_draw();
  1829. Xstatic void    motion_draw();
  1830. Xstatic void    resize_draw();
  1831. X
  1832. Xstatic char defaultTranslations[] = "<BtnDown>: input() \n <BtnUp>: input() \n <KeyDown>: input() \n <KeyUp>: input() \n <Motion>: motion() \n <Configure>: resize()";
  1833. Xstatic XtActionsRec actionsList[] = {
  1834. X  { "input",  (XtActionProc)input_draw },
  1835. X  { "motion", (XtActionProc)motion_draw },
  1836. X  { "resize", (XtActionProc)resize_draw },
  1837. X};
  1838. X
  1839. X/* Default instance record values */
  1840. Xstatic XtResource resources[] = {
  1841. X  {XtNexposeCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  1842. X     XtOffset(DrawingAreaWidget, drawing_area.expose_callback), 
  1843. X     XtRCallback, NULL },
  1844. X  {XtNinputCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  1845. X     XtOffset(DrawingAreaWidget, drawing_area.input_callback), 
  1846. X     XtRCallback, NULL },
  1847. X  {XtNmotionCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  1848. X     XtOffset(DrawingAreaWidget, drawing_area.motion_callback), 
  1849. X     XtRCallback, NULL },
  1850. X  {XtNresizeCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  1851. X     XtOffset(DrawingAreaWidget, drawing_area.resize_callback), 
  1852. X     XtRCallback, NULL },
  1853. X};
  1854. X
  1855. X
  1856. XDrawingAreaClassRec drawingAreaClassRec = {
  1857. X  /* CoreClassPart */
  1858. X{
  1859. X  (WidgetClass) &simpleClassRec,    /* superclass          */    
  1860. X    "DrawingArea",            /* class_name          */
  1861. X    sizeof(DrawingAreaRec),        /* size              */
  1862. X    NULL,                /* class_initialize      */
  1863. X    NULL,                /* class_part_initialize  */
  1864. X    FALSE,                /* class_inited          */
  1865. X    Initialize,                /* initialize          */
  1866. X    NULL,                /* initialize_hook      */
  1867. X    XtInheritRealize,            /* realize          */
  1868. X    actionsList,            /* actions          */
  1869. X    XtNumber(actionsList),        /* num_actions          */
  1870. X    resources,                /* resources          */
  1871. X    XtNumber(resources),        /* resource_count      */
  1872. X    NULLQUARK,                /* xrm_class          */
  1873. X    FALSE,                /* compress_motion      */
  1874. X    FALSE,                /* compress_exposure      */
  1875. X    TRUE,                /* compress_enterleave    */
  1876. X    FALSE,                /* visible_interest      */
  1877. X    Destroy,                /* destroy          */
  1878. X    NULL,                /* resize          */
  1879. X    Redisplay,                /* expose          */
  1880. X    NULL,                /* set_values          */
  1881. X    NULL,                /* set_values_hook      */
  1882. X    XtInheritSetValuesAlmost,        /* set_values_almost      */
  1883. X    NULL,                /* get_values_hook      */
  1884. X    NULL,                /* accept_focus          */
  1885. X    XtVersion,                /* version          */
  1886. X    NULL,                /* callback_private      */
  1887. X    defaultTranslations,        /* tm_table          */
  1888. X    XtInheritQueryGeometry,        /* query_geometry      */
  1889. X    XtInheritDisplayAccelerator,    /* display_accelerator      */
  1890. X    NULL                /* extension          */
  1891. X  },  /* CoreClass fields initialization */
  1892. X  {
  1893. X    /* change_sensitive        */    XtInheritChangeSensitive
  1894. X  },  /* SimpleClass fields initialization */
  1895. X  {
  1896. X    0,                                     /* field not used    */
  1897. X  },  /* DrawingAreaClass fields initialization */
  1898. X};
  1899. X
  1900. X  
  1901. XWidgetClass drawingAreaWidgetClass = (WidgetClass)&drawingAreaClassRec;
  1902. X
  1903. X
  1904. Xstatic void Initialize( request, new)
  1905. XDrawingAreaWidget request, new;
  1906. X{
  1907. X  if (request->core.width == 0)
  1908. X    new->core.width = 100;
  1909. X  if (request->core.height == 0)
  1910. X    new->core.height = 100;
  1911. X}
  1912. X
  1913. X
  1914. Xstatic void Destroy( w)
  1915. XDrawingAreaWidget w;
  1916. X{
  1917. X  XtRemoveAllCallbacks(w, XtNexposeCallback, w->drawing_area.expose_callback);
  1918. X  XtRemoveAllCallbacks(w, XtNinputCallback, w->drawing_area.input_callback);
  1919. X  XtRemoveAllCallbacks(w, XtNmotionCallback, w->drawing_area.motion_callback);
  1920. X  XtRemoveAllCallbacks(w, XtNresizeCallback, w->drawing_area.resize_callback);
  1921. X}
  1922. X
  1923. X
  1924. X/* Invoke expose callbacks */
  1925. Xstatic void Redisplay(w, event, region)
  1926. XDrawingAreaWidget w;
  1927. XXEvent         *event;
  1928. XRegion          region;
  1929. X{
  1930. X  XawDrawingAreaCallbackStruct cb;
  1931. X
  1932. X  cb.reason = XawCR_EXPOSE;
  1933. X  cb.event  = event;
  1934. X  cb.window = XtWindow(w);
  1935. X  XtCallCallbacks(w, XtNexposeCallback, &cb);
  1936. X}
  1937. X
  1938. X/* Invoke resize callbacks */
  1939. Xstatic void resize_draw(w, event, args, n_args)
  1940. XDrawingAreaWidget w;
  1941. XXEvent         *event;
  1942. Xchar         *args[];
  1943. Xint          n_args;
  1944. X{
  1945. X  XawDrawingAreaCallbackStruct cb;
  1946. X
  1947. X  cb.reason = XawCR_RESIZE;
  1948. X  cb.event  = event;
  1949. X  cb.window = XtWindow(w);
  1950. X  XtCallCallbacks(w, XtNresizeCallback, &cb);
  1951. X}
  1952. X
  1953. X/* Invoke input callbacks */
  1954. Xstatic void input_draw(w, event, args, n_args)
  1955. XDrawingAreaWidget w;
  1956. XXEvent         *event;
  1957. Xchar         *args[];
  1958. Xint          n_args;
  1959. X{
  1960. X  XawDrawingAreaCallbackStruct cb;
  1961. X
  1962. X  cb.reason = XawCR_INPUT;
  1963. X  cb.event  = event;
  1964. X  cb.window = XtWindow(w);
  1965. X  XtCallCallbacks(w, XtNinputCallback, &cb);
  1966. X}
  1967. X
  1968. X/* Invoke motion callbacks */
  1969. Xstatic void motion_draw(w, event, args, n_args)
  1970. XDrawingAreaWidget w;
  1971. XXEvent         *event;
  1972. Xchar         *args[];
  1973. Xint          n_args;
  1974. X{
  1975. X  XawDrawingAreaCallbackStruct cb;
  1976. X
  1977. X  cb.reason = XawCR_MOTION;
  1978. X  cb.event  = event;
  1979. X  cb.window = XtWindow(w);
  1980. X  XtCallCallbacks(w, XtNmotionCallback, &cb);
  1981. X}
  1982. END_OF_FILE
  1983. if test 5171 -ne `wc -c <'xrainbow/X11/Xaw_d/DrawingA.c'`; then
  1984.     echo shar: \"'xrainbow/X11/Xaw_d/DrawingA.c'\" unpacked with wrong size!
  1985. fi
  1986. # end of 'xrainbow/X11/Xaw_d/DrawingA.c'
  1987. fi
  1988. if test -f 'xrainbow/X11/Xaw_d/DrawingA.doc' -a "${1}" != "-c" ; then 
  1989.   echo shar: Will not clobber existing file \"'xrainbow/X11/Xaw_d/DrawingA.doc'\"
  1990. else
  1991. echo shar: Extracting \"'xrainbow/X11/Xaw_d/DrawingA.doc'\" \(4291 characters\)
  1992. sed "s/^X//" >'xrainbow/X11/Xaw_d/DrawingA.doc' <<'END_OF_FILE'
  1993. XDrawingArea Widget
  1994. X
  1995. X
  1996. XSYNOPSIS
  1997. X  Application header file    <X11/Xaw_d/DrawingA.h>
  1998. X  Class header file        <X11/Xaw_d/DrawingAP.h>
  1999. X  Class                drawingAreaWidgetClass
  2000. X  Class Name            DrawingArea
  2001. X  Superclass            Simple
  2002. X
  2003. X
  2004. XOVERVIEW
  2005. X  This widget was needed to allow a drawing area in the Athena widget
  2006. X  set that doesn't require hacking up the Label widget by adding
  2007. X  complicated actions.  This widget follows Motif's DrawingArea widget
  2008. X  closely, except that it follows Athena's naming conventions and there
  2009. X  is no resize policy.  Also, Motif's Drawing area is a composite widget,
  2010. X  while this one is a simple widget.  This widget is NOT officially
  2011. X  part of the Athena widget set.
  2012. X
  2013. X
  2014. XDESCRIPTION
  2015. X  The DrawingArea widget is modeled after Motif's DrawingArea widget.
  2016. X  The DrawingArea widget is an empty widget that is easily adaptable to
  2017. X  a variety of purposes.  It does no drawing and defines no behavior
  2018. X  except for invoking callbacks.  Callbacks notify the application when
  2019. X  graphics need to be drawn (exposure events or widget resize) and when
  2020. X  the widget receives input from the keyboard or mouse.  Applications
  2021. X  are responsible for defining appearence and behavior as needed in
  2022. X  response to DrawingArea callbacks.
  2023. X
  2024. X
  2025. XClasses
  2026. X  DrawingArea inherits behavior and resources from the Core and Simple
  2027. X  classes.
  2028. X  The class pointer is DrawingAreaWidgetClass.  The class name is DrawingArea.
  2029. X
  2030. X
  2031. XNew Resources
  2032. X   Name                 Class        RepType        Default Value
  2033. X   ----                 -----        -------        -------------
  2034. X   exposeCallback    Callback    Pointer        NULL
  2035. X   inputCallback    Callback    Pointer        NULL
  2036. X   motionCallback    Callback    Pointer        NULL
  2037. X   resizeCallback    Callback    Pointer        NULL
  2038. X
  2039. X   XtNexposeCallback
  2040. X     Specifies list of callbacks that is called when DrawingArea recieves
  2041. X     an exposure event.  The callback reason is XawCR_EXPOSE.
  2042. X   XtNinputCallback
  2043. X     Specifies list of callbacks that is called when DrawingArea recieves
  2044. X     an keyboard or mouse event (key or button, up or down).  The callback 
  2045. X     reason is XawCR_INPUT.
  2046. X   XtNmotionCallback   
  2047. X     Specifies list of callbacks that is called when DrawingArea recieves
  2048. X     a mouse motion event.  The callback reason is XawCR_MOTION.
  2049. X   XtNresizeCallback
  2050. X     Specifies list of callbacks that is called when the DrawingArea is
  2051. X     resized.  The callback reason is XawCR_RESIZE.
  2052. X
  2053. X
  2054. XInherited Resources, Changed defaults
  2055. X   Name                 Class        RepType        Default Value
  2056. X   ----                 -----        -------        -------------
  2057. X   height        Height        Dimension    100
  2058. X   width        Width        Dimension    100
  2059. X
  2060. X
  2061. XCallback Information
  2062. X  A pointer to the following structure is returned with each callback.
  2063. X
  2064. X  typedef struct {
  2065. X    int        reason;
  2066. X    XEvent *event;
  2067. X    Window  window;
  2068. X  } XawDrawingAreaCallbackStruct;
  2069. X
  2070. X  reason: Indicates why the callback was invoked
  2071. X  event:  Points to the XEvent that triggered the callback
  2072. X  window: Is set to the widget window
  2073. X
  2074. X
  2075. XBehavior
  2076. X <KeyDown>,<KeyUp>,<BtnDown>,<BtnUp>:
  2077. X   The callbacks for XtNinputCallback are called when a key or button is 
  2078. X   pressed or released.
  2079. X <Expose>:
  2080. X   The callbacks for XtNexposeCallbacks are called when the widget recieves
  2081. X   an exposure event.
  2082. X <Configure>:
  2083. X   The callbacks for XtNresizeCallbacks are called when the widget is resized.
  2084. X <Motion>:
  2085. X   The callbacks for XtNmotionCallbacks are called when the widget recieves a 
  2086. X   pointer motion event.
  2087. X
  2088. X
  2089. XDefault Translations
  2090. X  <BtnDown>:    input()
  2091. X  <BtnUp>:    input()
  2092. X  <KeyDown>:    input()
  2093. X  <KeyUp>:    input()
  2094. X  <Motion>:    motion()
  2095. X  <ResReq>:    resize()
  2096. X
  2097. X
  2098. XSEE ALSO
  2099. X  OSF/Motif Programmer's reference: XmDrawingArea
  2100. X    Open Software Foundation
  2101. X  Athena Widget Set - C Language Interface Rel 4: 3.6 Simple Widget
  2102. X    Chris D. Peterson
  2103. X  X Toolkit Intrinsics - C Language Interface
  2104. X    Joel McCormack, Paul Asenta, Ralph R. Swick
  2105. X  The X Window System, programming and Applications with Xt, OSF/Motif Edition
  2106. X    Douglas A. Young
  2107. X
  2108. X
  2109. XCOPYRIGHT
  2110. X  Copyright 1990, David Nedde
  2111. X  Permission to use, copy, modify, and distribute this
  2112. X  software and its documentation for any purpose and without
  2113. X  fee is provided that the above copyright notice appears in all copies.
  2114. X  It is provided "as is" without express or implied warranty.
  2115. X
  2116. X
  2117. XAUTHOR
  2118. X  David Nedde, Computer Science Dept.        daven@maxine.wpi.edu
  2119. X  Worcester Polytechnic Institute        (508) 831-5117/5668
  2120. X  Worcester, MA 01609
  2121. END_OF_FILE
  2122. if test 4291 -ne `wc -c <'xrainbow/X11/Xaw_d/DrawingA.doc'`; then
  2123.     echo shar: \"'xrainbow/X11/Xaw_d/DrawingA.doc'\" unpacked with wrong size!
  2124. fi
  2125. # end of 'xrainbow/X11/Xaw_d/DrawingA.doc'
  2126. fi
  2127. if test -f 'xrainbow/include/Wc/WcCreate.h' -a "${1}" != "-c" ; then 
  2128.   echo shar: Will not clobber existing file \"'xrainbow/include/Wc/WcCreate.h'\"
  2129. else
  2130. echo shar: Extracting \"'xrainbow/include/Wc/WcCreate.h'\" \(7512 characters\)
  2131. sed "s/^X//" >'xrainbow/include/Wc/WcCreate.h' <<'END_OF_FILE'
  2132. X/*
  2133. X** Copyright (c) 1990 David E. Smyth
  2134. X**
  2135. X** This file was derived from work performed by Martin Brunecky at
  2136. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  2137. X** following copyright:
  2138. X**
  2139. X*******************************************************************************
  2140. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  2141. X*
  2142. X*                        All Rights Reserved
  2143. X*
  2144. X* Permission to use, copy, modify, and distribute this software and its
  2145. X* documentation for any purpose and without fee is hereby granted, provided
  2146. X* that the above copyright notice appears on all copies and that both the
  2147. X* copyright and this permission notice appear in supporting documentation
  2148. X* and that the name of Auto-trol not be used in advertising or publicity
  2149. X* pertaining to distribution of the software without specific, prior written
  2150. X* permission.
  2151. X* 
  2152. X* Auto-trol disclaims all warranties with regard to this software, including
  2153. X* all implied warranties of merchantability and fitness, in no event shall
  2154. X* Auto-trol be liable for any special, indirect or consequential damages or
  2155. X* any damages whatsoever resulting from loss of use, data or profits, whether 
  2156. X* in an action of contract, negligence or other tortious action, arising out 
  2157. X* of or in connection with the use or performance of this software.
  2158. X*******************************************************************************
  2159. X**
  2160. X** Redistribution and use in source and binary forms are permitted
  2161. X** provided that the above copyright notice and this paragraph are
  2162. X** duplicated in all such forms and that any documentation, advertising
  2163. X** materials, and other materials related to such distribution and use
  2164. X** acknowledge that the software was developed by David E. Smyth.  The
  2165. X** name of David E. Smyth may not be used to endorse or promote products
  2166. X** derived from this software without specific prior written permission.
  2167. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  2168. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  2169. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2170. X**
  2171. X*/
  2172. X
  2173. X/*
  2174. X* SCCS_data: @(#)WcCreate.h 1.1 ( 19 Nov 90 )
  2175. X*
  2176. X* Include_name:
  2177. X*
  2178. X*     WcCreate.h
  2179. X*
  2180. X* Subsystem_group:
  2181. X*
  2182. X*     Widget Creation Library
  2183. X*
  2184. X* Include_description:
  2185. X*
  2186. X*     Public defines for the Widget Creation Library supporting widget 
  2187. X*     tree creation from the Xrm database.
  2188. X*
  2189. X* Include_history:
  2190. X*
  2191. X*   mm/dd/yy  initials  action
  2192. X*   --------  --------  -------------------------------------------------------
  2193. X*   07/16/90   D.Smyth  added WcAllowDuplicate*Reg... decls
  2194. X*   06/30/90   R.Whitby added WcRegisterWcActions declaration
  2195. X*   06/19/90   D.Smyth  Widget Creation Library version 1.0 Release
  2196. X*   04/04/90   marbru   updated, added new callbacks
  2197. X*   03/27/90   marbru   updated for new names
  2198. X*   03/02/90   marbru   created
  2199. X*
  2200. X*******************************************************************************
  2201. X*/
  2202. X#ifndef _WcCreate_h
  2203. X#define _WcCreate_h
  2204. X
  2205. X/*
  2206. X#include <X11/IntrinsicP.h>
  2207. X#include <X11/CoreP.h>
  2208. X#include <X11/ObjectP.h>
  2209. X*/
  2210. X
  2211. X#ifdef FUNCTION_PROTOTYPES
  2212. X/****************************** ANSI FUNC DECLS ******************************/
  2213. X
  2214. X#define APP XtAppContext
  2215. X#define EV extern void
  2216. X#define EW extern Widget
  2217. X#define EC extern char*
  2218. X
  2219. X/* -- Widget class, constructor, and callback proc registration routines */
  2220. X
  2221. XEV WcRegisterClassPtr   (APP, char* name,   WidgetClass class);
  2222. XEV WcRegisterClassName  (APP, char* name,   WidgetClass class);
  2223. XEV WcRegisterConstructor(APP, char* name,   Widget(*constructor) () );
  2224. XEV WcRegisterCallback   (APP, char* CBname, XtCallbackProc, caddr_t defCliData);
  2225. XEV WcRegisterAction    (APP, char* name,   XtActionProc proc );
  2226. XEV WcRegisterWcCallbacks(APP );
  2227. X
  2228. X/* -- Allow duplicate registration of classes, constructors, and callbacks */
  2229. X
  2230. XEV WcAllowDuplicateRegistration   ( int allowed );
  2231. XEV WcAllowDuplicateClassPtrReg    ( int allowed );
  2232. XEV WcAllowDuplicateClassNameReg   ( int allowed );
  2233. XEV WcAllowDuplicateConstructorReg ( int allowed );
  2234. XEV WcAllowDuplicateCallbackReg    ( int allowed );
  2235. X
  2236. X/* -- Widget action registration routine */
  2237. X
  2238. XEV WcRegisterWcActions   ( APP );
  2239. X
  2240. X/* -- Widget creation routines */
  2241. X
  2242. XEV WcWidgetCreation      ( Widget root );
  2243. XEV WcCreateNamedChildren ( Widget parent, char* names );
  2244. XEV WcCreateNamedPopups   ( Widget parent, char* names );
  2245. XEW WcCreateDatabaseChild ( Widget parent, char* name, int* managed );
  2246. XEW WcCreateDatabasePopup ( Widget parent, char* name );
  2247. X
  2248. X/* -- Widget name routines 
  2249. X**    The character buffer returned by WcNamesToWidgetList contains the
  2250. X**    names which could not be converted to widgets.  This buffer is static,
  2251. X**    so its contents are changed everytime WcNamesToWidgetList is called.
  2252. X**    The character buffer returned by WcWidgetToFullName must be XtFree'd
  2253. X**    by the caller.
  2254. X*/
  2255. X
  2256. XEW WcChildNameToWidget ( Widget w, char* childName );
  2257. XEW WcFullNameToWidget  ( Widget w, char* name );
  2258. XEC WcNamesToWidgetList ( Widget, char* names, Widget widgetList[], int* count);
  2259. XEC WcWidgetToFullName  ( Widget w );
  2260. X
  2261. X/*  -- Useful for argument parsing */
  2262. X
  2263. XEC WcLowerCaseCopy        ( char* in );            /* caller frees buf */
  2264. XEC WcSkipWhitespace       ( char* cp );
  2265. XEC WcSkipWhitespace_Comma ( char* cp );
  2266. XEC WcCleanName            ( char* in, char* out );    /* out[] must exist */
  2267. XEC WcStripWhitespaceFromBothEnds (char* name );        /* caller frees buf */
  2268. X
  2269. XEC WcGetResourceType          ( Widget, char* rName );    /* caller frees buf */
  2270. XEV WcSetValueFromString       ( Widget, char* rName, char* rVal );
  2271. XEV WcSetValueFromStringAndType( Widget, char* rName, char* rVal, char* rType );
  2272. X
  2273. XEC WcStrStr( char* searchThis, char* forThisPattern );    /* like ANSI strstr */
  2274. X
  2275. X#undef APP
  2276. X#undef EV
  2277. X#undef EW
  2278. X#undef EC
  2279. X
  2280. X#else
  2281. X/**************************** NON-ANSI FUNC DECLS ****************************/
  2282. X
  2283. X/* -- Widget constructor registration routine */
  2284. X
  2285. Xextern void WcRegisterClassPtr    ();
  2286. Xextern void WcRegisterClassName   ();
  2287. Xextern void WcRegisterConstructor ();
  2288. Xextern void WcRegisterCallback    ();
  2289. Xextern void WcRegisterAction      ();
  2290. Xextern void WcRegisterWcCallbacks ();
  2291. X
  2292. X/* -- Allow duplicate registration of classes, constructors, and callbacks */
  2293. X
  2294. Xextern void WcAllowDuplicateRegistration   ();
  2295. Xextern void WcAllowDuplicateClassPtrReg    ();
  2296. Xextern void WcAllowDuplicateClassNameReg   ();
  2297. Xextern void WcAllowDuplicateConstructorReg ();
  2298. Xextern void WcAllowDuplicateCallbackReg    ();
  2299. X
  2300. X/* -- Widget action registration routine */
  2301. X
  2302. Xextern void WcRegisterWcActions       ();
  2303. X
  2304. X/* -- Widget creation routines */
  2305. X
  2306. Xextern void   WcWidgetCreation         ();
  2307. Xextern void   WcCreateNamedChildren    ();
  2308. Xextern void   WcCreateNamedPopups    ();
  2309. Xextern Widget WcCreateDatabaseChild    ();
  2310. Xextern Widget WcCreateDatabasePopup    ();
  2311. X
  2312. X/* -- Widget name routine */
  2313. X
  2314. Xextern Widget WcChildNameToWidget    ();
  2315. Xextern Widget WcFullNameToWidget    ();
  2316. Xextern char*  WcNamesToWidgetList    ();    /* rets: names not converted */
  2317. Xextern char*  WcWidgetToFullName    ();    /* ret'd buff must be free'd */
  2318. X
  2319. Xextern char* WcLowerCaseCopy               ();    /* ret'd buff must be free'd */
  2320. Xextern char* WcSkipWhitespace              ();
  2321. Xextern char* WcSkipWhitespace_Comma        ();
  2322. Xextern char* WcCleanName                   ();
  2323. Xextern char* WcStripWhitespaceFromBothEnds ();    /* ret'd buff must be free'd */
  2324. X
  2325. Xextern char* WcGetResourceType             ();    /* ret'd buff must be free'd */
  2326. Xextern void  WcSetValueFromString          ();
  2327. Xextern void  WcSetValueFromStringAndType   ();
  2328. X
  2329. Xextern char* WcStrStr ();            /* same as ANSI strstr() */
  2330. X
  2331. X#endif /* FUNCTION_PROTOTYPES */
  2332. X
  2333. X#endif /* _WcCreate_h */
  2334. END_OF_FILE
  2335. if test 7512 -ne `wc -c <'xrainbow/include/Wc/WcCreate.h'`; then
  2336.     echo shar: \"'xrainbow/include/Wc/WcCreate.h'\" unpacked with wrong size!
  2337. fi
  2338. # end of 'xrainbow/include/Wc/WcCreate.h'
  2339. fi
  2340. echo shar: End of archive 4 \(of 5\).
  2341. cp /dev/null ark4isdone
  2342. MISSING=""
  2343. for I in 1 2 3 4 5 ; do
  2344.     if test ! -f ark${I}isdone ; then
  2345.     MISSING="${MISSING} ${I}"
  2346.     fi
  2347. done
  2348. if test "${MISSING}" = "" ; then
  2349.     echo You have unpacked all 5 archives.
  2350.     echo "Please Read README"
  2351.     rm -f ark[1-9]isdone
  2352. else
  2353.     echo You still need to unpack the following archives:
  2354.     echo "        " ${MISSING}
  2355. fi
  2356. ##  End of shell archive.
  2357. exit 0
  2358.  
  2359. --
  2360. Dan Heller
  2361. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  2362. Senior Writer                President          comp-sources-x@uunet.uu.net
  2363. argv@ora.com                 argv@zipcode.com
  2364.