home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume6 / wsxc2 / part01 next >
Internet Message Format  |  1990-04-26  |  24KB

  1. Path: uunet!cs.utexas.edu!usc!apple!sun-barr!newstop!sun!auto-trol.COM
  2. From: marbru@auto-trol.COM (Martin Brunecky)
  3. Newsgroups: comp.sources.x
  4. Subject: v06i095: WsXc -- poor man's UIL, Part01/03
  5. Message-ID: <134884@sun.Eng.Sun.COM>
  6. Date: 26 Apr 90 18:46:12 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 527
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: Martin Brunecky <marbru@auto-trol.COM>
  12. Posting-number: Volume 6, Issue 95
  13. Archive-name: wsxc2/part01
  14.  
  15. WsXc 2.0 Part 01/03
  16.  
  17.      WsXc - POOR MAN'S UIL, Release 2.0
  18.  
  19.      This posting contains the second release of  WsXc,  an  Xt Intrinsic
  20.      extension alowing to specify the entire user interface within the  X
  21.      resource database. Contrary to UIL, WsXc is very easy to use, and it
  22.      is a lot of fun.
  23.  
  24.      This release uses a  completely  new syntax,  which we  have  found
  25.      much closer to the Xt spirit then the original one. It also contains
  26.      many enhancements and bug fixes.  WsXc  is provided on  as is basis,
  27.      without any support or warranties.
  28.  
  29.      CONTENTS:
  30.  
  31.      o  README                 Basic description of the WsXc facility
  32.  
  33.      The basic description is a compromise between tutorial and reference
  34.      manual, both of which are missing. For more details about individual
  35.      functions, please refer to source code comments.
  36.  
  37.      The following files contain the code, based on Motif Xt  Intrinsics,
  38.      tested  on  SPARC, Ultrix/RISC and VAX/VMS. The code is compatible
  39.      with R4 Intrinsics, to use it with R3 Xt Intrisics requires to remove
  40.      references to compositeObjectClass.
  41.  
  42.       o  WsCreate.h            defines available public functions
  43.       o  WsCreateFunc.c        widget tree creation and control
  44.       o  WsCvtStrToCallback.c  string to callback resource convertor
  45.  
  46.      The folowing demo applications use the WsXc code listed above,  and
  47.      the Motif widget set. To change HellWorld to your widget set, simply
  48.      modify the HelloWorld.c replacing Motif widgets with yours.
  49.      Note, the application class resource files must be moved either into
  50.      application-class directory, or your user preference files directory
  51.      (HOME).
  52.  
  53.       o  HelloWorld.c          sample application
  54.       o  HelloWorldClass       application class resource file
  55.       o  WsRegisterMotif.c     registartion code for the Motif widget set
  56.       o  MotifTest.c           more complex demo application
  57.       o  MotifTestClass        application class resource file
  58.       o  MotifTestMenu         class resource file for deffered load
  59.  
  60. WsXc 2.0 Part 01/03 contents:
  61.  
  62.       o  README                 Basic description of the WsXc facility
  63.       o  WsCreate.h             defines available public functions
  64. #! /bin/sh
  65. # This is a shell archive.  Remove anything before this line, then unpack
  66. # it by saving it into a file and typing "sh file".  To overwrite existing
  67. # files, type "sh file -c".  You can also feed this as standard input via
  68. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  69. # will see the following message at the end:
  70. #        "End of shell archive."
  71. # Contents:  README WsCreate.h
  72. # Wrapped by marbru@auto-trol on Thu Apr 26 10:14:07 1990
  73. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  74. if test -f 'README' -a "${1}" != "-c" ; then 
  75.   echo shar: Will not clobber existing file \"'README'\"
  76. else
  77. echo shar: Extracting \"'README'\" \(16377 characters\)
  78. sed "s/^X//" >'README' <<'END_OF_FILE'
  79. X
  80. X
  81. X
  82. X    POOR MAN's UIL - WsXc - RELEASE 2.0
  83. X    -----------------------------------
  84. X
  85. X    About two weeks ago, prompted by the discussion  of  the  advantages
  86. X    and  disadvantages  of UIL, I have put together some code supporting
  87. X    user interface creation and management using SOLELY the  X  resource
  88. X    database.  The preliminary code has been posted on comp.sources.x as
  89. X    "WsXc".
  90. X
  91. X    Since then WsXc matured.  Besides the widget  set  independency  and
  92. X    ability to define widget tree and callbacks within X resource files,
  93. X    we have added several convenience callbacks, allowing to  deal  with
  94. X    widgets  such  as  Attached Box (XmForm), postpone sub-tree creation
  95. X    until the first action on it, and even postpone resource files  load
  96. X    to reduce initialization time.
  97. X
  98. X    The existing experience, so  far,  is  very  positive.   Performance
  99. X    benchmarks  show  that  WsXc  is  in-par  with UIL - slightly faster
  100. X    widget fetches, slightly slower  inital  resource  file  load  (more
  101. X    data).   Since  the  widget tree and all resource definitions are in
  102. X    one place, WsXc can really take advantage of  resource  wildcarding,
  103. X    significantly cutting down on the definition size.  Contrary to UIL,
  104. X    there is no compilation step, making development iterations faster.
  105. X
  106. X    To better "fit" the X resource database concepts, we have completely
  107. X    changed  WsXc  syntax.  We have added more (and better) diagnostics,
  108. X    optional  widget  tree  creation  traceback,  trace   callback   for
  109. X    development purposes, and fixed many bugs.
  110. X
  111. X
  112. X    USING WsXc for USER INTERFACE DEFINITION
  113. X    ----------------------------------------
  114. X
  115. X    To start, let me present a simple example of an application-class  X
  116. X    resource file for a fancier flavor of HelloWorld:
  117. X    !
  118. X    !  shell - an application shell, contains RowColumn organizer
  119. X    !
  120. X    HelloWorld.createChildren:  box
  121. X    !
  122. X    !  box -  the main container, contains label and button
  123. X    !
  124. X    *box.createClass:           xmRowColumnWidgetClass
  125. X    *box.createChildren:        label,button
  126. X    !
  127. X    !  label
  128. X    !
  129. X    *label.createClass:         xmLabelWidgetClass
  130. X    *label.labelString:         Hello, WORLD !
  131. X    !
  132. X    !  button
  133. X    !
  134. X    *button.createClass:        xmPushButtonWidgetClass
  135. X    *button.labelString:        Push ME
  136. X    *button.activateCallback:   push(Push again to EXIT)
  137. X
  138. X    Except for the top-level shell creation, there is NO widget creation
  139. X    code in this HelloWorld.  The entire widget tree definition is shown
  140. X    above.  Widget  tree  is  defined  by  createChild  and  createClass
  141. X    resources,  and  recursively  created from the top level shell down.
  142. X    Similarly, callbacks are defined  by  name,  and  (optional)  string
  143. X    argument  passed  to  callback function as callback data.  Note this
  144. X    example is a starting point:  It does NOT show all the functionality
  145. X    such  as  defferred  subtree  creation,  manage/unmanage  callbacks,
  146. X    etc...
  147. X
  148. X
  149. X    WsXc 2.0 OVERVIEW
  150. X    -----------------
  151. X
  152. X    WsXc is a set of Xt Intrinsics based routines,  callbacks,  resource
  153. X    converters  and  reserved  resource names.  The following is a brief
  154. X    overview of the facility, not a reference manual.
  155. X
  156. X    Resources
  157. X
  158. X    The  application  resources  defined  for  individual  widgets   and
  159. X    interpretted  by WsXc calls and callbacks always start with "create"
  160. X    prefix:
  161. X
  162. X     o  createChildren:   name[,name]...
  163. X
  164. X        Specifies parent's children.  Other children resources, such  as
  165. X        widget  class must be provided with each child.  Note, primitive
  166. X        (non-composite) widgets may have pop-up children, however,  such
  167. X        children  are  not created automatically - must be created using
  168. X        one of creation callbacks.  This  restriction  reduces  creation
  169. X        overhead  by  skipping  database query for children of primitive
  170. X        widgets.
  171. X
  172. X     o  createClass:      class_or_constructor_name rec ed
  173. X
  174. X        Specifies widget  class  or  constructor  (convenience  creation
  175. X        routine), registered by the application.
  176. X
  177. X     o  createCallback:   callback_name[(client_data_string)][,name...]
  178. X
  179. X        Specifies the (list of) callback(s) to invoke after  the  widget
  180. X        has  been  created.   Often  used  to deliver widget ID to other
  181. X        widgets ( such as default button  ID,  or  Attached  Box  widget
  182. X        resources ).
  183. X
  184. X     o  createNoAuto:     true/false (default = false)
  185. X
  186. X        Controls  automatic  widget  creation.   Normally,  widget  tree
  187. X        creation  recursively  descends the tree and creates all widgets
  188. X        defined in the database.  Widgets with createNoAuto  "true"  are
  189. X        skipped  (similarly to popup children of primitive widgets), and
  190. X        must be created by explicit creation  call  or  callback.   This
  191. X        allows to deffer sub-tree creation.
  192. X
  193. X     o  createUnmanaged:   true/false (default = false)
  194. X
  195. X        Specifies whether a widget is created managed or unmanaged  (for
  196. X        example, Motif pulldown menus must be created unmanaged).
  197. X
  198. X     o  createTraceback:   true/false (default = false)
  199. X
  200. X        Specifies whether a traceback information about widget  creation
  201. X        is  printed  on  standard output.  Used to assist in widget tree
  202. X        design, particularly when deferred creation or heavy wildcarding
  203. X        is used.
  204. X
  205. X
  206. X    Functions
  207. X
  208. X    The functions used by the application to interface with WsXc are  as
  209. X    follows:
  210. X
  211. X     o  WsRegisterObjectClass ( app, name, widget_class )
  212. X
  213. X        This function registers object/widget class with WsXc, assigning
  214. X        it  a  name  (string)  to  be  used  within X resource file.  By
  215. X        convention, the string should match class name  (though  mapping
  216. X        is case-insensitive).
  217. X
  218. X     o  WsRegisterConstructor ( app, name, widget_constructor )
  219. X
  220. X        This  function  registers  object/widget  constructor  (creation
  221. X        routine)  with  WsXc,  assigning  it  a name (string) to be used
  222. X        within X resource file.  By convention, the string should  match
  223. X        function name (though mapping is case-insensitive).
  224. X
  225. X     o  WsRegisterCallback ( app, name, callback, default_tag )
  226. X
  227. X        This function  registers  an  application  callback  with  WsXc,
  228. X        assigning  it a name (string) to be used within X resource file.
  229. X        By convention, the string should  match  callback  name  (though
  230. X        mapping is case-insensitive).
  231. X
  232. X     o  WsRegisterCreateCallbacks ( app )
  233. X
  234. X        This function registers all WsXc provided callbacks, along  with
  235. X        the StringToCallback resource converter.
  236. X
  237. X     o  WsCreateKnownChildren ( top_level_shell )
  238. X
  239. X        This function performs widget tree creation,  using  information
  240. X        provided  by the X resource database.  Starting at the specified
  241. X        widget,  function  recursively  descends  the  widget  tree  and
  242. X        creates  all widgets defined in the database.  Except for direct
  243. X        ancestors of the specified  widget,  widgets  with  createNoAuto
  244. X        resource "true" are skipped - such sub-tree can be created later
  245. X        using creation callbacks.
  246. X
  247. X    Callbacks
  248. X
  249. X    The WsXc package includes several "convenience" callbacks,  used  to
  250. X    complemet the static definition contained within X resource database
  251. X    with runtime dynamics.  Callbacks refer to "widget_path",  a  widget
  252. X    name  qualified by all it's ancestores up to, but not including, the
  253. X    top level shell.  For each callback, the client_data  string  format
  254. X    (as appears in X resource database) is shown:
  255. X
  256. X     o  WsCreateKnownChildrenCB   ( widget_path[,widget_path...] )
  257. X
  258. X        This callback creates known children of  named  widget(s).   The
  259. X        createNoAuto  resource  is  ignored  for the first level (direct
  260. X        ancestors) of named widget(s).  Callback can be used  to  create
  261. X        popup children of a primitive widget.
  262. X
  263. X     o  WsCreateNamedChildCB      ( child_name, widget_path )
  264. X
  265. X        This callback creates a subtree starting with a specified  child
  266. X        of  a named widget(s).  The createNoAuto resource is ignored for
  267. X        the first level (direct ancestors) of named widget(s).  Callback
  268. X        can be used to create popup children of a primitive widget.
  269. X
  270. X     o  WsManageNamedChildrenCB   ( widget_path[,widget_path...] )
  271. X
  272. X        This callback manages named widget(s)
  273. X
  274. X     o  WsUnmanageNamedChidrenCB  ( widget_path[,widget_path...] )
  275. X
  276. X        This callback unmanages named widget(s)
  277. X
  278. X     o  WsDestroyNamedChildrenCB  ( widget_path[,widget_path...] )
  279. X
  280. X        This callback destroys named widget(s)
  281. X
  282. X     o  WsSetWidgetResourceCB     ( resource, widget_path[,widget_path])
  283. X
  284. X        This callback sets invoking widget's ID in  prescribed  resource
  285. X        of named widget(s)
  286. X
  287. X     o  WsSetNamedWidgetResourceCB (widget_path, resource, widget_path)
  288. X
  289. X        This callback sets named widget's ID in prescribed  resource  of
  290. X        named widget(s)
  291. X
  292. X     o  WsLoadResourceFileCB      ( filename )
  293. X
  294. X        This callback loads and merges an additional resource file.  The
  295. X        file  is  searched  for  in XAPPLRESDIR directory first, then in
  296. X        XUSERRESDIR.  Both  files  will  be  loaded,  if  present,  user
  297. X        preferences overriding application ones.
  298. X        The $LANG environmental variable use is NOT supported (yet).
  299. X
  300. X    A "string to callback" converter is provided with the package.   The
  301. X    converter  builds an XtCallbackList using registered callback names.
  302. X    Any callback on the list may have an optional  string  argument.   A
  303. X    pointer  to  the  string  is  used  as  callback client data.  If no
  304. X    argument  (string)  is  provided,  the  default  client  data  value
  305. X    provided  at  registration  time  is  used.   The  callback resource
  306. X    specification in the X resource database has the following format:
  307. X
  308. X        callbackName:   callback__name[(args)][,callback__name[(args)]]...
  309. X
  310. X    where   callback_name   is   the   callback   name    assigned    by
  311. X    WsRegisterCallback, and args presents an arbitrary string.
  312. X
  313. X
  314. X    WsXc EXAMPLES
  315. X    -------------
  316. X    Two examples are provided  with  WsXc.   Note,  in  both  cases  the
  317. X    application   class   resource  files  must  be  moved  either  into
  318. X    application class resources directory,  or  user  preference  (home)
  319. X    directory.
  320. X
  321. X     o  HelloWorld, using HelloWorldClass resource file
  322. X
  323. X        This is a very basic demonstration of WsXc concepts.   The  demo
  324. X        is  based  on  Motif widgets, but can be easily converted to use
  325. X        any other widget set.
  326. X
  327. X     o  MotifTest, using MotiftestClass, MotifTestMenu resource files
  328. X
  329. X        This demo attempts to demonstrate more sophisticated WsXc usage,
  330. X        such as creating Motif pulldown menus, defining default buttons,
  331. X        deffered sub-tree creation and deffered resource file load.
  332. X
  333. X
  334. X
  335. X    WsXc COMPARISON WITH UIL
  336. X    ------------------------
  337. X    The X resource database user interface definition, here (for lack of
  338. X    better  names)  referred  to  as  WsXc, performs essentialy the same
  339. X    function as UIL.  As a complete comparison with  UIL  is  a  complex
  340. X    task,  here I mention only several important differences between UIL
  341. X    and WsXc.
  342. X
  343. X    Implementation:
  344. X    A UIL application uses multiple user  interface  definition  sources
  345. X    (application  code,  UIL  file,  compiled UID file and an X resource
  346. X    file).  WsXc requires only  application  code  and  the  X  resource
  347. X    file(s),  and  the  application  code  can  be  limited  to callback
  348. X    functions.  The UIL approach  is  based  on  a  compiler  generating
  349. X    intermediate code which is interpreted by Mrm at runtime.  WsXc is a
  350. X    pure runtime interpreter.
  351. X
  352. X    Portability:
  353. X    UIL generated  UID  files  are  machine-specific,  which  may  cause
  354. X    problems  in  heterogeneous  environments.  For each machine type in
  355. X    the network, a different version of the UID file must be maintained.
  356. X    WsXc uses strictly ASCII X resource files, avoiding many portability
  357. X    problems.
  358. X
  359. X    Performance:
  360. X    Since UIL uses pre-compiled, machine specific data, the widget  tree
  361. X    creation  could  be  faster  than  that for WsXc.  However, even UIL
  362. X    widget creation accesses the X resource database for  resources  NOT
  363. X    explicitly  specified  by  the  UIL  file.  Since MOST resources are
  364. X    usually NOT explictly specified, the overhead depends  more  on  the
  365. X    Xrm  database  volume, than on the widget creation method used.  UIL
  366. X    fetches access the UID file - file  overhead  appears  at  a  widget
  367. X    creation  time.   WsXc accesses Xrm database - file overhead appears
  368. X    at the application startup time (unless the deffered  database  load
  369. X    is  used).   Limited  timing  tests  performed  sofar  show  minimal
  370. X    differences between both methods - widget creation itself  dominates
  371. X    the time.
  372. X
  373. X    Extensibility.
  374. X    Adding new widgets to UIL, even with the new Motif WML facility,  is
  375. X    not an easy process.  Adding new data types (resource representation
  376. X    types) to UIL is  often  impossible.   On  the  contrary,  there  is
  377. X    nothing  special  about adding additional widgets to WsXc.  The same
  378. X    method also applies to adding new data types.  The only  requirement
  379. X    is  the  addition  of  a  convertor from string to a particular data
  380. X    type.
  381. X
  382. X    Syntax Checking:
  383. X    The UIL compiler can perform rigorous  syntax  checking  for  widget
  384. X    resources,  thus  assisting in user interface development.  WsXc can
  385. X    not catch any syntax errors in  resource  name  specification,  such
  386. X    resources  are  simply  ignored.   However, errors in resource value
  387. X    specification can be caught by the resource converter.  In addition,
  388. X    a  simple tool that acquires a widget's resource list and performs X
  389. X    resource file syntax checking can be added.
  390. X
  391. X    Value Computations:
  392. X    The UIL compiler can compute  the  geometry  of  individual  widgets
  393. X    using  arbitrary  arithmetic  expressions.  Geometry values in the X
  394. X    resource database can not, currently, contain expressions.  However,
  395. X    using  cpp, a string substitution could be applied.  This limitation
  396. X    is primarily a resource converter issue.  A more intelligent  string
  397. X    to   integer   converter   could  evaluate  arithmetic  expressions,
  398. X    including X  resource  database  value  substitution.   But,  in  my
  399. X    opinion,  geometry  configuration  should  be  left  to the geometry
  400. X    manager  widgets  and  never  hardcoded  by   any   user   interface
  401. X    definition.
  402. X
  403. X    Non-widget Value Fetches:
  404. X    UIL  allows  to  define  named  values,  and  retrieve  those   with
  405. X    application  calls.   The  X  resource  database  provides  the same
  406. X    facility, in addition allowing to qualify names by  a  pathname  and
  407. X    use  wildcarding.   Also,  assuming resource converter availability,
  408. X    there are no limitations as to what data types can be used.
  409. X
  410. X    Deffered  Intialization:   Both  UIL  and  WsXc  provide  tools  for
  411. X    deffered  sub-tree  creation,  which reduces the application startup
  412. X    time.   To  convert  an  application  designed  for  simple  startup
  413. X    initialization  into deffered one, UIL requires both application and
  414. X    UIL code changes.  The WsXc conversion  implies  splitting  resource
  415. X    file and adding deffered load/creation convenience callbacks.
  416. X
  417. X    Resource Conversions:
  418. X    UIL supports resource conversions  such  as  colors,  pixelmaps  and
  419. X    compound strings.  Many of the conversions are performed at runtime,
  420. X    using resource converters  -  the  same  ones  as  WsXc.   For  some
  421. X    resources, such as Compound Strings, UIL compile time conversion can
  422. X    provide some runtime savings.  However, support  of  wide  character
  423. X    sets  may require a separate "compound string" file, generated using
  424. X    a "compound string editor" and accessed using ASCII keys - both  for
  425. X    UIL and WsXc, eliminating any UIL advantage.
  426. X
  427. X    Interactive User Interface Generator Tools Support:
  428. X    Interactive tools for user interface creation are coming.   Most  of
  429. X    them  already  use  X  resource  database  for  majority  of  widget
  430. X    resources.  Widget tree creation is often handled by the  "C"  code,
  431. X    or by UIL.  WsXc can provide viable alternative both to "C" code and
  432. X    UIL - simple  to  generate,  simple  to  read  back  and  parse,  no
  433. X    compilation nor linking steps.
  434. END_OF_FILE
  435. if test 16377 -ne `wc -c <'README'`; then
  436.     echo shar: \"'README'\" unpacked with wrong size!
  437. fi
  438. # end of 'README'
  439. fi
  440. if test -f 'WsCreate.h' -a "${1}" != "-c" ; then 
  441.   echo shar: Will not clobber existing file \"'WsCreate.h'\"
  442. else
  443. echo shar: Extracting \"'WsCreate.h'\" \(2607 characters\)
  444. sed "s/^X//" >'WsCreate.h' <<'END_OF_FILE'
  445. X/*
  446. X*******************************************************************************
  447. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  448. X*
  449. X*                        All Rights Reserved
  450. X*
  451. X* Permission to use, copy, modify, and distribute this software and its
  452. X* documentation for any purpose and without fee is hereby granted, provided
  453. X* that the above copyright notice appears on all copies and that both the
  454. X* copyright and this permission notice appear in supporting documentation
  455. X* and that the name of Auto-trol not be used in advertising or publicity
  456. X* pertaining to distribution of the software without specific, prior written
  457. X* permission.
  458. X* 
  459. X* Auto-trol disclaims all warranties with regard to this software, including
  460. X* all implied warranties of merchantability and fitness, in no event shall
  461. X* Auto-trol be liable for any special, indirect or consequential damages or
  462. X* any damages whatsoever resulting from loss of use, data or profits, whether 
  463. X* in an action of contract, negligence or other tortious action, arising out 
  464. X* of or in connection with the use or performance of this software.
  465. X*
  466. X* SCCS_data: @(#)WsCreate.h 1.2(4/18/90)
  467. X*
  468. X* Include_name:
  469. X*
  470. X*     WsCreate.h
  471. X*
  472. X* Subsystem_group:
  473. X*
  474. X*     Window System
  475. X*
  476. X* Related_keywords:
  477. X*
  478. X*     Public Defines
  479. X*
  480. X* Include_description:
  481. X*
  482. X*     Public defines for the Window System  widget tree creation from
  483. X*     the Xrm database.
  484. X*
  485. X* Include_history:
  486. X*
  487. X*   mm/dd/yy  initials  action
  488. X*   --------  --------  -------------------------------------------------------
  489. X*   04/04/90   marbru   updated, added new callbacks
  490. X*   03/27/90   marbru   updated for new names
  491. X*   03/02/90   marbru   created
  492. X*
  493. X*******************************************************************************
  494. X*/
  495. X#ifndef _WsCreate_h
  496. X#define _WsCreate_h
  497. X
  498. X/* -- App context inquiry, should be part of Ws.h */
  499. X
  500. X#define WsInqAppContext(w)  XtWidgetToApplicationContext(w)
  501. X
  502. X/* -- Widget constructor registration routine */
  503. X
  504. Xextern void WsRegisterObjectClass     ();
  505. Xextern void WsRegisterConstructor     ();
  506. Xextern void WsRegisterCallback        ();
  507. Xextern void WsRegisterCreateCallbacks ();
  508. X
  509. X/* -- Widget creation routine */
  510. X
  511. Xextern void WsCreateKnownChildren     ();
  512. X
  513. X/* -- Convenience callbacks */
  514. X
  515. Xextern void WsCreateKnownChildrenCB   ();
  516. Xextern void WsCreateNamedChildCB      (); 
  517. Xextern void WsManageNamedChildrenCB   ();
  518. Xextern void WsUnmanageNamedChidrenCB  ();
  519. Xextern void WsDestroyNamedChildrenCB  ();
  520. Xextern void WsSetWidgetResourceCB     ();
  521. Xextern void WsSetNamedWidgetResourceCB();
  522. Xextern void WsLoadResourceFileCB      ();
  523. X
  524. X#endif  /* _WsCreate_h */
  525. END_OF_FILE
  526. if test 2607 -ne `wc -c <'WsCreate.h'`; then
  527.     echo shar: \"'WsCreate.h'\" unpacked with wrong size!
  528. fi
  529. # end of 'WsCreate.h'
  530. fi
  531. echo shar: End of shell archive.
  532. exit 0
  533.  
  534. dan
  535. ----------------------------------------------------
  536. O'Reilly && Associates   argv@sun.com / argv@ora.com
  537. Opinions expressed reflect those of the author only.
  538.