home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume14 / ora.vol6 / part07 < prev    next >
Text File  |  1991-09-18  |  58KB  |  1,777 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: v14i037: Examples from the Motif Programmer's Manual (ORA-Vol. 6), Part07/11
  5. Message-ID: <20151@exodus.Eng.Sun.COM>
  6. Date: 18 Sep 91 22:31:14 GMT
  7. References: <csx-14i031-ora.vol6@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1765
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: Dan Heller <argv@z-code.com>
  13. Posting-number: Volume 14, Issue 37
  14. Archive-name: ora.vol6/part07
  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 7 (of 11)."
  23. # Contents:  vol6/ch04/cmd_area.c vol6/ch05/ask_user.c
  24. #   vol6/ch06/prompt_dlg.c vol6/ch08/corners.c
  25. #   vol6/ch08/dev_ind_draw.c vol6/ch10/drawing.c
  26. #   vol6/ch14/color_slide.c vol6/ch15/cut_paste.c vol6/ch15/error.c
  27. #   vol6/ch15/phone.c vol6/ch15/select_text.c
  28. #   vol6/ch18/copy_retrieve.c vol6/ch18/undo.c vol6/ch20/working.c
  29. # Wrapped by argv@tribbles on Wed Sep 18 15:10:24 1991
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'vol6/ch04/cmd_area.c' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'vol6/ch04/cmd_area.c'\"
  33. else
  34. echo shar: Extracting \"'vol6/ch04/cmd_area.c'\" \(3792 characters\)
  35. sed "s/^X//" >'vol6/ch04/cmd_area.c' <<'END_OF_FILE'
  36. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  37. X * This program is freely distributable without licensing fees and
  38. X * is provided without guarantee or warrantee expressed or implied.
  39. X * This program is -not- in the public domain.
  40. X */
  41. X
  42. X/* cmd_area.c -- use a ScrolledText object to view the
  43. X * putput of commands input by the user in a Command window.
  44. X */
  45. X#include <Xm/Text.h>
  46. X#include <Xm/MainW.h>
  47. X#include <Xm/Command.h>
  48. X#include <stdio.h>         /* For popen() */
  49. X
  50. X/* main() -- initialize toolkit, create a main window, menubar,
  51. X * a Command Area and a ScrolledText to view the output of commands.
  52. X */
  53. Xmain(argc, argv)
  54. Xint argc;
  55. Xchar *argv[];
  56. X{
  57. X    Widget        top, main_w, menubar, menu, command_w, text_w;
  58. X    XtAppContext  app;
  59. X    XmString      file, quit;
  60. X    extern void   exec_cmd(), exit();
  61. X    Arg           args[4];
  62. X
  63. X    /* initialize toolkit and create toplevel shell */
  64. X    top = XtVaAppInitialize(&app, "Demos",
  65. X        NULL, 0, &argc, argv, NULL, NULL);
  66. X
  67. X    (void) close(0); /* don't let commands read from stdin */
  68. X
  69. X    /* MainWindow for the application -- contains menubar, ScrolledText
  70. X     * and CommandArea (which prompts for filename).
  71. X     */
  72. X    main_w = XtVaCreateManagedWidget("main_w",
  73. X        xmMainWindowWidgetClass, top,
  74. X        NULL);
  75. X
  76. X    /* Create a simple MenuBar that contains one menu */
  77. X    file = XmStringCreateSimple("File");
  78. X    menubar = XmVaCreateSimpleMenuBar(main_w, "menubar",
  79. X        XmVaCASCADEBUTTON, file, 'F',
  80. X        NULL);
  81. X    XmStringFree(file);
  82. X
  83. X    /* "File" menu has only one item (Quit), so make callback exit() */
  84. X    quit = XmStringCreateSimple("Quit");
  85. X    menu = XmVaCreateSimplePulldownMenu(menubar, "file_menu", 0, exit,
  86. X        XmVaPUSHBUTTON, quit, 'Q', NULL, NULL,
  87. X        NULL);
  88. X    XmStringFree(quit);
  89. X
  90. X    /* Menubar is done -- manage it */
  91. X    XtManageChild(menubar);
  92. X
  93. X    /* Create ScrolledText -- this is work area for the MainWindow */
  94. X    XtSetArg(args[0], XmNrows,      24);
  95. X    XtSetArg(args[1], XmNcolumns,   80);
  96. X    XtSetArg(args[2], XmNeditable,  False);
  97. X    XtSetArg(args[3], XmNeditMode,  XmMULTI_LINE_EDIT);
  98. X    text_w = XmCreateScrolledText(main_w, "text_w", args, 4);
  99. X    XtManageChild(text_w);
  100. X
  101. X    /* store text_w as user data in "File" menu for file_cb() callback */
  102. X    XtVaSetValues(menu, XmNuserData, text_w, NULL);
  103. X
  104. X    /* Create the command area -- this must be a Command class widget */
  105. X    file = XmStringCreateSimple("Command:");
  106. X    command_w = XtVaCreateWidget("command_w", xmCommandWidgetClass, main_w,
  107. X        XmNpromptString, file,
  108. X        NULL);
  109. X    XmStringFree(file);
  110. X    XtAddCallback(command_w, XmNcommandEnteredCallback, exec_cmd, text_w);
  111. X    XtManageChild(command_w);
  112. X
  113. X    XmMainWindowSetAreas(main_w, menubar, command_w,
  114. X        NULL, NULL, XtParent(text_w));
  115. X    XtRealizeWidget(top);
  116. X    XtAppMainLoop(app);
  117. X}
  118. X
  119. X/* execute the command and redirect output to the ScrolledText window */
  120. Xvoid
  121. Xexec_cmd(cmd_widget, text_w, cbs)
  122. XWidget cmd_widget;  /* the command widget itself, not its Text widget */
  123. XWidget text_w; /* passed the text_w as client_data */
  124. XXmCommandCallbackStruct *cbs;
  125. X{
  126. X    char *cmd, buf[BUFSIZ];
  127. X    XmTextPosition pos;
  128. X    FILE *pp;
  129. X
  130. X    XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &cmd);
  131. X
  132. X    if (!cmd || !*cmd) { /* nothing typed? */
  133. X        if (cmd)
  134. X            XtFree(cmd);
  135. X        return;
  136. X    }
  137. X
  138. X    /* make sure the file is a regular text file and open it */
  139. X    if (!(pp = popen(cmd, "r")))
  140. X        perror(cmd);
  141. X    XtFree(cmd);
  142. X    if (!pp)
  143. X        return;
  144. X
  145. X    /* put the output of the command in the Text widget by reading
  146. X     * until EOF (meaning that the command has terminated).
  147. X     */
  148. X    for (pos = 0; fgets(buf, sizeof buf, pp); pos += strlen(buf))
  149. X        XmTextReplace(text_w, pos, pos, buf);
  150. X
  151. X    pclose(pp);
  152. X}
  153. END_OF_FILE
  154. if test 3792 -ne `wc -c <'vol6/ch04/cmd_area.c'`; then
  155.     echo shar: \"'vol6/ch04/cmd_area.c'\" unpacked with wrong size!
  156. fi
  157. # end of 'vol6/ch04/cmd_area.c'
  158. fi
  159. if test -f 'vol6/ch05/ask_user.c' -a "${1}" != "-c" ; then 
  160.   echo shar: Will not clobber existing file \"'vol6/ch05/ask_user.c'\"
  161. else
  162. echo shar: Extracting \"'vol6/ch05/ask_user.c'\" \(3577 characters\)
  163. sed "s/^X//" >'vol6/ch05/ask_user.c' <<'END_OF_FILE'
  164. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  165. X * This program is freely distributable without licensing fees and
  166. X * is provided without guarantee or warrantee expressed or implied.
  167. X * This program is -not- in the public domain.
  168. X */
  169. X
  170. X/*
  171. X * ask_user.c -- create a pushbutton that posts a dialog box
  172. X * that asks the user a question that requires an immediate
  173. X * response.  The function that asks the question actually
  174. X * posts the dialog that displays the question, waits for and
  175. X * returns the result.
  176. X */
  177. X#include <X11/Intrinsic.h>
  178. X#include <Xm/DialogS.h>
  179. X#include <Xm/SelectioB.h>
  180. X#include <Xm/RowColumn.h>
  181. X#include <Xm/MessageB.h>
  182. X#include <Xm/PushBG.h>
  183. X#include <Xm/PushB.h>
  184. X
  185. X#define YES 1
  186. X#define NO  2
  187. X
  188. X/* main() --create a pushbutton whose callback pops up a dialog box */
  189. Xmain(argc, argv)
  190. Xchar *argv[];
  191. X{
  192. X    Widget parent, button;
  193. X    XtAppContext app;
  194. X    XmString label;
  195. X    void pushed();
  196. X
  197. X    toplevel = XtAppInitialize(&app, argv[0], argv[0],
  198. X        NULL, 0, &argc, argv, NULL, NULL, 0);
  199. X
  200. X    label = XmStringCreateSimple("/bin/rm *");
  201. X    button = XtVaCreateManagedWidget("button",
  202. X        xmPushButtonWidgetClass, toplevel,
  203. X        XmNlabelString,          label,
  204. X        NULL);
  205. X    XtAddCallback(button, XmNactivateCallback,
  206. X        pushed, "Remove Everything?");
  207. X    XmStringFree(label);
  208. X
  209. X    XtRealizeWidget(toplevel);
  210. X    XtAppMainLoop(app);
  211. X}
  212. X
  213. X/* pushed() --the callback routine for the main app's pushbutton. */
  214. Xvoid
  215. Xpushed(w, question)
  216. XWidget w;
  217. Xchar *question;
  218. X{
  219. X    if (AskUser(w, question) == YES)
  220. X        puts("Yes");
  221. X    else
  222. X        puts("No");
  223. X}
  224. X
  225. X/*
  226. X * AskUser() -- a generalized routine that asks the user a question
  227. X * and returns the response.
  228. X */
  229. XAskUser(parent, question)
  230. Xchar *question;
  231. X{
  232. X    static Widget dialog;
  233. X    XmString text, yes, no;
  234. X    int answer = 0;
  235. X    extern void response();
  236. X
  237. X    if (!dialog) {
  238. X        dialog = XmCreateQuestionDialog(parent, "dialog", NULL, 0);
  239. X        yes = XmStringCreateSimple("Yes");
  240. X        no = XmStringCreateSimple("No");
  241. X        XtVaSetValues(dialog,
  242. X            XmNdialogStyle,        XmDIALOG_SYSTEM_MODAL,
  243. X            XmNokLabelString,      yes,
  244. X            XmNcancelLabelString,  no,
  245. X            NULL);
  246. X        XtSetSensitive(
  247. X            XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON), False);
  248. X        XtAddCallback(dialog, XmNokCallback, response, &answer);
  249. X        XtAddCallback(dialog, XmNcancelCallback, response, &answer);
  250. X    }
  251. X    text = XmStringCreateSimple(question);
  252. X    XtVaSetValues(dialog,
  253. X        XmNmessageString,      text,
  254. X        NULL);
  255. X    XmStringFree(text);
  256. X    XtManageChild(dialog);
  257. X    XtPopup(XtParent(dialog), XtGrabNone);
  258. X
  259. X    /* while the user hasn't provided an answer, simulate XtMainLoop.
  260. X     * The answer changes as soon as the user selects one of the
  261. X     * buttons and the callback routine changes its value.  Don't
  262. X     * break loop until XtPending() also returns False to assure
  263. X     * widget destruction.
  264. X     */
  265. X    while (answer == 0 || XtPending()) {
  266. X        XEvent event;
  267. X        XtNextEvent(&event);
  268. X        XtDispatchEvent(&event);
  269. X    }
  270. X    return answer;
  271. X}
  272. X
  273. X/* response() --The user made some sort of response to the
  274. X * question posed in AskUser().  Set the answer (client_data)
  275. X * accordingly and destroy the dialog.
  276. X */
  277. Xvoid
  278. Xresponse(w, answer, reason)
  279. XWidget w;
  280. Xint *answer;
  281. XXmAnyCallbackStruct *reason;
  282. X{
  283. X    switch (reason->reason) {
  284. X        case XmCR_OK:
  285. X            *answer = YES;
  286. X            break;
  287. X        case XmCR_CANCEL:
  288. X            *answer = NO;
  289. X            break;
  290. X        default:
  291. X            return;
  292. X    }
  293. X}
  294. END_OF_FILE
  295. if test 3577 -ne `wc -c <'vol6/ch05/ask_user.c'`; then
  296.     echo shar: \"'vol6/ch05/ask_user.c'\" unpacked with wrong size!
  297. fi
  298. # end of 'vol6/ch05/ask_user.c'
  299. fi
  300. if test -f 'vol6/ch06/prompt_dlg.c' -a "${1}" != "-c" ; then 
  301.   echo shar: Will not clobber existing file \"'vol6/ch06/prompt_dlg.c'\"
  302. else
  303. echo shar: Extracting \"'vol6/ch06/prompt_dlg.c'\" \(2855 characters\)
  304. sed "s/^X//" >'vol6/ch06/prompt_dlg.c' <<'END_OF_FILE'
  305. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  306. X * This program is freely distributable without licensing fees and
  307. X * is provided without guarantee or warrantee expressed or implied.
  308. X * This program is -not- in the public domain.
  309. X */
  310. X
  311. X/* prompt_dlg.c -- prompt the user for a string.  Two PushButtons
  312. X * are displayed.  When one is selected, a PromptDialog is displayed
  313. X * allowing the user to type a string.  When done, the PushButton's
  314. X * label changes to the string.
  315. X */
  316. X#include <Xm/SelectioB.h>
  317. X#include <Xm/RowColumn.h>
  318. X#include <Xm/PushB.h>
  319. X
  320. Xmain(argc, argv)
  321. Xchar *argv[];
  322. X{
  323. X    XtAppContext app;
  324. X    Widget toplevel, rc, button;
  325. X    void pushed();
  326. X
  327. X    /* Initialize toolkit and create toplevel shell */
  328. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  329. X        &argc, argv, NULL, NULL);
  330. X
  331. X    /* RowColumn managed both PushButtons */
  332. X    rc = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, toplevel,
  333. X        NULL);
  334. X    /* Create two pushbuttons -- both have the same callback */
  335. X    button = XtVaCreateManagedWidget("PushMe-1",
  336. X        xmPushButtonWidgetClass, rc, NULL);
  337. X    XtAddCallback(button, XmNactivateCallback, pushed, NULL);
  338. X    button = XtVaCreateManagedWidget("PushMe-2",
  339. X        xmPushButtonWidgetClass, rc, NULL);
  340. X    XtAddCallback(button, XmNactivateCallback, pushed, NULL);
  341. X
  342. X    XtManageChild(rc);
  343. X    XtRealizeWidget(toplevel);
  344. X    XtAppMainLoop(app);
  345. X}
  346. X
  347. X/* pushed() --the callback routine for the main app's pushbuttons.
  348. X * Create a dialog that prompts for a new button name.
  349. X */
  350. Xvoid
  351. Xpushed(pb)
  352. XWidget pb;
  353. X{
  354. X    static Widget dialog;
  355. X    XmString t = XmStringCreateSimple("Enter New Button Name:");
  356. X    extern void read_name();
  357. X    Arg args[2];
  358. X
  359. X    /* Create the dialog -- the PushButton acts as the DialogShell's
  360. X     * parent (not the parent of the PromptDialog).
  361. X     */
  362. X    XtSetArg(args[0], XmNselectionLabelString, t);
  363. X    XtSetArg(args[1], XmNautoUnmanage, False);
  364. X    dialog = XmCreatePromptDialog(pb, "prompt", args, 2);
  365. X    XmStringFree(t); /* always destroy compound strings when done */
  366. X
  367. X    /* When the user types the name, call read_name() ... */
  368. X    XtAddCallback(dialog, XmNokCallback, read_name, pb);
  369. X
  370. X    /* If the user selects cancel, just destroy the dialog */
  371. X    XtAddCallback(dialog, XmNcancelCallback, XtDestroyWidget, NULL);
  372. X
  373. X    /* No help is available... */
  374. X    XtSetSensitive(
  375. X        XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON), False);
  376. X    XtManageChild(dialog);
  377. X
  378. X    XtPopup(XtParent(dialog), XtGrabNone);
  379. X}
  380. X
  381. X/* read_name() --the text field has been filled in. */
  382. Xvoid
  383. Xread_name(w, push_button, cbs)
  384. XWidget w;
  385. XWidget push_button;  /* the "client_data" parameter to XtAddCallback */
  386. XXmSelectionBoxCallbackStruct *cbs;
  387. X{
  388. X    XtVaSetValues(push_button, XmNlabelString, cbs->value, NULL);
  389. X    /* Name's fine -- go ahead and enter it */
  390. X    XtDestroyWidget(w);
  391. X}
  392. END_OF_FILE
  393. if test 2855 -ne `wc -c <'vol6/ch06/prompt_dlg.c'`; then
  394.     echo shar: \"'vol6/ch06/prompt_dlg.c'\" unpacked with wrong size!
  395. fi
  396. # end of 'vol6/ch06/prompt_dlg.c'
  397. fi
  398. if test -f 'vol6/ch08/corners.c' -a "${1}" != "-c" ; then 
  399.   echo shar: Will not clobber existing file \"'vol6/ch08/corners.c'\"
  400. else
  401. echo shar: Extracting \"'vol6/ch08/corners.c'\" \(3405 characters\)
  402. sed "s/^X//" >'vol6/ch08/corners.c' <<'END_OF_FILE'
  403. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  404. X * This program is freely distributable without licensing fees and
  405. X * is provided without guarantee or warrantee expressed or implied.
  406. X * This program is -not- in the public domain.
  407. X */
  408. X
  409. X/* corners.c -- demonstrate widget layout management for a
  410. X * BulletinBoard widget.  There are four widgets each labeled
  411. X * top-left, top-right, bottom-left and bottom-right.  Their
  412. X * positions in the bulletin board correspond to their names.
  413. X * Only when the widget is resized does the geometry management
  414. X * kick in and position the children in their correct locations.
  415. X */
  416. X#include <Xm/BulletinB.h>
  417. X#include <Xm/PushBG.h>
  418. X
  419. Xchar *corners[] = {
  420. X    "Top-Left", "Top-Right", "Bottom-Left", "Bottom-Right",
  421. X};
  422. X
  423. Xstatic void resize();
  424. X
  425. Xmain(argc, argv)
  426. Xint argc;
  427. Xchar *argv[];
  428. X{
  429. X    Widget toplevel, bboard;
  430. X    XtAppContext app;
  431. X    XtActionsRec rec;
  432. X    int i;
  433. X
  434. X    /* Initialize toolkit and create toplevel shell */
  435. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  436. X        &argc, argv, NULL, NULL);
  437. X
  438. X    /* Create your standard BulletinBoard widget */
  439. X    bboard = XtVaCreateManagedWidget("bboard",
  440. X        xmBulletinBoardWidgetClass, toplevel, NULL);
  441. X
  442. X    /* Set up a translation table that captures "Resize" events
  443. X     * (also called ConfigureNotify or Configure events).  If the
  444. X     * event is generated, call the function resize().
  445. X     */
  446. X    rec.string = "resize";
  447. X    rec.proc = resize;
  448. X    XtAppAddActions(app, &rec, 1);
  449. X    XtOverrideTranslations(bboard,
  450. X        XtParseTranslationTable("<Configure>: resize()"));
  451. X
  452. X    /* Create children of the dialog -- a PushButton in each corner. */
  453. X    for (i = 0; i < XtNumber(corners); i++)
  454. X        XtVaCreateManagedWidget(corners[i],
  455. X            xmPushButtonGadgetClass, bboard, NULL);
  456. X
  457. X    XtRealizeWidget(toplevel);
  458. X    XtAppMainLoop(app);
  459. X}
  460. X
  461. X/* resize(), the routine that is automatically called by Xt upon the
  462. X * delivery of a Configure event.  This happens whenever the widget
  463. X * gets resized.
  464. X */
  465. Xstatic void
  466. Xresize(w, event, args, num_args)
  467. XCompositeWidget w;   /* The widget (BulletinBoard) that got resized */
  468. XXConfigureEvent *event;  /* The event struct associated with the event */
  469. XString args[]; /* unused */
  470. Xint *num_args; /* unused */
  471. X{
  472. X    WidgetList children;
  473. X    int width = event->width;
  474. X    int height = event->height;
  475. X    Dimension w_width, w_height; 
  476. X    short margin_w, margin_h;
  477. X
  478. X    /* get handle to BulletinBoard's children and marginal spacing */
  479. X    XtVaGetValues(w,
  480. X        XmNchildren, &children,
  481. X        XmNmarginWidth, &margin_w,
  482. X        XmNmarginHeight, &margin_h,
  483. X        NULL);
  484. X
  485. X    /* place the top left widget */
  486. X    XtVaSetValues(children[0],
  487. X        XmNx, margin_w,
  488. X        XmNy, margin_h,
  489. X        NULL);
  490. X    /* top right */
  491. X    XtVaGetValues(children[1], XmNwidth, &w_width, NULL);
  492. X    XtVaSetValues(children[1],
  493. X        XmNx, width - margin_w - w_width,
  494. X        XmNy, margin_h,
  495. X        NULL);
  496. X    /* bottom left */
  497. X    XtVaGetValues(children[2], XmNheight, &w_height, NULL);
  498. X    XtVaSetValues(children[2],
  499. X        XmNx, margin_w,
  500. X        XmNy, height - margin_h - w_height,
  501. X        NULL);
  502. X    /* bottom right */
  503. X    XtVaGetValues(children[3],
  504. X        XmNheight, &w_height,
  505. X        XmNwidth, &w_width,
  506. X        NULL);
  507. X    XtVaSetValues(children[3],
  508. X        XmNx, width - margin_w - w_width,
  509. X        XmNy, height - margin_h - w_height,
  510. X        NULL);
  511. X}
  512. END_OF_FILE
  513. if test 3405 -ne `wc -c <'vol6/ch08/corners.c'`; then
  514.     echo shar: \"'vol6/ch08/corners.c'\" unpacked with wrong size!
  515. fi
  516. # end of 'vol6/ch08/corners.c'
  517. fi
  518. if test -f 'vol6/ch08/dev_ind_draw.c' -a "${1}" != "-c" ; then 
  519.   echo shar: Will not clobber existing file \"'vol6/ch08/dev_ind_draw.c'\"
  520. else
  521. echo shar: Extracting \"'vol6/ch08/dev_ind_draw.c'\" \(3297 characters\)
  522. sed "s/^X//" >'vol6/ch08/dev_ind_draw.c' <<'END_OF_FILE'
  523. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  524. X * This program is freely distributable without licensing fees and
  525. X * is provided without guarantee or warrantee expressed or implied.
  526. X * This program is -not- in the public domain.
  527. X */
  528. X
  529. X/* drawing.c -- extremely simple drawing program that introduces
  530. X * the DrawingArea widget.  This widget provides a window for
  531. X * drawing and some callbacks for getting input and other misc
  532. X * events (resize and expose).  It's also a manager, so it can
  533. X * have children.  There is no geometry management, tho.
  534. X */
  535. X#include <Xm/DrawingA.h>
  536. X#include <Xm/RowColumn.h>
  537. X
  538. XDisplay *dpy;
  539. X
  540. Xmain(argc, argv)
  541. Xint argc;
  542. Xchar *argv[];
  543. X{
  544. X    Widget toplevel, drawing_a;
  545. X    XtAppContext app;
  546. X    XGCValues gcv;
  547. X    GC gc;
  548. X    void drawing_area_callback();
  549. X
  550. X    /* Initialize toolkit and create 500x500 top level shell */
  551. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0, 
  552. X        &argc, argv, NULL, NULL);
  553. X
  554. X    /* avoiding having to use a macro everywhere else... */
  555. X    dpy = XtDisplay(toplevel);
  556. X
  557. X    /* Create a DrawingArea widget. */
  558. X    drawing_a = XtVaCreateWidget("drawing_a",
  559. X        xmDrawingAreaWidgetClass, toplevel,
  560. X    XmNunitType,   Xm1000TH_INCHES,
  561. X    XmNheight,     2000, /* 2 inches? */
  562. X    XmNwidth,      5000, /* 5 inches? */
  563. X        NULL);
  564. X
  565. X    /* add callback to trap input events */
  566. X    XtAddCallback(drawing_a, XmNinputCallback,
  567. X        drawing_area_callback, NULL);
  568. X    /* add callback to trap resizing */
  569. X    XtAddCallback(drawing_a, XmNresizeCallback,
  570. X        drawing_area_callback, NULL);
  571. X
  572. X    /* Create a GC for drawing (in callback).  Attach to
  573. X     * DrawingArea's XmNuserData to avoid having to make global.
  574. X     */
  575. X    gcv.foreground = BlackPixelOfScreen(XtScreen(drawing_a));
  576. X    gcv.background = WhitePixelOfScreen(XtScreen(drawing_a));
  577. X    gc = XCreateGC(dpy, RootWindowOfScreen(XtScreen(drawing_a)),
  578. X        GCForeground|GCBackground, &gcv);
  579. X    XtVaSetValues(drawing_a, XmNuserData, gc, NULL);
  580. X
  581. X    XtManageChild(drawing_a);
  582. X    XtRealizeWidget(toplevel);
  583. X    XtAppMainLoop(app);
  584. X}
  585. X
  586. X/* Callback routine for DrawingArea's input and resize callbacks.
  587. X * This is also used as the PushButton's callback.  Determine which
  588. X * activated us by testing the cbs->reason field.
  589. X */
  590. Xvoid
  591. Xdrawing_area_callback(widget, data, cbs)
  592. XWidget widget;
  593. XXtPointer data;
  594. XXmDrawingAreaCallbackStruct *cbs;
  595. X{
  596. X    static Position x, y;
  597. X    XEvent *event = cbs->event;
  598. X
  599. X    if (cbs->reason == XmCR_INPUT) {
  600. X        /* activated by DrawingArea input event */
  601. X        if (event->xany.type == ButtonPress) {
  602. X            /* anchor initial point */
  603. X            x = event->xbutton.x;
  604. X            y = event->xbutton.y;
  605. X        } else if (event->xany.type == ButtonRelease) {
  606. X            /* draw full line; get GC and use in XDrawLine() */
  607. X            GC gc;
  608. X            XtVaGetValues(widget, XmNuserData, &gc, NULL);
  609. X            XDrawLine(dpy, cbs->window, gc, x, y,
  610. X                event->xbutton.x, event->xbutton.y);
  611. X            x = event->xbutton.x;
  612. X            y = event->xbutton.y;
  613. X        }
  614. X    }
  615. X
  616. X    if (cbs->reason == XmCR_RESIZE && cbs->window)
  617. X        XClearWindow(dpy, cbs->window);
  618. X
  619. X    if (cbs->reason == XmCR_ACTIVATE)
  620. X        /* activated by pushbutton -- clear parent's window */
  621. X        XClearWindow(dpy, XtWindow(XtParent(widget)));
  622. X}
  623. END_OF_FILE
  624. if test 3297 -ne `wc -c <'vol6/ch08/dev_ind_draw.c'`; then
  625.     echo shar: \"'vol6/ch08/dev_ind_draw.c'\" unpacked with wrong size!
  626. fi
  627. # end of 'vol6/ch08/dev_ind_draw.c'
  628. fi
  629. if test -f 'vol6/ch10/drawing.c' -a "${1}" != "-c" ; then 
  630.   echo shar: Will not clobber existing file \"'vol6/ch10/drawing.c'\"
  631. else
  632. echo shar: Extracting \"'vol6/ch10/drawing.c'\" \(3464 characters\)
  633. sed "s/^X//" >'vol6/ch10/drawing.c' <<'END_OF_FILE'
  634. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  635. X * This program is freely distributable without licensing fees and
  636. X * is provided without guarantee or warrantee expressed or implied.
  637. X * This program is -not- in the public domain.
  638. X */
  639. X
  640. X/* drawing.c -- extremely simple drawing program that introduces
  641. X * the DrawingArea widget.  This widget provides a window for
  642. X * drawing and some callbacks for getting input and other misc
  643. X * events.  It's also a manager, so it can have children.
  644. X * There is no geometry management, tho.
  645. X */
  646. X#include <Xm/DrawingA.h>
  647. X#include <Xm/PushBG.h>
  648. X#include <Xm/RowColumn.h>
  649. X
  650. Xmain(argc, argv)
  651. Xint argc;
  652. Xchar *argv[];
  653. X{
  654. X    Widget toplevel, drawing_a, pb;
  655. X    XtAppContext app;
  656. X    XGCValues gcv;
  657. X    GC gc;
  658. X    void drawing_area_callback();
  659. X
  660. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0, 
  661. X        &argc, argv, NULL,
  662. X        XmNwidth,  400,
  663. X        XmNheight, 300,
  664. X        NULL);
  665. X
  666. X    /* Create a DrawingArea widget. */
  667. X    drawing_a = XtVaCreateWidget("drawing_a",
  668. X        xmDrawingAreaWidgetClass, toplevel,
  669. X        NULL);
  670. X    /* add callback for all mouse and keyboard input events */
  671. X    XtAddCallback(drawing_a, XmNinputCallback, drawing_area_callback, NULL);
  672. X
  673. X    /* Since we're going to be drawing, we will be using Xlib routines
  674. X     * and therefore need a graphics context.  Create a GC and attach
  675. X     * to the DrawingArea's XmNuserData to avoid having to make global
  676. X     * variable. (Avoiding globals is a good design principle to follow.)
  677. X     */
  678. X    gcv.foreground = BlackPixelOfScreen(XtScreen(drawing_a));
  679. X    gc = XCreateGC(XtDisplay(drawing_a),
  680. X        RootWindowOfScreen(XtScreen(drawing_a)), GCForeground, &gcv);
  681. X    XtVaSetValues(drawing_a, XmNuserData, gc, NULL);
  682. X
  683. X    /* add a pushbutton the user can use to clear the canvas */
  684. X    pb = XtVaCreateManagedWidget("Clear",
  685. X        xmPushButtonGadgetClass, drawing_a,
  686. X        NULL);
  687. X    /* if activated, call same callback as XmNinputCallback. */
  688. X    XtAddCallback(pb, XmNactivateCallback, drawing_area_callback, NULL);
  689. X
  690. X    XtManageChild(drawing_a);
  691. X    XtRealizeWidget(toplevel);
  692. X    XtAppMainLoop(app);
  693. X}
  694. X
  695. X/* Callback routine for DrawingArea's input callbacks and the
  696. X * PushButton's activate callback.  Determine which it is by
  697. X * testing the cbs->reason field.
  698. X */
  699. Xvoid
  700. Xdrawing_area_callback(widget, data, cbs)
  701. XWidget widget;
  702. XXtPointer data;
  703. XXmDrawingAreaCallbackStruct *cbs;
  704. X{
  705. X    static Position x, y;
  706. X    XEvent *event = cbs->event;
  707. X
  708. X    if (cbs->reason == XmCR_INPUT) {
  709. X        /* activated by DrawingArea input event -- draw lines.
  710. X         * Button Down events anchor the initial point and Button
  711. X         * Up draws from the anchor point to the button-up point.
  712. X         */
  713. X        if (event->xany.type == ButtonPress) {
  714. X            /* anchor initial point (i.e., save its value) */
  715. X            x = event->xbutton.x;
  716. X            y = event->xbutton.y;
  717. X        } else if (event->xany.type == ButtonRelease) {
  718. X            /* draw full line; get GC and use in XDrawLine() */
  719. X            GC gc;
  720. X            XtVaGetValues(widget, XmNuserData, &gc, NULL);
  721. X            XDrawLine(event->xany.display, cbs->window, gc, x, y,
  722. X                event->xbutton.x, event->xbutton.y);
  723. X            x = event->xbutton.x;
  724. X            y = event->xbutton.y;
  725. X        }
  726. X    }
  727. X
  728. X    if (cbs->reason == XmCR_ACTIVATE)
  729. X        /* activated by pushbutton -- clear parent's window */
  730. X        XClearWindow(event->xany.display, XtWindow(XtParent(widget)));
  731. X}
  732. END_OF_FILE
  733. if test 3464 -ne `wc -c <'vol6/ch10/drawing.c'`; then
  734.     echo shar: \"'vol6/ch10/drawing.c'\" unpacked with wrong size!
  735. fi
  736. # end of 'vol6/ch10/drawing.c'
  737. fi
  738. if test -f 'vol6/ch14/color_slide.c' -a "${1}" != "-c" ; then 
  739.   echo shar: Will not clobber existing file \"'vol6/ch14/color_slide.c'\"
  740. else
  741. echo shar: Extracting \"'vol6/ch14/color_slide.c'\" \(3689 characters\)
  742. sed "s/^X//" >'vol6/ch14/color_slide.c' <<'END_OF_FILE'
  743. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  744. X * This program is freely distributable without licensing fees and
  745. X * is provided without guarantee or warrantee expressed or implied.
  746. X * This program is -not- in the public domain.
  747. X */
  748. X
  749. X/* color_slide.c -- Use scale widgets to display the different
  750. X * colors of a colormap.
  751. X */
  752. X#include <Xm/LabelG.h>
  753. X#include <Xm/Scale.h>
  754. X#include <Xm/RowColumn.h>
  755. X#include <Xm/DrawingA.h>
  756. X
  757. XWidget colorwindow; /* the window the siplays a solid color */
  758. XXColor color;       /* the color in the colorwindow */
  759. X
  760. Xmain(argc, argv)
  761. Xchar *argv[];
  762. X{
  763. X    Widget        toplevel, rowcol, scale;
  764. X    XtAppContext  app;
  765. X    Pixel         background;
  766. X    void          new_value();
  767. X    XtVarArgsList arglist;
  768. X
  769. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  770. X        &argc, argv, NULL, NULL);
  771. X
  772. X    if (DefaultDepthOfScreen(XtScreen(toplevel)) < 2) {
  773. X        puts("You must be using a color screen.");
  774. X        exit(1);
  775. X    }
  776. X
  777. X    color.flags = DoRed|DoGreen|DoBlue;
  778. X    /* initialize first color */
  779. X    XAllocColor(XtDisplay(toplevel),
  780. X        DefaultColormapOfScreen(XtScreen(toplevel)), &color);
  781. X
  782. X    rowcol = XtVaCreateManagedWidget("rowcol",
  783. X        xmRowColumnWidgetClass, toplevel, NULL);
  784. X
  785. X    colorwindow = XtVaCreateManagedWidget("colorwindow",
  786. X        widgetClass,   rowcol,
  787. X        XmNheight,     100,
  788. X        XmNbackground, color.pixel,
  789. X        NULL);
  790. X
  791. X    /* use rowcol again to create another RowColumn under the 1st */
  792. X    rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, rowcol,
  793. X        XmNorientation, XmHORIZONTAL,
  794. X        NULL);
  795. X
  796. X    arglist = XtVaCreateArgsList(NULL,
  797. X        XmNshowValue, True,
  798. X        XmNmaximum, 255,
  799. X        XmNscaleMultiple, 5,
  800. X        NULL);
  801. X
  802. X    scale = XtVaCreateManagedWidget("Red",
  803. X        xmScaleWidgetClass, rowcol,
  804. X        XtVaNestedList, arglist,
  805. X        XtVaTypedArg, XmNtitleString, XmRString, "Red", 4,
  806. X        XtVaTypedArg, XmNforeground, XmRString, "Red", 4,
  807. X        NULL);
  808. X    XtAddCallback(scale, XmNdragCallback, new_value, DoRed);
  809. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, DoRed);
  810. X
  811. X    scale = XtVaCreateManagedWidget("Green",
  812. X        xmScaleWidgetClass, rowcol,
  813. X        XtVaNestedList, arglist,
  814. X        XtVaTypedArg, XmNtitleString, XmRString, "Green", 6,
  815. X        XtVaTypedArg, XmNforeground, XmRString, "Green", 6,
  816. X        NULL);
  817. X    XtAddCallback(scale, XmNdragCallback, new_value, DoGreen);
  818. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, DoGreen);
  819. X
  820. X    scale = XtVaCreateManagedWidget("Blue",
  821. X        xmScaleWidgetClass, rowcol,
  822. X        XtVaNestedList, arglist,
  823. X        XtVaTypedArg, XmNtitleString, XmRString, "Blue", 5,
  824. X        XtVaTypedArg, XmNforeground, XmRString, "Blue", 5,
  825. X        NULL);
  826. X    XtAddCallback(scale, XmNdragCallback, new_value, DoBlue);
  827. X    XtAddCallback(scale, XmNvalueChangedCallback, new_value, DoBlue);
  828. X
  829. X    XtFree(arglist);
  830. X
  831. X    XtManageChild(rowcol);
  832. X
  833. X    XtRealizeWidget(toplevel);
  834. X    XtAppMainLoop(app);
  835. X}
  836. X
  837. Xvoid
  838. Xnew_value(scale_w, rgb, cbs)
  839. XWidget scale_w;
  840. Xint rgb;
  841. XXmScaleCallbackStruct *cbs;
  842. X{
  843. X    Colormap cmap = DefaultColormapOfScreen(XtScreen(scale_w));
  844. X
  845. X    switch (rgb) {
  846. X        case DoRed :
  847. X            color.red = (cbs->value << 8);
  848. X            break;
  849. X        case DoGreen :
  850. X            color.green = (cbs->value << 8);
  851. X            break;
  852. X        case DoBlue :
  853. X            color.blue = (cbs->value << 8);
  854. X    }
  855. X
  856. X    /* reuse the same color again and again */
  857. X    XFreeColors(XtDisplay(scale_w), cmap, &color.pixel, 1, 0);
  858. X    if (!XAllocColor(XtDisplay(scale_w), cmap, &color))
  859. X        puts("Couldn't XallocColor!"), exit(1);
  860. X    XtVaSetValues(colorwindow, XmNbackground, color.pixel, NULL);
  861. X}
  862. END_OF_FILE
  863. if test 3689 -ne `wc -c <'vol6/ch14/color_slide.c'`; then
  864.     echo shar: \"'vol6/ch14/color_slide.c'\" unpacked with wrong size!
  865. fi
  866. # end of 'vol6/ch14/color_slide.c'
  867. fi
  868. if test -f 'vol6/ch15/cut_paste.c' -a "${1}" != "-c" ; then 
  869.   echo shar: Will not clobber existing file \"'vol6/ch15/cut_paste.c'\"
  870. else
  871. echo shar: Extracting \"'vol6/ch15/cut_paste.c'\" \(3658 characters\)
  872. sed "s/^X//" >'vol6/ch15/cut_paste.c' <<'END_OF_FILE'
  873. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  874. X * This program is freely distributable without licensing fees and
  875. X * is provided without guarantee or warrantee expressed or implied.
  876. X * This program is -not- in the public domain.
  877. X */
  878. X
  879. X/* cut_paste.c -- demonstrate the XmText* functions that handle
  880. X * clipboard operations.  These functions are convenience routines
  881. X * that relieve the programmer of the need to use clipboard functions.
  882. X * The functionality of these routines already exists in the Text
  883. X * widget, yet it is common to place such features in the interface
  884. X * via the MenuBar's "Edit" pulldown menu.
  885. X */
  886. X#include <Xm/Text.h>
  887. X#include <Xm/LabelG.h>
  888. X#include <Xm/PushBG.h>
  889. X#include <Xm/RowColumn.h>
  890. X#include <Xm/MainW.h>
  891. X
  892. XWidget text_w, text_output;
  893. X
  894. Xmain(argc, argv)
  895. Xint argc;
  896. Xchar *argv[];
  897. X{
  898. X    Widget        toplevel, main_w, menubar, rowcol_v, rowcol_h, pb;
  899. X    XtAppContext  app;
  900. X    int           i;
  901. X    void          cut_paste();
  902. X    XmString      label, cut, clear, copy, paste;
  903. X    Arg           args[5];
  904. X
  905. X    toplevel = XtVaAppInitialize(&app, "Demos",
  906. X        NULL, 0, &argc, argv, NULL, NULL);
  907. X
  908. X    main_w = XtVaCreateWidget("main_w",
  909. X        xmMainWindowWidgetClass, toplevel, NULL);
  910. X
  911. X    /* Create a simple MenuBar that contains a single menu */
  912. X    label = XmStringCreateSimple("Edit");
  913. X    menubar = XmVaCreateSimpleMenuBar(main_w, "main_w",
  914. X        XmVaCASCADEBUTTON, label, 'E',
  915. X        NULL);
  916. X    XmStringFree(label);
  917. X
  918. X    cut = XmStringCreateSimple("Cut");      /* create a simple    */
  919. X    copy = XmStringCreateSimple("Copy");    /* pulldown menu that */
  920. X    clear = XmStringCreateSimple("Clear");  /* has these menu     */
  921. X    paste = XmStringCreateSimple("Paste");  /* items in it.       */
  922. X    XmVaCreateSimplePulldownMenu(menubar, "edit_menu", 0, cut_paste,
  923. X        XmVaPUSHBUTTON, cut, 'C', NULL, NULL,
  924. X        XmVaPUSHBUTTON, copy, 'o', NULL, NULL,
  925. X        XmVaPUSHBUTTON, paste, 'P', NULL, NULL,
  926. X        XmVaSEPARATOR,
  927. X        XmVaPUSHBUTTON, clear, 'l', NULL, NULL,
  928. X        NULL);
  929. X    XmStringFree(cut);
  930. X    XmStringFree(clear);
  931. X    XmStringFree(copy);
  932. X    XmStringFree(paste);
  933. X
  934. X    XtManageChild(menubar);
  935. X
  936. X    /* create a standard vertical RowColumn... */
  937. X    rowcol_v = XtVaCreateWidget("rowcol_v",
  938. X        xmRowColumnWidgetClass, main_w, NULL);
  939. X
  940. X    text_output = XtVaCreateManagedWidget("text_out",
  941. X        xmTextWidgetClass, rowcol_v,
  942. X        XmNeditable,              False,
  943. X        XmNcursorPositionVisible, False,
  944. X        XmNshadowThickness,       0,
  945. X        XmNsensitive,             False,
  946. X        NULL);
  947. X
  948. X    XtSetArg(args[0], XmNrows,      10);
  949. X    XtSetArg(args[1], XmNcolumns,   80);
  950. X    XtSetArg(args[2], XmNeditMode,  XmMULTI_LINE_EDIT);
  951. X    XtSetArg(args[3], XmNscrollHorizontal,  False);
  952. X    XtSetArg(args[4], XmNwordWrap,  True);
  953. X    text_w = XmCreateScrolledText(rowcol_v, "text_w", args, 5);
  954. X    XtManageChild(text_w);
  955. X
  956. X    XtManageChild(rowcol_v);
  957. X    XtManageChild(main_w);
  958. X
  959. X    XtRealizeWidget(toplevel);
  960. X    XtAppMainLoop(app);
  961. X}
  962. X
  963. X/* the callback routine for the items in the edit menu */
  964. Xvoid
  965. Xcut_paste(widget, num)
  966. XWidget widget;  /* the menu item (pushbutton) that was selected */
  967. Xint num;        /* the menu item number */
  968. X{
  969. X    Boolean result = True;
  970. X
  971. X    switch (num) {
  972. X        case 0 : result = XmTextCut(text_w, CurrentTime); break;
  973. X        case 1 : result = XmTextCopy(text_w, CurrentTime); break;
  974. X        case 2 : result = XmTextPaste(text_w);
  975. X        case 3 : XmTextClearSelection(text_w, CurrentTime); break;
  976. X    }
  977. X    if (result == False)
  978. X        XmTextSetString(text_output, "There is no selection.");
  979. X    else
  980. X        XmTextSetString(text_output, NULL);
  981. X}
  982. END_OF_FILE
  983. if test 3658 -ne `wc -c <'vol6/ch15/cut_paste.c'`; then
  984.     echo shar: \"'vol6/ch15/cut_paste.c'\" unpacked with wrong size!
  985. fi
  986. # end of 'vol6/ch15/cut_paste.c'
  987. fi
  988. if test -f 'vol6/ch15/error.c' -a "${1}" != "-c" ; then 
  989.   echo shar: Will not clobber existing file \"'vol6/ch15/error.c'\"
  990. else
  991. echo shar: Extracting \"'vol6/ch15/error.c'\" \(3488 characters\)
  992. sed "s/^X//" >'vol6/ch15/error.c' <<'END_OF_FILE'
  993. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  994. X * This program is freely distributable without licensing fees and
  995. X * is provided without guarantee or warrantee expressed or implied.
  996. X * This program is -not- in the public domain.
  997. X */
  998. X
  999. X#include <stdio.h>
  1000. X#include <Xm/Text.h>
  1001. X#include <Xm/PushBG.h>
  1002. X#include <Xm/RowColumn.h>
  1003. X#include <varargs.h>
  1004. X
  1005. Xvoid wprint();
  1006. XWidget text_w;
  1007. X
  1008. Xstatic void
  1009. Xx_error(dpy, err_event)
  1010. XDisplay      *dpy;
  1011. XXErrorEvent  *err_event;
  1012. X{
  1013. X    char                buf[BUFSIZ];
  1014. X
  1015. X    XGetErrorText(dpy, err_event->error_code, buf, sizeof buf);
  1016. X
  1017. X    wprint("X Error: <%s>\n", buf);
  1018. X}
  1019. X
  1020. Xstatic void
  1021. Xxt_error(message)
  1022. Xchar *message;
  1023. X{
  1024. X    wprint("Xt Error: %s\n", message);
  1025. X}
  1026. X
  1027. Xstatic void
  1028. Xmake_x_error(w, which)
  1029. XWidget w;
  1030. Xint which;
  1031. X{
  1032. X    switch (which) {
  1033. X    case 0 : XLookupColor(XtDisplay(text_w), NULL, "", NULL); break;
  1034. X    case 2 : XtError("This is an XtError call!"); break;
  1035. X    case 3 : XtWarning("This is an XtWarning call."); break;
  1036. X    }
  1037. X}
  1038. X
  1039. Xmain(argc, argv)
  1040. Xint argc;
  1041. Xchar *argv[];
  1042. X{
  1043. X    XtAppContext app;
  1044. X    Widget       toplevel, rowcol1, rowcol2, pb;
  1045. X    Arg          args[7];
  1046. X
  1047. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1048. X    NULL, 0, &argc, argv, NULL, NULL);
  1049. X
  1050. X    rowcol1 = XtVaCreateWidget("rowcol1", xmRowColumnWidgetClass, toplevel,
  1051. X    NULL);
  1052. X    rowcol2 = XtVaCreateWidget("rowcol2", xmRowColumnWidgetClass, rowcol1,
  1053. X    XmNorientation, XmHORIZONTAL,
  1054. X    NULL);
  1055. X    pb = XtVaCreateManagedWidget("XLib Error",
  1056. X    xmPushButtonGadgetClass, rowcol2,
  1057. X    NULL);
  1058. X    XtAddCallback(pb, XmNactivateCallback, make_x_error, 0);
  1059. X    pb = XtVaCreateManagedWidget("Xt Error",
  1060. X    xmPushButtonGadgetClass, rowcol2,
  1061. X    NULL);
  1062. X    XtAddCallback(pb, XmNactivateCallback, make_x_error, 2);
  1063. X    pb = XtVaCreateManagedWidget("Xt Warning",
  1064. X    xmPushButtonGadgetClass, rowcol2,
  1065. X    NULL);
  1066. X    XtAddCallback(pb, XmNactivateCallback, make_x_error, 3);
  1067. X
  1068. X    /* Create text_w as a ScrolledText window */
  1069. X    XtSetArg(args[0], XmNrows,             6);
  1070. X    XtSetArg(args[1], XmNcolumns,          80);
  1071. X    XtSetArg(args[2], XmNeditable,         False);
  1072. X    XtSetArg(args[3], XmNeditMode,         XmMULTI_LINE_EDIT);
  1073. X    XtSetArg(args[4], XmNwordWrap,         True);
  1074. X    XtSetArg(args[5], XmNscrollHorizontal, False);
  1075. X    XtSetArg(args[6], XmNcursorPositionVisible, False);
  1076. X    text_w = XmCreateScrolledText(rowcol1, "text_w", args, 7);
  1077. X    XtManageChild(text_w);
  1078. X
  1079. X    /* catch Xt errors */
  1080. X    XtAppSetErrorHandler(app, xt_error);
  1081. X    XtAppSetWarningHandler(app, xt_error);
  1082. X    /* and Xlib errors */
  1083. X    XSetErrorHandler(x_error);
  1084. X
  1085. X    XtManageChild(rowcol1);
  1086. X    XtManageChild(rowcol2);
  1087. X    XtRealizeWidget(toplevel);
  1088. X    XtAppMainLoop(app);
  1089. X}
  1090. X
  1091. X/*VARARGS*/
  1092. Xvoid
  1093. Xwprint(va_alist)
  1094. Xva_dcl
  1095. X{
  1096. X    char msgbuf[BUFSIZ]; /* we're not getting huge strings */
  1097. X    char *fmt;
  1098. X    static XmTextPosition wpr_position; /* maintain text position */
  1099. X    va_list args;
  1100. X
  1101. X    va_start(args);
  1102. X    fmt = va_arg(args, char *);
  1103. X#ifndef NO_VPRINTF
  1104. X    (void) vsprintf(msgbuf, fmt, args);
  1105. X#else /* !NO_VPRINTF */
  1106. X    {
  1107. X        FILE foo;
  1108. X        foo._cnt = BUFSIZ;
  1109. X        foo._base = foo._ptr = msgbuf; /* (unsigned char *) ?? */
  1110. X        foo._flag = _IOWRT+_IOSTRG;
  1111. X        (void) _doprnt(fmt, args, &foo);
  1112. X        *foo._ptr = '\0'; /* plant terminating null character */
  1113. X    }
  1114. X#endif /* NO_VPRINTF */
  1115. X    va_end(args);
  1116. X
  1117. X    XmTextInsert(text_w, wpr_position, msgbuf);
  1118. X    wpr_position += strlen(msgbuf);
  1119. X    XtVaSetValues(text_w, XmNcursorPosition, wpr_position, NULL);
  1120. X    XmTextShowPosition(text_w, wpr_position);
  1121. X}
  1122. END_OF_FILE
  1123. if test 3488 -ne `wc -c <'vol6/ch15/error.c'`; then
  1124.     echo shar: \"'vol6/ch15/error.c'\" unpacked with wrong size!
  1125. fi
  1126. # end of 'vol6/ch15/error.c'
  1127. fi
  1128. if test -f 'vol6/ch15/phone.c' -a "${1}" != "-c" ; then 
  1129.   echo shar: Will not clobber existing file \"'vol6/ch15/phone.c'\"
  1130. else
  1131. echo shar: Extracting \"'vol6/ch15/phone.c'\" \(3274 characters\)
  1132. sed "s/^X//" >'vol6/ch15/phone.c' <<'END_OF_FILE'
  1133. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1134. X * This program is freely distributable without licensing fees and
  1135. X * is provided without guarantee or warrantee expressed or implied.
  1136. X * This program is -not- in the public domain.
  1137. X */
  1138. X
  1139. X/* prompt_phone.c -- a complex problem for XmNmodifyVerifyCallback.
  1140. X * prompt for a phone number by filtering digits only from input.
  1141. X * Don't allow paste operations and handle backspacing.
  1142. X */
  1143. X#include <Xm/Text.h>
  1144. X#include <Xm/LabelG.h>
  1145. X#include <Xm/RowColumn.h>
  1146. X#include <ctype.h>
  1147. X#include <stdio.h>
  1148. X
  1149. Xvoid check_phone();
  1150. X
  1151. Xmain(argc, argv)
  1152. Xint argc;
  1153. Xchar *argv[];
  1154. X{
  1155. X    Widget        toplevel, text_w, rowcol;
  1156. X    XtAppContext  app;
  1157. X
  1158. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1159. X        NULL, 0, &argc, argv, NULL, NULL);
  1160. X
  1161. X    rowcol = XtVaCreateWidget("rowcol",
  1162. X        xmRowColumnWidgetClass, toplevel,
  1163. X        XmNorientation, XmHORIZONTAL,
  1164. X        NULL);
  1165. X
  1166. X    XtVaCreateManagedWidget("Phone Number:",
  1167. X        xmLabelGadgetClass, rowcol, NULL);
  1168. X    text_w = XtVaCreateManagedWidget("text_w",
  1169. X        xmTextWidgetClass, rowcol, NULL);
  1170. X
  1171. X    XtAddCallback(text_w, XmNmodifyVerifyCallback, check_phone, NULL);
  1172. X    XtAddCallback(text_w, XmNmotionVerifyCallback, check_phone, NULL);
  1173. X    XtAddCallback(text_w, XmNvalueChangedCallback, check_phone, NULL);
  1174. X
  1175. X    XtManageChild(rowcol);
  1176. X    XtRealizeWidget(toplevel);
  1177. X    XtAppMainLoop(app);
  1178. X}
  1179. X
  1180. Xvoid
  1181. Xcheck_phone(text_w, unused, cbs)
  1182. XWidget     text_w;
  1183. XXtPointer  unused;
  1184. XXmTextVerifyCallbackStruct *cbs;
  1185. X{
  1186. X    char c;
  1187. X    int len = XmTextGetLastPosition(text_w);
  1188. X
  1189. X    if (cbs->reason == XmCR_MOVING_INSERT_CURSOR) {
  1190. X        /* we'll get a motion-notify if the user clicks somewhere with the
  1191. X         * intent of changing the insertion point, or we'll get one if the
  1192. X         * program actually sets the cursor position like we do below.
  1193. X         * If we reset the cursor manually (like below) "event" is NULL,
  1194. X         * and we allow it -- however, if the user "clicks" to move the
  1195. X         * insertion cursor, we cannot allow it.  We would -normally-
  1196. X         * test for that by testing cbs->event != NULL (like we do here),
  1197. X         * but it currently won't work because of a bug with Motif where
  1198. X         * it sets the event field to NULL anyway!!
  1199. X         */
  1200. X        if (cbs->newInsert != len && cbs->event)
  1201. X            cbs->doit = False;
  1202. X        return;
  1203. X    }
  1204. X
  1205. X    if (cbs->reason == XmCR_VALUE_CHANGED) {
  1206. X        XmTextSetInsertionPosition(text_w, len);
  1207. X        return;
  1208. X    }
  1209. X
  1210. X    /* no backspacing, typing or stuffing in middle of string */
  1211. X    if (cbs->currInsert < len) {
  1212. X        cbs->doit = False;
  1213. X        return;
  1214. X    }
  1215. X
  1216. X    if (cbs->text->ptr == NULL) { /* backspace */
  1217. X        if (cbs->startPos == 3 || cbs->startPos == 7)
  1218. X            cbs->startPos--; /* delete the hyphen too */
  1219. X        return;
  1220. X    }
  1221. X
  1222. X    if (cbs->text->length > 1) { /* don't allow clipboard copies */
  1223. X        cbs->doit = False;
  1224. X        return;
  1225. X    }
  1226. X
  1227. X    /* don't allow non-digits or let the input exceed 12 chars */
  1228. X    if (!isdigit(c = cbs->text->ptr[0]) || len >= 12)
  1229. X        cbs->doit = False;
  1230. X    else if (len == 2 || len == 6) {
  1231. X        cbs->text->ptr = XtRealloc(cbs->text->ptr, 2);
  1232. X        cbs->text->length = 2;
  1233. X        cbs->text->ptr[0] = c;
  1234. X        cbs->text->ptr[1] = '-';
  1235. X    }
  1236. X}
  1237. END_OF_FILE
  1238. if test 3274 -ne `wc -c <'vol6/ch15/phone.c'`; then
  1239.     echo shar: \"'vol6/ch15/phone.c'\" unpacked with wrong size!
  1240. fi
  1241. # end of 'vol6/ch15/phone.c'
  1242. fi
  1243. if test -f 'vol6/ch15/select_text.c' -a "${1}" != "-c" ; then 
  1244.   echo shar: Will not clobber existing file \"'vol6/ch15/select_text.c'\"
  1245. else
  1246. echo shar: Extracting \"'vol6/ch15/select_text.c'\" \(3518 characters\)
  1247. sed "s/^X//" >'vol6/ch15/select_text.c' <<'END_OF_FILE'
  1248. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1249. X * This program is freely distributable without licensing fees and
  1250. X * is provided without guarantee or warrantee expressed or implied.
  1251. X * This program is -not- in the public domain.
  1252. X */
  1253. X
  1254. X/* select_text.c -- demonstrate how to position a cursor at a
  1255. X * particular location.  The position is determined by a search_pat-
  1256. X * match search.
  1257. X */
  1258. X#include <Xm/Text.h>
  1259. X#include <Xm/LabelG.h>
  1260. X#include <Xm/RowColumn.h>
  1261. X#include <X11/Xos.h>   /* for the index() function */
  1262. X
  1263. XWidget text_w, search_w, text_output;
  1264. X
  1265. Xmain(argc, argv)
  1266. Xint argc;
  1267. Xchar *argv[];
  1268. X{
  1269. X    Widget        toplevel, rowcol_v, rowcol_h;
  1270. X    XtAppContext  app;
  1271. X    int           i;
  1272. X    void          search_text();
  1273. X    Arg           args[5];
  1274. X
  1275. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1276. X        NULL, 0, &argc, argv, NULL, NULL);
  1277. X
  1278. X    rowcol_v = XtVaCreateWidget("rowcol_v",
  1279. X        xmRowColumnWidgetClass, toplevel, NULL);
  1280. X
  1281. X    rowcol_h = XtVaCreateWidget("rowcol_h",
  1282. X        xmRowColumnWidgetClass, rowcol_v,
  1283. X        XmNorientation,  XmHORIZONTAL,
  1284. X        NULL);
  1285. X    XtVaCreateManagedWidget("Search Pattern:",
  1286. X        xmLabelGadgetClass, rowcol_h, NULL);
  1287. X    search_w = XtVaCreateManagedWidget("search_text",
  1288. X        xmTextWidgetClass, rowcol_h, NULL);
  1289. X    XtManageChild(rowcol_h);
  1290. X
  1291. X    text_output = XtVaCreateManagedWidget("text_out",
  1292. X        xmTextWidgetClass, rowcol_v,
  1293. X        XmNeditable,              False,
  1294. X        XmNcursorPositionVisible, False,
  1295. X        XmNshadowThickness,       0,
  1296. X        XmNsensitive,             False,
  1297. X        NULL);
  1298. X
  1299. X    XtSetArg(args[0], XmNrows,      10);
  1300. X    XtSetArg(args[1], XmNcolumns,   80);
  1301. X    XtSetArg(args[2], XmNeditMode,  XmMULTI_LINE_EDIT);
  1302. X    XtSetArg(args[3], XmNscrollHorizontal,  False);
  1303. X    XtSetArg(args[4], XmNwordWrap,  True);
  1304. X    text_w = XmCreateScrolledText(rowcol_v, "text_w", args, 5);
  1305. X    XtManageChild(text_w);
  1306. X
  1307. X    XtAddCallback(search_w, XmNactivateCallback, search_text, NULL);
  1308. X
  1309. X    XtManageChild(rowcol_v);
  1310. X
  1311. X    XtRealizeWidget(toplevel);
  1312. X    XtAppMainLoop(app);
  1313. X}
  1314. X
  1315. Xvoid
  1316. Xsearch_text()
  1317. X{
  1318. X    char *search_pat, *p, *string, buf[32];
  1319. X    XmTextPosition pos;
  1320. X    int len;
  1321. X    Boolean found = False;
  1322. X
  1323. X    string = XmTextGetString(text_w);
  1324. X    if (!*string) {
  1325. X        XmTextSetString(text_output, "No text to search.");
  1326. X        XtFree(string);
  1327. X        return;
  1328. X    }
  1329. X
  1330. X    search_pat = XmTextGetString(search_w);
  1331. X    if (!*search_pat) {
  1332. X        XmTextSetString(text_output, "Specify a search pattern.");
  1333. X        XtFree(string);
  1334. X        XtFree(search_pat);
  1335. X        return;
  1336. X    }
  1337. X    len = strlen(search_pat);
  1338. X    /* start searching at current cursor position + 1 */
  1339. X    pos = XmTextGetCursorPosition(text_w);
  1340. X    for (p = &string[pos+1]; p = index(p, *search_pat); p++)
  1341. X        if (!strncmp(p, search_pat, len)) {
  1342. X            found = True;
  1343. X            break;
  1344. X        }
  1345. X    if (!found) { /* didn't find pattern? */
  1346. X        /* search from beginning till we've passed "pos" */
  1347. X        for (p = string; p = index(p, *search_pat); p++)
  1348. X            if (p - string > pos || !strncmp(p, search_pat, len)) {
  1349. X                found = True;
  1350. X                break;
  1351. X            }
  1352. X    }
  1353. X    if (!found)
  1354. X        XmTextSetString(text_output, "Pattern not found.");
  1355. X    else {
  1356. X        pos = (XmTextPosition)(p - string);
  1357. X        sprintf(buf, "Pattern found at position %ld.", pos);
  1358. X        XmTextSetString(text_output, buf);
  1359. X        XmTextSetInsertionPosition(text_w, pos);
  1360. X    XmTextSetHighlight(text_w, pos, pos + len, XmHIGHLIGHT_SELECTED);
  1361. X    }
  1362. X}
  1363. END_OF_FILE
  1364. if test 3518 -ne `wc -c <'vol6/ch15/select_text.c'`; then
  1365.     echo shar: \"'vol6/ch15/select_text.c'\" unpacked with wrong size!
  1366. fi
  1367. # end of 'vol6/ch15/select_text.c'
  1368. fi
  1369. if test -f 'vol6/ch18/copy_retrieve.c' -a "${1}" != "-c" ; then 
  1370.   echo shar: Will not clobber existing file \"'vol6/ch18/copy_retrieve.c'\"
  1371. else
  1372. echo shar: Extracting \"'vol6/ch18/copy_retrieve.c'\" \(3416 characters\)
  1373. sed "s/^X//" >'vol6/ch18/copy_retrieve.c' <<'END_OF_FILE'
  1374. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1375. X * This program is freely distributable without licensing fees and
  1376. X * is provided without guarantee or warrantee expressed or implied.
  1377. X * This program is -not- in the public domain.
  1378. X */
  1379. X
  1380. X/* copy_retrieve.c -- simple copy and retrieve program.  Two
  1381. X * pushbuttons: the first places text in the clipboard, the other
  1382. X * receives text from the clipboard.  This just demonstrates the
  1383. X * API involved.
  1384. X */
  1385. X#include <Xm/CutPaste.h>
  1386. X#include <Xm/RowColumn.h>
  1387. X#include <Xm/PushBG.h>
  1388. X
  1389. Xstatic void to_clipbd(), from_clipbd();
  1390. X
  1391. Xmain(argc, argv)
  1392. Xint argc;
  1393. Xchar *argv[];
  1394. X{
  1395. X    Widget toplevel, rowcol, button;
  1396. X    XtAppContext app;
  1397. X
  1398. X    /* Initialize toolkit, application context and toplevel shell */
  1399. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  1400. X        &argc, argv, NULL, NULL);
  1401. X
  1402. X    /* manage two buttons in a RowColumn widget */
  1403. X    rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, toplevel, NULL);
  1404. X
  1405. X    /* button1 copies to the clipboard */
  1406. X    button = XtVaCreateManagedWidget("button1",
  1407. X        xmPushButtonGadgetClass, rowcol,
  1408. X        XtVaTypedArg, XmNlabelString, XmRString,
  1409. X            "Copy To Clipboard", 18, /* strlen() + 1 */
  1410. X        NULL);
  1411. X    XtAddCallback(button, XmNactivateCallback, to_clipbd, "text");
  1412. X
  1413. X    /* button2 retrieves text stored in the clipboard */
  1414. X    button = XtVaCreateManagedWidget("button2",
  1415. X        xmPushButtonGadgetClass, rowcol,
  1416. X        XtVaTypedArg, XmNlabelString, XmRString,
  1417. X            "Retrieve From Clipboard", 24, /* strlen() + 1 */
  1418. X        NULL);
  1419. X    XtAddCallback(button, XmNactivateCallback, from_clipbd, NULL);
  1420. X
  1421. X    /* manage RowColumn, realize toplevel shell and start main loop */
  1422. X    XtManageChild(rowcol);
  1423. X    XtRealizeWidget(toplevel);
  1424. X    XtAppMainLoop(app);
  1425. X}
  1426. X
  1427. X/* copy data to clipboard. */
  1428. Xstatic void
  1429. Xto_clipbd(widget, data)
  1430. XWidget widget;
  1431. Xchar *data;
  1432. X{
  1433. X    unsigned long item_id = 0;  /* clipboard item id */
  1434. X    int           status;
  1435. X    XmString      clip_label;
  1436. X    char          buf[32];
  1437. X    static int    cnt;
  1438. X    Display      *dpy = XtDisplayOfObject(widget);
  1439. X    Window        window = XtWindowOfObject(widget);
  1440. X
  1441. X    sprintf(buf, "%s-%d", data, ++cnt); /* make each copy unique */
  1442. X
  1443. X    clip_label = XmStringCreateSimple("to_clipbd");
  1444. X
  1445. X    /* start a copy.  retry till unlocked */
  1446. X    do
  1447. X        status = XmClipboardStartCopy(dpy, window,
  1448. X            clip_label, CurrentTime, NULL, NULL, &item_id);
  1449. X    while (status == ClipboardLocked);
  1450. X
  1451. X    XmStringFree(clip_label);
  1452. X
  1453. X    /* copy the data (buf) -- pass "cnt" as private id for kicks */
  1454. X    do
  1455. X        status = XmClipboardCopy(dpy, window, item_id, "STRING",
  1456. X            buf, (long)strlen(buf)+1, cnt, NULL);
  1457. X    while (status == ClipboardLocked);
  1458. X
  1459. X    /* end the copy */
  1460. X    do
  1461. X        status = XmClipboardEndCopy(dpy, window, item_id);
  1462. X    while (status == ClipboardLocked);
  1463. X
  1464. X    printf("copied \"%s\" to clipboard.\n", buf);
  1465. X}
  1466. X
  1467. Xstatic void
  1468. Xfrom_clipbd(widget)
  1469. XWidget widget;
  1470. X{
  1471. X    int         status, private_id;
  1472. X    char        buf[32];
  1473. X    Display    *dpy = XtDisplayOfObject(widget);
  1474. X    Window      window = XtWindowOfObject(widget);
  1475. X
  1476. X    do
  1477. X        status = XmClipboardRetrieve(dpy, window,
  1478. X            "STRING", buf, sizeof buf, NULL, &private_id);
  1479. X    while (status == ClipboardLocked);
  1480. X
  1481. X    if (status == ClipboardSuccess)
  1482. X        printf("retrieved \"%s\" (private id = %d).\n",
  1483. X            buf, private_id);
  1484. X}
  1485. END_OF_FILE
  1486. if test 3416 -ne `wc -c <'vol6/ch18/copy_retrieve.c'`; then
  1487.     echo shar: \"'vol6/ch18/copy_retrieve.c'\" unpacked with wrong size!
  1488. fi
  1489. # end of 'vol6/ch18/copy_retrieve.c'
  1490. fi
  1491. if test -f 'vol6/ch18/undo.c' -a "${1}" != "-c" ; then 
  1492.   echo shar: Will not clobber existing file \"'vol6/ch18/undo.c'\"
  1493. else
  1494. echo shar: Extracting \"'vol6/ch18/undo.c'\" \(3596 characters\)
  1495. sed "s/^X//" >'vol6/ch18/undo.c' <<'END_OF_FILE'
  1496. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1497. X * This program is freely distributable without licensing fees and
  1498. X * is provided without guarantee or warrantee expressed or implied.
  1499. X * This program is -not- in the public domain.
  1500. X */
  1501. X
  1502. X/* undo.c -- demonstrate undoing a clipboard copy */
  1503. X
  1504. X#include <Xm/Xm.h>
  1505. X#include <Xm/CutPaste.h>
  1506. X#include <Xm/RowColumn.h>
  1507. X#include <Xm/PushBG.h>
  1508. X
  1509. Xvoid
  1510. Xcut_to_clipboard(widget, data)
  1511. XWidget widget;
  1512. Xchar *data;
  1513. X{
  1514. X    unsigned long item_id = 0;    /* clipboard item id */
  1515. X    int data_id = 0;    /* clipboard data id */
  1516. X    int status = 0;    /* clipboard status  */
  1517. X    XmString clip_label;
  1518. X    char buf[32];
  1519. X    static int cnt;
  1520. X    Display *dpy = XtDisplayOfObject(widget);
  1521. X    Window window = XtWindowOfObject(widget);
  1522. X
  1523. X    sprintf(buf, "%s %d", data, ++cnt);
  1524. X    printf("Putting \"%s\" on clipboard\n", buf);
  1525. X
  1526. X    clip_label = XmStringCreateSimple("cut_to_clipboard");
  1527. X    /*
  1528. X     * start copy to clipboard, and continue till a sucessful start copy
  1529. X     * is made
  1530. X     */
  1531. X    status = 0;
  1532. X    while (status != ClipboardSuccess)
  1533. X    status = XmClipboardStartCopy(dpy, window,
  1534. X        clip_label, CurrentTime, NULL, NULL, &item_id);
  1535. X
  1536. X    /*
  1537. X     * move the data to the clipboard, and continue till a sucessful copy
  1538. X     * is made
  1539. X     */
  1540. X    status = 0;
  1541. X    while (status != ClipboardSuccess)
  1542. X    status = XmClipboardCopy(dpy, window,
  1543. X        item_id, "STRING", buf, (long) strlen(buf) + 1, 0, &data_id);
  1544. X
  1545. X    /*
  1546. X     * end the copy to the clipboard and continue till a sucessful end
  1547. X     * copy is made
  1548. X     */
  1549. X    status = 0;
  1550. X    while (status != ClipboardSuccess)
  1551. X    status = XmClipboardEndCopy(dpy, window,
  1552. X        item_id);
  1553. X}
  1554. X
  1555. Xvoid
  1556. Xundo(widget)
  1557. XWidget widget;
  1558. X{
  1559. X    XmClipboardUndoCopy(XtDisplayOfObject(widget), XtWindowOfObject(widget));
  1560. X}
  1561. X
  1562. Xvoid
  1563. Xretrieve_from_clipboard(widget)
  1564. XWidget widget;
  1565. X{
  1566. X    int status = ClipboardLocked;
  1567. X    char buf[32];
  1568. X    Display *dpy = XtDisplayOfObject(widget);
  1569. X    Window window = XtWindowOfObject(widget);
  1570. X
  1571. X    XmClipboardStartRetrieve(dpy, window, CurrentTime);
  1572. X    while (status == ClipboardLocked) {
  1573. X    status = XmClipboardRetrieve(dpy, window,
  1574. X        "STRING", buf, sizeof buf, NULL, NULL);
  1575. X    printf("status = %s\n",
  1576. X        (status == ClipboardSuccess)? "success" :
  1577. X        (status == ClipboardLocked)? "locked" :
  1578. X        (status == ClipboardNoData)? "no data" :
  1579. X        (status == ClipboardTruncate)? "data truncated" :
  1580. X        (status == ClipboardFail)? "Failed" : "Bad Format");
  1581. X    if (status == ClipboardSuccess)
  1582. X        puts(buf);
  1583. X    }
  1584. X    XmClipboardEndRetrieve(dpy, window);
  1585. X}
  1586. X
  1587. Xmain(argc, argv)
  1588. Xchar *argv[];
  1589. X{
  1590. X    Widget toplevel, rowcol, button;
  1591. X    XtAppContext app;
  1592. X
  1593. X    toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
  1594. X    &argc, argv, NULL, NULL);
  1595. X
  1596. X    rowcol = XtVaCreateManagedWidget("rowcol",
  1597. X    xmRowColumnWidgetClass, toplevel,
  1598. X    NULL);
  1599. X    button = XtVaCreateManagedWidget("button1",
  1600. X    xmPushButtonGadgetClass, rowcol,
  1601. X    XtVaTypedArg, XmNlabelString, XmRString,
  1602. X        "Cut To Clipboard", sizeof (char *),
  1603. X    NULL);
  1604. X    XtAddCallback(button, XmNactivateCallback, cut_to_clipboard, "data");
  1605. X
  1606. X    button = XtVaCreateManagedWidget("button2",
  1607. X    xmPushButtonGadgetClass, rowcol,
  1608. X    XtVaTypedArg, XmNlabelString, XmRString,
  1609. X       "Undo Cut", sizeof (char *),
  1610. X    NULL);
  1611. X    XtAddCallback(button, XmNactivateCallback, undo, NULL);
  1612. X
  1613. X    button = XtVaCreateManagedWidget("retrieve",
  1614. X    xmPushButtonGadgetClass, rowcol,
  1615. X    XtVaTypedArg, XmNlabelString, XmRString,
  1616. X        "Retrieve From Clipboard", sizeof (char *),
  1617. X    NULL);
  1618. X    XtAddCallback(button, XmNactivateCallback, retrieve_from_clipboard, NULL);
  1619. X
  1620. X    XtRealizeWidget(toplevel);
  1621. X    XtAppMainLoop(app);
  1622. X}
  1623. END_OF_FILE
  1624. if test 3596 -ne `wc -c <'vol6/ch18/undo.c'`; then
  1625.     echo shar: \"'vol6/ch18/undo.c'\" unpacked with wrong size!
  1626. fi
  1627. # end of 'vol6/ch18/undo.c'
  1628. fi
  1629. if test -f 'vol6/ch20/working.c' -a "${1}" != "-c" ; then 
  1630.   echo shar: Will not clobber existing file \"'vol6/ch20/working.c'\"
  1631. else
  1632. echo shar: Extracting \"'vol6/ch20/working.c'\" \(3574 characters\)
  1633. sed "s/^X//" >'vol6/ch20/working.c' <<'END_OF_FILE'
  1634. X/* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1635. X * This program is freely distributable without licensing fees and
  1636. X * is provided without guarantee or warrantee expressed or implied.
  1637. X * This program is -not- in the public domain.
  1638. X */
  1639. X
  1640. X/* working.c -- represent a complicated, time-consuming task by
  1641. X * counting from 0 to 20000 and provide feedback to the user about
  1642. X * how far we are in the process.  The user may terminate the process
  1643. X * at any time by selecting the Stop button in the WorkingDialog.
  1644. X * This demonstrates how WorkingDialogs can be used to allow the
  1645. X * user to interrupt lengthy procedures.
  1646. X */
  1647. X#include <Xm/MessageB.h>
  1648. X#include <Xm/PushB.h>
  1649. X
  1650. X#define MAXNUM 20000
  1651. X
  1652. X/* main() --create a pushbutton whose callback pops up a dialog box */
  1653. Xmain(argc, argv)
  1654. Xchar *argv[];
  1655. X{
  1656. X    XtAppContext  app;
  1657. X    XtWorkProcId  work_id;
  1658. X    Widget        toplevel, dialog;
  1659. X    XmString      stop_txt;
  1660. X    extern void   done();
  1661. X    Arg           args[1];
  1662. X    int           count();
  1663. X
  1664. X    toplevel = XtVaAppInitialize(&app, "Demos",
  1665. X        NULL, 0, &argc, argv, NULL, NULL);
  1666. X
  1667. X    /* Create the dialog -- the "cancel" button says "Stop" */
  1668. X    stop_txt = XmStringCreateSimple("Stop");
  1669. X    XtSetArg(args[0], XmNcancelLabelString, stop_txt);
  1670. X    dialog = XmCreateWorkingDialog(toplevel, "working", args, 1);
  1671. X    XmStringFree(stop_txt);
  1672. X
  1673. X    work_id = XtAppAddWorkProc(app, count, dialog);
  1674. X    XtVaSetValues(dialog, XmNuserData, work_id, NULL);
  1675. X
  1676. X    XtUnmanageChild(  /* no need for the ok button */
  1677. X        XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON), False);
  1678. X    XtUnmanageChild(  /* no need for the help button */
  1679. X        XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON), False);
  1680. X
  1681. X    /* Use cancel button to stop counting. True = remove work proc */
  1682. X    XtAddCallback(dialog, XmNcancelCallback, done, True);
  1683. X
  1684. X    XtManageChild(dialog);
  1685. X    XtPopup(XtParent(dialog), XtGrabNone);
  1686. X
  1687. X    /* XtRealizeWidget(toplevel); */
  1688. X    XtAppMainLoop(app);
  1689. X}
  1690. X
  1691. X/* work procedure -- counts to MAXNUM.  When we hit it, change the
  1692. X * "Stop" button to say "Done".
  1693. X */
  1694. Xint
  1695. Xcount(dialog)
  1696. XWidget dialog; /* client data for XtAppAddWorkProc() */
  1697. X{
  1698. X    static int n;
  1699. X    char buf[64];
  1700. X    XmString str, button;
  1701. X    Arg args[2];
  1702. X
  1703. X    /* if we printed every number, the flicker is too fast to read.
  1704. X     * Therefore, just print every 1000 ticks for smoother feedback.
  1705. X     */
  1706. X    if (++n % 1000 != 0)
  1707. X        return False;
  1708. X
  1709. X    /* display where we are in the counter. */
  1710. X    sprintf(buf, "Counter: %d", n);
  1711. X    str = XmStringCreateSimple(buf);
  1712. X    XtSetArg(args[0], XmNmessageString, str);
  1713. X
  1714. X    if (n == MAXNUM) {
  1715. X        button = XmStringCreateSimple("Done");
  1716. X        XtSetArg(args[1], XmNcancelLabelString, button);
  1717. X        XtRemoveCallback(dialog, XmNcancelCallback, done, True);
  1718. X        XtAddCallback(dialog, XmNcancelCallback, done, False);
  1719. X
  1720. X        XtManageChild(dialog);
  1721. X        /* or, use:
  1722. X        if (!XtIsManaged(dialog))
  1723. X            done(dialog, False);
  1724. X        */
  1725. X    }
  1726. X
  1727. X    XtSetValues(dialog, args, 1 + (n == MAXNUM));
  1728. X
  1729. X    /* return either True (we're done, remove the work proc)
  1730. X     * or False (continue working by calling this function).
  1731. X     */
  1732. X    return n == MAXNUM;
  1733. X}
  1734. X
  1735. X/* User pressed "Stop" or "Done" in WorkingDialog. */
  1736. Xvoid
  1737. Xdone(dialog, remove_work_proc)
  1738. XWidget dialog;
  1739. Xint remove_work_proc;
  1740. X{
  1741. X    if (remove_work_proc) {
  1742. X        XtWorkProcId work_id;
  1743. X        XtVaGetValues(dialog, XmNuserData, &work_id, NULL);
  1744. X        XtRemoveWorkProc(work_id);
  1745. X    }
  1746. X    XtDestroyWidget(dialog);
  1747. X    exit(0); /* for purposes of this demo; remove for general use */
  1748. X}
  1749. END_OF_FILE
  1750. if test 3574 -ne `wc -c <'vol6/ch20/working.c'`; then
  1751.     echo shar: \"'vol6/ch20/working.c'\" unpacked with wrong size!
  1752. fi
  1753. # end of 'vol6/ch20/working.c'
  1754. fi
  1755. echo shar: End of archive 7 \(of 11\).
  1756. cp /dev/null ark7isdone
  1757. MISSING=""
  1758. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  1759.     if test ! -f ark${I}isdone ; then
  1760.     MISSING="${MISSING} ${I}"
  1761.     fi
  1762. done
  1763. if test "${MISSING}" = "" ; then
  1764.     echo You have unpacked all 11 archives.
  1765.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1766. else
  1767.     echo You still need to unpack the following archives:
  1768.     echo "        " ${MISSING}
  1769. fi
  1770. ##  End of shell archive.
  1771. exit 0
  1772. --
  1773. Dan Heller
  1774. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  1775. Senior Writer                President          comp-sources-x@uunet.uu.net
  1776. argv@ora.com                 argv@zipcode.com
  1777.