home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume14 / ora.vol6 / part08 < prev    next >
Text File  |  1991-09-18  |  59KB  |  1,791 lines

  1. Path: uunet!cs.utexas.edu!sun-barr!cronkite.Central.Sun.COM!exodus!z-code.com
  2. From: argv@z-code.com (Dan Heller)
  3. Newsgroups: comp.sources.x
  4. Subject: v14i038: Examples from the Motif Programmer's Manual (ORA-Vol. 6), Part08/11
  5. Message-ID: <20152@exodus.Eng.Sun.COM>
  6. Date: 18 Sep 91 22:31:20 GMT
  7. References: <csx-14i031-ora.vol6@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1779
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: Dan Heller <argv@z-code.com>
  13. Posting-number: Volume 14, Issue 38
  14. Archive-name: ora.vol6/part08
  15.  
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # If this archive is complete, you will see the following message at the end:
  22. #        "End of archive 8 (of 11)."
  23. # Contents:  vol6/ch05/modal.c vol6/ch05/reason.c vol6/ch07/map_dlg.c
  24. #   vol6/ch08/traversal.c vol6/ch08/unit_types.c
  25. #   vol6/ch09/monitor_sb.c vol6/ch11/arrow.c vol6/ch11/multi_click.c
  26. #   vol6/ch12/toggle_box.c vol6/ch14/simple_scale.c vol6/ch15/passwd.c
  27. #   vol6/ch15/prompt_phone.c vol6/ch15/text_box.c
  28. #   vol6/ch16/simple_option.c vol6/ch16/simple_popup.c
  29. #   vol6/ch17/wm_del_proto.c vol6/ch17/wm_delete.c
  30. #   vol6/ch20/simple_help.c
  31. # Wrapped by argv@tribbles on Wed Sep 18 15:10:25 1991
  32. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  33. if test -f 'vol6/ch05/modal.c' -a "${1}" != "-c" ; then 
  34.   echo shar: Will not clobber existing file \"'vol6/ch05/modal.c'\"
  35. else
  36. echo shar: Extracting \"'vol6/ch05/modal.c'\" \(2604 characters\)
  37. sed "s/^X//" >'vol6/ch05/modal.c' <<'END_OF_FILE'
  38. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  39. X * This program is freely distributable without licensing fees and
  40. X * is provided without guarantee or warrantee expressed or implied.
  41. X * This program is -not- in the public domain.
  42. X */
  43. X
  44. X/* modal.c -- demonstrate modal dialogs.  Display two pushbuttons
  45. X * each activating a modal dialog.
  46. X */
  47. X#include <Xm/RowColumn.h>
  48. X#include <Xm/MessageB.h>
  49. X#include <Xm/PushB.h>
  50. X
  51. X/* main() --create a pushbutton whose callback pops up a dialog box */
  52. Xmain(argc, argv)
  53. Xchar *argv[];
  54. X{
  55. X    XtAppContext app;
  56. X    Widget toplevel, button, rowcolumn;
  57. X    void pushed();
  58. X
  59. X    toplevel = XtVaAppInitialize(&app, "Demos",
  60. X        NULL, 0, &argc, argv, NULL, NULL);
  61. X
  62. X    rowcolumn = XtCreateManagedWidget("rowcolumn",
  63. X        xmRowColumnWidgetClass, toplevel, NULL, 0);
  64. X
  65. X    button = XtCreateManagedWidget("application-modal",
  66. X        xmPushButtonWidgetClass, rowcolumn, NULL, 0);
  67. X    XtAddCallback(button, XmNactivateCallback,
  68. X        pushed, XmDIALOG_FULL_APPLICATION_MODAL);
  69. X    button = XtCreateManagedWidget("system-modal",
  70. X        xmPushButtonWidgetClass, rowcolumn, NULL, 0);
  71. X    XtAddCallback(button, XmNactivateCallback, pushed,
  72. X        XmDIALOG_SYSTEM_MODAL);
  73. X
  74. X    XtRealizeWidget(toplevel);
  75. X    XtAppMainLoop(app);
  76. X}
  77. X
  78. X/* pushed() --the callback routine for the main app's pushbutton.
  79. X * Create either a full-application or system modal dialog box.
  80. X */
  81. Xvoid
  82. Xpushed(w, modality)
  83. XWidget w;
  84. Xunsigned char modality;
  85. X{
  86. X    static Widget dialog;
  87. X    XmString t;
  88. X    extern void dlg_callback();
  89. X
  90. X    /* See if we've already created this dialog -- if so,
  91. X     * we don't need to create it again.  Just re-pop it up.
  92. X     */
  93. X    if (!dialog) {
  94. X        Arg args[2];
  95. X        XmString ok = XmStringCreateSimple("OK");
  96. X        XtSetArg(args[0], XmNautoUnmanage, False);
  97. X        XtSetArg(args[1], XmNcancelLabelString, ok);
  98. X        dialog = XmCreateInformationDialog(w, "notice", args, 2);
  99. X        XtAddCallback(dialog, XmNcancelCallback, dlg_callback, NULL);
  100. X        XtUnmanageChild(
  101. X            XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON));
  102. X        XtUnmanageChild(
  103. X            XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  104. X    }
  105. X    t = XmStringCreateSimple("You must reply to this message now!");
  106. X    XtVaSetValues(dialog,
  107. X        XmNmessageString,    t,
  108. X        XmNdialogStyle,      modality,
  109. X        NULL);
  110. X    XmStringFree(t);
  111. X    XtManageChild(dialog);
  112. X    XtPopup(XtParent(dialog), XtGrabNone);
  113. X}
  114. X
  115. Xvoid
  116. Xdlg_callback(dialog, client_data, cbs)
  117. XWidget dialog;
  118. XXtPointer client_data;
  119. XXmAnyCallbackStruct *cbs;
  120. X{
  121. X    XtPopdown(XtParent(dialog));
  122. X}
  123. END_OF_FILE
  124. if test 2604 -ne `wc -c <'vol6/ch05/modal.c'`; then
  125.     echo shar: \"'vol6/ch05/modal.c'\" unpacked with wrong size!
  126. fi
  127. # end of 'vol6/ch05/modal.c'
  128. fi
  129. if test -f 'vol6/ch05/reason.c' -a "${1}" != "-c" ; then 
  130.   echo shar: Will not clobber existing file \"'vol6/ch05/reason.c'\"
  131. else
  132. echo shar: Extracting \"'vol6/ch05/reason.c'\" \(2907 characters\)
  133. sed "s/^X//" >'vol6/ch05/reason.c' <<'END_OF_FILE'
  134. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  135. X * This program is freely distributable without licensing fees and
  136. X * is provided without guarantee or warrantee expressed or implied.
  137. X * This program is -not- in the public domain.
  138. X */
  139. X
  140. X/* reason.c -- examine the reason field of the callback structure
  141. X * passed as the call_data of the callback function.  This field
  142. X * indicates which action area button in the dialog was pressed.
  143. X */
  144. X#include <Xm/RowColumn.h>
  145. X#include <Xm/MessageB.h>
  146. X#include <Xm/PushB.h>
  147. X
  148. X/* main() --create a pushbutton whose callback pops up a dialog box */
  149. Xmain(argc, argv)
  150. Xchar *argv[];
  151. X{
  152. X    XtAppContext app;
  153. X    Widget toplevel, rc, pb;
  154. X    extern void pushed();
  155. X
  156. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  157. X        &argc, argv, NULL, NULL);
  158. X
  159. X    rc = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, toplevel, NULL);
  160. X
  161. X    pb = XtVaCreateManagedWidget("Hello", xmPushButtonWidgetClass, rc, NULL);
  162. X    XtAddCallback(pb, XmNactivateCallback, pushed, "Hello World");
  163. X
  164. X    pb = XtVaCreateManagedWidget("Goodbye", xmPushButtonWidgetClass, rc, NULL);
  165. X    XtAddCallback(pb, XmNactivateCallback, pushed, "Goodbye World");
  166. X
  167. X    XtManageChild(rc);
  168. X    XtRealizeWidget(toplevel);
  169. X    XtAppMainLoop(app);
  170. X}
  171. X
  172. X/* pushed() --the callback routine for the main app's pushbuttons.
  173. X * Create and popup a dialog box that has callback functions for
  174. X * the Ok, Cancel and Help buttons.
  175. X */
  176. Xvoid
  177. Xpushed(w, message)
  178. XWidget w;
  179. Xchar *message; /* really: client_data, but we know what it is */
  180. X{
  181. X    static Widget dialog;
  182. X    XmString t = XmStringCreateSimple(message);
  183. X
  184. X    /* See if we've already created this dialog -- if so,
  185. X     * we don't need to create it again.  Just set the message
  186. X     * and manage it (repop it up).
  187. X     */
  188. X    if (!dialog) {
  189. X        extern void callback();
  190. X        Arg args[1];
  191. X
  192. X        XtSetArg(args[0], XmNautoUnmanage,  False);
  193. X        dialog = XmCreateMessageDialog(w, "notice", args, 1);
  194. X        XtAddCallback(dialog, XmNokCallback, callback, "Hi");
  195. X        XtAddCallback(dialog, XmNcancelCallback, callback, "Foo");
  196. X        XtAddCallback(dialog, XmNhelpCallback, callback, "Bar");
  197. X    }
  198. X    XtVaSetValues(dialog, XmNmessageString, t, NULL);
  199. X    XmStringFree(t);
  200. X    XtManageChild(dialog);
  201. X
  202. X    XtPopup(XtParent(dialog), XtGrabNone);
  203. X}
  204. X
  205. X/* callback() --One of the dialog buttons was selected.
  206. X * Determine which one by examining the "reason" parameter.
  207. X */
  208. Xvoid
  209. Xcallback(w, client_data, cbs)
  210. XWidget w;
  211. XXtPointer client_data;
  212. XXmAnyCallbackStruct *cbs;
  213. X{
  214. X    char *button;
  215. X
  216. X    switch (cbs->reason) {
  217. X        case XmCR_OK : button = "OK"; break;
  218. X        case XmCR_CANCEL : button = "Cancel"; break;
  219. X        case XmCR_HELP : button = "Help";
  220. X    }
  221. X    printf("%s was selected: %s\n", button, client_data);
  222. X    if (cbs->reason != XmCR_HELP) {
  223. X        /* the ok and cancel buttons "close" the widget */
  224. X        XtPopdown(XtParent(w));
  225. X    }
  226. X}
  227. END_OF_FILE
  228. if test 2907 -ne `wc -c <'vol6/ch05/reason.c'`; then
  229.     echo shar: \"'vol6/ch05/reason.c'\" unpacked with wrong size!
  230. fi
  231. # end of 'vol6/ch05/reason.c'
  232. fi
  233. if test -f 'vol6/ch07/map_dlg.c' -a "${1}" != "-c" ; then 
  234.   echo shar: Will not clobber existing file \"'vol6/ch07/map_dlg.c'\"
  235. else
  236. echo shar: Extracting \"'vol6/ch07/map_dlg.c'\" \(2310 characters\)
  237. sed "s/^X//" >'vol6/ch07/map_dlg.c' <<'END_OF_FILE'
  238. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  239. X * This program is freely distributable without licensing fees and
  240. X * is provided without guarantee or warrantee expressed or implied.
  241. X * This program is -not- in the public domain.
  242. X */
  243. X
  244. X/* map_dlg.c -- Use the XmNmapCallback to automatically position
  245. X * a dialog on the screen.  Each time the dialog is displayed, it
  246. X * is mapped down and to the right by 200 pixels in each direction.
  247. X */
  248. X#include <Xm/MessageB.h>
  249. X#include <Xm/PushB.h>
  250. X
  251. X/* main() --create a pushbutton whose callback pops up a dialog box */
  252. Xmain(argc, argv)
  253. Xchar *argv[];
  254. X{
  255. X    Widget toplevel, button;
  256. X    XtAppContext app;
  257. X    void pushed();
  258. X
  259. X    toplevel = XtVaAppInitialize(&app, "Demos",
  260. X        NULL, 0, &argc, argv, NULL, NULL);
  261. X
  262. X    button = XtCreateManagedWidget("button", xmPushButtonWidgetClass,
  263. X        toplevel, NULL, 0);
  264. X    XtAddCallback(button, XmNactivateCallback, pushed, "Hello World");
  265. X
  266. X    XtRealizeWidget(toplevel);
  267. X    XtAppMainLoop(app);
  268. X}
  269. X
  270. X/* callback function for XmNmapCallback.  Position dialog in 200 pixel
  271. X * "steps".  When the edge of the screen is hit, start over.
  272. X */
  273. Xstatic void
  274. Xmap_dialog(dialog, client_data, cbs)
  275. XWidget dialog;
  276. XXtPointer client_data;
  277. XXmAnyCallbackStruct *cbs;
  278. X{
  279. X    static Position x, y;
  280. X    Dimension w, h;
  281. X
  282. X    XtVaGetValues(dialog, XmNwidth, &w, XmNheight, &h, NULL);
  283. X    if (x + w >= WidthOfScreen(XtScreen(dialog)))
  284. X        x = 0;
  285. X    if (y + h >= HeightOfScreen(XtScreen(dialog)))
  286. X        y = 0;
  287. X    XtVaSetValues(dialog, XmNx, x, XmNy, y, NULL);
  288. X    x += 200, y += 200;
  289. X}
  290. X
  291. X/* pushed() --the callback routine for the main app's pushbutton.
  292. X * Create and popup a dialog box that has callback functions for
  293. X * the Ok, Cancel and Help buttons.
  294. X */
  295. Xvoid
  296. Xpushed(w, message)
  297. XWidget w;
  298. Xchar *message; /* The client_data parameter passed by XtAddCallback */
  299. X{
  300. X    Widget dialog;
  301. X    Arg arg[3];
  302. X    XmString t = XmStringCreateSimple(message);
  303. X    extern void response();
  304. X
  305. X    XtSetArg(arg[0], XmNautoUnmanage, False);
  306. X    XtSetArg(arg[1], XmNmessageString, t);
  307. X    XtSetArg(arg[2], XmNdefaultPosition, False);
  308. X    dialog = XmCreateMessageDialog(w, "notice", arg, 3);
  309. X    XmStringFree(t);
  310. X
  311. X    XtAddCallback(dialog, XmNmapCallback, map_dialog, NULL);
  312. X
  313. X    XtManageChild(dialog);
  314. X    XtPopup(XtParent(dialog), XtGrabNone);
  315. X}
  316. END_OF_FILE
  317. if test 2310 -ne `wc -c <'vol6/ch07/map_dlg.c'`; then
  318.     echo shar: \"'vol6/ch07/map_dlg.c'\" unpacked with wrong size!
  319. fi
  320. # end of 'vol6/ch07/map_dlg.c'
  321. fi
  322. if test -f 'vol6/ch08/traversal.c' -a "${1}" != "-c" ; then 
  323.   echo shar: Will not clobber existing file \"'vol6/ch08/traversal.c'\"
  324. else
  325. echo shar: Extracting \"'vol6/ch08/traversal.c'\" \(2604 characters\)
  326. sed "s/^X//" >'vol6/ch08/traversal.c' <<'END_OF_FILE'
  327. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  328. X * This program is freely distributable without licensing fees and
  329. X * is provided without guarantee or warrantee expressed or implied.
  330. X * This program is -not- in the public domain.
  331. X */
  332. X
  333. X/* traverse.c -- demonstrate how keyboard traversal can be
  334. X * manipulated among primitive widgets.  Create a tic-tac-toe
  335. X * board of PushButtons.  As each item is selected, mark it
  336. X * with an X (unless the Shift key is down) and change the
  337. X * PushButton's XmNtraversalOn to False so user can't traverse
  338. X * to it anymore.
  339. X */
  340. X#include <Xm/PushBG.h>
  341. X#include <Xm/Form.h>
  342. X
  343. Xmain(argc, argv)
  344. Xint argc;
  345. Xchar *argv[];
  346. X{
  347. X    XtAppContext app;
  348. X    Widget toplevel, parent, w;
  349. X    int x, y;
  350. X    extern void pushed();  /* callback for the PushButton */
  351. X
  352. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  353. X        &argc, argv, NULL, NULL);
  354. X
  355. X    parent = XtVaCreateManagedWidget("form", xmFormWidgetClass, toplevel,
  356. X        XmNfractionBase,    3,
  357. X        NULL);
  358. X    /* create nine pushbutton widgets in tic-tac-toe format */
  359. X    for (x = 0; x < 3; x++)
  360. X        for (y = 0; y < 3; y++) {
  361. X            w = XtVaCreateManagedWidget(" ",
  362. X                xmPushButtonGadgetClass, parent,
  363. X                XmNtopAttachment,    XmATTACH_POSITION,
  364. X                XmNtopPosition,      y,
  365. X                XmNleftAttachment,   XmATTACH_POSITION,
  366. X                XmNleftPosition,     x,
  367. X                XmNrightAttachment,  XmATTACH_POSITION,
  368. X                XmNrightPosition,    x+1,
  369. X                XmNbottomAttachment, XmATTACH_POSITION,
  370. X                XmNbottomPosition,   y+1,
  371. X                NULL);
  372. X            XtAddCallback(w, XmNactivateCallback, pushed, NULL);
  373. X        }
  374. X
  375. X    XtRealizeWidget(toplevel);
  376. X    XtAppMainLoop(app);
  377. X}
  378. X
  379. Xvoid
  380. Xpushed(w, client_data, cbs)
  381. XWidget      w;           /* The PushButton that got activated */
  382. XXtPointer   client_data; /* unused -- NULL was passed to XtAddCallback() */
  383. XXmPushButtonCallbackStruct *cbs;
  384. X{
  385. X    char buf[2];
  386. X    XmString str;
  387. X    int letter;
  388. X
  389. X    XtVaGetValues(w, XmNuserData, &letter, NULL);
  390. X    if (letter) {
  391. X        XBell(XtDisplayOfObject(w), 50);
  392. X        return;
  393. X    }
  394. X    /* Shift key gets an O.  (xbutton and xkey happen to be similar) */
  395. X    if (cbs->event->xbutton.state & ShiftMask)
  396. X        letter = buf[0] = '0';
  397. X    else
  398. X        letter = buf[0] = 'X';
  399. X    buf[1] = 0;
  400. X    str = XmStringCreateSimple(buf);
  401. X    XtVaSetValues(w,
  402. X        XmNlabelString,     str,
  403. X        XmNuserData,        letter,
  404. X        XmNshadowThickness, 0,
  405. X        XmNtraversalOn,     False,
  406. X        NULL);
  407. X    XmStringFree(str);
  408. X}
  409. END_OF_FILE
  410. if test 2604 -ne `wc -c <'vol6/ch08/traversal.c'`; then
  411.     echo shar: \"'vol6/ch08/traversal.c'\" unpacked with wrong size!
  412. fi
  413. # end of 'vol6/ch08/traversal.c'
  414. fi
  415. if test -f 'vol6/ch08/unit_types.c' -a "${1}" != "-c" ; then 
  416.   echo shar: Will not clobber existing file \"'vol6/ch08/unit_types.c'\"
  417. else
  418. echo shar: Extracting \"'vol6/ch08/unit_types.c'\" \(1618 characters\)
  419. sed "s/^X//" >'vol6/ch08/unit_types.c' <<'END_OF_FILE'
  420. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  421. X * This program is freely distributable without licensing fees and
  422. X * is provided without guarantee or warrantee expressed or implied.
  423. X * This program is -not- in the public domain.
  424. X */
  425. X
  426. X/* unit_types.c --the same as paned_win1.c except that the
  427. X * Labels' minimum and maximum sizes are set to 1/4 inch and
  428. X * 1/2 inch respectively.  These measurements are retained
  429. X * regardless of the pixels-per-inch resolution of the user's
  430. X * display.
  431. X */
  432. X#include <Xm/Label.h>
  433. X#include <Xm/PanedW.h>
  434. X#include <Xm/Text.h>
  435. X
  436. Xmain(argc, argv)
  437. Xchar *argv[];
  438. X{
  439. X    Widget        toplevel, pane;
  440. X    XtAppContext  app;
  441. X
  442. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  443. X        &argc, argv, NULL, NULL);
  444. X
  445. X    pane = XtVaCreateWidget("pane",
  446. X        xmPanedWindowWidgetClass, toplevel,
  447. X        XmNunitType, Xm1000TH_INCHES,
  448. X        NULL);
  449. X
  450. X    XtVaCreateManagedWidget("Hello", xmLabelWidgetClass, pane,
  451. X        XmNpaneMinimum,    250, /* quarter inch */
  452. X        XmNpaneMaximum,    500, /* half inch */
  453. X        NULL);
  454. X
  455. X    XtVaCreateManagedWidget("text", xmTextWidgetClass, pane,
  456. X        XmNrows,           5,
  457. X        XmNcolumns,        80,
  458. X        XmNpaneMinimum,    250,
  459. X        XmNeditMode,       XmMULTI_LINE_EDIT,
  460. X        XmNvalue,   "This is a test of the paned window widget.",
  461. X        NULL);
  462. X
  463. X    XtVaCreateManagedWidget("Goodbye", xmLabelWidgetClass, pane,
  464. X        XmNpaneMinimum,    250, /* quarter inch */
  465. X        XmNpaneMaximum,    500, /* half inch */
  466. X        NULL);
  467. X
  468. X    XtManageChild(pane);
  469. X
  470. X    XtRealizeWidget(toplevel);
  471. X    XtAppMainLoop(app);
  472. X}
  473. END_OF_FILE
  474. if test 1618 -ne `wc -c <'vol6/ch08/unit_types.c'`; then
  475.     echo shar: \"'vol6/ch08/unit_types.c'\" unpacked with wrong size!
  476. fi
  477. # end of 'vol6/ch08/unit_types.c'
  478. fi
  479. if test -f 'vol6/ch09/monitor_sb.c' -a "${1}" != "-c" ; then 
  480.   echo shar: Will not clobber existing file \"'vol6/ch09/monitor_sb.c'\"
  481. else
  482. echo shar: Extracting \"'vol6/ch09/monitor_sb.c'\" \(3201 characters\)
  483. sed "s/^X//" >'vol6/ch09/monitor_sb.c' <<'END_OF_FILE'
  484. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  485. X * This program is freely distributable without licensing fees and
  486. X * is provided without guarantee or warrantee expressed or implied.
  487. X * This program is -not- in the public domain.
  488. X */
  489. X
  490. X/* monitor_sb.c -- demonstrate the Scrollbar callback routines by
  491. X * monitoring the Scrollbar for a ScrolledList.  Functionally, this
  492. X * program does nothing.  However, by tinkering with the Scrolled
  493. X * List and watching the output from the Scrollbar's callback routine,
  494. X * you'll see some interesting behavioral patterns.  By interacting
  495. X * with the *List* widget to cause scrolling, the Scrollbar's callback
  496. X * routine is never called.  Thus, monitoring the scrolling actions
  497. X * of a Scrollbar should not be used to keep tabs on exactly when
  498. X * the scrollbar's value changes!
  499. X */
  500. X#include <Xm/List.h>
  501. X
  502. X/* print the "interesting" resource values of a scrollbar */
  503. Xvoid
  504. Xscroll_action(scrollbar, client_data, cbs)
  505. XWidget scrollbar;
  506. XXtPointer client_data;
  507. XXmScrollBarCallbackStruct *cbs;
  508. X{
  509. X    printf("cbs->reason: %s, cbs->value = %d, cbs->pixel = %d\n",
  510. X        cbs->reason == XmCR_DRAG? "drag" :
  511. X        cbs->reason == XmCR_VALUE_CHANGED? "value changed" :
  512. X        cbs->reason == XmCR_INCREMENT? "increment" :
  513. X        cbs->reason == XmCR_DECREMENT? "decrement" :
  514. X        cbs->reason == XmCR_PAGE_INCREMENT? "page increment" :
  515. X        cbs->reason == XmCR_PAGE_DECREMENT? "page decrement" :
  516. X        cbs->reason == XmCR_TO_TOP? "top" :
  517. X        cbs->reason == XmCR_TO_BOTTOM? "bottom" : "unknown",
  518. X        cbs->value, cbs->pixel);
  519. X}
  520. X
  521. Xmain(argc, argv)
  522. Xint argc;
  523. Xchar *argv[];
  524. X{
  525. X    Widget        toplevel, list_w, sb;
  526. X    XtAppContext  app;
  527. X    char *items = "choice0, choice1, choice2, choice3, choice4, \
  528. X                   choice5, choice6, choice7, choice8, choice9, \
  529. X                   choice10, choice11, choice12, choice13, choice14";
  530. X
  531. X    toplevel = XtAppInitialize(&app, "Demos",
  532. X        NULL, 0, &argc, argv, NULL, NULL, 0);
  533. X
  534. X    list_w = XmCreateScrolledList(toplevel, "list_w", NULL, 0);
  535. X    XtVaSetValues(list_w,
  536. X        /* Rather than convert the entire list of items into an array
  537. X         * of compound strings, let's just let Motif's type converter
  538. X         * do it for us and save lots of effort (altho not much time).
  539. X         */
  540. X        XtVaTypedArg, XmNitems, XmRString, items, strlen(items)+1,
  541. X        XmNitemCount, 15,
  542. X        XmNvisibleItemCount, 5,
  543. X        NULL);
  544. X    XtManageChild(list_w);
  545. X
  546. X    /* get the scrollbar from ScrolledWindow associated with Text widget */
  547. X    XtVaGetValues(XtParent(list_w), XmNverticalScrollBar, &sb, NULL);
  548. X    XtAddCallback(sb, XmNvalueChangedCallback, scroll_action, NULL);
  549. X    XtAddCallback(sb, XmNdragCallback, scroll_action, NULL);
  550. X    XtAddCallback(sb, XmNincrementCallback, scroll_action, NULL);
  551. X    XtAddCallback(sb, XmNdecrementCallback, scroll_action, NULL);
  552. X    XtAddCallback(sb, XmNpageIncrementCallback, scroll_action, NULL);
  553. X    XtAddCallback(sb, XmNpageDecrementCallback, scroll_action, NULL);
  554. X    XtAddCallback(sb, XmNtoTopCallback, scroll_action, NULL);
  555. X    XtAddCallback(sb, XmNtoBottomCallback, scroll_action, NULL);
  556. X
  557. X    XtRealizeWidget(toplevel);
  558. X    XtAppMainLoop(app);
  559. X}
  560. END_OF_FILE
  561. if test 3201 -ne `wc -c <'vol6/ch09/monitor_sb.c'`; then
  562.     echo shar: \"'vol6/ch09/monitor_sb.c'\" unpacked with wrong size!
  563. fi
  564. # end of 'vol6/ch09/monitor_sb.c'
  565. fi
  566. if test -f 'vol6/ch11/arrow.c' -a "${1}" != "-c" ; then 
  567.   echo shar: Will not clobber existing file \"'vol6/ch11/arrow.c'\"
  568. else
  569. echo shar: Extracting \"'vol6/ch11/arrow.c'\" \(2348 characters\)
  570. sed "s/^X//" >'vol6/ch11/arrow.c' <<'END_OF_FILE'
  571. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  572. X * This program is freely distributable without licensing fees and
  573. X * is provided without guarantee or warrantee expressed or implied.
  574. X * This program is -not- in the public domain.
  575. X */
  576. X
  577. X/* arrow.c -- demonstrate the ArrowButton widget.
  578. X * Have a Form widget display 4 ArrowButtons in a
  579. X * familiar arrangement.
  580. X */
  581. X#include <Xm/ArrowBG.h>
  582. X#include <Xm/Form.h>
  583. X
  584. Xmain(argc, argv)
  585. Xint argc;
  586. Xchar *argv[];
  587. X{
  588. X    XtAppContext app;
  589. X    Widget toplevel, form;
  590. X    XmString btn_text;
  591. X    Display *dpy;
  592. X
  593. X    toplevel = XtVaAppInitialize(&app, "Demos",
  594. X        NULL, 0, &argc, argv, NULL, NULL);
  595. X
  596. X    dpy = XtDisplay(toplevel);
  597. X    /* Rather than listing all these resources in an app-defaults file,
  598. X     * add them directly to the database for this application only. This
  599. X     * would be virtually equivalent to hard-coding values, since these
  600. X     * resources will override any other specified external to this file.
  601. X     */
  602. X    XrmPutStringResource(&dpy->db, "*form*topAttachment", "attach_position");
  603. X    XrmPutStringResource(&dpy->db, "*form*leftAttachment", "attach_position");
  604. X    XrmPutStringResource(&dpy->db, "*form*rightAttachment", "attach_position");
  605. X    XrmPutStringResource(&dpy->db, "*form*bottomAttachment", "attach_position");
  606. X
  607. X    form = XtVaCreateWidget("form", xmFormWidgetClass, toplevel,
  608. X    XmNfractionBase,     3,
  609. X    NULL);
  610. X
  611. X    XtVaCreateManagedWidget("arrow1",
  612. X    xmArrowButtonGadgetClass, form,
  613. X    XmNtopPosition,      0,
  614. X    XmNbottomPosition,   1,
  615. X    XmNleftPosition,     1,
  616. X    XmNrightPosition,    2,
  617. X    XmNarrowDirection,   XmARROW_UP,
  618. X    NULL);
  619. X
  620. X    XtVaCreateManagedWidget("arrow2",
  621. X    xmArrowButtonGadgetClass, form,
  622. X    XmNtopPosition,      1,
  623. X    XmNbottomPosition,   2,
  624. X    XmNleftPosition,     0,
  625. X    XmNrightPosition,    1,
  626. X    XmNarrowDirection,   XmARROW_LEFT,
  627. X    NULL);
  628. X
  629. X    XtVaCreateManagedWidget("arrow3",
  630. X    xmArrowButtonGadgetClass, form,
  631. X    XmNtopPosition,      1,
  632. X    XmNbottomPosition,   2,
  633. X    XmNleftPosition,     2,
  634. X    XmNrightPosition,    3,
  635. X    XmNarrowDirection,   XmARROW_RIGHT,
  636. X    NULL);
  637. X
  638. X    XtVaCreateManagedWidget("arrow4",
  639. X    xmArrowButtonGadgetClass, form,
  640. X    XmNtopPosition,      2,
  641. X    XmNbottomPosition,   3,
  642. X    XmNleftPosition,     1,
  643. X    XmNrightPosition,    2,
  644. X    XmNarrowDirection,   XmARROW_DOWN,
  645. X    NULL);
  646. X
  647. X    XtManageChild(form);
  648. X    XtRealizeWidget(toplevel);
  649. X    XtAppMainLoop(app);
  650. X}
  651. END_OF_FILE
  652. if test 2348 -ne `wc -c <'vol6/ch11/arrow.c'`; then
  653.     echo shar: \"'vol6/ch11/arrow.c'\" unpacked with wrong size!
  654. fi
  655. # end of 'vol6/ch11/arrow.c'
  656. fi
  657. if test -f 'vol6/ch11/multi_click.c' -a "${1}" != "-c" ; then 
  658.   echo shar: Will not clobber existing file \"'vol6/ch11/multi_click.c'\"
  659. else
  660. echo shar: Extracting \"'vol6/ch11/multi_click.c'\" \(2286 characters\)
  661. sed "s/^X//" >'vol6/ch11/multi_click.c' <<'END_OF_FILE'
  662. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  663. X * This program is freely distributable without licensing fees and
  664. X * is provided without guarantee or warrantee expressed or implied.
  665. X * This program is -not- in the public domain.
  666. X */
  667. X
  668. X/* multi_click.c -- demonstrate handling multiple PushButton clicks.
  669. X * First, obtain the time interval of what constitutes a multiple
  670. X * button click from the display and pass this as the client_data
  671. X * for the button_click() callback function.  In the callback, single
  672. X * button clicks set a timer to expire on that interval and call the
  673. X * function process_clicks().  Double clicks remove the timer and
  674. X * just call process_clicks() directly.
  675. X */
  676. X#include <Xm/PushB.h>
  677. X
  678. XXtAppContext app;
  679. X
  680. Xmain(argc, argv)
  681. Xint argc;
  682. Xchar *argv[];
  683. X{
  684. X    Widget toplevel, button, WidgetCreate();
  685. X    void button_click();
  686. X    XmString btn_text;
  687. X    int interval;
  688. X
  689. X    toplevel = XtVaAppInitialize(&app, "Demos",
  690. X        NULL, 0, &argc, argv, NULL, NULL);
  691. X
  692. X    /* get how long for a double click */
  693. X    interval = XtGetMultiClickTime(XtDisplay(toplevel));
  694. X    printf("interval = %d\n", interval);
  695. X
  696. X    btn_text = XmStringCreateSimple("Push Here");
  697. X    button = XtVaCreateManagedWidget("button",
  698. X        xmPushButtonWidgetClass, toplevel,
  699. X        XmNlabelString, btn_text,
  700. X        XmNwidth,       50,
  701. X        XmNheight,      25,
  702. X        NULL);
  703. X    XmStringFree(btn_text);
  704. X    XtAddCallback(button, XmNactivateCallback, button_click, interval);
  705. X
  706. X    XtRealizeWidget(toplevel);
  707. X    XtAppMainLoop(app);
  708. X}
  709. X
  710. X/* Process button clicks.  Single clicks set a timer, double clicks
  711. X * remove the timer, and extended clicks are ignored.
  712. X */
  713. Xvoid
  714. Xbutton_click(w, interval, cbs)
  715. XWidget w;
  716. Xint interval;
  717. XXmPushButtonCallbackStruct *cbs;
  718. X{
  719. X    static XtIntervalId id;
  720. X    void process_clicks();
  721. X
  722. X    if (cbs->click_count == 1)
  723. X        id = XtAppAddTimeOut(app, interval, process_clicks, False);
  724. X    else if (cbs->click_count == 2) {
  725. X        XtRemoveTimeOut(id);
  726. X        process_clicks(True);
  727. X    }
  728. X}
  729. X
  730. X/* This function won't be called until we've established whether
  731. X * or not a single or a double click has occured.
  732. X */
  733. Xvoid
  734. Xprocess_clicks(double_click)
  735. Xint double_click;
  736. X{
  737. X    if (double_click)
  738. X        puts("Double click");
  739. X    else
  740. X        puts("Single click");
  741. X}
  742. END_OF_FILE
  743. if test 2286 -ne `wc -c <'vol6/ch11/multi_click.c'`; then
  744.     echo shar: \"'vol6/ch11/multi_click.c'\" unpacked with wrong size!
  745. fi
  746. # end of 'vol6/ch11/multi_click.c'
  747. fi
  748. if test -f 'vol6/ch12/toggle_box.c' -a "${1}" != "-c" ; then 
  749.   echo shar: Will not clobber existing file \"'vol6/ch12/toggle_box.c'\"
  750. else
  751. echo shar: Extracting \"'vol6/ch12/toggle_box.c'\" \(2896 characters\)
  752. sed "s/^X//" >'vol6/ch12/toggle_box.c' <<'END_OF_FILE'
  753. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  754. X * This program is freely distributable without licensing fees and
  755. X * is provided without guarantee or warrantee expressed or implied.
  756. X * This program is -not- in the public domain.
  757. X */
  758. X
  759. X/* toggle_box.c -- demonstrate a homebrew ToggleBox.  A static
  760. X * list of strings is used as the basis for a list of toggles.
  761. X * The callback routine toggled() is set for each toggle item.
  762. X * The client data for this routine is set to the enumerated
  763. X * value of the item with respect to the entire list.  This value
  764. X * is treated as a bit which is toggled in "toggles_set" -- a
  765. X * mask that contains a complete list of all the selected items.
  766. X * This list is printed when the PushButton is selected.
  767. X */
  768. X#include <Xm/ToggleBG.h>
  769. X#include <Xm/PushBG.h>
  770. X#include <Xm/SeparatoG.h>
  771. X#include <Xm/RowColumn.h>
  772. X
  773. Xunsigned long toggles_set; /* has the bits of which toggles are set */
  774. X
  775. Xchar *strings[] = {
  776. X    "One", "Two", "Three", "Four", "Five",
  777. X    "Six", "Seven", "Eight", "Nine", "Ten",
  778. X};
  779. X
  780. X/* A RowColumn is used to manage a ToggleBox (also a RowColumn) and
  781. X * a PushButton with a separator gadget in between.
  782. X */
  783. Xmain(argc, argv)
  784. Xint argc;
  785. Xchar *argv[];
  786. X{
  787. X    Widget toplevel, rowcol, toggle_box, w;
  788. X    XtAppContext app;
  789. X    void toggled(), check_bits();
  790. X    int i;
  791. X
  792. X    toplevel = XtVaAppInitialize(&app, "Demos",
  793. X        NULL, 0, &argc, argv, NULL, NULL);
  794. X
  795. X    rowcol = XtVaCreateManagedWidget("rowcolumn",
  796. X        xmRowColumnWidgetClass, toplevel,
  797. X        NULL);
  798. X
  799. X    toggle_box = XtVaCreateWidget("togglebox",
  800. X        xmRowColumnWidgetClass, rowcol,
  801. X        XmNpacking,        XmPACK_COLUMN,
  802. X        XmNnumColumns,     2,
  803. X        NULL);
  804. X
  805. X    /* simply loop thru the strings creating a widget for each one */
  806. X    for (i = 0; i < XtNumber(strings); i++) {
  807. X        w = XtVaCreateManagedWidget(strings[i],
  808. X            xmToggleButtonGadgetClass, toggle_box, NULL);
  809. X        XtAddCallback(w, XmNvalueChangedCallback, toggled, i);
  810. X    }
  811. X
  812. X    XtVaCreateManagedWidget("_sep",
  813. X        xmSeparatorGadgetClass, rowcol, NULL);
  814. X    w = XtVaCreateManagedWidget("Check Toggles",
  815. X        xmPushButtonGadgetClass, rowcol, NULL);
  816. X    XtAddCallback(w, XmNactivateCallback, check_bits, NULL);
  817. X
  818. X    XtManageChild(rowcol);
  819. X    XtManageChild(toggle_box);
  820. X
  821. X    XtRealizeWidget(toplevel);
  822. X    XtAppMainLoop(app);
  823. X}
  824. X
  825. X/* callback for all ToggleButtons. */
  826. Xvoid
  827. Xtoggled(widget, bit, toggle_data)
  828. XWidget widget;
  829. Xint bit;
  830. XXmToggleButtonCallbackStruct *toggle_data;
  831. X{
  832. X    if (toggle_data->set) /* if the toggle button is set, flip its bit */
  833. X        toggles_set |= (1 << bit);
  834. X    else /* if the toggle is "off", turn off the bit. */
  835. X        toggles_set &= ~(1 << bit);
  836. X}
  837. X
  838. Xvoid
  839. Xcheck_bits()
  840. X{
  841. X    int i;
  842. X
  843. X    printf("Toggles set:");
  844. X    for (i = 0; i < XtNumber(strings); i++)
  845. X        if (toggles_set & (1<<i))
  846. X            printf(" %s", strings[i]);
  847. X    putchar('\n');
  848. X}
  849. END_OF_FILE
  850. if test 2896 -ne `wc -c <'vol6/ch12/toggle_box.c'`; then
  851.     echo shar: \"'vol6/ch12/toggle_box.c'\" unpacked with wrong size!
  852. fi
  853. # end of 'vol6/ch12/toggle_box.c'
  854. fi
  855. if test -f 'vol6/ch14/simple_scale.c' -a "${1}" != "-c" ; then 
  856.   echo shar: Will not clobber existing file \"'vol6/ch14/simple_scale.c'\"
  857. else
  858. echo shar: Extracting \"'vol6/ch14/simple_scale.c'\" \(2309 characters\)
  859. sed "s/^X//" >'vol6/ch14/simple_scale.c' <<'END_OF_FILE'
  860. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  861. X * This program is freely distributable without licensing fees and
  862. X * is provided without guarantee or warrantee expressed or implied.
  863. X * This program is -not- in the public domain.
  864. X */
  865. X
  866. X/* scale.c -- demonstrate a few scale widgets. */
  867. X
  868. X#include <Xm/Scale.h>
  869. X#include <Xm/RowColumn.h>
  870. X
  871. Xmain(argc, argv)
  872. Xchar *argv[];
  873. X{
  874. X    Widget        toplevel, rowcol, scale;
  875. X    XtAppContext  app;
  876. X    void          new_value(); /* callback for Scale widgets */
  877. X
  878. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  879. X        &argc, argv, NULL, NULL);
  880. X
  881. X    rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, toplevel,
  882. X        XmNorientation, XmHORIZONTAL,
  883. X        NULL);
  884. X
  885. X    scale = XtVaCreateManagedWidget("Days",
  886. X        xmScaleWidgetClass, rowcol,
  887. X        XtVaTypedArg, XmNtitleString, XmRString, "Days", 4,
  888. X        XmNmaximum,   7,
  889. X        XmNminimum,   1,
  890. X        XmNvalue,     1,
  891. X        XmNshowValue, True,
  892. X        NULL);
  893. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, NULL);
  894. X
  895. X    scale = XtVaCreateManagedWidget("Weeks",
  896. X        xmScaleWidgetClass, rowcol,
  897. X        XtVaTypedArg, XmNtitleString, XmRString, "Weeks", 5,
  898. X        XmNmaximum,   52,
  899. X        XmNminimum,   1,
  900. X        XmNvalue,     1,
  901. X        XmNshowValue, True,
  902. X        NULL);
  903. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, NULL);
  904. X
  905. X    scale = XtVaCreateManagedWidget("Months",
  906. X        xmScaleWidgetClass, rowcol,
  907. X        XtVaTypedArg, XmNtitleString, XmRString, "Months", 6,
  908. X        XmNmaximum,   12,
  909. X        XmNminimum,   1,
  910. X        XmNvalue,     1,
  911. X        XmNshowValue, True,
  912. X        NULL);
  913. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, NULL);
  914. X
  915. X    scale = XtVaCreateManagedWidget("Years",
  916. X        xmScaleWidgetClass, rowcol,
  917. X        XtVaTypedArg, XmNtitleString, XmRString, "Years", 5,
  918. X        XmNmaximum,   20,
  919. X        XmNminimum,   1,
  920. X        XmNvalue,     1,
  921. X        XmNshowValue, True,
  922. X        NULL);
  923. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, NULL);
  924. X
  925. X    XtManageChild(rowcol);
  926. X
  927. X    XtRealizeWidget(toplevel);
  928. X    XtAppMainLoop(app);
  929. X}
  930. X
  931. Xvoid
  932. Xnew_value(scale_w, client_data, cbs)
  933. XWidget scale_w;
  934. XXtPointer client_data;
  935. XXmScaleCallbackStruct *cbs;
  936. X{
  937. X    printf("%s: %d\n", XtName(scale_w), cbs->value);
  938. X}
  939. END_OF_FILE
  940. if test 2309 -ne `wc -c <'vol6/ch14/simple_scale.c'`; then
  941.     echo shar: \"'vol6/ch14/simple_scale.c'\" unpacked with wrong size!
  942. fi
  943. # end of 'vol6/ch14/simple_scale.c'
  944. fi
  945. if test -f 'vol6/ch15/passwd.c' -a "${1}" != "-c" ; then 
  946.   echo shar: Will not clobber existing file \"'vol6/ch15/passwd.c'\"
  947. else
  948. echo shar: Extracting \"'vol6/ch15/passwd.c'\" \(2436 characters\)
  949. sed "s/^X//" >'vol6/ch15/passwd.c' <<'END_OF_FILE'
  950. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  951. X * This program is freely distributable without licensing fees and
  952. X * is provided without guarantee or warrantee expressed or implied.
  953. X * This program is -not- in the public domain.
  954. X */
  955. X
  956. X/* passwd.c -- prompt for a passwd.  Meaning, all input looks like
  957. X * a series of *'s.  Store the actual data typed by the user in
  958. X * an internal variable.  Don't allow paste operations.  Handle
  959. X * backspacing by deleting all text from insertion point to the
  960. X * end of text.
  961. X */
  962. X#include <Xm/Text.h>
  963. X#include <Xm/LabelG.h>
  964. X#include <Xm/RowColumn.h>
  965. X#include <ctype.h>
  966. X
  967. Xvoid check_passwd();
  968. Xchar *passwd; /* store user-typed passwd here. */
  969. X
  970. Xmain(argc, argv)
  971. Xint argc;
  972. Xchar *argv[];
  973. X{
  974. X    Widget        toplevel, text_w, rowcol;
  975. X    XtAppContext  app;
  976. X
  977. X    toplevel = XtVaAppInitialize(&app, "Demos",
  978. X        NULL, 0, &argc, argv, NULL, NULL);
  979. X
  980. X    rowcol = XtVaCreateWidget("rowcol",
  981. X        xmRowColumnWidgetClass, toplevel,
  982. X        XmNorientation, XmHORIZONTAL,
  983. X        NULL);
  984. X
  985. X    XtVaCreateManagedWidget("Password:",
  986. X        xmLabelGadgetClass, rowcol, NULL);
  987. X    text_w = XtVaCreateManagedWidget("text_w",
  988. X        xmTextWidgetClass, rowcol, NULL);
  989. X
  990. X    XtAddCallback(text_w, XmNmodifyVerifyCallback, check_passwd, NULL);
  991. X    XtAddCallback(text_w, XmNactivateCallback, check_passwd, NULL);
  992. X
  993. X    XtManageChild(rowcol);
  994. X    XtRealizeWidget(toplevel);
  995. X    XtAppMainLoop(app);
  996. X}
  997. X
  998. Xvoid
  999. Xcheck_passwd(text_w, unused, cbs)
  1000. XWidget        text_w;
  1001. XXtPointer     unused;
  1002. XXmTextVerifyCallbackStruct *cbs;
  1003. X{
  1004. X    char *new;
  1005. X    int len;
  1006. X
  1007. X    if (cbs->reason == XmCR_ACTIVATE) {
  1008. X        printf("Password: %s\n", passwd);
  1009. X        return;
  1010. X    }
  1011. X
  1012. X    if (cbs->text->ptr == NULL) { /* backspace */
  1013. X        cbs->endPos = strlen(passwd); /* delete from here to end */
  1014. X        passwd[cbs->startPos] = 0; /* backspace--terminate */
  1015. X        return;
  1016. X    }
  1017. X
  1018. X    if (cbs->text->length > 1) {
  1019. X        cbs->doit = False; /* don't allow "paste" operations */
  1020. X        return; /* make the user *type* the password! */
  1021. X    }
  1022. X
  1023. X    new = XtMalloc(cbs->endPos + 2); /* new char + NULL terminator */
  1024. X    if (passwd) {
  1025. X        strcpy(new, passwd);
  1026. X        XtFree(passwd);
  1027. X    } else
  1028. X        new[0] = NULL;
  1029. X    passwd = new;
  1030. X    strncat(passwd, cbs->text->ptr, cbs->text->length);
  1031. X    passwd[cbs->endPos + cbs->text->length] = 0;
  1032. X
  1033. X    for (len = 0; len < cbs->text->length; len++)
  1034. X        cbs->text->ptr[len] = '*';
  1035. X}
  1036. END_OF_FILE
  1037. if test 2436 -ne `wc -c <'vol6/ch15/passwd.c'`; then
  1038.     echo shar: \"'vol6/ch15/passwd.c'\" unpacked with wrong size!
  1039. fi
  1040. # end of 'vol6/ch15/passwd.c'
  1041. fi
  1042. if test -f 'vol6/ch15/prompt_phone.c' -a "${1}" != "-c" ; then 
  1043.   echo shar: Will not clobber existing file \"'vol6/ch15/prompt_phone.c'\"
  1044. else
  1045. echo shar: Extracting \"'vol6/ch15/prompt_phone.c'\" \(2376 characters\)
  1046. sed "s/^X//" >'vol6/ch15/prompt_phone.c' <<'END_OF_FILE'
  1047. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1048. X * This program is freely distributable without licensing fees and
  1049. X * is provided without guarantee or warrantee expressed or implied.
  1050. X * This program is -not- in the public domain.
  1051. X */
  1052. X
  1053. X/* prompt_phone.c -- a complex problem for XmNmodifyVerifyCallback.
  1054. X * prompt for a phone number by filtering digits only from input.
  1055. X * Don't allow paste operations and handle backspacing.
  1056. X */
  1057. X#include <Xm/Text.h>
  1058. X#include <Xm/LabelG.h>
  1059. X#include <Xm/RowColumn.h>
  1060. X#include <ctype.h>
  1061. X
  1062. Xvoid check_phone();
  1063. X
  1064. Xmain(argc, argv)
  1065. Xint argc;
  1066. Xchar *argv[];
  1067. X{
  1068. X    Widget        toplevel, text_w, rowcol;
  1069. X    XtAppContext  app;
  1070. X
  1071. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1072. X        NULL, 0, &argc, argv, NULL, NULL);
  1073. X
  1074. X    rowcol = XtVaCreateWidget("rowcol",
  1075. X        xmRowColumnWidgetClass, toplevel,
  1076. X        XmNorientation, XmHORIZONTAL,
  1077. X        NULL);
  1078. X
  1079. X    XtVaCreateManagedWidget("Phone Number:",
  1080. X        xmLabelGadgetClass, rowcol, NULL);
  1081. X    text_w = XtVaCreateManagedWidget("text_w",
  1082. X        xmTextWidgetClass, rowcol, NULL);
  1083. X
  1084. X    XtAddCallback(text_w, XmNmodifyVerifyCallback, check_phone, NULL);
  1085. X    XtAddCallback(text_w, XmNvalueChangedCallback, check_phone, NULL);
  1086. X
  1087. X    XtManageChild(rowcol);
  1088. X    XtRealizeWidget(toplevel);
  1089. X    XtAppMainLoop(app);
  1090. X}
  1091. X
  1092. Xvoid
  1093. Xcheck_phone(text_w, unused, cbs)
  1094. XWidget     text_w;
  1095. XXtPointer  unused;
  1096. XXmTextVerifyCallbackStruct *cbs;
  1097. X{
  1098. X    char c;
  1099. X    int len = XmTextGetLastPosition(text_w);
  1100. X
  1101. X    if (cbs->reason == XmCR_VALUE_CHANGED) {
  1102. X        XmTextSetInsertionPosition(text_w, len);
  1103. X        return;
  1104. X    }
  1105. X
  1106. X    /* no backspacing or typing in the middle of string */
  1107. X    if (cbs->currInsert < len) {
  1108. X        cbs->doit = False;
  1109. X        return;
  1110. X    }
  1111. X
  1112. X    if (cbs->text->ptr == NULL) { /* backspace */
  1113. X        if (cbs->startPos == 3 || cbs->startPos == 7)
  1114. X            cbs->startPos--; /* delete the hyphen too */
  1115. X        return;
  1116. X    }
  1117. X
  1118. X    if (cbs->text->length > 1) { /* don't allow clipboard copies */
  1119. X        cbs->doit = False;
  1120. X        return;
  1121. X    }
  1122. X
  1123. X    /* don't allow non-digits or let the input exceed 12 chars */
  1124. X    if (!isdigit(c = cbs->text->ptr[0]) || len >= 12)
  1125. X        cbs->doit = False;
  1126. X    else if (len == 2 || len == 6) {
  1127. X        cbs->text->ptr = XtRealloc(cbs->text->ptr, 2);
  1128. X        cbs->text->length = 2;
  1129. X        cbs->text->ptr[0] = c;
  1130. X        cbs->text->ptr[1] = '-';
  1131. X    }
  1132. X}
  1133. END_OF_FILE
  1134. if test 2376 -ne `wc -c <'vol6/ch15/prompt_phone.c'`; then
  1135.     echo shar: \"'vol6/ch15/prompt_phone.c'\" unpacked with wrong size!
  1136. fi
  1137. # end of 'vol6/ch15/prompt_phone.c'
  1138. fi
  1139. if test -f 'vol6/ch15/text_box.c' -a "${1}" != "-c" ; then 
  1140.   echo shar: Will not clobber existing file \"'vol6/ch15/text_box.c'\"
  1141. else
  1142. echo shar: Extracting \"'vol6/ch15/text_box.c'\" \(2787 characters\)
  1143. sed "s/^X//" >'vol6/ch15/text_box.c' <<'END_OF_FILE'
  1144. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1145. X * This program is freely distributable without licensing fees and
  1146. X * is provided without guarantee or warrantee expressed or implied.
  1147. X * This program is -not- in the public domain.
  1148. X */
  1149. X
  1150. X/* text_box.c -- demonstrate simple use of XmNactivateCallback
  1151. X * for Text widgets.  Create a rowcolumn that has rows of Form
  1152. X * widgets, each containing a Label and a Text widget.  When
  1153. X * the user presses Return, print the value of the text widget
  1154. X * and move the focus to the next text widget.
  1155. X */
  1156. X#include <Xm/TextF.h>
  1157. X#include <Xm/LabelG.h>
  1158. X#include <Xm/Form.h>
  1159. X#include <Xm/RowColumn.h>
  1160. X
  1161. Xchar *labels[] = { "Name:", "Address:", "City:", "State:", "Zip:" };
  1162. X
  1163. Xmain(argc, argv)
  1164. Xint argc;
  1165. Xchar *argv[];
  1166. X{
  1167. X    Widget        toplevel, text_w, form, rowcol;
  1168. X    XtAppContext  app;
  1169. X    int           i;
  1170. X    void          print_result();
  1171. X
  1172. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1173. X        NULL, 0, &argc, argv, NULL, NULL);
  1174. X
  1175. X    rowcol = XtVaCreateWidget("rowcol",
  1176. X        xmRowColumnWidgetClass, toplevel, NULL);
  1177. X
  1178. X    for (i = 0; i < XtNumber(labels); i++) {
  1179. X        form = XtVaCreateWidget("form", xmFormWidgetClass, rowcol,
  1180. X            XmNfractionBase,  10,
  1181. X            NULL);
  1182. X        XtVaCreateManagedWidget(labels[i],
  1183. X            xmLabelGadgetClass, form,
  1184. X            XmNtopAttachment,    XmATTACH_FORM,
  1185. X            XmNbottomAttachment, XmATTACH_FORM,
  1186. X            XmNleftAttachment,   XmATTACH_FORM,
  1187. X            XmNrightAttachment,  XmATTACH_POSITION,
  1188. X            XmNrightPosition,    3,
  1189. X            XmNalignment,        XmALIGNMENT_END,
  1190. X            NULL);
  1191. X        text_w = XtVaCreateManagedWidget("text_w",
  1192. X            xmTextFieldWidgetClass, form,
  1193. X            XmNtraversalOn,      True,
  1194. X            XmNrightAttachment,  XmATTACH_FORM,
  1195. X            XmNleftAttachment,   XmATTACH_POSITION,
  1196. X            XmNleftPosition,     4,
  1197. X            NULL);
  1198. X
  1199. X        /* When user hits return, print the label+value of text_w */
  1200. X        XtAddCallback(text_w, XmNactivateCallback,
  1201. X            print_result, labels[i]);
  1202. X
  1203. X        /* Also advance focus to next Text widget, which is in the
  1204. X         * next Tab Group because each Text widget is in a Form by
  1205. X         * itself.  If there were all in the same manager, we'd just
  1206. X         * use XmTRAVERSE_NEXT instead.
  1207. X         */
  1208. X        XtAddCallback(text_w, XmNactivateCallback,
  1209. X            XmProcessTraversal, XmTRAVERSE_NEXT_TAB_GROUP);
  1210. X        XtManageChild(form);
  1211. X    }
  1212. X    XtManageChild(rowcol);
  1213. X
  1214. X    XtRealizeWidget(toplevel);
  1215. X    XtAppMainLoop(app);
  1216. X}
  1217. X
  1218. X/* callback for when the user his return in the Text widget */
  1219. Xvoid
  1220. Xprint_result(text_w, label)
  1221. XWidget text_w;
  1222. Xchar  *label;
  1223. X{
  1224. X    char *value = XmTextFieldGetString(text_w);
  1225. X
  1226. X    printf("%s %s\n", label, value);
  1227. X    XtFree(value);
  1228. X}
  1229. END_OF_FILE
  1230. if test 2787 -ne `wc -c <'vol6/ch15/text_box.c'`; then
  1231.     echo shar: \"'vol6/ch15/text_box.c'\" unpacked with wrong size!
  1232. fi
  1233. # end of 'vol6/ch15/text_box.c'
  1234. fi
  1235. if test -f 'vol6/ch16/simple_option.c' -a "${1}" != "-c" ; then 
  1236.   echo shar: Will not clobber existing file \"'vol6/ch16/simple_option.c'\"
  1237. else
  1238. echo shar: Extracting \"'vol6/ch16/simple_option.c'\" \(2743 characters\)
  1239. sed "s/^X//" >'vol6/ch16/simple_option.c' <<'END_OF_FILE'
  1240. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1241. X * This program is freely distributable without licensing fees and
  1242. X * is provided without guarantee or warrantee expressed or implied.
  1243. X * This program is -not- in the public domain.
  1244. X */
  1245. X
  1246. X/* simple_option.c -- demonstrate how to use a simple option menu.
  1247. X * Display a drawing area (used hypothetically).  The user can select
  1248. X * the drawing style from the option menu.  Notice the difference in
  1249. X * appearance between the PushButton and the option menu.
  1250. X */
  1251. X#include <Xm/RowColumn.h>
  1252. X#include <Xm/MainW.h>
  1253. X#include <Xm/DrawingA.h>
  1254. X#include <Xm/PushB.h>
  1255. X
  1256. Xmain(argc, argv)
  1257. Xint argc;
  1258. Xchar *argv[];
  1259. X{
  1260. X    XmString draw_shape, line, square, circle, quit;
  1261. X    Widget toplevel, main_w, rc, sw, drawing_a, option_menu, pb;
  1262. X    void option_cb(), exit();
  1263. X    XtAppContext app;
  1264. X
  1265. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  1266. X        &argc, argv, NULL, NULL);
  1267. X
  1268. X    /* Create a MainWindow widget that contains a RowColumn
  1269. X     * widget as its work window.
  1270. X     */
  1271. X    main_w = XtVaCreateManagedWidget("main_w",
  1272. X        xmMainWindowWidgetClass, toplevel, NULL);
  1273. X    rc = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, main_w, NULL);
  1274. X
  1275. X    /* Inside RowColumn is the Quit pushbutton, the option menu and the
  1276. X     * scrolled window that contains the drawing area.
  1277. X     */
  1278. X    pb = XtVaCreateManagedWidget("Quit", xmPushButtonWidgetClass, rc, NULL);
  1279. X    XtAddCallback(pb, XmNactivateCallback, exit, NULL);
  1280. X
  1281. X    draw_shape = XmStringCreateSimple("Draw Mode:");
  1282. X    line = XmStringCreateSimple("Line");
  1283. X    square = XmStringCreateSimple("Square");
  1284. X    circle = XmStringCreateSimple("Circle");
  1285. X    option_menu = XmVaCreateSimpleOptionMenu(rc, "option_menu",
  1286. X        draw_shape, 'D', 0 /*initial menu selection*/, option_cb,
  1287. X        XmVaPUSHBUTTON, line, 'L', NULL, NULL,
  1288. X        XmVaPUSHBUTTON, square, 'S', NULL, NULL,
  1289. X        XmVaPUSHBUTTON, circle, 'C', NULL, NULL,
  1290. X        NULL);
  1291. X    XmStringFree(line);
  1292. X    XmStringFree(square);
  1293. X    XmStringFree(circle);
  1294. X    XmStringFree(draw_shape);
  1295. X
  1296. X    XtManageChild(option_menu);
  1297. X
  1298. X    /* Create a DrawingArea inside a ScrolledWindow */
  1299. X    sw = XtVaCreateManagedWidget("sw", xmScrolledWindowWidgetClass, rc,
  1300. X        XmNscrollingPolicy, XmAUTOMATIC,
  1301. X        NULL);
  1302. X    drawing_a = XtVaCreateManagedWidget("drawing_area",
  1303. X        xmDrawingAreaWidgetClass, sw,
  1304. X        XmNwidth, 500,
  1305. X        XmNheight, 500,
  1306. X        NULL);
  1307. X    
  1308. X    XtManageChild(rc);
  1309. X
  1310. X    XtRealizeWidget(toplevel);
  1311. X    XtAppMainLoop(app);
  1312. X}
  1313. X
  1314. X/* invoked when the user selects an item in the option menu */
  1315. Xvoid
  1316. Xoption_cb(menu_item, item_no, cbs)
  1317. XWidget menu_item;
  1318. Xint item_no;
  1319. XXmAnyCallbackStruct *cbs;
  1320. X{
  1321. X    puts(XtName(menu_item)); /* Otherwise, just print the selection */
  1322. X}
  1323. END_OF_FILE
  1324. if test 2743 -ne `wc -c <'vol6/ch16/simple_option.c'`; then
  1325.     echo shar: \"'vol6/ch16/simple_option.c'\" unpacked with wrong size!
  1326. fi
  1327. # end of 'vol6/ch16/simple_option.c'
  1328. fi
  1329. if test -f 'vol6/ch16/simple_popup.c' -a "${1}" != "-c" ; then 
  1330.   echo shar: Will not clobber existing file \"'vol6/ch16/simple_popup.c'\"
  1331. else
  1332. echo shar: Extracting \"'vol6/ch16/simple_popup.c'\" \(2929 characters\)
  1333. sed "s/^X//" >'vol6/ch16/simple_popup.c' <<'END_OF_FILE'
  1334. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1335. X * This program is freely distributable without licensing fees and
  1336. X * is provided without guarantee or warrantee expressed or implied.
  1337. X * This program is -not- in the public domain.
  1338. X */
  1339. X
  1340. X/* simple_popup.c -- demonstrate how to use a simple popup menu.
  1341. X * Create a main window that contains a DrawingArea widget, which
  1342. X * displays a popup menu when the user presses the menu button
  1343. X * (typically button 3).
  1344. X */
  1345. X#include <Xm/RowColumn.h>
  1346. X#include <Xm/MainW.h>
  1347. X#include <Xm/DrawingA.h>
  1348. X
  1349. Xmain(argc, argv)
  1350. Xint argc;
  1351. Xchar *argv[];
  1352. X{
  1353. X    XmString line, square, circle, quit, quit_acc;
  1354. X    Widget toplevel, main_w, drawing_a, popup_menu;
  1355. X    void popup_cb(), input();
  1356. X    XtAppContext app;
  1357. X
  1358. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  1359. X        &argc, argv, NULL, NULL);
  1360. X
  1361. X    /* Create a MainWindow widget that contains a DrawingArea in
  1362. X     * its work window. (This happens by default.)
  1363. X     */
  1364. X    main_w = XtVaCreateManagedWidget("main_w",
  1365. X        xmMainWindowWidgetClass, toplevel,
  1366. X        XmNscrollingPolicy,  XmAUTOMATIC,
  1367. X        NULL);
  1368. X    /* Create a DrawingArea -- no actual drawing will be done. */
  1369. X    drawing_a = XtVaCreateManagedWidget("drawing_a",
  1370. X        xmDrawingAreaWidgetClass, main_w,
  1371. X        XmNwidth, 500,
  1372. X        XmNheight, 500,
  1373. X        NULL);
  1374. X
  1375. X    line = XmStringCreateSimple("Line");
  1376. X    square = XmStringCreateSimple("Square");
  1377. X    circle = XmStringCreateSimple("Circle");
  1378. X    quit = XmStringCreateSimple("Quit");
  1379. X    quit_acc = XmStringCreateSimple("Ctrl-C");
  1380. X    popup_menu = XmVaCreateSimplePopupMenu(drawing_a, "popup", popup_cb,
  1381. X        XmVaPUSHBUTTON, line, NULL, NULL, NULL,
  1382. X        XmVaPUSHBUTTON, square, NULL, NULL, NULL,
  1383. X        XmVaPUSHBUTTON, circle, NULL, NULL, NULL,
  1384. X        XmVaSEPARATOR,
  1385. X        XmVaPUSHBUTTON, quit, NULL, "Ctrl<Key>c", quit_acc,
  1386. X        NULL);
  1387. X    XmStringFree(line);
  1388. X    XmStringFree(square);
  1389. X    XmStringFree(circle);
  1390. X    XmStringFree(quit);
  1391. X
  1392. X    /* after popup menu is created, add callback for all input events */
  1393. X    XtAddCallback(drawing_a, XmNinputCallback, input, popup_menu);
  1394. X
  1395. X    XtRealizeWidget(toplevel);
  1396. X    XtAppMainLoop(app);
  1397. X}
  1398. X
  1399. X/* called in responses to events in the DrawingArea; button-3 pops up menu. */
  1400. Xvoid
  1401. Xinput(widget, popup, cbs)
  1402. XWidget widget;
  1403. XWidget popup;   /* popup menu associated with drawing area */
  1404. XXmDrawingAreaCallbackStruct *cbs;
  1405. X{
  1406. X    if (cbs->event->xany.type != ButtonPress ||
  1407. X        cbs->event->xbutton.button != 3)
  1408. X        return;
  1409. X
  1410. X    /* Position the menu where the event occurred */
  1411. X    XmMenuPosition(popup, cbs->event);
  1412. X    XtManageChild(popup);
  1413. X}
  1414. X
  1415. X/* invoked when the user selects an item in the popup menu */
  1416. Xvoid
  1417. Xpopup_cb(menu_item, item_no, cbs)
  1418. XWidget menu_item;
  1419. Xint item_no;
  1420. XXmAnyCallbackStruct *cbs;
  1421. X{
  1422. X    if (item_no == 3) /* Quit was selected -- exit */
  1423. X        exit(0);
  1424. X    puts(XtName(menu_item)); /* Otherwise, just print the selection */
  1425. X}
  1426. END_OF_FILE
  1427. if test 2929 -ne `wc -c <'vol6/ch16/simple_popup.c'`; then
  1428.     echo shar: \"'vol6/ch16/simple_popup.c'\" unpacked with wrong size!
  1429. fi
  1430. # end of 'vol6/ch16/simple_popup.c'
  1431. fi
  1432. if test -f 'vol6/ch17/wm_del_proto.c' -a "${1}" != "-c" ; then 
  1433.   echo shar: Will not clobber existing file \"'vol6/ch17/wm_del_proto.c'\"
  1434. else
  1435. echo shar: Extracting \"'vol6/ch17/wm_del_proto.c'\" \(2792 characters\)
  1436. sed "s/^X//" >'vol6/ch17/wm_del_proto.c' <<'END_OF_FILE'
  1437. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1438. X * This program is freely distributable without licensing fees and
  1439. X * is provided without guarantee or warrantee expressed or implied.
  1440. X * This program is -not- in the public domain.
  1441. X */
  1442. X
  1443. X/* wm_delete.c -- demonstrate how client messages are caught and
  1444. X * processed by adding an event handler for them.  Main window
  1445. X * just pops up a simple dialog, which has a client event handler.
  1446. X * Use the Close button in the window manager's system menu to
  1447. X * exercise it.  Watch the print statements during execution.
  1448. X */
  1449. X#include <Xm/MessageB.h>
  1450. X#include <Xm/PushB.h>
  1451. X#include <Xm/Protocols.h>
  1452. X
  1453. X/* main() --create a pushbutton whose callback pops up a dialog box */
  1454. Xmain(argc, argv)
  1455. Xchar *argv[];
  1456. X{
  1457. X    Widget toplevel, button;
  1458. X    XtAppContext app;
  1459. X    void pushed();
  1460. X
  1461. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1462. X        NULL, 0, &argc, argv, NULL, NULL);
  1463. X
  1464. X    button = XtCreateManagedWidget("button", xmPushButtonWidgetClass,
  1465. X        toplevel, NULL, 0);
  1466. X    XtAddCallback(button, XmNactivateCallback, pushed, "Hello World");
  1467. X
  1468. X    XtRealizeWidget(toplevel);
  1469. X    XtAppMainLoop(app);
  1470. X}
  1471. X
  1472. X/* pushed() --the callback routine for the main app's pushbutton.
  1473. X * Create any old dialog box that has a callback function for
  1474. X * client messages.
  1475. X */
  1476. Xvoid
  1477. Xpushed(w, message)
  1478. XWidget w;
  1479. Xchar *message; /* really: client_data, but we know what it is */
  1480. X{
  1481. X    Widget dialog, shell;
  1482. X    void do_client_msg();
  1483. X    Atom protocol;
  1484. X    XmString t = XmStringCreateSimple(message);
  1485. X    Arg args[1];
  1486. X
  1487. X    XtSetArg(args[0], XmNmessageString, t);
  1488. X    dialog = XmCreateMessageDialog(w, "notice", args, 1);
  1489. X    XmStringFree(t);
  1490. X
  1491. X    XtManageChild(dialog);
  1492. X
  1493. X    shell = XtParent(dialog);
  1494. X    protocol = XmInternAtom(XtDisplay(w), "WM_DELETE_WINDOW", False);
  1495. X    XmAddWMProtocols(shell, &protocol, 1);
  1496. X    XtAddEventHandler(shell, NoEventMask, True, do_client_msg, NULL);
  1497. X}
  1498. X
  1499. X/* function to handle client messages only.  Just catch WM_DELETE_WINDOW
  1500. X * messages and report them; ignore other messages.
  1501. X */
  1502. Xvoid
  1503. Xdo_client_msg(widget, client_data, msg)
  1504. XWidget widget;
  1505. XXtPointer client_data;
  1506. XXClientMessageEvent *msg;
  1507. X{
  1508. X    char  *str;
  1509. X    int   message = msg->data.l[0];
  1510. X    Atom  WM_DELETE_WINDOW;
  1511. X
  1512. X    if (msg->type != ClientMessage)
  1513. X        return;
  1514. X
  1515. X    WM_DELETE_WINDOW = XmInternAtom(msg->display, "WM_DELETE_WINDOW", False);
  1516. X
  1517. X    /* Get the atom name associated with the client message */
  1518. X    str = XGetAtomName(msg->display, msg->message_type);
  1519. X    printf("msg type = %s (%d)\n", str, msg->message_type);
  1520. X    XFree(str);
  1521. X
  1522. X    /* Get the atom name of the message itself... */
  1523. X    str = XGetAtomName(msg->display, message);
  1524. X    printf("message = %s (%d)\n", str, message);
  1525. X    XFree(str);
  1526. X
  1527. X    if (message == WM_DELETE_WINDOW)
  1528. X        puts("closing window");
  1529. X}
  1530. END_OF_FILE
  1531. if test 2792 -ne `wc -c <'vol6/ch17/wm_del_proto.c'`; then
  1532.     echo shar: \"'vol6/ch17/wm_del_proto.c'\" unpacked with wrong size!
  1533. fi
  1534. # end of 'vol6/ch17/wm_del_proto.c'
  1535. fi
  1536. if test -f 'vol6/ch17/wm_delete.c' -a "${1}" != "-c" ; then 
  1537.   echo shar: Will not clobber existing file \"'vol6/ch17/wm_delete.c'\"
  1538. else
  1539. echo shar: Extracting \"'vol6/ch17/wm_delete.c'\" \(3128 characters\)
  1540. sed "s/^X//" >'vol6/ch17/wm_delete.c' <<'END_OF_FILE'
  1541. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1542. X * This program is freely distributable without licensing fees and
  1543. X * is provided without guarantee or warrantee expressed or implied.
  1544. X * This program is -not- in the public domain.
  1545. X */
  1546. X
  1547. X/* wm_delete.c -- demonstrate how to bind the Close button in the
  1548. X * window manager's system menu to the "cancel" button in a dialog.
  1549. X */
  1550. X#include <Xm/MessageB.h>
  1551. X#include <Xm/PushB.h>
  1552. X#include <Xm/Protocols.h>
  1553. X
  1554. X#define YES 1
  1555. X#define NO  0
  1556. Xint answer;
  1557. X
  1558. X/* main() --create a pushbutton whose callback pops up a dialog box */
  1559. Xmain(argc, argv)
  1560. Xchar *argv[];
  1561. X{
  1562. X    Widget toplevel, button;
  1563. X    XtAppContext app;
  1564. X    void activate();
  1565. X
  1566. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1567. X        NULL, 0, &argc, argv, NULL, NULL);
  1568. X
  1569. X    button = XtCreateManagedWidget("button", xmPushButtonWidgetClass,
  1570. X        toplevel, NULL, 0);
  1571. X    XtAddCallback(button, XmNactivateCallback, activate, NULL);
  1572. X
  1573. X    XtRealizeWidget(toplevel);
  1574. X    XtAppMainLoop(app);
  1575. X}
  1576. X
  1577. X/* Create and popup an ErrorDialog indicating that the user may have
  1578. X * done something wrong.  The dialog contains an Ok and Cancel button,
  1579. X * but he can still choose the Close button in the titlebar.
  1580. X */
  1581. Xvoid
  1582. Xactivate(w)
  1583. XWidget w;
  1584. X{
  1585. X    Widget dialog, shell;
  1586. X    void handle_close(), response();
  1587. X    XmString t = XmStringCreateSimple("Warning: Delete All Files?");
  1588. X    Atom WM_DELETE_WINDOW;
  1589. X    Arg args[2];
  1590. X
  1591. X    /* Make sure the VendorShell associated with the dialog does not
  1592. X     * react to the user's selection of the Close system menu item.
  1593. X     */
  1594. X    XtSetArg(args[0], XmNmessageString, t);
  1595. X    XtSetArg(args[1], XmNdeleteResponse, XmDO_NOTHING);
  1596. X    dialog = XmCreateWarningDialog(w, "notice", args, 2);
  1597. X    XmStringFree(t);
  1598. X
  1599. X    /* add callback routines for ok and cancel -- desensitize help */
  1600. X    XtAddCallback(dialog, XmNokCallback, response, NULL);
  1601. X    XtAddCallback(dialog, XmNcancelCallback, response, NULL);
  1602. X    XtSetSensitive(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON), False);
  1603. X
  1604. X    XtManageChild(dialog);
  1605. X
  1606. X    /* Add a callback for the WM_DELETE_WINDOW protocol */
  1607. X    shell = XtParent(dialog);
  1608. X    WM_DELETE_WINDOW = XmInternAtom(XtDisplay(w), "WM_DELETE_WINDOW", False);
  1609. X    XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, response, dialog);
  1610. X}
  1611. X
  1612. X/* callback for the Ok and Cancel buttons in the dialog -- may also be
  1613. X * called from the WM_DELETE_WINDOW protocol message sent by the wm.
  1614. X */
  1615. Xvoid
  1616. Xresponse(widget, client_data, cbs)
  1617. XWidget widget;
  1618. XXtPointer client_data;
  1619. XXmAnyCallbackStruct *cbs;
  1620. X{
  1621. X    Widget dialog;
  1622. X
  1623. X    if (cbs->reason == XmCR_OK) {
  1624. X        answer = YES;
  1625. X        puts("Yes.");
  1626. X    } else {
  1627. X        answer = NO;
  1628. X        puts("No.");
  1629. X    }
  1630. X    /* test that "reason" is not the cancel button and not the ok button.
  1631. X     * It's value is XmCR_PROTOCOLS (6666), but we can't check for that
  1632. X     * because OSF didn't make that value public.
  1633. X     */
  1634. X    if (cbs->reason != XmCR_CANCEL && cbs->reason != XmCR_OK)
  1635. X        /* we passed the dialog as client data for the protocol callback */
  1636. X        dialog = (Widget)client_data;
  1637. X    else
  1638. X        dialog = widget;
  1639. X
  1640. X    XtDestroyWidget(dialog);
  1641. X}
  1642. END_OF_FILE
  1643. if test 3128 -ne `wc -c <'vol6/ch17/wm_delete.c'`; then
  1644.     echo shar: \"'vol6/ch17/wm_delete.c'\" unpacked with wrong size!
  1645. fi
  1646. # end of 'vol6/ch17/wm_delete.c'
  1647. fi
  1648. if test -f 'vol6/ch20/simple_help.c' -a "${1}" != "-c" ; then 
  1649.   echo shar: Will not clobber existing file \"'vol6/ch20/simple_help.c'\"
  1650. else
  1651. echo shar: Extracting \"'vol6/ch20/simple_help.c'\" \(3195 characters\)
  1652. sed "s/^X//" >'vol6/ch20/simple_help.c' <<'END_OF_FILE'
  1653. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1654. X * This program is freely distributable without licensing fees and
  1655. X * is provided without guarantee or warrantee expressed or implied.
  1656. X * This program is -not- in the public domain.
  1657. X */
  1658. X
  1659. X/* simple_help.c -- create a pushbutton that posts a dialog box
  1660. X * that entices the user to press the help button.  The callback
  1661. X * for this button displays a new dialog that gives help.
  1662. X */
  1663. X#include <Xm/MessageB.h>
  1664. X#include <Xm/PushB.h>
  1665. X
  1666. X/* main() --create a pushbutton whose callback pops up a dialog box */
  1667. Xmain(argc, argv)
  1668. Xchar *argv[];
  1669. X{
  1670. X    Widget toplevel, button;
  1671. X    XtAppContext app;
  1672. X    XmString label;
  1673. X    void pushed();
  1674. X
  1675. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  1676. X        &argc, argv, NULL, NULL);
  1677. X
  1678. X    label = XmStringCreateSimple("???");
  1679. X    button = XtVaCreateManagedWidget("button",
  1680. X        xmPushButtonWidgetClass, toplevel,
  1681. X        XmNlabelString,          label,
  1682. X        NULL);
  1683. X    XtAddCallback(button, XmNactivateCallback,
  1684. X        pushed, "You probably need help for this item.");
  1685. X    XmStringFree(label);
  1686. X
  1687. X    XtRealizeWidget(toplevel);
  1688. X    XtAppMainLoop(app);
  1689. X}
  1690. X
  1691. X#define HELP_TEXT "You just got help.\n    Now press 'Ok'"
  1692. X
  1693. X/* pushed() --the callback routine for the main app's pushbutton. */
  1694. Xvoid
  1695. Xpushed(w, text)
  1696. XWidget w;
  1697. Xchar *text;
  1698. X{
  1699. X    Widget dialog;
  1700. X    XmString t = XmStringCreateSimple(text);
  1701. X    Arg args[2];
  1702. X    extern void help_callback();
  1703. X
  1704. X    XtSetArg(args[0], XmNautoUnmanage, False);
  1705. X    XtSetArg(args[1], XmNmessageString, t);
  1706. X    dialog = XmCreateMessageDialog(XtParent(w), "notice", args, 2);
  1707. X    XmStringFree(t);
  1708. X
  1709. X    XtUnmanageChild(
  1710. X    XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
  1711. X
  1712. X    XtAddCallback(dialog, XmNokCallback, XtDestroyWidget, NULL);
  1713. X    XtAddCallback(dialog, XmNhelpCallback, help_callback, HELP_TEXT);
  1714. X
  1715. X    XtManageChild(dialog);
  1716. X    XtPopup(XtParent(dialog), XtGrabNone);
  1717. X}
  1718. X
  1719. X/*
  1720. X * The callback routine for the Help button in the original dialog
  1721. X * box. This routine displays a HelpDialog based on the help_text
  1722. X * parameter.
  1723. X */
  1724. Xvoid
  1725. Xhelp_callback(parent, help_text, cbs)
  1726. XWidget parent;
  1727. Xchar *help_text;
  1728. XXmAnyCallbackStruct *cbs;
  1729. X{
  1730. X    Widget dialog;
  1731. X    XmString text;
  1732. X    void help_done();
  1733. X    Arg args[2];
  1734. X
  1735. X    text = XmStringCreateLtoR(help_text, XmSTRING_DEFAULT_CHARSET);
  1736. X    XtSetArg(args[0], XmNmessageString, text);
  1737. X    XtSetArg(args[1], XmNautoUnmanage, False);
  1738. X    dialog = XmCreateInformationDialog(parent, "help", args, 2);
  1739. X    XmStringFree(text);
  1740. X
  1741. X    XtUnmanageChild(  /* no need for the cancel button */
  1742. X        XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON), False);
  1743. X    XtSetSensitive(   /* no more help is available. */
  1744. X        XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON), False);
  1745. X    /* the Ok button will call help_done() below */
  1746. X    XtAddCallback(dialog, XmNokCallback, help_done, NULL);
  1747. X
  1748. X    /* display the help text */
  1749. X    XtManageChild(dialog);
  1750. X    XtPopup(XtParent(dialog), XtGrabNone);
  1751. X}
  1752. X
  1753. X/* help_done() --called when user presses "Ok" in HelpDialog.
  1754. X * Destroy the dialog shell and reset it so that help_callback()
  1755. X * will create a new one.
  1756. X */
  1757. Xvoid
  1758. Xhelp_done(dialog)
  1759. XWidget dialog;
  1760. X{
  1761. X    XtDestroyWidget(dialog);
  1762. X}
  1763. END_OF_FILE
  1764. if test 3195 -ne `wc -c <'vol6/ch20/simple_help.c'`; then
  1765.     echo shar: \"'vol6/ch20/simple_help.c'\" unpacked with wrong size!
  1766. fi
  1767. # end of 'vol6/ch20/simple_help.c'
  1768. fi
  1769. echo shar: End of archive 8 \(of 11\).
  1770. cp /dev/null ark8isdone
  1771. MISSING=""
  1772. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  1773.     if test ! -f ark${I}isdone ; then
  1774.     MISSING="${MISSING} ${I}"
  1775.     fi
  1776. done
  1777. if test "${MISSING}" = "" ; then
  1778.     echo You have unpacked all 11 archives.
  1779.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1780. else
  1781.     echo You still need to unpack the following archives:
  1782.     echo "        " ${MISSING}
  1783. fi
  1784. ##  End of shell archive.
  1785. exit 0
  1786. --
  1787. Dan Heller
  1788. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  1789. Senior Writer                President          comp-sources-x@uunet.uu.net
  1790. argv@ora.com                 argv@zipcode.com
  1791.