home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / wcl / part09 < prev    next >
Internet Message Format  |  1990-12-17  |  106KB

  1. Path: uunet!zaphod.mps.ohio-state.edu!usc!cs.utexas.edu!sun-barr!newstop!exodus!jpl-devvax.jpl.nasa.gov
  2. From: david@jpl-devvax.jpl.nasa.gov (David E. Smyth)
  3. Newsgroups: comp.sources.x
  4. Subject: v10i057: wcl -- Widget Creation Library, Part09/11
  5. Message-ID: <4691@exodus.Eng.Sun.COM>
  6. Date: 18 Dec 90 02:05:25 GMT
  7. References: <csx-10i049:wcl@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 3193
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: david@jpl-devvax.jpl.nasa.gov (David E. Smyth)
  13. Posting-number: Volume 10, Issue 57
  14. Archive-name: wcl/part09
  15.  
  16. # to unbundle, "sh" this file -- DO NOT use csh
  17. #  SHAR archive format.  Archive created Fri Oct 19 09:33:17 PDT 1990
  18. echo x - WcActions.c
  19. sed 's/^X//' > WcActions.c <<'+FUNKY+STUFF+'
  20. X/*
  21. X** Copyright (c) 1990 Rodney J. Whitby
  22. X**
  23. X** This file was derived from work performed by David E. Smyth under the
  24. X** following copyright:
  25. X**
  26. X*******************************************************************************
  27. X** Copyright (c) 1990 David E. Smyth
  28. X**
  29. X** This file was derived from work performed by Martin Brunecky at
  30. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  31. X** following copyright:
  32. X**
  33. X*******************************************************************************
  34. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  35. X*
  36. X*                        All Rights Reserved
  37. X*
  38. X* Permission to use, copy, modify, and distribute this software and its
  39. X* documentation for any purpose and without fee is hereby granted, provided
  40. X* that the above copyright notice appears on all copies and that both the
  41. X* copyright and this permission notice appear in supporting documentation
  42. X* and that the name of Auto-trol not be used in advertising or publicity
  43. X* pertaining to distribution of the software without specific, prior written
  44. X* permission.
  45. X*
  46. X* Auto-trol disclaims all warranties with regard to this software, including
  47. X* all implied warranties of merchantability and fitness, in no event shall
  48. X* Auto-trol be liable for any special, indirect or consequential damages or
  49. X* any damages whatsoever resulting from loss of use, data or profits, whether
  50. X* in an action of contract, negligence or other tortious action, arising out
  51. X* of or in connection with the use or performance of this software.
  52. X*******************************************************************************
  53. X**
  54. X** Redistribution and use in source and binary forms are permitted
  55. X** provided that the above copyright notice and this paragraph are
  56. X** duplicated in all such forms and that any documentation, advertising
  57. X** materials, and other materials related to such distribution and use
  58. X** acknowledge that the software was developed by David E. Smyth.  The
  59. X** name of David E. Smyth may not be used to endorse or promote products
  60. X** derived from this software without specific prior written permission.
  61. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  62. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  63. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  64. X**
  65. X*/
  66. X
  67. X/*
  68. X* SCCS_data: @(#)WcActions.c 1.0 ( 30 June 1990 )
  69. X*
  70. X* Subsystem_group:
  71. X*
  72. X*     Widget Creation Library
  73. X*
  74. X* Module_description:
  75. X*
  76. X*     This module contains the convenience actions used to create and 
  77. X*     manage a widget tree using the Xrm databse.
  78. X*
  79. X*     Several convenience actions are provided with the package, allowing 
  80. X*     deferred widget creation, control (manage/unmanage) and other utility
  81. X*     functions.
  82. X*
  83. X* Module_interface_summary: 
  84. X*
  85. X*     Convenience Actions:
  86. X*
  87. X* Module_history:
  88. X*                                                  
  89. X*   All actions and the action registration routine were made by
  90. X*   Rod Whitby following about 30 June 1990.
  91. X*
  92. X* Design_notes:
  93. X*
  94. X*******************************************************************************
  95. X*/
  96. X/*
  97. X*******************************************************************************
  98. X* Include_files.
  99. X*******************************************************************************
  100. X*/
  101. X
  102. X#include "WcCreate.h"
  103. X#include "WcCreateP.h"
  104. X
  105. X/*
  106. X*******************************************************************************
  107. X* Private_type_declarations.
  108. X*******************************************************************************
  109. X*/
  110. X
  111. X/*
  112. X*******************************************************************************
  113. X* Private_macro_definitions.
  114. X*******************************************************************************
  115. X*/
  116. X
  117. X/*
  118. X*******************************************************************************
  119. X* Private_data_definitions.
  120. X*******************************************************************************
  121. X*/
  122. X
  123. Xstatic char msg[1024];
  124. X
  125. X/*
  126. X*******************************************************************************
  127. X* Private_function_declarations.
  128. X*******************************************************************************
  129. X*/
  130. X
  131. X#define COMMAS 1
  132. X#define NO_COMMAS 0
  133. X
  134. Xstatic char* AllocAndBuildString( params, num_params, commas )
  135. X    char *params[];
  136. X    int  *num_params;
  137. X    int   commas;
  138. X{
  139. X    char *data;
  140. X    int   len, i;
  141. X
  142. X    for ( len = 0, i = 0; i < *num_params; i++ )
  143. X        len += strlen( params[i] ) + 1;
  144. X
  145. X    data = XtMalloc(len + 1);
  146. X
  147. X    (void)strcpy(data, params[0]);
  148. X    for ( i = 1; i < *num_params; i++ )
  149. X    {
  150. X    if (commas)
  151. X        strcat(data, ",");
  152. X    else
  153. X        strcat(data, " ");
  154. X        (void)strcat(data, params[i]);
  155. X    }
  156. X    return data;
  157. X}
  158. X
  159. Xstatic void SendToCallback( callback, w, params, num_params, min_reqd, commas )
  160. X    XtCallbackProc callback;
  161. X    Widget         w;
  162. X    char          *params[];
  163. X    int           *num_params;
  164. X    int            min_reqd;
  165. X    int            commas;
  166. X{
  167. X    char* data;
  168. X
  169. X    if ( *num_params < min_reqd )
  170. X    {
  171. X    callback( w, "", NULL );
  172. X    return;
  173. X    }
  174. X
  175. X    data = AllocAndBuildString( params, num_params, commas );
  176. X
  177. X    callback( w, data, NULL );
  178. X    XtFree(data);
  179. X}
  180. X
  181. X/*
  182. X*******************************************************************************
  183. X* Public_action_function_declarations.
  184. X*******************************************************************************
  185. X*/
  186. X
  187. X/*
  188. X    -- Create Dynamic Children from Xrm Database
  189. X*******************************************************************************
  190. X    WcCreateChildrenACT( parent, child [, child ... ] )
  191. X*/
  192. Xvoid    WcCreateChildrenACT( w, event, params, num_params )
  193. X    Widget      w;
  194. X    XEvent     *event;
  195. X    String     *params;
  196. X    Cardinal   *num_params;
  197. X{
  198. X    SendToCallback( WcCreateChildrenCB, w, params, num_params, 2, COMMAS );
  199. X}
  200. X
  201. X/*
  202. X    -- Manage or Unmanage named widget(s)
  203. X*******************************************************************************
  204. X    WcManageACT  ( widget_path [, widget_path ... ] )
  205. X    WcUnmanageACT( widget_path [, widget_path ... ] )
  206. X*/
  207. Xvoid    WcManageACT( w, event, params, num_params )
  208. X    Widget    w;
  209. X    XEvent   *event;
  210. X    String   *params;
  211. X    Cardinal *num_params;
  212. X{
  213. X    SendToCallback( WcManageCB, w, params, num_params, 1, COMMAS );
  214. X}
  215. X
  216. Xvoid    WcUnmanageACT( w, event, params, num_params )
  217. X    Widget    w;
  218. X    XEvent   *event;
  219. X    String   *params;
  220. X    Cardinal *num_params;
  221. X{
  222. X    SendToCallback( WcUnmanageCB, w, params, num_params, 1, COMMAS );
  223. X}
  224. X
  225. X/*
  226. X    -- Manage or unamange named children action
  227. X*******************************************************************************
  228. X    WcManageChildrenACT  ( parent, child [, child ... ] )
  229. X    WcUnmanageChildrenACT( parent, child [, child ... ] )
  230. X*/
  231. Xvoid    WcManageChildrenACT( w, event, params, num_params )
  232. X    Widget    w;
  233. X    XEvent   *event;
  234. X    String   *params;
  235. X    Cardinal *num_params;
  236. X{
  237. X    SendToCallback( WcManageChildrenCB, w, params, num_params, 2, COMMAS );
  238. X}
  239. X
  240. Xvoid    WcUnmanageChildrenACT( w, event, params, num_params )
  241. X    Widget    w;
  242. X    XEvent   *event;
  243. X    String   *params;
  244. X    Cardinal *num_params;
  245. X{
  246. X    SendToCallback( WcUnmanageChildrenCB, w, params, num_params, 2, COMMAS );
  247. X}
  248. X
  249. X/*
  250. X    -- Destroy named children action
  251. X*******************************************************************************
  252. X    WcDestroyACT( widget_path [, widget_path ... ] )
  253. X*/
  254. Xvoid    WcDestroyACT( w, event, params, num_params )
  255. X    Widget    w;
  256. X    XEvent   *event;
  257. X    String   *params;
  258. X    Cardinal *num_params;
  259. X{
  260. X    SendToCallback( WcDestroyCB, w, params, num_params, 1, COMMAS );
  261. X}
  262. X
  263. X/*
  264. X    -- Set Resource Value on Widget
  265. X*******************************************************************************
  266. X    WcSetValueACT( widget_path.res_name: res_val )
  267. X*/
  268. Xvoid    WcSetValueACT( w, event, params, num_params )
  269. X    Widget    w;
  270. X    XEvent   *event;
  271. X    String   *params;
  272. X    Cardinal *num_params;
  273. X{
  274. X    /* note: blanks are optional, so we really don't know how many params 
  275. X    ** we get from the translation manager: anything from 1 to 3. 
  276. X    */
  277. X    SendToCallback( WcSetValueCB, w, params, num_params, 1, NO_COMMAS );
  278. X}
  279. X
  280. X/*
  281. X    -- Change sensitivity of widgets.
  282. X*******************************************************************************
  283. X    WcSetSensitiveACT  ( widget_path [, widget_path ... ] )
  284. X    WcSetInsensitiveACT( widget_path [, widget_path ... ] )
  285. X*/
  286. Xvoid    WcSetSensitiveACT( w, event, params, num_params )
  287. X    Widget    w;
  288. X    XEvent   *event;
  289. X    String   *params;
  290. X    Cardinal *num_params;
  291. X{
  292. X    SendToCallback( WcSetSensitiveCB, w, params, num_params, 1, COMMAS );
  293. X}
  294. X
  295. Xvoid    WcSetInsensitiveACT( w, event, params, num_params )
  296. X    Widget    w;
  297. X    XEvent   *event;
  298. X    String   *params;
  299. X    Cardinal *num_params;
  300. X{
  301. X    SendToCallback( WcSetInsensitiveCB, w, params, num_params, 1, COMMAS );
  302. X}
  303. X
  304. X/*
  305. X    -- Load Resource File
  306. X*******************************************************************************
  307. X    WcLoadResourceFileACT( file_name )
  308. X*/
  309. Xvoid    WcLoadResourceFileACT( w, event, params, num_params )
  310. X    Widget    w;
  311. X    XEvent   *event;
  312. X    String   *params;
  313. X    Cardinal *num_params;
  314. X{
  315. X    SendToCallback( WcLoadResourceFileCB, w, params, num_params, 1, COMMAS );
  316. X}
  317. X
  318. X/*
  319. X    -- WcTraceAction
  320. X*******************************************************************************
  321. X    WcTraceACT( [ annotation ] )
  322. X*/
  323. Xvoid    WcTraceACT( w, event, params, num_params )
  324. X    Widget    w;
  325. X    XEvent   *event;
  326. X    String   *params;
  327. X    Cardinal *num_params;
  328. X{
  329. X    SendToCallback( WcTraceCB, w, params, num_params, 1, COMMAS );
  330. X}
  331. X
  332. X/*
  333. X  -- Popup and Popdown named widget
  334. X*******************************************************************************
  335. X    WcPopupACT    ( widget_path )
  336. X    WcPopupGrabACT( widget_path )
  337. X    WcPopdownACT  ( widget_path )
  338. X*/
  339. Xvoid    WcPopupACT( w, event, params, num_params )
  340. X    Widget    w;
  341. X    XEvent   *event;
  342. X    String   *params;
  343. X    Cardinal *num_params;
  344. X{
  345. X    SendToCallback( WcPopupCB, w, params, num_params, 1, COMMAS );
  346. X}
  347. X
  348. Xvoid    WcPopupGrabACT( w, event, params, num_params )
  349. X    Widget    w;
  350. X    XEvent   *event;
  351. X    String   *params;
  352. X    Cardinal *num_params;
  353. X{
  354. X    SendToCallback( WcPopupGrabCB, w, params, num_params, 1, COMMAS );
  355. X}
  356. X
  357. Xvoid    WcPopdownACT( w, event, params, num_params )
  358. X    Widget    w;
  359. X    XEvent   *event;
  360. X    String   *params;
  361. X    Cardinal *num_params;
  362. X{
  363. X    SendToCallback( WcPopdownCB, w, params, num_params, 1, COMMAS );
  364. X}
  365. X
  366. X/*
  367. X  -- Map and Unmap named widget
  368. X*******************************************************************************
  369. X    WcMapACT  ( widget_path )
  370. X    WcUnmapACT( widget_path )
  371. X*/
  372. Xvoid    WcMapACT( w, event, params, num_params )
  373. X    Widget    w;
  374. X    XEvent   *event;
  375. X    String   *params;
  376. X    Cardinal *num_params;
  377. X{
  378. X    SendToCallback( WcMapCB, w, params, num_params, 1, COMMAS );
  379. X}
  380. X
  381. Xvoid    WcUnmapACT( w, event, params, num_params )
  382. X    Widget    w;
  383. X    XEvent   *event;
  384. X    String   *params;
  385. X    Cardinal *num_params;
  386. X{
  387. X    SendToCallback( WcUnmapCB, w, params, num_params, 1, COMMAS );
  388. X}
  389. X
  390. X/*
  391. X    -- Invoke shell command
  392. X*******************************************************************************
  393. X    WcSystemACT( any shell command line )
  394. X*/
  395. Xvoid    WcSystemACT( w, event, params, num_params )
  396. X    Widget    w;
  397. X    XEvent   *event;
  398. X    String   *params;
  399. X    Cardinal *num_params;
  400. X{
  401. X    SendToCallback( WcSystemCB, w, params, num_params, 1, NO_COMMAS );
  402. X}
  403. X
  404. X/*
  405. X    -- Exit the application
  406. X*******************************************************************************
  407. X    WcExitACT( [ integer_exit_code ] )
  408. X*/
  409. Xvoid    WcExitACT( w, event, params, num_params )
  410. X    Widget    w;
  411. X    XEvent   *event;
  412. X    String   *params;
  413. X    Cardinal *num_params;
  414. X{
  415. X    SendToCallback( WcExitCB, w, params, num_params, 1, COMMAS );
  416. X}
  417. X
  418. X/*
  419. X  -- WcRegisterWcActions
  420. X*******************************************************************************
  421. X   Convenience routine, registering all standard actions in one application
  422. X   call.   Called from WcWidgetCreation(), so application usually never needs
  423. X   to call this.
  424. X*/
  425. X
  426. Xvoid WcRegisterWcActions ( app )
  427. XXtAppContext app;
  428. X{
  429. X    static XtActionsRec WcActions[] = {
  430. X      {"WcCreateChildrenACT",    WcCreateChildrenACT    },
  431. X      {"WcManageACT",        WcManageACT        },
  432. X      {"WcUnmanageACT",        WcUnmanageACT        },
  433. X      {"WcManageChildrenACT",    WcManageChildrenACT    },
  434. X      {"WcUnmanageChildrenACT",    WcUnmanageChildrenACT    },
  435. X      {"WcDestroyACT",        WcDestroyACT        },
  436. X      {"WcSetValueACT",        WcSetValueACT        },
  437. X      {"WcSetSensitiveACT",    WcSetSensitiveACT    },
  438. X      {"WcSetInsensitiveACT",    WcSetInsensitiveACT    },
  439. X      {"WcLoadResourceFileACT",    WcLoadResourceFileACT    },
  440. X      {"WcTraceACT",        WcTraceACT        },
  441. X      {"WcPopupACT",        WcPopupACT        },
  442. X      {"WcPopupGrabACT",    WcPopupGrabACT        },
  443. X      {"WcPopdownACT",        WcPopdownACT        },
  444. X      {"WcMapACT",        WcMapACT        },
  445. X      {"WcUnmapACT",        WcUnmapACT        },
  446. X      {"WcSystemACT",        WcSystemACT        },
  447. X      {"WcExitACT",        WcExitACT        },
  448. X    };
  449. X
  450. X    ONCE_PER_XtAppContext( app );
  451. X
  452. X    XtAppAddActions(app, WcActions, XtNumber(WcActions));
  453. X}
  454. +FUNKY+STUFF+
  455. echo '-rw-r--r--  1 david       12898 Oct 18 17:06 WcActions.c    (as sent)'
  456. chmod u=rw,g=r,o=r WcActions.c
  457. ls -l WcActions.c
  458. echo x - WcAthenaP.h
  459. sed 's/^X//' > WcAthenaP.h <<'+FUNKY+STUFF+'
  460. X/*
  461. X** Copyright (c) 1990 David E. Smyth
  462. X** 
  463. X** Redistribution and use in source and binary forms are permitted
  464. X** provided that the above copyright notice and this paragraph are
  465. X** duplicated in all such forms and that any documentation, advertising
  466. X** materials, and other materials related to such distribution and use
  467. X** acknowledge that the software was developed by David E. Smyth.  The
  468. X** name of David E. Smyth may not be used to endorse or promote products
  469. X** derived from this software without specific prior written permission.
  470. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  471. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  472. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  473. X** 
  474. X*/
  475. X
  476. X/*
  477. X* SCCS_data: @(#)WcAthenaP.h 1.0 ( 19 June 1990 )
  478. X*/
  479. X
  480. X#ifndef _WcAthenaP_h_
  481. X#define _WcAthenaP_h_
  482. X
  483. X/* Core, Object, RectObj, WindowObj, 
  484. X** XmGadget, XmPrimitive, and XmComposite, 
  485. X** Shell, OverrideShell, WMShell, VendorShell, TopLevelShell, ApplicationShell, 
  486. X** Constraint, XmManager.
  487. X*/
  488. X#include <X11/IntrinsicP.h>
  489. X
  490. X/* include all the *P.h files in heirarchical order */
  491. X
  492. X#include <X11/CoreP.h>
  493. X#include <X11/ObjectP.h>
  494. X#include <X11/Xaw/SimpleP.h>
  495. X#include <X11/CompositeP.h>
  496. X#include <X11/ConstrainP.h>
  497. X
  498. X/* Core */
  499. X#include <X11/Xaw/ClockP.h>
  500. X#include <X11/Xaw/LogoP.h>
  501. X#include <X11/Xaw/MailboxP.h>
  502. X#include <X11/Xaw/SimpleP.h>
  503. X
  504. X/* Simple */
  505. X#include <X11/Xaw/GripP.h>
  506. X#include <X11/Xaw/LabelP.h>
  507. X#include <X11/Xaw/ListP.h>
  508. X#include <X11/Xaw/ScrollbarP.h>
  509. X#include <X11/Xaw/StripCharP.h>
  510. X#include <X11/Xaw/TextP.h>
  511. X
  512. X/* Label */
  513. X#include <X11/Xaw/CommandP.h>
  514. X#include <X11/Xaw/MenuButtoP.h>
  515. X#include <X11/Xaw/ToggleP.h>
  516. X
  517. X/* Sme */
  518. X#include <X11/Xaw/SmeP.h>
  519. X#include <X11/Xaw/SimpleMenP.h>
  520. X#include <X11/Xaw/SmeBSBP.h>
  521. X#include <X11/Xaw/SmeLineP.h>
  522. X
  523. X
  524. X/* Text */
  525. X#include <X11/Xaw/AsciiTextP.h>
  526. X#include <X11/Xaw/TextSrcP.h>
  527. X#include <X11/Xaw/AsciiSrcP.h>
  528. X#include <X11/Xaw/TextSinkP.h>
  529. X#include <X11/Xaw/AsciiSinkP.h>
  530. X
  531. X/* Composite and Constraint */
  532. X#include <X11/Xaw/BoxP.h>
  533. X#include <X11/Xaw/FormP.h>
  534. X#include <X11/Xaw/PanedP.h>
  535. X
  536. X/* Form */
  537. X#include <X11/Xaw/DialogP.h>
  538. X#include <X11/Xaw/ViewportP.h>
  539. X
  540. X#endif
  541. +FUNKY+STUFF+
  542. echo '-rw-r--r--  1 david        2168 Aug  6 09:36 WcAthenaP.h    (as sent)'
  543. chmod u=rw,g=r,o=r WcAthenaP.h
  544. ls -l WcAthenaP.h
  545. echo x - WcCallb.c
  546. sed 's/^X//' > WcCallb.c <<'+FUNKY+STUFF+'
  547. X/*
  548. X** Copyright (c) 1990 David E. Smyth
  549. X**
  550. X** This file was derived from work performed by Martin Brunecky at
  551. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  552. X** following copyright:
  553. X**
  554. X*******************************************************************************
  555. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  556. X*
  557. X*                        All Rights Reserved
  558. X*
  559. X* Permission to use, copy, modify, and distribute this software and its
  560. X* documentation for any purpose and without fee is hereby granted, provided
  561. X* that the above copyright notice appears on all copies and that both the
  562. X* copyright and this permission notice appear in supporting documentation
  563. X* and that the name of Auto-trol not be used in advertising or publicity
  564. X* pertaining to distribution of the software without specific, prior written
  565. X* permission.
  566. X*
  567. X* Auto-trol disclaims all warranties with regard to this software, including
  568. X* all implied warranties of merchantability and fitness, in no event shall
  569. X* Auto-trol be liable for any special, indirect or consequential damages or
  570. X* any damages whatsoever resulting from loss of use, data or profits, whether
  571. X* in an action of contract, negligence or other tortious action, arising out
  572. X* of or in connection with the use or performance of this software.
  573. X*******************************************************************************
  574. X**
  575. X** Redistribution and use in source and binary forms are permitted
  576. X** provided that the above copyright notice and this paragraph are
  577. X** duplicated in all such forms and that any documentation, advertising
  578. X** materials, and other materials related to such distribution and use
  579. X** acknowledge that the software was developed by David E. Smyth.  The
  580. X** name of David E. Smyth may not be used to endorse or promote products
  581. X** derived from this software without specific prior written permission.
  582. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  583. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  584. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  585. X**
  586. X*/
  587. X
  588. X/*
  589. X* SCCS_data: @(#)WcCallb.c 1.04 ( 30 September 1990 )
  590. X*
  591. X* Subsystem_group:
  592. X*
  593. X*     Widget Creation Library
  594. X*
  595. X* Module_description:
  596. X*
  597. X*     This module contains the convenience callbacks used to create and 
  598. X*     manage a widget tree using the Xrm databse.
  599. X*
  600. X*     Several convenience callbacks are provided with the package, allowing 
  601. X*     deferred widget creation, control (manage/unmanage) and other utility
  602. X*     functions.
  603. X*
  604. X* Module_interface_summary: 
  605. X*
  606. X*     Convenience Callbacks:
  607. X*
  608. X* Module_history:
  609. X*                                                  
  610. X*   Several of the callbacks and the callback registration routine were
  611. X*   originally written by Martin Brunecky at Auto-Trol, between about
  612. X*   the first of February 1990 until about 18 April 1990.
  613. X*
  614. X*   Additional callbacks and modifications to all callbacks and the
  615. X*   callback registration routine were made by David Smyth at Jet
  616. X*   Propulsion Laboratories following about 15 March 1990.
  617. X*
  618. X*   WcLoadResourceFileCB enhanced to remember which resource files have
  619. X*   been loaded (by resource file name, not complete path name).
  620. X
  621. X* Design_notes:
  622. X*
  623. X*   For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
  624. X*   (runtime) binding. But since most UNIX systems lack such capability,
  625. X*   we stick to the concept of "registration" routines.
  626. X*
  627. X*   All these callbacks could probably be declared as static.  They
  628. X*   were not because applications may want to link them to widgets
  629. X*   via C code.  
  630. X*
  631. X*   When Motif runs on release 4 Intrinsics, then all argument parsing
  632. X*   should be replaced with coverters, so conversions get cached.  This
  633. X*   will improve performance, especially for pop-ups.
  634. X*
  635. X*******************************************************************************
  636. X*/
  637. X/*
  638. X*******************************************************************************
  639. X* Include_files.
  640. X*******************************************************************************
  641. X*/
  642. X
  643. X#include "WcCreate.h"
  644. X#include "WcCreateP.h"
  645. X
  646. X/*
  647. X*******************************************************************************
  648. X* Private_type_declarations.
  649. X*******************************************************************************
  650. X*/
  651. X
  652. X/*
  653. X*******************************************************************************
  654. X* Private_macro_definitions.
  655. X*******************************************************************************
  656. X*/
  657. X
  658. X/*
  659. X*******************************************************************************
  660. X* Private_data_definitions.
  661. X*******************************************************************************
  662. X*/
  663. X
  664. X/* NOTE: These are shared arrays because they are large: i.e.,
  665. X** this is a performance optimization intended to reduce page
  666. X** faults which can occur while making large extensions to the
  667. X** stack space.  Wait a minute: wouldn't this just happen
  668. X** once, and then the stack space is alloc'd?  Yes, but a
  669. X** huge stack space runs the risk of getting swapped, which causes
  670. X** page faults.  This is probably a nit-picky sort of optimization.
  671. X** Remember that D.Smyth is an old sys programmer from the stone
  672. X** ages, and pity him instead of flaming him.
  673. X** Be careful when filling msg not to call any funcs in here, 
  674. X** so the message does not get garbled.
  675. X*/
  676. X
  677. Xstatic char    msg[MAX_ERRMSG];
  678. Xstatic char    cleanName[MAX_PATHNAME];
  679. Xstatic Widget    widget_list[MAX_CHILDREN];
  680. X
  681. X/*
  682. X*******************************************************************************
  683. X* Private_function_declarations.
  684. X*******************************************************************************
  685. X*/
  686. X
  687. X/*
  688. X*******************************************************************************
  689. X* Public_callback_function_declarations.
  690. X*******************************************************************************
  691. X    The client data argument of callbacks MUST be a null terminated
  692. X    string.  If client == (char*)0 this is an error.  The correct way
  693. X    to pass no client information is *client == '\0'. The CvtStringToCallback
  694. X    converter which actually causes these functions to be called (adds
  695. X    these functions to widget's callback lists) does ensure that the
  696. X    client data is a proper null terminated string.
  697. X
  698. X    Callbacks are not intended to be re-entrant nor recursive.  Many of
  699. X    these use static buffers.
  700. X*******************************************************************************
  701. X*/
  702. X
  703. X/*
  704. X    -- Create Dynamically Created Children from Xrm Database
  705. X*******************************************************************************
  706. X    This callback creates one or more specified children of a parent widget.
  707. X    If parent name is `this' then widget invoking callback is used as the
  708. X    parent.  Parent name can also be a wildcarded path name.  Child names
  709. X    must be single part, specific children of the parent. Client data format:
  710. X
  711. X             parent, child [,child] ...
  712. X    
  713. X    This callback is used for deferred sub-tree creation, where named child
  714. X    creation has been postponed because it was not included in a wcChildren
  715. X    resource value.
  716. X*/
  717. X
  718. Xvoid WcCreateChildrenCB ( w, parent_children, unused )
  719. X    Widget w;
  720. X    char* parent_children;    /* parent + list of named children */
  721. X    caddr_t unused;        /* call data from widget, not used */
  722. X{
  723. X    char*    children;
  724. X    Widget    parent;
  725. X
  726. X    if ( *parent_children == NUL ) 
  727. X    {
  728. X    XtWarning(
  729. X            "WcCreateChildrenCB ( ) - Failed \n\
  730. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  731. X                    Name of parent can be `this' or wildcarded pathname, \n\
  732. X                    Name of child must be single part name from parent. \n\
  733. X             Problem: No widget names provided.");
  734. X    return;
  735. X    }
  736. X
  737. X    children = WcCleanName( parent_children, cleanName );
  738. X
  739. X    children = WcSkipWhitespace_Comma( children );
  740. X
  741. X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
  742. X    {
  743. X    sprintf( msg,
  744. X            "WcCreateChildrenCB (%s) - Failed \n\
  745. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  746. X                    Name of parent can be `this' or wildcarded pathname, \n\
  747. X                    Name of child must be single part name from parent. \n\
  748. X             Problem: Parent widget named `%s' not found.",
  749. X        parent_children, cleanName);
  750. X    XtWarning( msg );
  751. X    return;
  752. X    }
  753. X
  754. X    if (*children == NUL)
  755. X    {
  756. X        sprintf( msg,
  757. X            "WcCreateChildrenCB (%s) - Failed \n\
  758. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  759. X                    Name of parent can be `this' or wildcarded pathname, \n\
  760. X                    Name of child must be single part name from parent. \n\
  761. X             Problem: No children names provided.",
  762. X        parent_children );
  763. X    XtWarning( msg );
  764. X        return;
  765. X    }
  766. X
  767. X    WcCreateNamedChildren ( parent, children );
  768. X}
  769. X
  770. X/******************************************************************************
  771. X**  Manage or Unmanage named widget(s)
  772. X*******************************************************************************
  773. X    This callback translates string passed in as client data into one or more
  774. X    widget ids, and manages or unmanages it or them.  Client data format:
  775. X    name [, name] ...
  776. X    Name can include `this' and other path names.
  777. X******************************************************************************/
  778. X
  779. X#ifdef FUNCTION_PROTOTYPES
  780. Xstatic void ManageOrUnmanage( Widget, char*, char*, void (*proc)() );
  781. X#else
  782. Xstatic void ManageOrUnmanage();
  783. X#endif
  784. X
  785. Xvoid WcManageCB ( w, widgetNames, unused )
  786. X    Widget w;
  787. X    char* widgetNames;
  788. X    caddr_t unused;        /* call data from widget, not used */
  789. X{
  790. X    ManageOrUnmanage( w, widgetNames, "WcManageCB", XtManageChildren );
  791. X}
  792. X
  793. Xvoid WcUnmanageCB ( w, widgetNames, unused )
  794. X    Widget w;
  795. X    char* widgetNames;
  796. X    caddr_t unused;             /* call data from widget, not used */
  797. X{
  798. X    ManageOrUnmanage( w, widgetNames, "WcUnmanageCB", XtUnmanageChildren );
  799. X}
  800. X
  801. Xstatic void ManageOrUnmanage ( w, widgetNames, callbackName, proc )
  802. X    Widget w;
  803. X    char* widgetNames;
  804. X    char* callbackName;
  805. X    void (*proc)();
  806. X{
  807. X    int         numWidgets = 0;
  808. X    char*       s = widgetNames;
  809. X
  810. X    while (*s && numWidgets < MAX_CHILDREN)
  811. X    {
  812. X        s = WcCleanName ( s, cleanName );
  813. X        s = WcSkipWhitespace_Comma ( s );
  814. X        if ( widget_list[numWidgets] = WcFullNameToWidget ( w, cleanName ) )
  815. X            numWidgets++;
  816. X        else
  817. X        {
  818. X            sprintf(msg,
  819. X            "%s (%s) - Widget `%s' ignored \n\
  820. X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
  821. X             Problem: Could not find widget named `%s'.",
  822. X             callbackName, widgetNames, cleanName, callbackName, cleanName);
  823. X            XtWarning( msg );
  824. X        }
  825. X    }
  826. X    if (numWidgets >= MAX_CHILDREN)
  827. X    {
  828. X    sprintf(msg,
  829. X            "%s (%s) - Failed \n\
  830. X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
  831. X             Problem: Too many widgets (more than MAX_CHILDREN).",
  832. X             callbackName, widgetNames, callbackName);
  833. X    XtWarning( msg );
  834. X    numWidgets = 0;
  835. X    }
  836. X
  837. X    if ( numWidgets )
  838. X        /* proc is either XtManageChildren or XtUnmanageChildren */
  839. X        proc ( widget_list, numWidgets );
  840. X}
  841. X
  842. X/*
  843. X    -- Manage or unamange named children callback
  844. X*******************************************************************************
  845. X    These callbacks translates a string passed in as client data into a parent
  846. X    widget id, and names of children of that parent.  If parent name is
  847. X    `this' then widget invoking callback is used as the parent.  Parent
  848. X    name can also be a wildcarded path name.  Child names must be single
  849. X    part, specific children of the parent. Client data format:
  850. X
  851. X             parent, child [,child] ...
  852. X
  853. X    This callback can be used as an alternate for WcManageCB but it is
  854. X    really intended to be used to manage/unmanage children of widgets 
  855. X    which have multiple instances, and where the parent name is `this'.
  856. X*/
  857. X#ifdef FUNCTION_PROTOTYPES
  858. Xstatic void ManageOrUnmanageChildren( Widget, char*, char*, void (*proc)() );
  859. X#else
  860. Xstatic void ManageOrUnmanageChildren();
  861. X#endif
  862. X
  863. Xvoid WcManageChildrenCB ( w, parent_children, unused )
  864. X    Widget     w;
  865. X    char*    parent_children;/* client data, list of named children  */
  866. X    caddr_t    unused;        /* call data from widget        */
  867. X{
  868. X    ManageOrUnmanageChildren( w, parent_children, 
  869. X                "WcManageChildrenCB", XtManageChildren );
  870. X}
  871. X
  872. Xvoid WcUnmanageChildrenCB ( w, parent_children, unused )
  873. X    Widget      w;
  874. X    char*       parent_children;/* client data, list of named children  */
  875. X    caddr_t     unused;         /* call data from widget                */
  876. X{
  877. X    ManageOrUnmanageChildren( w, parent_children,
  878. X                                "WcUnmanageChildrenCB", XtUnmanageChildren );
  879. X}
  880. X
  881. Xstatic void ManageOrUnmanageChildren( w, parent_children, callbackName, proc )
  882. X    Widget w;
  883. X    char* parent_children;      /* client data, list of named children  */
  884. X    char* callbackName;        /* WcManageChildrenCB or WcUnmanageChildrenCB */
  885. X    void (*proc)();        /* XtManageChildren or XtUnmanageChildren */
  886. X{
  887. X    int             numWidgets = 0;
  888. X    char*        next;
  889. X    Widget        parent;
  890. X
  891. X    if ( *parent_children == NUL )
  892. X    {
  893. X        sprintf(msg,
  894. X            "%s ( ) - Failed \n\
  895. X             Usage: %s ( parent, child [, child ] ...) \n\
  896. X                    Name of parent can be `this' or wildcarded pathname, \n\
  897. X                    Name of child must be single part name from parent. \n\
  898. X             Problem: No widget names provided.",
  899. X        callbackName, callbackName);
  900. X    XtWarning( msg );
  901. X        return;
  902. X    }
  903. X
  904. X    next = WcCleanName( parent_children, cleanName );
  905. X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
  906. X    {
  907. X        sprintf( msg,
  908. X            "%s (%s) - Failed \n\
  909. X             Usage: %s ( parent, child [, child ] ...) \n\
  910. X                    Name of parent can be `this' or wildcarded pathname, \n\
  911. X                    Name of child must be single part name from parent. \n\
  912. X             Problem: Parent widget named `%s' not found.",
  913. X            callbackName, parent_children, callbackName, cleanName);
  914. X        XtWarning( msg );
  915. X        return;
  916. X    }
  917. X
  918. X    while (*next && numWidgets < MAX_CHILDREN)
  919. X    {
  920. X        next = WcCleanName( next, cleanName );
  921. X    if (widget_list[numWidgets] = WcChildNameToWidget( parent, cleanName ))
  922. X        numWidgets++;
  923. X    else
  924. X    {
  925. X        sprintf( msg,
  926. X            "%s (%s) - Child `%s' ignored \n\
  927. X             Usage: %s ( parent, child [, child ] ...) \n\
  928. X                    Name of parent can be `this' or wildcarded pathname, \n\
  929. X                    Name of child must be single part name from parent. \n\
  930. X             Problem: Child widget named `%s' not found.",
  931. X        callbackName, parent_children, callbackName, cleanName);
  932. X        XtWarning( msg );
  933. X    }
  934. X    }
  935. X
  936. X    if (numWidgets >= MAX_CHILDREN)
  937. X    {
  938. X        sprintf(msg,
  939. X            "%s (%s) - Failed \n\
  940. X             Usage: %s ( parent, child [, child ] ...) \n\
  941. X                    Name of parent can be `this' or wildcarded pathname, \n\
  942. X                    Name of child must be single part name from parent. \n\
  943. X             Problem: Too many widgets (more than MAX_CHILDREN).",
  944. X             callbackName, parent_children, callbackName);
  945. X        XtWarning( msg );
  946. X        numWidgets = 0;
  947. X    }
  948. X
  949. X    if ( numWidgets )
  950. X        /* proc is either XtManageChildren or XtUnmanageChildren */
  951. X        proc ( widget_list, numWidgets );
  952. X}
  953. X
  954. X/*
  955. X    -- Destroy named children callback
  956. X*******************************************************************************
  957. X    This callback translates string passed in as client data into a widget id
  958. X    and destroys it. A comma separated list of widgets can be specified.
  959. X    `this' means the invoking widget.
  960. X*/
  961. X
  962. Xvoid WcDestroyCB ( w, widgetNames, unused )
  963. X    Widget  w;
  964. X    char*   widgetNames;    /* client data, widgets to be destroyed */
  965. X    caddr_t unused;        /* call data from widget, not used    */
  966. X{
  967. X    int        widget_count = MAX_CHILDREN;
  968. X    char*    unConvertedNames;
  969. X    int         i;
  970. X
  971. X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames, 
  972. X                    widget_list, &widget_count );
  973. X    if ( unConvertedNames[0] != NUL )
  974. X    {
  975. X    sprintf(msg,
  976. X            "WcDestroyCB (%s) \n\
  977. X             Usage: WcDestroyCB ( widget [, widget ] ...) \n\
  978. X                    Name of widget can be `this' or wildcarded pathname. \n\
  979. X            Problem: No widgets found named %s.",
  980. X             widgetNames, unConvertedNames);
  981. X        XtWarning( msg );
  982. X    }
  983. X
  984. X    for (i=0; i<widget_count; i++)
  985. X       XtDestroyWidget ( widget_list[i] );
  986. X}
  987. X
  988. X/*
  989. X    -- Parse name_res_resVal into name, res, resVal
  990. X*******************************************************************************
  991. X    This is a private function to WcSetValueCB()
  992. X*/
  993. X
  994. Xstatic void 
  995. XParseNameResResVal( name_res_resVal, target_name, resource, res_val )
  996. X    char* name_res_resVal;    /* input */
  997. X    char* target_name;        /* output */
  998. X    char* resource;        /* output */
  999. X    char* res_val;        /* output */
  1000. X{
  1001. X    register char *d,*s;
  1002. X
  1003. X    s = name_res_resVal;
  1004. X    /* copy from name_res_resVal into target_name[],
  1005. X    ** ignore initial whitespace, stop at trailing `:'  
  1006. X    ** Then backup to get final segment, the resource name
  1007. X    */
  1008. X    for ( s = name_res_resVal ; *s && *s <= ' ' ; s++ )
  1009. X    ;    /* skip initial whitespace */
  1010. X    for ( d = target_name ; *s && *s != ':' ; s++, d++ )
  1011. X    *d = *s;
  1012. X    for ( ; target_name < d && (*d != '.' && *d != '*') ; s--, d-- )
  1013. X    ;
  1014. X    *d = NUL;
  1015. X
  1016. X    /* OK, now target_name is null terminated.
  1017. X    ** s points at final `.' or `*' in name_resName, 
  1018. X    ** now we copy to resource[].
  1019. X    */
  1020. X    for ( s++, d = resource ; *s && *s != ':' ; s++, d++ )
  1021. X        *d = *s;
  1022. X    *d = NUL;
  1023. X
  1024. X    /* OK, now resource is null terminated.
  1025. X    ** s points at the `:' now we skip whitespace and the rest is value
  1026. X    ** until we hit the NUL terminator.
  1027. X    */
  1028. X    for (s++ ; *s && *s <= ' ' ; s++ )
  1029. X        ;       /* skip initial whitespace */
  1030. X    for (d = res_val ; *s ; s++, d++ )
  1031. X    *d = *s;
  1032. X    do
  1033. X    *d = NUL;    /* null terminate, delete trailing whitespace */
  1034. X    while (*--d <= ' ');
  1035. X}
  1036. X
  1037. X/*
  1038. X   -- Set Resource Value on Widget
  1039. X*******************************************************************************
  1040. X    This callback sets a resource value on the named widget.
  1041. X
  1042. X    The client data argument has a format:
  1043. X
  1044. X        target_widget_name.resource_name: resource value
  1045. X
  1046. X    The special resource value of "this" means "this widget."  Typically,
  1047. X    using "this" as the resource value is used to set the "XmNdefaultButton"
  1048. X    resource on a XmbulletinBoard, "menuBar", "workArea", etc on XmMainWindows,
  1049. X    the subMenuId resource on menuBar cascade buttons, and so on.
  1050. X
  1051. X    Just about everything this function does is related to providing
  1052. X    nice error messages.
  1053. X*/
  1054. X
  1055. Xvoid WcSetValueCB ( w, name_res_resVal, unused )
  1056. X    Widget  w;  
  1057. X    char*   name_res_resVal;        /* client data: name.resName: resVal */
  1058. X    caddr_t unused;            /* call data from wudget, not used   */
  1059. X{
  1060. X    /* Note: static buffers make this routine NON-REENTRANT!! */
  1061. X    static char    target_name[MAX_XRMSTRING];
  1062. X    static char    resource[MAX_XRMSTRING];
  1063. X    static char    res_val[MAX_XRMSTRING];
  1064. X
  1065. X    Widget    target;
  1066. X    Widget    res_widget;
  1067. X    char*    res_type;    /* must be XtFree'd */
  1068. X
  1069. X    ParseNameResResVal( name_res_resVal, target_name, resource, res_val );
  1070. X
  1071. X    /* Check for syntax error: if any of the strings are null, wrongo!
  1072. X    */
  1073. X    if ( target_name[0] == NUL || resource[0] == NUL || res_val[0] == NUL )
  1074. X    {
  1075. X        char *missing;
  1076. X
  1077. X        if (target_name[0] == NUL) missing = "target_widget_name";
  1078. X        else if (resource[0] == NUL) missing = "res_name";
  1079. X        else if (res_val[0] == NUL) missing = "res_value";
  1080. X
  1081. X        sprintf ( msg,
  1082. X            "WcSetValueCB (%s) - Failed \n\
  1083. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  1084. X             Problem: Missing %s argument.",
  1085. X            name_res_resVal, missing );
  1086. X        XtWarning( msg ); 
  1087. X    return;
  1088. X    }
  1089. X
  1090. X    /* See if we can find the target widget */
  1091. X    if (! (target = WcFullNameToWidget( w, target_name )) )
  1092. X    {
  1093. X        sprintf ( msg,
  1094. X            "WcSetValueCB (%s)  \n\
  1095. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  1096. X             Problem: Could not find widget named `%s'",
  1097. X             name_res_resVal, target_name );
  1098. X        XtWarning( msg );
  1099. X        return;
  1100. X    }
  1101. X
  1102. X    /* Make certain widget has this resource type */
  1103. X    if (! (res_type = WcGetResourceType( target, resource )) )
  1104. X    {
  1105. X    sprintf ( msg,
  1106. X            "WcSetValueCB (%s) - Failed \n\
  1107. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  1108. X             Problem: widget %s does not have a resource named %s.",
  1109. X    name_res_resVal, target_name, resource);
  1110. X        XtWarning(msg);
  1111. X    return;
  1112. X    }
  1113. X
  1114. X    /* Try this heuristic: if the resource type has "Widget" somewhere within
  1115. X    ** it, then see if we can convert the resource value to a widget using 
  1116. X    ** WcFullNameToWidget.  This allow relative naming from the calling
  1117. X    ** widget, including `this' or ^^foobar.
  1118. X    ** WcStrStr( res_type, "Widget") returns NULL if "Widget" is not in res_type
  1119. X    */
  1120. X    if ( WcStrStr( res_type, "Widget") 
  1121. X#ifdef MOTIF
  1122. X    || WcStrStr( res_type, "Window")  /* wrong: but that's a menuWidget */
  1123. X#endif
  1124. X    )
  1125. X    {
  1126. X    Widget    res_widget;
  1127. X    Arg    arg[1];
  1128. X
  1129. X    if (res_widget = WcFullNameToWidget( w, res_val ))
  1130. X    {
  1131. X        XtSetArg( arg[0], resource, res_widget);
  1132. X        XtSetValues( target, arg, 1 );
  1133. X        return;
  1134. X    }
  1135. X    }
  1136. X
  1137. X    /* We have the type, so do conversion, and then call XtSetValues. */
  1138. X
  1139. X    WcSetValueFromStringAndType( target, resource, res_val, res_type );
  1140. X    XtFree( res_type );
  1141. X}
  1142. X
  1143. X/*
  1144. X    -- Change sensitivity of widgets.
  1145. X*******************************************************************************
  1146. X    This callback translates string passed in as client data into widget ids
  1147. X    and sets each to be sensitve/insensitive. A comma separated list of 
  1148. X    widgets can be specified.  `this' means the invoking widget.  
  1149. X
  1150. X    This callback someday should take care of the problem with text
  1151. X    widgets - they don't get grey when insensitive, which must be a bug.
  1152. X*/
  1153. X
  1154. X#ifdef FUNCTION_PROTOTYPES
  1155. Xstatic void ChangeSensitivity( Widget, char*, char*, int );
  1156. X#else
  1157. Xstatic void ChangeSensitivity();
  1158. X#endif
  1159. X
  1160. Xvoid WcSetSensitiveCB ( w, widgetNames, unused )
  1161. X    Widget  w;
  1162. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  1163. X    caddr_t unused;        /* call data from widget is not used    */
  1164. X{
  1165. X    ChangeSensitivity ( w, widgetNames, "WcSetSensitiveCB", (Boolean)TRUE );
  1166. X}
  1167. X
  1168. Xvoid WcSetInsensitiveCB ( w, widgetNames, unused )
  1169. X    Widget  w;
  1170. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  1171. X    caddr_t unused;             /* call data from widget is not used    */
  1172. X{
  1173. X    ChangeSensitivity ( w, widgetNames, "WcSetInsensitiveCB", (Boolean)FALSE );
  1174. X}
  1175. X
  1176. Xstatic void ChangeSensitivity ( w, widgetNames, callbackName, sensitive )
  1177. X    Widget  w;
  1178. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  1179. X    char*   callbackName;    /* "WcSetSensitiveCB" or "WcSetInsensitiveCB" */
  1180. X    int     sensitive;
  1181. X{
  1182. X    int    widget_count = MAX_CHILDREN;
  1183. X    char*  unConvertedNames;
  1184. X    int    i;
  1185. X
  1186. X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames,
  1187. X                                    widget_list, &widget_count );
  1188. X    if ( unConvertedNames[0] != NUL )
  1189. X    {
  1190. X        sprintf(msg,
  1191. X            "%s (%s) - One or more widget names ignored \n\
  1192. X             Usage: %s ( widget [, widget ] ...) \n\
  1193. X                    Name of widget can be `this' or wildcarded pathname. \n\
  1194. X                    Problem: No widgets found named %s.",
  1195. X             callbackName, widgetNames, callbackName, unConvertedNames);
  1196. X        XtWarning( msg );
  1197. X    }
  1198. X
  1199. X    for (i=0; i<widget_count; i++)
  1200. X    XtSetSensitive ( widget_list[i], sensitive );
  1201. X}
  1202. X
  1203. X/*
  1204. X    -- Load Resource File
  1205. X*******************************************************************************
  1206. X    This callbacks loads specified resource file into application
  1207. X    resource database. It allows to load resources on as-needed
  1208. X    basis, reducing the intitial resource file load overhead. 
  1209. X    The file to load is specified as client data. The directory search 
  1210. X    for the file (should be) the same as for application class resource file.
  1211. X    
  1212. X    To prevent repeated loads of the same file, the callback keeps
  1213. X    track of each filename.  Note that I do not allow a file to be
  1214. X    re-loaded even if it is changed, or if a new file of the same 
  1215. X    name appears on the search path.  This was done for two reasons:
  1216. X    first, it makes the code more portable, as I don't have to depend
  1217. X    upon various system calls.  Second, resources can't be un-written,
  1218. X    so a user might get the wrong impression that a resource specification
  1219. X    can be deleted, and the resource file re-loaded, and something will
  1220. X    happen.  It just isn't so.
  1221. X
  1222. X    NOTE:
  1223. X    The file search list rule used here is a gross simplification of the R3
  1224. X    resource file search mechanism, without the $LANG provision.
  1225. X    I hope I can use R4 soon and do it RIGHT, but I depend on Motif for now,
  1226. X    and do not want to duplicate all the Motif code here.
  1227. X    Here I look into two directories only, which may be defined as environmental
  1228. X    variables:
  1229. X         XAPPLRESDIR  - defaults to "/usr/lib/X11/app-defaults/"
  1230. X     XUSERRESDIR  - defaults to HOME directory
  1231. X*/
  1232. X
  1233. X#ifdef VAX
  1234. X#define XAPPLRESDIR "sys$library:"
  1235. X#else
  1236. X#define XAPPLRESDIR "/usr/lib/X11/app-defaults/"
  1237. X#endif
  1238. X
  1239. Xvoid WcLoadResourceFileCB ( w,  resFileName, unused )
  1240. X    Widget w;
  1241. X    char*  resFileName;    /* client data, X resources file name */
  1242. X    caddr_t unused;    /* call data,   not used */
  1243. X{
  1244. X    static char        name[MAX_PATHNAME];        /* so not on stack */
  1245. X    XrmQuark        nameQ;
  1246. X    static XrmQuark    nameQuarks[MAX_RES_FILES];    /* initially all 0 */
  1247. X    int            i;
  1248. X    char*        path;
  1249. X    static char        filename[MAX_PATHNAME];        /* so not on stack */
  1250. X    XrmDatabase        rdb;
  1251. X    Display*        dpy = XtDisplay(w);
  1252. X    extern char*    getenv();
  1253. X    Boolean        found = FALSE;
  1254. X
  1255. X    (void) WcCleanName( resFileName, name );
  1256. X
  1257. X/*  -- check pathname presence */
  1258. X    if ( *name == NUL )
  1259. X    {
  1260. X        XtWarning ( 
  1261. X            "WcLoadResourceFileCB () - Failed \n\
  1262. X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
  1263. X             Problem: No file name provided.");
  1264. X        return;
  1265. X    }
  1266. X
  1267. X/*  -- check for repeated load, remember if first load */
  1268. X    nameQ = XrmStringToQuark( name );
  1269. X    i = 0;
  1270. X    while ( nameQuarks[i] && i < MAX_RES_FILES )
  1271. X    {
  1272. X    if ( nameQuarks[i] == nameQ )
  1273. X        return;            /* NB: not an error, its even common */
  1274. X    else
  1275. X        i++;
  1276. X    }
  1277. X    nameQuarks[i] = nameQ;
  1278. X
  1279. X/*  -- Look for file in application class resources file directory */
  1280. X    if ((path = getenv("XAPPLRESDIR")) == NULL) 
  1281. X    {
  1282. X    path = XAPPLRESDIR ;
  1283. X    } 
  1284. X    strcpy ( filename, path );
  1285. X    strcat ( filename, name );
  1286. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  1287. X    {
  1288. X    XrmMergeDatabases (rdb, &(dpy->db) );
  1289. X    found = TRUE;
  1290. X    }    
  1291. X
  1292. X#ifdef I_DONT_KNOW_WHY_THIS_IS_HERE
  1293. X/*  -- Look for file in user class resources file directory */
  1294. X    if ((path = getenv("XUSERRESDIR")) == NULL) 
  1295. X    {
  1296. X    path = ( char* )malloc (MAX_PATHNAME);
  1297. X        strcpy ( path, RootDirName(filename));
  1298. X    } 
  1299. X    strcpy ( filename, path );
  1300. X    strcat ( filename, name );
  1301. X    free   ( path );
  1302. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  1303. X    {
  1304. X    XrmMergeDatabases (rdb, &(dpy->db) );
  1305. X        found = TRUE;
  1306. X    }
  1307. X#endif
  1308. X
  1309. X/*  -- Look for file in current working directory */
  1310. X    strcpy ( filename, name );
  1311. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  1312. X    {
  1313. X        XrmMergeDatabases (rdb, &(dpy->db) );
  1314. X        found = TRUE;
  1315. X    }
  1316. X
  1317. X/*  -- warn the user if no file found */
  1318. X    if (!found)
  1319. X    {
  1320. X    sprintf  ( msg, 
  1321. X            "WcLoadResourceFileCB (%s) - Failed \n\
  1322. X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
  1323. X             Problem: Cannot load resource file %s",
  1324. X    resFileName, name );
  1325. X    XtWarning( msg );
  1326. X    }
  1327. X}
  1328. X
  1329. X/*
  1330. X  -- WcTraceCallback
  1331. X*******************************************************************************
  1332. X    This is a simple traceback callback, used to assist in interface
  1333. X    debugging. The callback prints the invoking wiget pathname and
  1334. X    a specified message on std. output.
  1335. X*/
  1336. X
  1337. Xvoid WcTraceCB ( w, annotation, unused )
  1338. X    Widget w;
  1339. X    char* annotation;    /* client data, traceback annotation */
  1340. X    caddr_t unused;    /* call data,   not used */
  1341. X{
  1342. X    char* name = WcWidgetToFullName( w );
  1343. X    
  1344. X    printf("TraceCB for %s: %s\n", name, annotation );
  1345. X    XtFree( name );
  1346. X}
  1347. X
  1348. X/*
  1349. X  -- Popup named widget
  1350. X*******************************************************************************
  1351. X    These callbacks translate a string passed in as client data into a 
  1352. X    widget id.  
  1353. X
  1354. X    A grab kind value of XtGrabNone has the effect of allowing 
  1355. X    non-modal popups.  This is the preferred type: rarely use modal pop-ups.
  1356. X    This is registered as PopupCB.
  1357. X
  1358. X    A grab kind value of XtGrabExclusive has the effect of grabbing all
  1359. X    application events, allowing modal popups.  This is registered as 
  1360. X    PopupGrabCB.
  1361. X*/
  1362. X
  1363. X#ifdef FUNCTION_PROTOTYPES
  1364. Xstatic void Popup ( Widget, char*, char*, XtGrabKind );
  1365. X#else
  1366. Xstatic void Popup ();
  1367. X#endif
  1368. X
  1369. Xvoid WcPopupCB ( w, name, unused )
  1370. X    Widget      w;
  1371. X    char*       name;
  1372. X    caddr_t    unused;
  1373. X{
  1374. X    Popup ( w, name, "WcPopupCB", XtGrabNone );
  1375. X}
  1376. X
  1377. Xvoid WcPopupGrabCB ( w, name, unused )
  1378. X    Widget      w;
  1379. X    char*       name;
  1380. X    caddr_t     unused;
  1381. X{
  1382. X    Popup ( w, name, "WcPopupGrabCB", XtGrabExclusive );
  1383. X}
  1384. X
  1385. Xstatic void Popup ( w, name, callbackName, grab )
  1386. X    Widget    w;
  1387. X    char*    name;
  1388. X    char*    callbackName;
  1389. X    XtGrabKind    grab;
  1390. X{
  1391. X    Widget      widget;
  1392. X
  1393. X    (void)WcCleanName ( name, cleanName );
  1394. X    widget = WcFullNameToWidget ( w, cleanName );
  1395. X
  1396. X    if (XtIsShell(widget))
  1397. X    {
  1398. X        XtPopup  ( widget, grab );
  1399. X    }
  1400. X    else
  1401. X    {
  1402. X        sprintf( msg,
  1403. X            "%s (%s) - Failed \n\
  1404. X             Usage: %s (shell_widget_name) \n\
  1405. X             Problem: `%s' is not a shell widget.",
  1406. X             callbackName, name, callbackName, cleanName);
  1407. X        XtWarning( msg );
  1408. X    }
  1409. X}
  1410. X
  1411. X/*
  1412. X  -- Popdown named widget
  1413. X*******************************************************************************
  1414. X    This callback translates string passed in as client data into a widget id
  1415. X    and pops-down a popup shell widget.
  1416. X*/
  1417. X
  1418. Xvoid WcPopdownCB ( w, name, unused ) 
  1419. X    Widget    w;
  1420. X    char*    name;
  1421. X    caddr_t    unused;
  1422. X{
  1423. X    Widget      widget;
  1424. X
  1425. X    (void)WcCleanName ( name, cleanName );
  1426. X    widget = WcFullNameToWidget ( w, cleanName );
  1427. X
  1428. X    if (XtIsShell(widget))
  1429. X    {
  1430. X        XtPopdown  ( widget );
  1431. X    }
  1432. X    else
  1433. X    {
  1434. X        sprintf( msg,
  1435. X            "WcPopdownCB (%s) Failed \n\
  1436. X             Usage: WcPopdownCB (shell_widget_name) \n\
  1437. X             Problem: `%s' is not a shell widget.",
  1438. X             name, cleanName);
  1439. X        XtWarning( msg );
  1440. X    }
  1441. X}
  1442. X
  1443. X/*
  1444. X  -- Map and Unmap named widget
  1445. X*******************************************************************************
  1446. X    These callbacks translate a string passed as client data into a widget id
  1447. X    and invokes either XtMapWidget() os XtUnmapWidget() as appropriate.
  1448. X*/
  1449. X
  1450. Xvoid WcMapCB (w, name, unused )
  1451. X    Widget      w;
  1452. X    char*       name;
  1453. X    caddr_t     unused;
  1454. X{
  1455. X    Widget      widget;
  1456. X
  1457. X    (void)WcCleanName ( name, cleanName );
  1458. X    widget = WcFullNameToWidget ( w, cleanName );
  1459. X
  1460. X    if (XtIsShell(widget))
  1461. X    {
  1462. X        XtMapWidget ( widget );
  1463. X    }
  1464. X    else
  1465. X    {
  1466. X        sprintf( msg,
  1467. X            "WcMapCB (%s) Failed \n\
  1468. X             Usage: WcMapCB (shell_widget_name) \n\
  1469. X             Problem: `%s' is not a shell widget.",
  1470. X             name, cleanName);
  1471. X        XtWarning( msg );
  1472. X    }
  1473. X}
  1474. X
  1475. Xvoid WcUnmapCB (w, name, unused )
  1476. X    Widget      w;
  1477. X    char*       name;
  1478. X    caddr_t     unused;
  1479. X{
  1480. X    Widget      widget;
  1481. X
  1482. X    (void)WcCleanName ( name, cleanName );
  1483. X    widget = WcFullNameToWidget ( w, cleanName );
  1484. X
  1485. X    if (XtIsShell(widget))
  1486. X    {
  1487. X        XtUnmapWidget ( widget );
  1488. X    }
  1489. X    else
  1490. X    {
  1491. X        sprintf( msg,
  1492. X            "WcUnmapCB (%s) Failed \n\
  1493. X             Usage: WcUnmapCB (shell_widget_name) \n\
  1494. X             Problem: `%s' is not a shell widget.",
  1495. X             name, cleanName);
  1496. X        XtWarning( msg );
  1497. X    }
  1498. X}
  1499. X
  1500. X/*
  1501. X  -- Invoke shell command
  1502. X*******************************************************************************
  1503. X    Call system().
  1504. X*/
  1505. X
  1506. Xvoid WcSystemCB ( w, shellCmdString, unused )
  1507. X    Widget      w;
  1508. X    char*       shellCmdString;
  1509. X    caddr_t     unused;
  1510. X{
  1511. X    system( shellCmdString );
  1512. X}
  1513. X
  1514. X/*
  1515. X  -- Exit the application
  1516. X*******************************************************************************
  1517. X    Call exit().
  1518. X*/
  1519. X
  1520. Xvoid WcExitCB ( w, exitValString, unused )
  1521. X    Widget    w;
  1522. X    char*    exitValString;
  1523. X    caddr_t    unused;
  1524. X{
  1525. X    int exitval = 0;
  1526. X
  1527. X    /* skip leading garbage before int */
  1528. X    while (*exitValString)
  1529. X    {
  1530. X        if ('0' < *exitValString && *exitValString <= '9')
  1531. X            break; /* found numbers, convert to exitval */
  1532. X        exitValString++;
  1533. X    }
  1534. X
  1535. X    /* convert to int */
  1536. X    while (*exitValString)
  1537. X    {
  1538. X        if ('0' < *exitValString && *exitValString <= '9')
  1539. X        {
  1540. X            exitval = exitval * 10 + (*exitValString - '0');
  1541. X            exitValString++;
  1542. X        }
  1543. X        else
  1544. X            break;  /* ignore trailing garbage */
  1545. X    }
  1546. X
  1547. X    exit( exitval );
  1548. X}
  1549. X
  1550. X/*
  1551. X  -- WcRegisterCreateCallbacks
  1552. X*******************************************************************************
  1553. X   Convenience routine, registering all standard callbacks in one application
  1554. X   call.   Called from WcWidgetCreation(), so application usually never needs
  1555. X   to call this.
  1556. X*/
  1557. X
  1558. Xvoid WcRegisterWcCallbacks ( app )
  1559. XXtAppContext app;
  1560. X{
  1561. X#define RCALL( name, func ) WcRegisterCallback ( app, name, func, NULL )
  1562. X
  1563. X    /* ONCE_PER_XtAppContext( app ); */
  1564. X    static int already = 0;
  1565. X    if (already++)
  1566. X    return;
  1567. X
  1568. X    RCALL( "WcCreateChildrenCB",    WcCreateChildrenCB    );
  1569. X    RCALL( "WcManageCB",        WcManageCB        );
  1570. X    RCALL( "WcUnmanageCB",        WcUnmanageCB        );
  1571. X    RCALL( "WcManageChildrenCB",    WcManageChildrenCB    );
  1572. X    RCALL( "WcUnmanageChildrenCB",    WcUnmanageChildrenCB    );
  1573. X    RCALL( "WcDestroyCB",        WcDestroyCB        );
  1574. X    RCALL( "WcSetValueCB",        WcSetValueCB        );
  1575. X    RCALL( "WcSetSensitiveCB",        WcSetSensitiveCB    );
  1576. X    RCALL( "WcSetInsensitiveCB",    WcSetInsensitiveCB    );
  1577. X    RCALL( "WcLoadResourceFileCB",    WcLoadResourceFileCB    );
  1578. X    RCALL( "WcTraceCB",            WcTraceCB        );
  1579. X    RCALL( "WcPopupCB",            WcPopupCB        );
  1580. X    RCALL( "WcPopupGrabCB",        WcPopupGrabCB        );
  1581. X    RCALL( "WcPopdownCB",        WcPopdownCB        );
  1582. X    RCALL( "WcMapCB",            WcMapCB            );
  1583. X    RCALL( "WcUnmapCB",            WcUnmapCB        );
  1584. X    RCALL( "WcSystemCB",        WcSystemCB        );
  1585. X    RCALL( "WcExitCB",            WcExitCB        );
  1586. X
  1587. X#undef CALLBACK
  1588. X}
  1589. +FUNKY+STUFF+
  1590. echo '-rw-r--r--  1 david       34636 Oct 16 14:35 WcCallb.c    (as sent)'
  1591. chmod u=rw,g=r,o=r WcCallb.c
  1592. ls -l WcCallb.c
  1593. exit 0
  1594.  
  1595. From david@jpl-devvax.jpl.nasa.gov Tue Oct 23 13:05:49 1990
  1596. Return-Path: <david@jpl-devvax.jpl.nasa.gov>
  1597. Received: from snail.Sun.COM (snail.Corp.Sun.COM) by turnpike.Eng.Sun.COM (4.0/SMI-4.0)
  1598.     id AA20479; Tue, 23 Oct 90 13:05:42 PDT
  1599. Received: from Sun.COM (sun-barr) by snail.Sun.COM (4.1/SMI-4.1)
  1600.     id AA04721; Tue, 23 Oct 90 13:05:39 PDT
  1601. Received: from uunet.uu.net by Sun.COM (4.1/SMI-4.1)
  1602.     id AA22788; Tue, 23 Oct 90 13:05:31 PDT
  1603. Received: from jato.jpl.nasa.gov by uunet.uu.net (5.61/1.14) with SMTP 
  1604.     id AA02157; Tue, 23 Oct 90 16:04:56 -0400
  1605. Received: from devvax.Jpl.Nasa.Gov (jpl-devvax.jpl.nasa.gov) by jato.Jpl.Nasa.Gov (4.1/SMI-4.1+DXRm2.2)
  1606.     id AA24063; Tue, 23 Oct 90 11:14:12 PDT
  1607. Received: by devvax.Jpl.Nasa.Gov (5.61/4.7)
  1608.     id AA03909; Tue, 23 Oct 90 10:25:57 -0700
  1609. From: david@jpl-devvax.jpl.nasa.gov (David E. Smyth)
  1610. Message-Id: <9010231725.AA03909@devvax.Jpl.Nasa.Gov>
  1611. To: comp-sources-x@uunet.uu.net
  1612. Subject: Widget Creation Library - part08 of 11
  1613. Status: OS
  1614.  
  1615. # to unbundle, "sh" this file -- DO NOT use csh
  1616. #  SHAR archive format.  Archive created Fri Oct 19 09:33:17 PDT 1990
  1617. echo x - WcActions.c
  1618. sed 's/^X//' > WcActions.c <<'+FUNKY+STUFF+'
  1619. X/*
  1620. X** Copyright (c) 1990 Rodney J. Whitby
  1621. X**
  1622. X** This file was derived from work performed by David E. Smyth under the
  1623. X** following copyright:
  1624. X**
  1625. X*******************************************************************************
  1626. X** Copyright (c) 1990 David E. Smyth
  1627. X**
  1628. X** This file was derived from work performed by Martin Brunecky at
  1629. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  1630. X** following copyright:
  1631. X**
  1632. X*******************************************************************************
  1633. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  1634. X*
  1635. X*                        All Rights Reserved
  1636. X*
  1637. X* Permission to use, copy, modify, and distribute this software and its
  1638. X* documentation for any purpose and without fee is hereby granted, provided
  1639. X* that the above copyright notice appears on all copies and that both the
  1640. X* copyright and this permission notice appear in supporting documentation
  1641. X* and that the name of Auto-trol not be used in advertising or publicity
  1642. X* pertaining to distribution of the software without specific, prior written
  1643. X* permission.
  1644. X*
  1645. X* Auto-trol disclaims all warranties with regard to this software, including
  1646. X* all implied warranties of merchantability and fitness, in no event shall
  1647. X* Auto-trol be liable for any special, indirect or consequential damages or
  1648. X* any damages whatsoever resulting from loss of use, data or profits, whether
  1649. X* in an action of contract, negligence or other tortious action, arising out
  1650. X* of or in connection with the use or performance of this software.
  1651. X*******************************************************************************
  1652. X**
  1653. X** Redistribution and use in source and binary forms are permitted
  1654. X** provided that the above copyright notice and this paragraph are
  1655. X** duplicated in all such forms and that any documentation, advertising
  1656. X** materials, and other materials related to such distribution and use
  1657. X** acknowledge that the software was developed by David E. Smyth.  The
  1658. X** name of David E. Smyth may not be used to endorse or promote products
  1659. X** derived from this software without specific prior written permission.
  1660. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  1661. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  1662. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1663. X**
  1664. X*/
  1665. X
  1666. X/*
  1667. X* SCCS_data: @(#)WcActions.c 1.0 ( 30 June 1990 )
  1668. X*
  1669. X* Subsystem_group:
  1670. X*
  1671. X*     Widget Creation Library
  1672. X*
  1673. X* Module_description:
  1674. X*
  1675. X*     This module contains the convenience actions used to create and 
  1676. X*     manage a widget tree using the Xrm databse.
  1677. X*
  1678. X*     Several convenience actions are provided with the package, allowing 
  1679. X*     deferred widget creation, control (manage/unmanage) and other utility
  1680. X*     functions.
  1681. X*
  1682. X* Module_interface_summary: 
  1683. X*
  1684. X*     Convenience Actions:
  1685. X*
  1686. X* Module_history:
  1687. X*                                                  
  1688. X*   All actions and the action registration routine were made by
  1689. X*   Rod Whitby following about 30 June 1990.
  1690. X*
  1691. X* Design_notes:
  1692. X*
  1693. X*******************************************************************************
  1694. X*/
  1695. X/*
  1696. X*******************************************************************************
  1697. X* Include_files.
  1698. X*******************************************************************************
  1699. X*/
  1700. X
  1701. X#include "WcCreate.h"
  1702. X#include "WcCreateP.h"
  1703. X
  1704. X/*
  1705. X*******************************************************************************
  1706. X* Private_type_declarations.
  1707. X*******************************************************************************
  1708. X*/
  1709. X
  1710. X/*
  1711. X*******************************************************************************
  1712. X* Private_macro_definitions.
  1713. X*******************************************************************************
  1714. X*/
  1715. X
  1716. X/*
  1717. X*******************************************************************************
  1718. X* Private_data_definitions.
  1719. X*******************************************************************************
  1720. X*/
  1721. X
  1722. Xstatic char msg[1024];
  1723. X
  1724. X/*
  1725. X*******************************************************************************
  1726. X* Private_function_declarations.
  1727. X*******************************************************************************
  1728. X*/
  1729. X
  1730. X#define COMMAS 1
  1731. X#define NO_COMMAS 0
  1732. X
  1733. Xstatic char* AllocAndBuildString( params, num_params, commas )
  1734. X    char *params[];
  1735. X    int  *num_params;
  1736. X    int   commas;
  1737. X{
  1738. X    char *data;
  1739. X    int   len, i;
  1740. X
  1741. X    for ( len = 0, i = 0; i < *num_params; i++ )
  1742. X        len += strlen( params[i] ) + 1;
  1743. X
  1744. X    data = XtMalloc(len + 1);
  1745. X
  1746. X    (void)strcpy(data, params[0]);
  1747. X    for ( i = 1; i < *num_params; i++ )
  1748. X    {
  1749. X    if (commas)
  1750. X        strcat(data, ",");
  1751. X    else
  1752. X        strcat(data, " ");
  1753. X        (void)strcat(data, params[i]);
  1754. X    }
  1755. X    return data;
  1756. X}
  1757. X
  1758. Xstatic void SendToCallback( callback, w, params, num_params, min_reqd, commas )
  1759. X    XtCallbackProc callback;
  1760. X    Widget         w;
  1761. X    char          *params[];
  1762. X    int           *num_params;
  1763. X    int            min_reqd;
  1764. X    int            commas;
  1765. X{
  1766. X    char* data;
  1767. X
  1768. X    if ( *num_params < min_reqd )
  1769. X    {
  1770. X    callback( w, "", NULL );
  1771. X    return;
  1772. X    }
  1773. X
  1774. X    data = AllocAndBuildString( params, num_params, commas );
  1775. X
  1776. X    callback( w, data, NULL );
  1777. X    XtFree(data);
  1778. X}
  1779. X
  1780. X/*
  1781. X*******************************************************************************
  1782. X* Public_action_function_declarations.
  1783. X*******************************************************************************
  1784. X*/
  1785. X
  1786. X/*
  1787. X    -- Create Dynamic Children from Xrm Database
  1788. X*******************************************************************************
  1789. X    WcCreateChildrenACT( parent, child [, child ... ] )
  1790. X*/
  1791. Xvoid    WcCreateChildrenACT( w, event, params, num_params )
  1792. X    Widget      w;
  1793. X    XEvent     *event;
  1794. X    String     *params;
  1795. X    Cardinal   *num_params;
  1796. X{
  1797. X    SendToCallback( WcCreateChildrenCB, w, params, num_params, 2, COMMAS );
  1798. X}
  1799. X
  1800. X/*
  1801. X    -- Manage or Unmanage named widget(s)
  1802. X*******************************************************************************
  1803. X    WcManageACT  ( widget_path [, widget_path ... ] )
  1804. X    WcUnmanageACT( widget_path [, widget_path ... ] )
  1805. X*/
  1806. Xvoid    WcManageACT( w, event, params, num_params )
  1807. X    Widget    w;
  1808. X    XEvent   *event;
  1809. X    String   *params;
  1810. X    Cardinal *num_params;
  1811. X{
  1812. X    SendToCallback( WcManageCB, w, params, num_params, 1, COMMAS );
  1813. X}
  1814. X
  1815. Xvoid    WcUnmanageACT( w, event, params, num_params )
  1816. X    Widget    w;
  1817. X    XEvent   *event;
  1818. X    String   *params;
  1819. X    Cardinal *num_params;
  1820. X{
  1821. X    SendToCallback( WcUnmanageCB, w, params, num_params, 1, COMMAS );
  1822. X}
  1823. X
  1824. X/*
  1825. X    -- Manage or unamange named children action
  1826. X*******************************************************************************
  1827. X    WcManageChildrenACT  ( parent, child [, child ... ] )
  1828. X    WcUnmanageChildrenACT( parent, child [, child ... ] )
  1829. X*/
  1830. Xvoid    WcManageChildrenACT( w, event, params, num_params )
  1831. X    Widget    w;
  1832. X    XEvent   *event;
  1833. X    String   *params;
  1834. X    Cardinal *num_params;
  1835. X{
  1836. X    SendToCallback( WcManageChildrenCB, w, params, num_params, 2, COMMAS );
  1837. X}
  1838. X
  1839. Xvoid    WcUnmanageChildrenACT( w, event, params, num_params )
  1840. X    Widget    w;
  1841. X    XEvent   *event;
  1842. X    String   *params;
  1843. X    Cardinal *num_params;
  1844. X{
  1845. X    SendToCallback( WcUnmanageChildrenCB, w, params, num_params, 2, COMMAS );
  1846. X}
  1847. X
  1848. X/*
  1849. X    -- Destroy named children action
  1850. X*******************************************************************************
  1851. X    WcDestroyACT( widget_path [, widget_path ... ] )
  1852. X*/
  1853. Xvoid    WcDestroyACT( w, event, params, num_params )
  1854. X    Widget    w;
  1855. X    XEvent   *event;
  1856. X    String   *params;
  1857. X    Cardinal *num_params;
  1858. X{
  1859. X    SendToCallback( WcDestroyCB, w, params, num_params, 1, COMMAS );
  1860. X}
  1861. X
  1862. X/*
  1863. X    -- Set Resource Value on Widget
  1864. X*******************************************************************************
  1865. X    WcSetValueACT( widget_path.res_name: res_val )
  1866. X*/
  1867. Xvoid    WcSetValueACT( w, event, params, num_params )
  1868. X    Widget    w;
  1869. X    XEvent   *event;
  1870. X    String   *params;
  1871. X    Cardinal *num_params;
  1872. X{
  1873. X    /* note: blanks are optional, so we really don't know how many params 
  1874. X    ** we get from the translation manager: anything from 1 to 3. 
  1875. X    */
  1876. X    SendToCallback( WcSetValueCB, w, params, num_params, 1, NO_COMMAS );
  1877. X}
  1878. X
  1879. X/*
  1880. X    -- Change sensitivity of widgets.
  1881. X*******************************************************************************
  1882. X    WcSetSensitiveACT  ( widget_path [, widget_path ... ] )
  1883. X    WcSetInsensitiveACT( widget_path [, widget_path ... ] )
  1884. X*/
  1885. Xvoid    WcSetSensitiveACT( w, event, params, num_params )
  1886. X    Widget    w;
  1887. X    XEvent   *event;
  1888. X    String   *params;
  1889. X    Cardinal *num_params;
  1890. X{
  1891. X    SendToCallback( WcSetSensitiveCB, w, params, num_params, 1, COMMAS );
  1892. X}
  1893. X
  1894. Xvoid    WcSetInsensitiveACT( w, event, params, num_params )
  1895. X    Widget    w;
  1896. X    XEvent   *event;
  1897. X    String   *params;
  1898. X    Cardinal *num_params;
  1899. X{
  1900. X    SendToCallback( WcSetInsensitiveCB, w, params, num_params, 1, COMMAS );
  1901. X}
  1902. X
  1903. X/*
  1904. X    -- Load Resource File
  1905. X*******************************************************************************
  1906. X    WcLoadResourceFileACT( file_name )
  1907. X*/
  1908. Xvoid    WcLoadResourceFileACT( w, event, params, num_params )
  1909. X    Widget    w;
  1910. X    XEvent   *event;
  1911. X    String   *params;
  1912. X    Cardinal *num_params;
  1913. X{
  1914. X    SendToCallback( WcLoadResourceFileCB, w, params, num_params, 1, COMMAS );
  1915. X}
  1916. X
  1917. X/*
  1918. X    -- WcTraceAction
  1919. X*******************************************************************************
  1920. X    WcTraceACT( [ annotation ] )
  1921. X*/
  1922. Xvoid    WcTraceACT( w, event, params, num_params )
  1923. X    Widget    w;
  1924. X    XEvent   *event;
  1925. X    String   *params;
  1926. X    Cardinal *num_params;
  1927. X{
  1928. X    SendToCallback( WcTraceCB, w, params, num_params, 1, COMMAS );
  1929. X}
  1930. X
  1931. X/*
  1932. X  -- Popup and Popdown named widget
  1933. X*******************************************************************************
  1934. X    WcPopupACT    ( widget_path )
  1935. X    WcPopupGrabACT( widget_path )
  1936. X    WcPopdownACT  ( widget_path )
  1937. X*/
  1938. Xvoid    WcPopupACT( w, event, params, num_params )
  1939. X    Widget    w;
  1940. X    XEvent   *event;
  1941. X    String   *params;
  1942. X    Cardinal *num_params;
  1943. X{
  1944. X    SendToCallback( WcPopupCB, w, params, num_params, 1, COMMAS );
  1945. X}
  1946. X
  1947. Xvoid    WcPopupGrabACT( w, event, params, num_params )
  1948. X    Widget    w;
  1949. X    XEvent   *event;
  1950. X    String   *params;
  1951. X    Cardinal *num_params;
  1952. X{
  1953. X    SendToCallback( WcPopupGrabCB, w, params, num_params, 1, COMMAS );
  1954. X}
  1955. X
  1956. Xvoid    WcPopdownACT( w, event, params, num_params )
  1957. X    Widget    w;
  1958. X    XEvent   *event;
  1959. X    String   *params;
  1960. X    Cardinal *num_params;
  1961. X{
  1962. X    SendToCallback( WcPopdownCB, w, params, num_params, 1, COMMAS );
  1963. X}
  1964. X
  1965. X/*
  1966. X  -- Map and Unmap named widget
  1967. X*******************************************************************************
  1968. X    WcMapACT  ( widget_path )
  1969. X    WcUnmapACT( widget_path )
  1970. X*/
  1971. Xvoid    WcMapACT( w, event, params, num_params )
  1972. X    Widget    w;
  1973. X    XEvent   *event;
  1974. X    String   *params;
  1975. X    Cardinal *num_params;
  1976. X{
  1977. X    SendToCallback( WcMapCB, w, params, num_params, 1, COMMAS );
  1978. X}
  1979. X
  1980. Xvoid    WcUnmapACT( w, event, params, num_params )
  1981. X    Widget    w;
  1982. X    XEvent   *event;
  1983. X    String   *params;
  1984. X    Cardinal *num_params;
  1985. X{
  1986. X    SendToCallback( WcUnmapCB, w, params, num_params, 1, COMMAS );
  1987. X}
  1988. X
  1989. X/*
  1990. X    -- Invoke shell command
  1991. X*******************************************************************************
  1992. X    WcSystemACT( any shell command line )
  1993. X*/
  1994. Xvoid    WcSystemACT( w, event, params, num_params )
  1995. X    Widget    w;
  1996. X    XEvent   *event;
  1997. X    String   *params;
  1998. X    Cardinal *num_params;
  1999. X{
  2000. X    SendToCallback( WcSystemCB, w, params, num_params, 1, NO_COMMAS );
  2001. X}
  2002. X
  2003. X/*
  2004. X    -- Exit the application
  2005. X*******************************************************************************
  2006. X    WcExitACT( [ integer_exit_code ] )
  2007. X*/
  2008. Xvoid    WcExitACT( w, event, params, num_params )
  2009. X    Widget    w;
  2010. X    XEvent   *event;
  2011. X    String   *params;
  2012. X    Cardinal *num_params;
  2013. X{
  2014. X    SendToCallback( WcExitCB, w, params, num_params, 1, COMMAS );
  2015. X}
  2016. X
  2017. X/*
  2018. X  -- WcRegisterWcActions
  2019. X*******************************************************************************
  2020. X   Convenience routine, registering all standard actions in one application
  2021. X   call.   Called from WcWidgetCreation(), so application usually never needs
  2022. X   to call this.
  2023. X*/
  2024. X
  2025. Xvoid WcRegisterWcActions ( app )
  2026. XXtAppContext app;
  2027. X{
  2028. X    static XtActionsRec WcActions[] = {
  2029. X      {"WcCreateChildrenACT",    WcCreateChildrenACT    },
  2030. X      {"WcManageACT",        WcManageACT        },
  2031. X      {"WcUnmanageACT",        WcUnmanageACT        },
  2032. X      {"WcManageChildrenACT",    WcManageChildrenACT    },
  2033. X      {"WcUnmanageChildrenACT",    WcUnmanageChildrenACT    },
  2034. X      {"WcDestroyACT",        WcDestroyACT        },
  2035. X      {"WcSetValueACT",        WcSetValueACT        },
  2036. X      {"WcSetSensitiveACT",    WcSetSensitiveACT    },
  2037. X      {"WcSetInsensitiveACT",    WcSetInsensitiveACT    },
  2038. X      {"WcLoadResourceFileACT",    WcLoadResourceFileACT    },
  2039. X      {"WcTraceACT",        WcTraceACT        },
  2040. X      {"WcPopupACT",        WcPopupACT        },
  2041. X      {"WcPopupGrabACT",    WcPopupGrabACT        },
  2042. X      {"WcPopdownACT",        WcPopdownACT        },
  2043. X      {"WcMapACT",        WcMapACT        },
  2044. X      {"WcUnmapACT",        WcUnmapACT        },
  2045. X      {"WcSystemACT",        WcSystemACT        },
  2046. X      {"WcExitACT",        WcExitACT        },
  2047. X    };
  2048. X
  2049. X    ONCE_PER_XtAppContext( app );
  2050. X
  2051. X    XtAppAddActions(app, WcActions, XtNumber(WcActions));
  2052. X}
  2053. +FUNKY+STUFF+
  2054. echo '-rw-r--r--  1 david       12898 Oct 18 17:06 WcActions.c    (as sent)'
  2055. chmod u=rw,g=r,o=r WcActions.c
  2056. ls -l WcActions.c
  2057. echo x - WcAthenaP.h
  2058. sed 's/^X//' > WcAthenaP.h <<'+FUNKY+STUFF+'
  2059. X/*
  2060. X** Copyright (c) 1990 David E. Smyth
  2061. X** 
  2062. X** Redistribution and use in source and binary forms are permitted
  2063. X** provided that the above copyright notice and this paragraph are
  2064. X** duplicated in all such forms and that any documentation, advertising
  2065. X** materials, and other materials related to such distribution and use
  2066. X** acknowledge that the software was developed by David E. Smyth.  The
  2067. X** name of David E. Smyth may not be used to endorse or promote products
  2068. X** derived from this software without specific prior written permission.
  2069. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  2070. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  2071. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2072. X** 
  2073. X*/
  2074. X
  2075. X/*
  2076. X* SCCS_data: @(#)WcAthenaP.h 1.0 ( 19 June 1990 )
  2077. X*/
  2078. X
  2079. X#ifndef _WcAthenaP_h_
  2080. X#define _WcAthenaP_h_
  2081. X
  2082. X/* Core, Object, RectObj, WindowObj, 
  2083. X** XmGadget, XmPrimitive, and XmComposite, 
  2084. X** Shell, OverrideShell, WMShell, VendorShell, TopLevelShell, ApplicationShell, 
  2085. X** Constraint, XmManager.
  2086. X*/
  2087. X#include <X11/IntrinsicP.h>
  2088. X
  2089. X/* include all the *P.h files in heirarchical order */
  2090. X
  2091. X#include <X11/CoreP.h>
  2092. X#include <X11/ObjectP.h>
  2093. X#include <X11/Xaw/SimpleP.h>
  2094. X#include <X11/CompositeP.h>
  2095. X#include <X11/ConstrainP.h>
  2096. X
  2097. X/* Core */
  2098. X#include <X11/Xaw/ClockP.h>
  2099. X#include <X11/Xaw/LogoP.h>
  2100. X#include <X11/Xaw/MailboxP.h>
  2101. X#include <X11/Xaw/SimpleP.h>
  2102. X
  2103. X/* Simple */
  2104. X#include <X11/Xaw/GripP.h>
  2105. X#include <X11/Xaw/LabelP.h>
  2106. X#include <X11/Xaw/ListP.h>
  2107. X#include <X11/Xaw/ScrollbarP.h>
  2108. X#include <X11/Xaw/StripCharP.h>
  2109. X#include <X11/Xaw/TextP.h>
  2110. X
  2111. X/* Label */
  2112. X#include <X11/Xaw/CommandP.h>
  2113. X#include <X11/Xaw/MenuButtoP.h>
  2114. X#include <X11/Xaw/ToggleP.h>
  2115. X
  2116. X/* Sme */
  2117. X#include <X11/Xaw/SmeP.h>
  2118. X#include <X11/Xaw/SimpleMenP.h>
  2119. X#include <X11/Xaw/SmeBSBP.h>
  2120. X#include <X11/Xaw/SmeLineP.h>
  2121. X
  2122. X
  2123. X/* Text */
  2124. X#include <X11/Xaw/AsciiTextP.h>
  2125. X#include <X11/Xaw/TextSrcP.h>
  2126. X#include <X11/Xaw/AsciiSrcP.h>
  2127. X#include <X11/Xaw/TextSinkP.h>
  2128. X#include <X11/Xaw/AsciiSinkP.h>
  2129. X
  2130. X/* Composite and Constraint */
  2131. X#include <X11/Xaw/BoxP.h>
  2132. X#include <X11/Xaw/FormP.h>
  2133. X#include <X11/Xaw/PanedP.h>
  2134. X
  2135. X/* Form */
  2136. X#include <X11/Xaw/DialogP.h>
  2137. X#include <X11/Xaw/ViewportP.h>
  2138. X
  2139. X#endif
  2140. +FUNKY+STUFF+
  2141. echo '-rw-r--r--  1 david        2168 Aug  6 09:36 WcAthenaP.h    (as sent)'
  2142. chmod u=rw,g=r,o=r WcAthenaP.h
  2143. ls -l WcAthenaP.h
  2144. echo x - WcCallb.c
  2145. sed 's/^X//' > WcCallb.c <<'+FUNKY+STUFF+'
  2146. X/*
  2147. X** Copyright (c) 1990 David E. Smyth
  2148. X**
  2149. X** This file was derived from work performed by Martin Brunecky at
  2150. X** Auto-trol Technology Corporation, Denver, Colorado, under the
  2151. X** following copyright:
  2152. X**
  2153. X*******************************************************************************
  2154. X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
  2155. X*
  2156. X*                        All Rights Reserved
  2157. X*
  2158. X* Permission to use, copy, modify, and distribute this software and its
  2159. X* documentation for any purpose and without fee is hereby granted, provided
  2160. X* that the above copyright notice appears on all copies and that both the
  2161. X* copyright and this permission notice appear in supporting documentation
  2162. X* and that the name of Auto-trol not be used in advertising or publicity
  2163. X* pertaining to distribution of the software without specific, prior written
  2164. X* permission.
  2165. X*
  2166. X* Auto-trol disclaims all warranties with regard to this software, including
  2167. X* all implied warranties of merchantability and fitness, in no event shall
  2168. X* Auto-trol be liable for any special, indirect or consequential damages or
  2169. X* any damages whatsoever resulting from loss of use, data or profits, whether
  2170. X* in an action of contract, negligence or other tortious action, arising out
  2171. X* of or in connection with the use or performance of this software.
  2172. X*******************************************************************************
  2173. X**
  2174. X** Redistribution and use in source and binary forms are permitted
  2175. X** provided that the above copyright notice and this paragraph are
  2176. X** duplicated in all such forms and that any documentation, advertising
  2177. X** materials, and other materials related to such distribution and use
  2178. X** acknowledge that the software was developed by David E. Smyth.  The
  2179. X** name of David E. Smyth may not be used to endorse or promote products
  2180. X** derived from this software without specific prior written permission.
  2181. X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  2182. X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  2183. X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2184. X**
  2185. X*/
  2186. X
  2187. X/*
  2188. X* SCCS_data: @(#)WcCallb.c 1.04 ( 30 September 1990 )
  2189. X*
  2190. X* Subsystem_group:
  2191. X*
  2192. X*     Widget Creation Library
  2193. X*
  2194. X* Module_description:
  2195. X*
  2196. X*     This module contains the convenience callbacks used to create and 
  2197. X*     manage a widget tree using the Xrm databse.
  2198. X*
  2199. X*     Several convenience callbacks are provided with the package, allowing 
  2200. X*     deferred widget creation, control (manage/unmanage) and other utility
  2201. X*     functions.
  2202. X*
  2203. X* Module_interface_summary: 
  2204. X*
  2205. X*     Convenience Callbacks:
  2206. X*
  2207. X* Module_history:
  2208. X*                                                  
  2209. X*   Several of the callbacks and the callback registration routine were
  2210. X*   originally written by Martin Brunecky at Auto-Trol, between about
  2211. X*   the first of February 1990 until about 18 April 1990.
  2212. X*
  2213. X*   Additional callbacks and modifications to all callbacks and the
  2214. X*   callback registration routine were made by David Smyth at Jet
  2215. X*   Propulsion Laboratories following about 15 March 1990.
  2216. X*
  2217. X*   WcLoadResourceFileCB enhanced to remember which resource files have
  2218. X*   been loaded (by resource file name, not complete path name).
  2219. X
  2220. X* Design_notes:
  2221. X*
  2222. X*   For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
  2223. X*   (runtime) binding. But since most UNIX systems lack such capability,
  2224. X*   we stick to the concept of "registration" routines.
  2225. X*
  2226. X*   All these callbacks could probably be declared as static.  They
  2227. X*   were not because applications may want to link them to widgets
  2228. X*   via C code.  
  2229. X*
  2230. X*   When Motif runs on release 4 Intrinsics, then all argument parsing
  2231. X*   should be replaced with coverters, so conversions get cached.  This
  2232. X*   will improve performance, especially for pop-ups.
  2233. X*
  2234. X*******************************************************************************
  2235. X*/
  2236. X/*
  2237. X*******************************************************************************
  2238. X* Include_files.
  2239. X*******************************************************************************
  2240. X*/
  2241. X
  2242. X#include "WcCreate.h"
  2243. X#include "WcCreateP.h"
  2244. X
  2245. X/*
  2246. X*******************************************************************************
  2247. X* Private_type_declarations.
  2248. X*******************************************************************************
  2249. X*/
  2250. X
  2251. X/*
  2252. X*******************************************************************************
  2253. X* Private_macro_definitions.
  2254. X*******************************************************************************
  2255. X*/
  2256. X
  2257. X/*
  2258. X*******************************************************************************
  2259. X* Private_data_definitions.
  2260. X*******************************************************************************
  2261. X*/
  2262. X
  2263. X/* NOTE: These are shared arrays because they are large: i.e.,
  2264. X** this is a performance optimization intended to reduce page
  2265. X** faults which can occur while making large extensions to the
  2266. X** stack space.  Wait a minute: wouldn't this just happen
  2267. X** once, and then the stack space is alloc'd?  Yes, but a
  2268. X** huge stack space runs the risk of getting swapped, which causes
  2269. X** page faults.  This is probably a nit-picky sort of optimization.
  2270. X** Remember that D.Smyth is an old sys programmer from the stone
  2271. X** ages, and pity him instead of flaming him.
  2272. X** Be careful when filling msg not to call any funcs in here, 
  2273. X** so the message does not get garbled.
  2274. X*/
  2275. X
  2276. Xstatic char    msg[MAX_ERRMSG];
  2277. Xstatic char    cleanName[MAX_PATHNAME];
  2278. Xstatic Widget    widget_list[MAX_CHILDREN];
  2279. X
  2280. X/*
  2281. X*******************************************************************************
  2282. X* Private_function_declarations.
  2283. X*******************************************************************************
  2284. X*/
  2285. X
  2286. X/*
  2287. X*******************************************************************************
  2288. X* Public_callback_function_declarations.
  2289. X*******************************************************************************
  2290. X    The client data argument of callbacks MUST be a null terminated
  2291. X    string.  If client == (char*)0 this is an error.  The correct way
  2292. X    to pass no client information is *client == '\0'. The CvtStringToCallback
  2293. X    converter which actually causes these functions to be called (adds
  2294. X    these functions to widget's callback lists) does ensure that the
  2295. X    client data is a proper null terminated string.
  2296. X
  2297. X    Callbacks are not intended to be re-entrant nor recursive.  Many of
  2298. X    these use static buffers.
  2299. X*******************************************************************************
  2300. X*/
  2301. X
  2302. X/*
  2303. X    -- Create Dynamically Created Children from Xrm Database
  2304. X*******************************************************************************
  2305. X    This callback creates one or more specified children of a parent widget.
  2306. X    If parent name is `this' then widget invoking callback is used as the
  2307. X    parent.  Parent name can also be a wildcarded path name.  Child names
  2308. X    must be single part, specific children of the parent. Client data format:
  2309. X
  2310. X             parent, child [,child] ...
  2311. X    
  2312. X    This callback is used for deferred sub-tree creation, where named child
  2313. X    creation has been postponed because it was not included in a wcChildren
  2314. X    resource value.
  2315. X*/
  2316. X
  2317. Xvoid WcCreateChildrenCB ( w, parent_children, unused )
  2318. X    Widget w;
  2319. X    char* parent_children;    /* parent + list of named children */
  2320. X    caddr_t unused;        /* call data from widget, not used */
  2321. X{
  2322. X    char*    children;
  2323. X    Widget    parent;
  2324. X
  2325. X    if ( *parent_children == NUL ) 
  2326. X    {
  2327. X    XtWarning(
  2328. X            "WcCreateChildrenCB ( ) - Failed \n\
  2329. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  2330. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2331. X                    Name of child must be single part name from parent. \n\
  2332. X             Problem: No widget names provided.");
  2333. X    return;
  2334. X    }
  2335. X
  2336. X    children = WcCleanName( parent_children, cleanName );
  2337. X
  2338. X    children = WcSkipWhitespace_Comma( children );
  2339. X
  2340. X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
  2341. X    {
  2342. X    sprintf( msg,
  2343. X            "WcCreateChildrenCB (%s) - Failed \n\
  2344. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  2345. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2346. X                    Name of child must be single part name from parent. \n\
  2347. X             Problem: Parent widget named `%s' not found.",
  2348. X        parent_children, cleanName);
  2349. X    XtWarning( msg );
  2350. X    return;
  2351. X    }
  2352. X
  2353. X    if (*children == NUL)
  2354. X    {
  2355. X        sprintf( msg,
  2356. X            "WcCreateChildrenCB (%s) - Failed \n\
  2357. X             Usage: WcCreateChildrenCB ( parent, child [, child ] ...) \n\
  2358. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2359. X                    Name of child must be single part name from parent. \n\
  2360. X             Problem: No children names provided.",
  2361. X        parent_children );
  2362. X    XtWarning( msg );
  2363. X        return;
  2364. X    }
  2365. X
  2366. X    WcCreateNamedChildren ( parent, children );
  2367. X}
  2368. X
  2369. X/******************************************************************************
  2370. X**  Manage or Unmanage named widget(s)
  2371. X*******************************************************************************
  2372. X    This callback translates string passed in as client data into one or more
  2373. X    widget ids, and manages or unmanages it or them.  Client data format:
  2374. X    name [, name] ...
  2375. X    Name can include `this' and other path names.
  2376. X******************************************************************************/
  2377. X
  2378. X#ifdef FUNCTION_PROTOTYPES
  2379. Xstatic void ManageOrUnmanage( Widget, char*, char*, void (*proc)() );
  2380. X#else
  2381. Xstatic void ManageOrUnmanage();
  2382. X#endif
  2383. X
  2384. Xvoid WcManageCB ( w, widgetNames, unused )
  2385. X    Widget w;
  2386. X    char* widgetNames;
  2387. X    caddr_t unused;        /* call data from widget, not used */
  2388. X{
  2389. X    ManageOrUnmanage( w, widgetNames, "WcManageCB", XtManageChildren );
  2390. X}
  2391. X
  2392. Xvoid WcUnmanageCB ( w, widgetNames, unused )
  2393. X    Widget w;
  2394. X    char* widgetNames;
  2395. X    caddr_t unused;             /* call data from widget, not used */
  2396. X{
  2397. X    ManageOrUnmanage( w, widgetNames, "WcUnmanageCB", XtUnmanageChildren );
  2398. X}
  2399. X
  2400. Xstatic void ManageOrUnmanage ( w, widgetNames, callbackName, proc )
  2401. X    Widget w;
  2402. X    char* widgetNames;
  2403. X    char* callbackName;
  2404. X    void (*proc)();
  2405. X{
  2406. X    int         numWidgets = 0;
  2407. X    char*       s = widgetNames;
  2408. X
  2409. X    while (*s && numWidgets < MAX_CHILDREN)
  2410. X    {
  2411. X        s = WcCleanName ( s, cleanName );
  2412. X        s = WcSkipWhitespace_Comma ( s );
  2413. X        if ( widget_list[numWidgets] = WcFullNameToWidget ( w, cleanName ) )
  2414. X            numWidgets++;
  2415. X        else
  2416. X        {
  2417. X            sprintf(msg,
  2418. X            "%s (%s) - Widget `%s' ignored \n\
  2419. X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
  2420. X             Problem: Could not find widget named `%s'.",
  2421. X             callbackName, widgetNames, cleanName, callbackName, cleanName);
  2422. X            XtWarning( msg );
  2423. X        }
  2424. X    }
  2425. X    if (numWidgets >= MAX_CHILDREN)
  2426. X    {
  2427. X    sprintf(msg,
  2428. X            "%s (%s) - Failed \n\
  2429. X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
  2430. X             Problem: Too many widgets (more than MAX_CHILDREN).",
  2431. X             callbackName, widgetNames, callbackName);
  2432. X    XtWarning( msg );
  2433. X    numWidgets = 0;
  2434. X    }
  2435. X
  2436. X    if ( numWidgets )
  2437. X        /* proc is either XtManageChildren or XtUnmanageChildren */
  2438. X        proc ( widget_list, numWidgets );
  2439. X}
  2440. X
  2441. X/*
  2442. X    -- Manage or unamange named children callback
  2443. X*******************************************************************************
  2444. X    These callbacks translates a string passed in as client data into a parent
  2445. X    widget id, and names of children of that parent.  If parent name is
  2446. X    `this' then widget invoking callback is used as the parent.  Parent
  2447. X    name can also be a wildcarded path name.  Child names must be single
  2448. X    part, specific children of the parent. Client data format:
  2449. X
  2450. X             parent, child [,child] ...
  2451. X
  2452. X    This callback can be used as an alternate for WcManageCB but it is
  2453. X    really intended to be used to manage/unmanage children of widgets 
  2454. X    which have multiple instances, and where the parent name is `this'.
  2455. X*/
  2456. X#ifdef FUNCTION_PROTOTYPES
  2457. Xstatic void ManageOrUnmanageChildren( Widget, char*, char*, void (*proc)() );
  2458. X#else
  2459. Xstatic void ManageOrUnmanageChildren();
  2460. X#endif
  2461. X
  2462. Xvoid WcManageChildrenCB ( w, parent_children, unused )
  2463. X    Widget     w;
  2464. X    char*    parent_children;/* client data, list of named children  */
  2465. X    caddr_t    unused;        /* call data from widget        */
  2466. X{
  2467. X    ManageOrUnmanageChildren( w, parent_children, 
  2468. X                "WcManageChildrenCB", XtManageChildren );
  2469. X}
  2470. X
  2471. Xvoid WcUnmanageChildrenCB ( w, parent_children, unused )
  2472. X    Widget      w;
  2473. X    char*       parent_children;/* client data, list of named children  */
  2474. X    caddr_t     unused;         /* call data from widget                */
  2475. X{
  2476. X    ManageOrUnmanageChildren( w, parent_children,
  2477. X                                "WcUnmanageChildrenCB", XtUnmanageChildren );
  2478. X}
  2479. X
  2480. Xstatic void ManageOrUnmanageChildren( w, parent_children, callbackName, proc )
  2481. X    Widget w;
  2482. X    char* parent_children;      /* client data, list of named children  */
  2483. X    char* callbackName;        /* WcManageChildrenCB or WcUnmanageChildrenCB */
  2484. X    void (*proc)();        /* XtManageChildren or XtUnmanageChildren */
  2485. X{
  2486. X    int             numWidgets = 0;
  2487. X    char*        next;
  2488. X    Widget        parent;
  2489. X
  2490. X    if ( *parent_children == NUL )
  2491. X    {
  2492. X        sprintf(msg,
  2493. X            "%s ( ) - Failed \n\
  2494. X             Usage: %s ( parent, child [, child ] ...) \n\
  2495. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2496. X                    Name of child must be single part name from parent. \n\
  2497. X             Problem: No widget names provided.",
  2498. X        callbackName, callbackName);
  2499. X    XtWarning( msg );
  2500. X        return;
  2501. X    }
  2502. X
  2503. X    next = WcCleanName( parent_children, cleanName );
  2504. X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
  2505. X    {
  2506. X        sprintf( msg,
  2507. X            "%s (%s) - Failed \n\
  2508. X             Usage: %s ( parent, child [, child ] ...) \n\
  2509. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2510. X                    Name of child must be single part name from parent. \n\
  2511. X             Problem: Parent widget named `%s' not found.",
  2512. X            callbackName, parent_children, callbackName, cleanName);
  2513. X        XtWarning( msg );
  2514. X        return;
  2515. X    }
  2516. X
  2517. X    while (*next && numWidgets < MAX_CHILDREN)
  2518. X    {
  2519. X        next = WcCleanName( next, cleanName );
  2520. X    if (widget_list[numWidgets] = WcChildNameToWidget( parent, cleanName ))
  2521. X        numWidgets++;
  2522. X    else
  2523. X    {
  2524. X        sprintf( msg,
  2525. X            "%s (%s) - Child `%s' ignored \n\
  2526. X             Usage: %s ( parent, child [, child ] ...) \n\
  2527. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2528. X                    Name of child must be single part name from parent. \n\
  2529. X             Problem: Child widget named `%s' not found.",
  2530. X        callbackName, parent_children, callbackName, cleanName);
  2531. X        XtWarning( msg );
  2532. X    }
  2533. X    }
  2534. X
  2535. X    if (numWidgets >= MAX_CHILDREN)
  2536. X    {
  2537. X        sprintf(msg,
  2538. X            "%s (%s) - Failed \n\
  2539. X             Usage: %s ( parent, child [, child ] ...) \n\
  2540. X                    Name of parent can be `this' or wildcarded pathname, \n\
  2541. X                    Name of child must be single part name from parent. \n\
  2542. X             Problem: Too many widgets (more than MAX_CHILDREN).",
  2543. X             callbackName, parent_children, callbackName);
  2544. X        XtWarning( msg );
  2545. X        numWidgets = 0;
  2546. X    }
  2547. X
  2548. X    if ( numWidgets )
  2549. X        /* proc is either XtManageChildren or XtUnmanageChildren */
  2550. X        proc ( widget_list, numWidgets );
  2551. X}
  2552. X
  2553. X/*
  2554. X    -- Destroy named children callback
  2555. X*******************************************************************************
  2556. X    This callback translates string passed in as client data into a widget id
  2557. X    and destroys it. A comma separated list of widgets can be specified.
  2558. X    `this' means the invoking widget.
  2559. X*/
  2560. X
  2561. Xvoid WcDestroyCB ( w, widgetNames, unused )
  2562. X    Widget  w;
  2563. X    char*   widgetNames;    /* client data, widgets to be destroyed */
  2564. X    caddr_t unused;        /* call data from widget, not used    */
  2565. X{
  2566. X    int        widget_count = MAX_CHILDREN;
  2567. X    char*    unConvertedNames;
  2568. X    int         i;
  2569. X
  2570. X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames, 
  2571. X                    widget_list, &widget_count );
  2572. X    if ( unConvertedNames[0] != NUL )
  2573. X    {
  2574. X    sprintf(msg,
  2575. X            "WcDestroyCB (%s) \n\
  2576. X             Usage: WcDestroyCB ( widget [, widget ] ...) \n\
  2577. X                    Name of widget can be `this' or wildcarded pathname. \n\
  2578. X            Problem: No widgets found named %s.",
  2579. X             widgetNames, unConvertedNames);
  2580. X        XtWarning( msg );
  2581. X    }
  2582. X
  2583. X    for (i=0; i<widget_count; i++)
  2584. X       XtDestroyWidget ( widget_list[i] );
  2585. X}
  2586. X
  2587. X/*
  2588. X    -- Parse name_res_resVal into name, res, resVal
  2589. X*******************************************************************************
  2590. X    This is a private function to WcSetValueCB()
  2591. X*/
  2592. X
  2593. Xstatic void 
  2594. XParseNameResResVal( name_res_resVal, target_name, resource, res_val )
  2595. X    char* name_res_resVal;    /* input */
  2596. X    char* target_name;        /* output */
  2597. X    char* resource;        /* output */
  2598. X    char* res_val;        /* output */
  2599. X{
  2600. X    register char *d,*s;
  2601. X
  2602. X    s = name_res_resVal;
  2603. X    /* copy from name_res_resVal into target_name[],
  2604. X    ** ignore initial whitespace, stop at trailing `:'  
  2605. X    ** Then backup to get final segment, the resource name
  2606. X    */
  2607. X    for ( s = name_res_resVal ; *s && *s <= ' ' ; s++ )
  2608. X    ;    /* skip initial whitespace */
  2609. X    for ( d = target_name ; *s && *s != ':' ; s++, d++ )
  2610. X    *d = *s;
  2611. X    for ( ; target_name < d && (*d != '.' && *d != '*') ; s--, d-- )
  2612. X    ;
  2613. X    *d = NUL;
  2614. X
  2615. X    /* OK, now target_name is null terminated.
  2616. X    ** s points at final `.' or `*' in name_resName, 
  2617. X    ** now we copy to resource[].
  2618. X    */
  2619. X    for ( s++, d = resource ; *s && *s != ':' ; s++, d++ )
  2620. X        *d = *s;
  2621. X    *d = NUL;
  2622. X
  2623. X    /* OK, now resource is null terminated.
  2624. X    ** s points at the `:' now we skip whitespace and the rest is value
  2625. X    ** until we hit the NUL terminator.
  2626. X    */
  2627. X    for (s++ ; *s && *s <= ' ' ; s++ )
  2628. X        ;       /* skip initial whitespace */
  2629. X    for (d = res_val ; *s ; s++, d++ )
  2630. X    *d = *s;
  2631. X    do
  2632. X    *d = NUL;    /* null terminate, delete trailing whitespace */
  2633. X    while (*--d <= ' ');
  2634. X}
  2635. X
  2636. X/*
  2637. X   -- Set Resource Value on Widget
  2638. X*******************************************************************************
  2639. X    This callback sets a resource value on the named widget.
  2640. X
  2641. X    The client data argument has a format:
  2642. X
  2643. X        target_widget_name.resource_name: resource value
  2644. X
  2645. X    The special resource value of "this" means "this widget."  Typically,
  2646. X    using "this" as the resource value is used to set the "XmNdefaultButton"
  2647. X    resource on a XmbulletinBoard, "menuBar", "workArea", etc on XmMainWindows,
  2648. X    the subMenuId resource on menuBar cascade buttons, and so on.
  2649. X
  2650. X    Just about everything this function does is related to providing
  2651. X    nice error messages.
  2652. X*/
  2653. X
  2654. Xvoid WcSetValueCB ( w, name_res_resVal, unused )
  2655. X    Widget  w;  
  2656. X    char*   name_res_resVal;        /* client data: name.resName: resVal */
  2657. X    caddr_t unused;            /* call data from wudget, not used   */
  2658. X{
  2659. X    /* Note: static buffers make this routine NON-REENTRANT!! */
  2660. X    static char    target_name[MAX_XRMSTRING];
  2661. X    static char    resource[MAX_XRMSTRING];
  2662. X    static char    res_val[MAX_XRMSTRING];
  2663. X
  2664. X    Widget    target;
  2665. X    Widget    res_widget;
  2666. X    char*    res_type;    /* must be XtFree'd */
  2667. X
  2668. X    ParseNameResResVal( name_res_resVal, target_name, resource, res_val );
  2669. X
  2670. X    /* Check for syntax error: if any of the strings are null, wrongo!
  2671. X    */
  2672. X    if ( target_name[0] == NUL || resource[0] == NUL || res_val[0] == NUL )
  2673. X    {
  2674. X        char *missing;
  2675. X
  2676. X        if (target_name[0] == NUL) missing = "target_widget_name";
  2677. X        else if (resource[0] == NUL) missing = "res_name";
  2678. X        else if (res_val[0] == NUL) missing = "res_value";
  2679. X
  2680. X        sprintf ( msg,
  2681. X            "WcSetValueCB (%s) - Failed \n\
  2682. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  2683. X             Problem: Missing %s argument.",
  2684. X            name_res_resVal, missing );
  2685. X        XtWarning( msg ); 
  2686. X    return;
  2687. X    }
  2688. X
  2689. X    /* See if we can find the target widget */
  2690. X    if (! (target = WcFullNameToWidget( w, target_name )) )
  2691. X    {
  2692. X        sprintf ( msg,
  2693. X            "WcSetValueCB (%s)  \n\
  2694. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  2695. X             Problem: Could not find widget named `%s'",
  2696. X             name_res_resVal, target_name );
  2697. X        XtWarning( msg );
  2698. X        return;
  2699. X    }
  2700. X
  2701. X    /* Make certain widget has this resource type */
  2702. X    if (! (res_type = WcGetResourceType( target, resource )) )
  2703. X    {
  2704. X    sprintf ( msg,
  2705. X            "WcSetValueCB (%s) - Failed \n\
  2706. X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
  2707. X             Problem: widget %s does not have a resource named %s.",
  2708. X    name_res_resVal, target_name, resource);
  2709. X        XtWarning(msg);
  2710. X    return;
  2711. X    }
  2712. X
  2713. X    /* Try this heuristic: if the resource type has "Widget" somewhere within
  2714. X    ** it, then see if we can convert the resource value to a widget using 
  2715. X    ** WcFullNameToWidget.  This allow relative naming from the calling
  2716. X    ** widget, including `this' or ^^foobar.
  2717. X    ** WcStrStr( res_type, "Widget") returns NULL if "Widget" is not in res_type
  2718. X    */
  2719. X    if ( WcStrStr( res_type, "Widget") 
  2720. X#ifdef MOTIF
  2721. X    || WcStrStr( res_type, "Window")  /* wrong: but that's a menuWidget */
  2722. X#endif
  2723. X    )
  2724. X    {
  2725. X    Widget    res_widget;
  2726. X    Arg    arg[1];
  2727. X
  2728. X    if (res_widget = WcFullNameToWidget( w, res_val ))
  2729. X    {
  2730. X        XtSetArg( arg[0], resource, res_widget);
  2731. X        XtSetValues( target, arg, 1 );
  2732. X        return;
  2733. X    }
  2734. X    }
  2735. X
  2736. X    /* We have the type, so do conversion, and then call XtSetValues. */
  2737. X
  2738. X    WcSetValueFromStringAndType( target, resource, res_val, res_type );
  2739. X    XtFree( res_type );
  2740. X}
  2741. X
  2742. X/*
  2743. X    -- Change sensitivity of widgets.
  2744. X*******************************************************************************
  2745. X    This callback translates string passed in as client data into widget ids
  2746. X    and sets each to be sensitve/insensitive. A comma separated list of 
  2747. X    widgets can be specified.  `this' means the invoking widget.  
  2748. X
  2749. X    This callback someday should take care of the problem with text
  2750. X    widgets - they don't get grey when insensitive, which must be a bug.
  2751. X*/
  2752. X
  2753. X#ifdef FUNCTION_PROTOTYPES
  2754. Xstatic void ChangeSensitivity( Widget, char*, char*, int );
  2755. X#else
  2756. Xstatic void ChangeSensitivity();
  2757. X#endif
  2758. X
  2759. Xvoid WcSetSensitiveCB ( w, widgetNames, unused )
  2760. X    Widget  w;
  2761. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  2762. X    caddr_t unused;        /* call data from widget is not used    */
  2763. X{
  2764. X    ChangeSensitivity ( w, widgetNames, "WcSetSensitiveCB", (Boolean)TRUE );
  2765. X}
  2766. X
  2767. Xvoid WcSetInsensitiveCB ( w, widgetNames, unused )
  2768. X    Widget  w;
  2769. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  2770. X    caddr_t unused;             /* call data from widget is not used    */
  2771. X{
  2772. X    ChangeSensitivity ( w, widgetNames, "WcSetInsensitiveCB", (Boolean)FALSE );
  2773. X}
  2774. X
  2775. Xstatic void ChangeSensitivity ( w, widgetNames, callbackName, sensitive )
  2776. X    Widget  w;
  2777. X    char*   widgetNames;        /* client data, widgets to be destroyed */
  2778. X    char*   callbackName;    /* "WcSetSensitiveCB" or "WcSetInsensitiveCB" */
  2779. X    int     sensitive;
  2780. X{
  2781. X    int    widget_count = MAX_CHILDREN;
  2782. X    char*  unConvertedNames;
  2783. X    int    i;
  2784. X
  2785. X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames,
  2786. X                                    widget_list, &widget_count );
  2787. X    if ( unConvertedNames[0] != NUL )
  2788. X    {
  2789. X        sprintf(msg,
  2790. X            "%s (%s) - One or more widget names ignored \n\
  2791. X             Usage: %s ( widget [, widget ] ...) \n\
  2792. X                    Name of widget can be `this' or wildcarded pathname. \n\
  2793. X                    Problem: No widgets found named %s.",
  2794. X             callbackName, widgetNames, callbackName, unConvertedNames);
  2795. X        XtWarning( msg );
  2796. X    }
  2797. X
  2798. X    for (i=0; i<widget_count; i++)
  2799. X    XtSetSensitive ( widget_list[i], sensitive );
  2800. X}
  2801. X
  2802. X/*
  2803. X    -- Load Resource File
  2804. X*******************************************************************************
  2805. X    This callbacks loads specified resource file into application
  2806. X    resource database. It allows to load resources on as-needed
  2807. X    basis, reducing the intitial resource file load overhead. 
  2808. X    The file to load is specified as client data. The directory search 
  2809. X    for the file (should be) the same as for application class resource file.
  2810. X    
  2811. X    To prevent repeated loads of the same file, the callback keeps
  2812. X    track of each filename.  Note that I do not allow a file to be
  2813. X    re-loaded even if it is changed, or if a new file of the same 
  2814. X    name appears on the search path.  This was done for two reasons:
  2815. X    first, it makes the code more portable, as I don't have to depend
  2816. X    upon various system calls.  Second, resources can't be un-written,
  2817. X    so a user might get the wrong impression that a resource specification
  2818. X    can be deleted, and the resource file re-loaded, and something will
  2819. X    happen.  It just isn't so.
  2820. X
  2821. X    NOTE:
  2822. X    The file search list rule used here is a gross simplification of the R3
  2823. X    resource file search mechanism, without the $LANG provision.
  2824. X    I hope I can use R4 soon and do it RIGHT, but I depend on Motif for now,
  2825. X    and do not want to duplicate all the Motif code here.
  2826. X    Here I look into two directories only, which may be defined as environmental
  2827. X    variables:
  2828. X         XAPPLRESDIR  - defaults to "/usr/lib/X11/app-defaults/"
  2829. X     XUSERRESDIR  - defaults to HOME directory
  2830. X*/
  2831. X
  2832. X#ifdef VAX
  2833. X#define XAPPLRESDIR "sys$library:"
  2834. X#else
  2835. X#define XAPPLRESDIR "/usr/lib/X11/app-defaults/"
  2836. X#endif
  2837. X
  2838. Xvoid WcLoadResourceFileCB ( w,  resFileName, unused )
  2839. X    Widget w;
  2840. X    char*  resFileName;    /* client data, X resources file name */
  2841. X    caddr_t unused;    /* call data,   not used */
  2842. X{
  2843. X    static char        name[MAX_PATHNAME];        /* so not on stack */
  2844. X    XrmQuark        nameQ;
  2845. X    static XrmQuark    nameQuarks[MAX_RES_FILES];    /* initially all 0 */
  2846. X    int            i;
  2847. X    char*        path;
  2848. X    static char        filename[MAX_PATHNAME];        /* so not on stack */
  2849. X    XrmDatabase        rdb;
  2850. X    Display*        dpy = XtDisplay(w);
  2851. X    extern char*    getenv();
  2852. X    Boolean        found = FALSE;
  2853. X
  2854. X    (void) WcCleanName( resFileName, name );
  2855. X
  2856. X/*  -- check pathname presence */
  2857. X    if ( *name == NUL )
  2858. X    {
  2859. X        XtWarning ( 
  2860. X            "WcLoadResourceFileCB () - Failed \n\
  2861. X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
  2862. X             Problem: No file name provided.");
  2863. X        return;
  2864. X    }
  2865. X
  2866. X/*  -- check for repeated load, remember if first load */
  2867. X    nameQ = XrmStringToQuark( name );
  2868. X    i = 0;
  2869. X    while ( nameQuarks[i] && i < MAX_RES_FILES )
  2870. X    {
  2871. X    if ( nameQuarks[i] == nameQ )
  2872. X        return;            /* NB: not an error, its even common */
  2873. X    else
  2874. X        i++;
  2875. X    }
  2876. X    nameQuarks[i] = nameQ;
  2877. X
  2878. X/*  -- Look for file in application class resources file directory */
  2879. X    if ((path = getenv("XAPPLRESDIR")) == NULL) 
  2880. X    {
  2881. X    path = XAPPLRESDIR ;
  2882. X    } 
  2883. X    strcpy ( filename, path );
  2884. X    strcat ( filename, name );
  2885. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  2886. X    {
  2887. X    XrmMergeDatabases (rdb, &(dpy->db) );
  2888. X    found = TRUE;
  2889. X    }    
  2890. X
  2891. X#ifdef I_DONT_KNOW_WHY_THIS_IS_HERE
  2892. X/*  -- Look for file in user class resources file directory */
  2893. X    if ((path = getenv("XUSERRESDIR")) == NULL) 
  2894. X    {
  2895. X    path = ( char* )malloc (MAX_PATHNAME);
  2896. X        strcpy ( path, RootDirName(filename));
  2897. X    } 
  2898. X    strcpy ( filename, path );
  2899. X    strcat ( filename, name );
  2900. X    free   ( path );
  2901. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  2902. X    {
  2903. X    XrmMergeDatabases (rdb, &(dpy->db) );
  2904. X        found = TRUE;
  2905. X    }
  2906. X#endif
  2907. X
  2908. X/*  -- Look for file in current working directory */
  2909. X    strcpy ( filename, name );
  2910. X    if ((rdb = XrmGetFileDatabase(filename)) != NULL )
  2911. X    {
  2912. X        XrmMergeDatabases (rdb, &(dpy->db) );
  2913. X        found = TRUE;
  2914. X    }
  2915. X
  2916. X/*  -- warn the user if no file found */
  2917. X    if (!found)
  2918. X    {
  2919. X    sprintf  ( msg, 
  2920. X            "WcLoadResourceFileCB (%s) - Failed \n\
  2921. X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
  2922. X             Problem: Cannot load resource file %s",
  2923. X    resFileName, name );
  2924. X    XtWarning( msg );
  2925. X    }
  2926. X}
  2927. X
  2928. X/*
  2929. X  -- WcTraceCallback
  2930. X*******************************************************************************
  2931. X    This is a simple traceback callback, used to assist in interface
  2932. X    debugging. The callback prints the invoking wiget pathname and
  2933. X    a specified message on std. output.
  2934. X*/
  2935. X
  2936. Xvoid WcTraceCB ( w, annotation, unused )
  2937. X    Widget w;
  2938. X    char* annotation;    /* client data, traceback annotation */
  2939. X    caddr_t unused;    /* call data,   not used */
  2940. X{
  2941. X    char* name = WcWidgetToFullName( w );
  2942. X    
  2943. X    printf("TraceCB for %s: %s\n", name, annotation );
  2944. X    XtFree( name );
  2945. X}
  2946. X
  2947. X/*
  2948. X  -- Popup named widget
  2949. X*******************************************************************************
  2950. X    These callbacks translate a string passed in as client data into a 
  2951. X    widget id.  
  2952. X
  2953. X    A grab kind value of XtGrabNone has the effect of allowing 
  2954. X    non-modal popups.  This is the preferred type: rarely use modal pop-ups.
  2955. X    This is registered as PopupCB.
  2956. X
  2957. X    A grab kind value of XtGrabExclusive has the effect of grabbing all
  2958. X    application events, allowing modal popups.  This is registered as 
  2959. X    PopupGrabCB.
  2960. X*/
  2961. X
  2962. X#ifdef FUNCTION_PROTOTYPES
  2963. Xstatic void Popup ( Widget, char*, char*, XtGrabKind );
  2964. X#else
  2965. Xstatic void Popup ();
  2966. X#endif
  2967. X
  2968. Xvoid WcPopupCB ( w, name, unused )
  2969. X    Widget      w;
  2970. X    char*       name;
  2971. X    caddr_t    unused;
  2972. X{
  2973. X    Popup ( w, name, "WcPopupCB", XtGrabNone );
  2974. X}
  2975. X
  2976. Xvoid WcPopupGrabCB ( w, name, unused )
  2977. X    Widget      w;
  2978. X    char*       name;
  2979. X    caddr_t     unused;
  2980. X{
  2981. X    Popup ( w, name, "WcPopupGrabCB", XtGrabExclusive );
  2982. X}
  2983. X
  2984. Xstatic void Popup ( w, name, callbackName, grab )
  2985. X    Widget    w;
  2986. X    char*    name;
  2987. X    char*    callbackName;
  2988. X    XtGrabKind    grab;
  2989. X{
  2990. X    Widget      widget;
  2991. X
  2992. X    (void)WcCleanName ( name, cleanName );
  2993. X    widget = WcFullNameToWidget ( w, cleanName );
  2994. X
  2995. X    if (XtIsShell(widget))
  2996. X    {
  2997. X        XtPopup  ( widget, grab );
  2998. X    }
  2999. X    else
  3000. X    {
  3001. X        sprintf( msg,
  3002. X            "%s (%s) - Failed \n\
  3003. X             Usage: %s (shell_widget_name) \n\
  3004. X             Problem: `%s' is not a shell widget.",
  3005. X             callbackName, name, callbackName, cleanName);
  3006. X        XtWarning( msg );
  3007. X    }
  3008. X}
  3009. X
  3010. X/*
  3011. X  -- Popdown named widget
  3012. X*******************************************************************************
  3013. X    This callback translates string passed in as client data into a widget id
  3014. X    and pops-down a popup shell widget.
  3015. X*/
  3016. X
  3017. Xvoid WcPopdownCB ( w, name, unused ) 
  3018. X    Widget    w;
  3019. X    char*    name;
  3020. X    caddr_t    unused;
  3021. X{
  3022. X    Widget      widget;
  3023. X
  3024. X    (void)WcCleanName ( name, cleanName );
  3025. X    widget = WcFullNameToWidget ( w, cleanName );
  3026. X
  3027. X    if (XtIsShell(widget))
  3028. X    {
  3029. X        XtPopdown  ( widget );
  3030. X    }
  3031. X    else
  3032. X    {
  3033. X        sprintf( msg,
  3034. X            "WcPopdownCB (%s) Failed \n\
  3035. X             Usage: WcPopdownCB (shell_widget_name) \n\
  3036. X             Problem: `%s' is not a shell widget.",
  3037. X             name, cleanName);
  3038. X        XtWarning( msg );
  3039. X    }
  3040. X}
  3041. X
  3042. X/*
  3043. X  -- Map and Unmap named widget
  3044. X*******************************************************************************
  3045. X    These callbacks translate a string passed as client data into a widget id
  3046. X    and invokes either XtMapWidget() os XtUnmapWidget() as appropriate.
  3047. X*/
  3048. X
  3049. Xvoid WcMapCB (w, name, unused )
  3050. X    Widget      w;
  3051. X    char*       name;
  3052. X    caddr_t     unused;
  3053. X{
  3054. X    Widget      widget;
  3055. X
  3056. X    (void)WcCleanName ( name, cleanName );
  3057. X    widget = WcFullNameToWidget ( w, cleanName );
  3058. X
  3059. X    if (XtIsShell(widget))
  3060. X    {
  3061. X        XtMapWidget ( widget );
  3062. X    }
  3063. X    else
  3064. X    {
  3065. X        sprintf( msg,
  3066. X            "WcMapCB (%s) Failed \n\
  3067. X             Usage: WcMapCB (shell_widget_name) \n\
  3068. X             Problem: `%s' is not a shell widget.",
  3069. X             name, cleanName);
  3070. X        XtWarning( msg );
  3071. X    }
  3072. X}
  3073. X
  3074. Xvoid WcUnmapCB (w, name, unused )
  3075. X    Widget      w;
  3076. X    char*       name;
  3077. X    caddr_t     unused;
  3078. X{
  3079. X    Widget      widget;
  3080. X
  3081. X    (void)WcCleanName ( name, cleanName );
  3082. X    widget = WcFullNameToWidget ( w, cleanName );
  3083. X
  3084. X    if (XtIsShell(widget))
  3085. X    {
  3086. X        XtUnmapWidget ( widget );
  3087. X    }
  3088. X    else
  3089. X    {
  3090. X        sprintf( msg,
  3091. X            "WcUnmapCB (%s) Failed \n\
  3092. X             Usage: WcUnmapCB (shell_widget_name) \n\
  3093. X             Problem: `%s' is not a shell widget.",
  3094. X             name, cleanName);
  3095. X        XtWarning( msg );
  3096. X    }
  3097. X}
  3098. X
  3099. X/*
  3100. X  -- Invoke shell command
  3101. X*******************************************************************************
  3102. X    Call system().
  3103. X*/
  3104. X
  3105. Xvoid WcSystemCB ( w, shellCmdString, unused )
  3106. X    Widget      w;
  3107. X    char*       shellCmdString;
  3108. X    caddr_t     unused;
  3109. X{
  3110. X    system( shellCmdString );
  3111. X}
  3112. X
  3113. X/*
  3114. X  -- Exit the application
  3115. X*******************************************************************************
  3116. X    Call exit().
  3117. X*/
  3118. X
  3119. Xvoid WcExitCB ( w, exitValString, unused )
  3120. X    Widget    w;
  3121. X    char*    exitValString;
  3122. X    caddr_t    unused;
  3123. X{
  3124. X    int exitval = 0;
  3125. X
  3126. X    /* skip leading garbage before int */
  3127. X    while (*exitValString)
  3128. X    {
  3129. X        if ('0' < *exitValString && *exitValString <= '9')
  3130. X            break; /* found numbers, convert to exitval */
  3131. X        exitValString++;
  3132. X    }
  3133. X
  3134. X    /* convert to int */
  3135. X    while (*exitValString)
  3136. X    {
  3137. X        if ('0' < *exitValString && *exitValString <= '9')
  3138. X        {
  3139. X            exitval = exitval * 10 + (*exitValString - '0');
  3140. X            exitValString++;
  3141. X        }
  3142. X        else
  3143. X            break;  /* ignore trailing garbage */
  3144. X    }
  3145. X
  3146. X    exit( exitval );
  3147. X}
  3148. X
  3149. X/*
  3150. X  -- WcRegisterCreateCallbacks
  3151. X*******************************************************************************
  3152. X   Convenience routine, registering all standard callbacks in one application
  3153. X   call.   Called from WcWidgetCreation(), so application usually never needs
  3154. X   to call this.
  3155. X*/
  3156. X
  3157. Xvoid WcRegisterWcCallbacks ( app )
  3158. XXtAppContext app;
  3159. X{
  3160. X#define RCALL( name, func ) WcRegisterCallback ( app, name, func, NULL )
  3161. X
  3162. X    /* ONCE_PER_XtAppContext( app ); */
  3163. X    static int already = 0;
  3164. X    if (already++)
  3165. X    return;
  3166. X
  3167. X    RCALL( "WcCreateChildrenCB",    WcCreateChildrenCB    );
  3168. X    RCALL( "WcManageCB",        WcManageCB        );
  3169. X    RCALL( "WcUnmanageCB",        WcUnmanageCB        );
  3170. X    RCALL( "WcManageChildrenCB",    WcManageChildrenCB    );
  3171. X    RCALL( "WcUnmanageChildrenCB",    WcUnmanageChildrenCB    );
  3172. X    RCALL( "WcDestroyCB",        WcDestroyCB        );
  3173. X    RCALL( "WcSetValueCB",        WcSetValueCB        );
  3174. X    RCALL( "WcSetSensitiveCB",        WcSetSensitiveCB    );
  3175. X    RCALL( "WcSetInsensitiveCB",    WcSetInsensitiveCB    );
  3176. X    RCALL( "WcLoadResourceFileCB",    WcLoadResourceFileCB    );
  3177. X    RCALL( "WcTraceCB",            WcTraceCB        );
  3178. X    RCALL( "WcPopupCB",            WcPopupCB        );
  3179. X    RCALL( "WcPopupGrabCB",        WcPopupGrabCB        );
  3180. X    RCALL( "WcPopdownCB",        WcPopdownCB        );
  3181. X    RCALL( "WcMapCB",            WcMapCB            );
  3182. X    RCALL( "WcUnmapCB",            WcUnmapCB        );
  3183. X    RCALL( "WcSystemCB",        WcSystemCB        );
  3184. X    RCALL( "WcExitCB",            WcExitCB        );
  3185. X
  3186. X#undef CALLBACK
  3187. X}
  3188. +FUNKY+STUFF+
  3189. echo '-rw-r--r--  1 david       34636 Oct 16 14:35 WcCallb.c    (as sent)'
  3190. chmod u=rw,g=r,o=r WcCallb.c
  3191. ls -l WcCallb.c
  3192. exit 0
  3193.  
  3194. dan
  3195. ----------------------------------------------------
  3196. O'Reilly && Associates   argv@sun.com / argv@ora.com
  3197. Opinions expressed reflect those of the author only.
  3198. --
  3199. dan
  3200. ----------------------------------------------------
  3201. O'Reilly && Associates   argv@sun.com / argv@ora.com
  3202. Opinions expressed reflect those of the author only.
  3203.