home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume21 / notes / part02 < prev    next >
Encoding:
Text File  |  1993-10-20  |  25.2 KB  |  1,010 lines

  1. Newsgroups: comp.sources.x
  2. From: bob@snuffy.penfield.ny.us (Bob Smith)
  3. Subject: v21i015:  notes - an X11R5 note pad based on the Athena Widget set, Part02/02
  4. Message-ID: <1993Oct20.200512.22880@sparky.sterling.com>
  5. X-Md4-Signature: cd33f4eff02b812805a3dab0d48c81ce
  6. Sender: chris@sparky.sterling.com (Chris Olson)
  7. Organization: Fuzzball Widget Factory
  8. Date: Wed, 20 Oct 1993 20:05:12 GMT
  9. Approved: chris@sterling.com
  10.  
  11. Submitted-by: bob@snuffy.penfield.ny.us (Bob Smith)
  12. Posting-number: Volume 21, Issue 15
  13. Archive-name: notes/part02
  14. Environment: X11R5
  15.  
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 2 (of 2)."
  24. # Contents:  callbacks.c
  25. # Wrapped by bob@snuffy on Sun Sep 19 21:37:44 1993
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'callbacks.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'callbacks.c'\"
  29. else
  30. echo shar: Extracting \"'callbacks.c'\" \(22566 characters\)
  31. sed "s/^X//" >'callbacks.c' <<'END_OF_FILE'
  32. X/*
  33. X * callbacks.c
  34. X *
  35. X * notes - by Bob Smith <bob@snuffy.dracut.ma.us>
  36. X */
  37. X
  38. X#include <stdio.h>
  39. X#include <malloc.h>
  40. X
  41. X#include <X11/IntrinsicP.h>
  42. X#include <X11/Intrinsic.h>
  43. X#include <X11/StringDefs.h>
  44. X#include <X11/Shell.h>
  45. X
  46. X#include <X11/Xaw/Box.h>
  47. X#include <X11/Xaw/Cardinals.h>
  48. X#include <X11/Xaw/Command.h>
  49. X#include <X11/Xaw/Label.h>
  50. X#include <X11/Xaw/Form.h>
  51. X#include <X11/Xaw/List.h>
  52. X#include <X11/Xaw/AsciiText.h>
  53. X
  54. X#include "notes.h"
  55. X
  56. X
  57. X/*
  58. X * external variables
  59. X */
  60. X/* in main.c */
  61. Xextern XtAppContext app_con;
  62. Xextern Widget toplevel;
  63. Xextern Widget **Notes;
  64. Xextern char **Titles;
  65. X
  66. X
  67. X/*
  68. X * external functions
  69. X */
  70. Xvoid sensitize_start_button();
  71. X
  72. X
  73. X/*
  74. X * forward declarations
  75. X */
  76. Xvoid show_list(), destroy_list();
  77. X
  78. X
  79. X/*
  80. X * null ()
  81. X * just a stub to redirect some actions to when you don't really
  82. X * want anything to happen -- used by the input dialogs to keep
  83. X * carriage return, newline, and tab from doing anything
  84. X */
  85. Xvoid
  86. Xnull(widget, client_data, call_data)
  87. X     Widget widget;
  88. X     XtPointer client_data, call_data;
  89. X{
  90. X}
  91. X
  92. X
  93. X/*
  94. X * quit ()
  95. X * self explanatory
  96. X */
  97. Xvoid
  98. Xquit(widget, client_data, call_data)
  99. X    Widget widget;
  100. X    XtPointer client_data, call_data;
  101. X{
  102. X    XtDestroyApplicationContext(app_con);
  103. X    exit(0);
  104. X}
  105. X
  106. X
  107. X/*
  108. X * desensitize_all ()
  109. X */
  110. Xstatic void
  111. Xdesensitize_all(widget, client_data, call_data)
  112. X    Widget widget;
  113. X    XtPointer client_data, call_data;
  114. X{
  115. X    Widget w, button;
  116. X    int i;
  117. X    XWindowAttributes atribs;
  118. X
  119. X    w = XtNameToWidget(toplevel, "*Notes");
  120. X    if (w) {
  121. X        button = XtNameToWidget(w, "*new_button");
  122. X        XtVaSetValues(button, XtNsensitive, False, NULL);
  123. X        button = XtNameToWidget(w, "*dismiss_button");
  124. X        XtVaSetValues(button, XtNsensitive, False, NULL);
  125. X        button = XtNameToWidget(w, "*save_button");
  126. X        XtVaSetValues(button, XtNsensitive, False, NULL);
  127. X        button = XtNameToWidget(w, "*quit_button");
  128. X        XtVaSetValues(button, XtNsensitive, False, NULL);
  129. X        button = XtNameToWidget(w, "*list");
  130. X        XtVaSetValues(button, XtNsensitive, False, NULL);
  131. X    }
  132. X
  133. X    i = 0;
  134. X    while (Notes[i]) {
  135. X        XGetWindowAttributes(XtDisplay(*Notes[i]),
  136. X            XtWindow(*Notes[i]), &atribs);
  137. X        if (atribs.map_state != IsUnmapped) {
  138. X            button = XtNameToWidget(*Notes[i], "*dismiss_button");
  139. X            XtVaSetValues(button, XtNsensitive, False, NULL);
  140. X            button = XtNameToWidget(*Notes[i], "*title_button");
  141. X            XtVaSetValues(button, XtNsensitive, False, NULL);
  142. X            button = XtNameToWidget(*Notes[i], "*clear_button");
  143. X            XtVaSetValues(button, XtNsensitive, False, NULL);
  144. X            button = XtNameToWidget(*Notes[i], "*delete_button");
  145. X            XtVaSetValues(button, XtNsensitive, False, NULL);
  146. X            button = XtNameToWidget(*Notes[i], "*select_button");
  147. X            XtVaSetValues(button, XtNsensitive, False, NULL);
  148. X        }
  149. X        i++;
  150. X    }
  151. X}
  152. X
  153. X
  154. X/*
  155. X * sensitize_all ()
  156. X */
  157. Xstatic void
  158. Xsensitize_all(widget, client_data, call_data)
  159. X    Widget widget;
  160. X    XtPointer client_data, call_data;
  161. X{
  162. X    Widget w, button;
  163. X    int i;
  164. X    XWindowAttributes atribs;
  165. X
  166. X    w = XtNameToWidget(toplevel, "*Notes");
  167. X    if (w) {
  168. X        button = XtNameToWidget(w, "*new_button");
  169. X        XtVaSetValues(button, XtNsensitive, True, NULL);
  170. X        button = XtNameToWidget(w, "*dismiss_button");
  171. X        XtVaSetValues(button, XtNsensitive, True, NULL);
  172. X        button = XtNameToWidget(w, "*save_button");
  173. X        XtVaSetValues(button, XtNsensitive, True, NULL);
  174. X        button = XtNameToWidget(w, "*quit_button");
  175. X        XtVaSetValues(button, XtNsensitive, True, NULL);
  176. X        button = XtNameToWidget(w, "*list");
  177. X        XtVaSetValues(button, XtNsensitive, True, NULL);
  178. X    }
  179. X
  180. X    i = 0;
  181. X    while (Notes[i]) {
  182. X        XGetWindowAttributes(XtDisplay(*Notes[i]),
  183. X            XtWindow(*Notes[i]), &atribs);
  184. X        if (atribs.map_state != IsUnmapped) {
  185. X            button = XtNameToWidget(*Notes[i], "*dismiss_button");
  186. X            XtVaSetValues(button, XtNsensitive, True, NULL);
  187. X            button = XtNameToWidget(*Notes[i], "*title_button");
  188. X            XtVaSetValues(button, XtNsensitive, True, NULL);
  189. X            button = XtNameToWidget(*Notes[i], "*clear_button");
  190. X            XtVaSetValues(button, XtNsensitive, True, NULL);
  191. X            button = XtNameToWidget(*Notes[i], "*delete_button");
  192. X            XtVaSetValues(button, XtNsensitive, True, NULL);
  193. X            button = XtNameToWidget(*Notes[i], "*select_button");
  194. X            XtVaSetValues(button, XtNsensitive, True, NULL);
  195. X        }
  196. X        i++;
  197. X    }
  198. X}
  199. X
  200. X
  201. X/*
  202. X * destroy_widget ()
  203. X * used by a number of the popups to get rid of themselves --
  204. X * the assumption is that the button being pressed is 2 levels
  205. X * deep into the popup we want to destroy - hence the
  206. X * usage of XtGrandParent
  207. X */
  208. Xvoid
  209. Xdestroy_widget(widget, client_data, call_data)
  210. X    Widget widget;
  211. X    XtPointer client_data, call_data;
  212. X{
  213. X    XtPopdown(XtGrandParent(widget));
  214. X    XtDestroyWidget(XtGrandParent(widget));
  215. X}
  216. X
  217. X
  218. X/*
  219. X * save_callback ()
  220. X * just a callback to get to write_notefile
  221. X */
  222. Xstatic void
  223. Xsave_callback(widget, client_data, call_data)
  224. X    Widget widget;
  225. X    XtPointer client_data, call_data;
  226. X{
  227. X    write_notefile();
  228. X}
  229. X
  230. X
  231. X/*
  232. X * confirm_clear_note ()
  233. X * clear the note widget if confirm is pressed in the dialog box
  234. X */
  235. Xstatic void
  236. Xconfirm_clear_note(widget, client_data, call_data)
  237. X    Widget widget;
  238. X    XtPointer client_data, call_data;
  239. X{
  240. X    XtVaSetValues((Widget) client_data, XtNstring, NULL, NULL);
  241. X}
  242. X
  243. X
  244. X/*
  245. X * clear_note ()
  246. X * put up a dialog asking if you really want to clear the
  247. X * associated note
  248. X */
  249. Xstatic void
  250. Xclear_note(widget, client_data, call_data)
  251. X    Widget widget;
  252. X    XtPointer client_data, call_data;
  253. X{
  254. X    Widget note = (Widget) client_data;
  255. X    Widget popup, form, prompt;
  256. X    Widget confirm_button, filler_box, cancel_button;
  257. X    Dimension note_w, popup_w;
  258. X    Position x, y;
  259. X
  260. X    popup = XtCreatePopupShell("Clear Note",
  261. X        transientShellWidgetClass, toplevel,
  262. X        NULL, ZERO);
  263. X
  264. X    form = XtCreateManagedWidget("form",
  265. X        formWidgetClass, popup,
  266. X        NULL, ZERO);
  267. X
  268. X    prompt = XtVaCreateManagedWidget("prompt",
  269. X        labelWidgetClass, form,
  270. X        XtNlabel, "Clear this note?",
  271. X        XtNborderWidth, 0,
  272. X        XtNtop, XawChainTop,
  273. X        XtNbottom, XawChainTop,
  274. X        XtNleft, XawChainLeft,
  275. X        XtNright, XawChainLeft,
  276. X        NULL);
  277. X
  278. X    confirm_button = XtVaCreateManagedWidget("confirm_button",
  279. X        commandWidgetClass, form,
  280. X        XtNlabel, "Confirm",
  281. X        XtNwidth, 64,
  282. X        XtNfromVert, prompt,
  283. X        XtNtop, XawChainBottom,
  284. X        XtNbottom, XawChainBottom,
  285. X        XtNleft, XawChainLeft,
  286. X        XtNright, XawChainLeft,
  287. X        NULL);
  288. X        AddCallback(confirm_button, confirm_clear_note, note);
  289. X        AddCallback(confirm_button, destroy_widget, NULL);
  290. X        AddCallback(confirm_button, sensitize_all, NULL);
  291. X
  292. X    filler_box = XtVaCreateManagedWidget("filler_box",
  293. X        boxWidgetClass, form,
  294. X        XtNwidth, 64,
  295. X        XtNborderWidth, 0,
  296. X        XtNfromHoriz, confirm_button,
  297. X        XtNfromVert, prompt,
  298. X        XtNtop, XawChainBottom,
  299. X        XtNbottom, XawChainBottom,
  300. X        XtNleft, XawChainLeft,
  301. X        XtNright, XawChainRight,
  302. X        NULL);
  303. X
  304. X    cancel_button = XtVaCreateManagedWidget("cancel_button",
  305. X        commandWidgetClass, form,
  306. X        XtNlabel, "Cancel",
  307. X        XtNwidth, 64,
  308. X        XtNfromHoriz, filler_box,
  309. X        XtNfromVert, prompt,
  310. X        XtNtop, XawChainBottom,
  311. X        XtNbottom, XawChainBottom,
  312. X        XtNleft, XawChainRight,
  313. X        XtNright, XawChainRight,
  314. X        NULL);
  315. X        AddCallback(cancel_button, destroy_widget, NULL);
  316. X        AddCallback(cancel_button, sensitize_all, NULL);
  317. X
  318. X    XtRealizeWidget(popup);
  319. X
  320. X    XtVaGetValues(XtGrandParent(note), XtNwidth, ¬e_w, NULL);
  321. X    XtVaGetValues(popup, XtNwidth, &popup_w, NULL);
  322. X    XtTranslateCoords(XtGrandParent(note), (note_w - popup_w)/2, 0, &x, &y);
  323. X    XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  324. X
  325. X    XtPopup(popup, XtGrabNone);
  326. X}
  327. X
  328. X
  329. X/*
  330. X * confirm_delete_note ()
  331. X * delete the associated note -- unalloc_note does the real work
  332. X */
  333. Xstatic void
  334. Xconfirm_delete_note(widget, client_data, call_data)
  335. X    Widget widget;
  336. X    XtPointer client_data, call_data;
  337. X{
  338. X    XtPopdown((Widget) client_data);
  339. X    XtDestroyWidget((Widget) client_data);
  340. X
  341. X    if (widget = XtNameToWidget(toplevel, "*Notes")) {
  342. X        XtPopdown(widget);
  343. X        XtDestroyWidget(widget);
  344. X    }
  345. X
  346. X    unalloc_note((Widget) client_data);
  347. X
  348. X    if (widget)
  349. X        show_list();
  350. X
  351. X}
  352. X
  353. X
  354. X/*
  355. X * delete_note ()
  356. X * put up a dialog asking if you really want to delete the
  357. X * associated note
  358. X */
  359. Xstatic void
  360. Xdelete_note(widget, client_data, call_data)
  361. X    Widget widget;
  362. X    XtPointer client_data, call_data;
  363. X{
  364. X    Widget note = (Widget) client_data;
  365. X    Widget popup, form, prompt;
  366. X    Widget confirm_button, filler_box, cancel_button;
  367. X    Dimension note_w, popup_w;
  368. X    Position x, y;
  369. X
  370. X    popup = XtCreatePopupShell("Destroy Note",
  371. X        transientShellWidgetClass, toplevel,
  372. X        NULL, ZERO);
  373. X
  374. X    form = XtCreateManagedWidget("form",
  375. X        formWidgetClass, popup,
  376. X        NULL, ZERO);
  377. X
  378. X    prompt = XtVaCreateManagedWidget("prompt",
  379. X        labelWidgetClass, form,
  380. X        XtNlabel, "Destroy this note?",
  381. X        XtNborderWidth, 0,
  382. X        XtNtop, XawChainTop,
  383. X        XtNbottom, XawChainTop,
  384. X        XtNleft, XawChainLeft,
  385. X        XtNright, XawChainLeft,
  386. X        NULL);
  387. X
  388. X    confirm_button = XtVaCreateManagedWidget("confirm_button",
  389. X        commandWidgetClass, form,
  390. X        XtNlabel, "Confirm",
  391. X        XtNwidth, 64,
  392. X        XtNfromVert, prompt,
  393. X        XtNtop, XawChainBottom,
  394. X        XtNbottom, XawChainBottom,
  395. X        XtNleft, XawChainLeft,
  396. X        XtNright, XawChainLeft,
  397. X        NULL);
  398. X        AddCallback(confirm_button, confirm_delete_note, note);
  399. X        AddCallback(confirm_button, destroy_widget, NULL);
  400. X        AddCallback(confirm_button, sensitize_all, NULL);
  401. X
  402. X    filler_box = XtVaCreateManagedWidget("filler_box",
  403. X        boxWidgetClass, form,
  404. X        XtNwidth, 64,
  405. X        XtNborderWidth, 0,
  406. X        XtNfromHoriz, confirm_button,
  407. X        XtNfromVert, prompt,
  408. X        XtNtop, XawChainBottom,
  409. X        XtNbottom, XawChainBottom,
  410. X        XtNleft, XawChainLeft,
  411. X        XtNright, XawChainRight,
  412. X        NULL);
  413. X
  414. X    cancel_button = XtVaCreateManagedWidget("cancel_button",
  415. X        commandWidgetClass, form,
  416. X        XtNlabel, "Cancel",
  417. X        XtNwidth, 64,
  418. X        XtNfromHoriz, filler_box,
  419. X        XtNfromVert, prompt,
  420. X        XtNtop, XawChainBottom,
  421. X        XtNbottom, XawChainBottom,
  422. X        XtNleft, XawChainRight,
  423. X        XtNright, XawChainRight,
  424. X        NULL);
  425. X        AddCallback(cancel_button, destroy_widget, NULL);
  426. X        AddCallback(cancel_button, sensitize_all, NULL);
  427. X
  428. X    XtRealizeWidget(popup);
  429. X
  430. X    XtVaGetValues(note, XtNwidth, ¬e_w, NULL);
  431. X    XtVaGetValues(popup, XtNwidth, &popup_w, NULL);
  432. X    XtTranslateCoords(note, (note_w - popup_w)/2, 0, &x, &y);
  433. X    XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  434. X
  435. X    XtPopup(popup, XtGrabNone);
  436. X}
  437. X
  438. X
  439. X/*
  440. X * confirm_new_title ()
  441. X * change the title of associated note
  442. X */
  443. Xstatic void
  444. Xconfirm_new_title(widget, client_data, call_data)
  445. X    Widget widget;
  446. X    XtPointer client_data, call_data;
  447. X{
  448. X    Widget w;
  449. X    String str;
  450. X    int i;
  451. X
  452. X    XtVaGetValues(XtNameToWidget(XtGrandParent(widget), "*input"),
  453. X        XtNstring, &str, NULL);
  454. X
  455. X    if (strlen(str)) {
  456. X        i = 0;
  457. X        while (Notes[i]) {
  458. X            if ((Widget) client_data == *Notes[i]) {
  459. X                Titles[i] = (char *) realloc(Titles[i], strlen(str)+1);
  460. X                if (!Titles[i])
  461. X                    die("Realloc in confirm_new_title failed.");
  462. X                strcpy(Titles[i], str);
  463. X                XtVaSetValues((Widget) client_data, XtNtitle, str, NULL);
  464. X                (void) sort_titles(0);
  465. X                w = XtNameToWidget(toplevel, "*Notes*list");
  466. X                if (w)
  467. X                    XawListChange(w, Titles, 0, 0, False);
  468. X                break;
  469. X            }
  470. X            i++;
  471. X        }
  472. X    }
  473. X}
  474. X
  475. X
  476. X/*
  477. X * new_title ()
  478. X * put up a prompt asking for a new title for the
  479. X * associated note
  480. X */
  481. Xstatic void
  482. Xnew_title(widget, client_data, call_data)
  483. X    Widget widget;
  484. X    XtPointer client_data, call_data;
  485. X{
  486. X    Widget popup, form, prompt, input;
  487. X    Widget confirm_button, filler_box, cancel_button;
  488. X    Dimension client_w, popup_w;
  489. X    Position x, y;
  490. X    String str;
  491. X
  492. X    popup = XtCreatePopupShell("Change Title",
  493. X        transientShellWidgetClass, toplevel,
  494. X        NULL, ZERO);
  495. X
  496. X    form = XtCreateManagedWidget("form",
  497. X        formWidgetClass, popup,
  498. X        NULL, ZERO);
  499. X
  500. X    prompt = XtVaCreateManagedWidget("prompt",
  501. X        labelWidgetClass, form,
  502. X        XtNlabel, "Enter new title",
  503. X        XtNborderWidth, 0,
  504. X        XtNtop, XawChainTop,
  505. X        XtNbottom, XawChainTop,
  506. X        XtNleft, XawChainLeft,
  507. X        XtNright, XawChainLeft,
  508. X        NULL);
  509. X
  510. X    XtVaGetValues((Widget) client_data, XtNtitle, &str, NULL);
  511. X
  512. X    input = XtVaCreateManagedWidget("input",
  513. X        asciiTextWidgetClass, form,
  514. X        XtNstring, str,
  515. X        XtNwidth, 202,
  516. X        XtNeditType, XawtextEdit,
  517. X        XtNjustify, XtJustifyLeft,
  518. X        XtNfromVert, prompt,
  519. X        XtNtop, XawChainTop,
  520. X        XtNbottom, XawChainTop,
  521. X        XtNleft, XawChainLeft,
  522. X        XtNright, XawChainRight,
  523. X        NULL);
  524. X
  525. X    confirm_button = XtVaCreateManagedWidget("confirm_button",
  526. X        commandWidgetClass, form,
  527. X        XtNlabel, "Confirm",
  528. X        XtNwidth, 64,
  529. X        XtNfromVert, input,
  530. X        XtNtop, XawChainBottom,
  531. X        XtNbottom, XawChainBottom,
  532. X        XtNleft, XawChainLeft,
  533. X        XtNright, XawChainLeft,
  534. X        NULL);
  535. X        AddCallback(confirm_button, confirm_new_title, client_data);
  536. X        AddCallback(confirm_button, destroy_widget, NULL);
  537. X        AddCallback(confirm_button, sensitize_all, NULL);
  538. X
  539. X    /* filler_box's only purpose is to provide spacing... */
  540. X    filler_box = XtVaCreateManagedWidget("filler_box",
  541. X        boxWidgetClass, form,
  542. X        XtNwidth, 64,
  543. X        XtNborderWidth, 0,
  544. X        XtNfromHoriz, confirm_button,
  545. X        XtNfromVert, input,
  546. X        XtNtop, XawChainBottom,
  547. X        XtNbottom, XawChainBottom,
  548. X        XtNleft, XawChainLeft,
  549. X        XtNright, XawChainRight,
  550. X        NULL);
  551. X
  552. X    cancel_button = XtVaCreateManagedWidget("cancel_button",
  553. X        commandWidgetClass, form,
  554. X        XtNlabel, "Cancel",
  555. X        XtNwidth, 64,
  556. X        XtNfromHoriz, filler_box,
  557. X        XtNfromVert, input,
  558. X        XtNtop, XawChainBottom,
  559. X        XtNbottom, XawChainBottom,
  560. X        XtNleft, XawChainRight,
  561. X        XtNright, XawChainRight,
  562. X        NULL);
  563. X        AddCallback(cancel_button, destroy_widget, NULL);
  564. X        AddCallback(cancel_button, sensitize_all, NULL);
  565. X
  566. X    XtRealizeWidget(popup);
  567. X
  568. X    XtVaGetValues((Widget) client_data, XtNwidth, &client_w, NULL);
  569. X    XtVaGetValues(popup, XtNwidth, &popup_w, NULL);
  570. X    XtTranslateCoords((Widget) client_data, (client_w - popup_w)/2, 0, &x, &y);
  571. X    XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  572. X
  573. X    XtPopup(popup, XtGrabNone);
  574. X}
  575. X
  576. X
  577. X/*
  578. X * confirm_new_note ()
  579. X * create a new note -- alloc_new_note does the bulk
  580. X * of the work
  581. X */
  582. Xstatic void
  583. Xconfirm_new_note(widget, client_data, call_data)
  584. X    Widget widget;
  585. X    XtPointer client_data, call_data;
  586. X{
  587. X    String str;
  588. X    int i;
  589. X
  590. X    XtVaGetValues((Widget) client_data, XtNstring, &str, NULL);
  591. X
  592. X    if (strlen(str)) {
  593. X        i = alloc_new_note(str);
  594. X        destroy_list();
  595. X        show_list();
  596. X        XtPopup(*Notes[i], XtGrabNone);
  597. X    }
  598. X}
  599. X
  600. X
  601. X/*
  602. X * new_note ()
  603. X * put up a dialog asking for the title of a new note
  604. X */
  605. Xstatic void
  606. Xnew_note(widget, client_data, call_data)
  607. X    Widget widget;
  608. X    XtPointer client_data, call_data;
  609. X{
  610. X    Widget popup, form, prompt, input;
  611. X    Widget confirm_button, filler_box, cancel_button;
  612. X    Dimension top_w, popup_w;
  613. X    Position x, y;
  614. X
  615. X    popup = XtCreatePopupShell("New Note",
  616. X        transientShellWidgetClass, toplevel,
  617. X        NULL, ZERO);
  618. X
  619. X    form = XtCreateManagedWidget("form",
  620. X        formWidgetClass, popup,
  621. X        NULL, ZERO);
  622. X
  623. X    prompt = XtVaCreateManagedWidget("prompt",
  624. X        labelWidgetClass, form,
  625. X        XtNlabel, "Enter title of new note",
  626. X        XtNborderWidth, 0,
  627. X        XtNtop, XawChainTop,
  628. X        XtNbottom, XawChainTop,
  629. X        XtNleft, XawChainLeft,
  630. X        XtNright, XawChainLeft,
  631. X        NULL);
  632. X
  633. X    input = XtVaCreateManagedWidget("input",
  634. X        asciiTextWidgetClass, form,
  635. X        XtNwidth, 202,
  636. X        XtNeditType, XawtextEdit,
  637. X        XtNjustify, XtJustifyLeft,
  638. X        XtNfromVert, prompt,
  639. X        XtNtop, XawChainTop,
  640. X        XtNbottom, XawChainTop,
  641. X        XtNleft, XawChainLeft,
  642. X        XtNright, XawChainRight,
  643. X        NULL);
  644. X
  645. X    confirm_button = XtVaCreateManagedWidget("confirm_button",
  646. X        commandWidgetClass, form,
  647. X        XtNlabel, "Confirm",
  648. X        XtNwidth, 64,
  649. X        XtNfromVert, input,
  650. X        XtNtop, XawChainBottom,
  651. X        XtNbottom, XawChainBottom,
  652. X        XtNleft, XawChainLeft,
  653. X        XtNright, XawChainLeft,
  654. X        NULL);
  655. X        AddCallback(confirm_button, confirm_new_note, input);
  656. X        AddCallback(confirm_button, destroy_widget, NULL);
  657. X        AddCallback(confirm_button, sensitize_all, NULL);
  658. X
  659. X    /* filler_box's only purpose is to provide spacing... */
  660. X    filler_box = XtVaCreateManagedWidget("filler_box",
  661. X        boxWidgetClass, form,
  662. X        XtNwidth, 64,
  663. X        XtNborderWidth, 0,
  664. X        XtNfromHoriz, confirm_button,
  665. X        XtNfromVert, input,
  666. X        XtNtop, XawChainBottom,
  667. X        XtNbottom, XawChainBottom,
  668. X        XtNleft, XawChainLeft,
  669. X        XtNright, XawChainRight,
  670. X        NULL);
  671. X
  672. X    cancel_button = XtVaCreateManagedWidget("cancel_button",
  673. X        commandWidgetClass, form,
  674. X        XtNlabel, "Cancel",
  675. X        XtNwidth, 64,
  676. X        XtNfromHoriz, filler_box,
  677. X        XtNfromVert, input,
  678. X        XtNtop, XawChainBottom,
  679. X        XtNbottom, XawChainBottom,
  680. X        XtNleft, XawChainRight,
  681. X        XtNright, XawChainRight,
  682. X        NULL);
  683. X        AddCallback(cancel_button, destroy_widget, NULL);
  684. X        AddCallback(cancel_button, sensitize_all, NULL);
  685. X
  686. X    XtRealizeWidget(popup);
  687. X
  688. X    XtVaGetValues(toplevel, XtNwidth, &top_w, NULL);
  689. X    XtVaGetValues(popup, XtNwidth, &popup_w, NULL);
  690. X    XtTranslateCoords(toplevel, (top_w - popup_w)/2, 0, &x, &y);
  691. X    XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  692. X
  693. X    XtPopup(popup, XtGrabNone);
  694. X}
  695. X
  696. X
  697. X/*
  698. X * dismiss_show_note ()
  699. X * unmap a note from the display -- note it does not destroy
  700. X * the note widget
  701. X */
  702. Xstatic void 
  703. Xdismiss_show_note(widget, client_data, call_data)
  704. X    Widget widget;
  705. X    XtPointer client_data, call_data;
  706. X{
  707. X    XtPopdown(XtGrandParent(widget));
  708. X    XtUnmapWidget(XtGrandParent(widget));
  709. X}
  710. X
  711. X
  712. X/*
  713. X * show_note ()
  714. X * map a note to the display
  715. X */
  716. Xstatic void
  717. Xshow_note(widget, client_data, call_data)
  718. X     Widget widget;
  719. X     XtPointer client_data, call_data;
  720. X{
  721. X    XawListReturnStruct *item = (XawListReturnStruct*) call_data;
  722. X    Widget w;
  723. X    XWindowAttributes atribs;
  724. X
  725. X    w = *Notes[item->list_index];
  726. X    XGetWindowAttributes(XtDisplay(w), XtWindow(w), &atribs);
  727. X
  728. X    if (atribs.map_state == IsUnmapped)
  729. X        XtPopup(w, XtGrabNone);
  730. X    else
  731. X        XRaiseWindow(XtDisplay(w), XtWindow(w));
  732. X}
  733. X
  734. X
  735. X/*
  736. X * select_note ()
  737. X */
  738. Xstatic void
  739. Xselect_note(widget, client_data, call_data)
  740. X    Widget widget;
  741. X    XtPointer client_data, call_data;
  742. X{
  743. X    Widget w = (Widget) client_data;
  744. X    Display *d;
  745. X    String str;
  746. X
  747. X    d = XtDisplay(XtGrandParent(widget));
  748. X    XtVaGetValues(w, XtNstring, &str, NULL);
  749. X    if (strlen(str)) {
  750. X        XawTextSetSelection(w, 0, strlen(str));
  751. X        XStoreBytes(d, str, strlen(str));
  752. X    }
  753. X}
  754. X
  755. X
  756. X/*
  757. X * make_note_widget ()
  758. X * dynamically allocate a widget, create a new note, and
  759. X * return a pointer to the widget -- remember that it's a
  760. X * pointer, not a widget itself
  761. X */
  762. XWidget *
  763. Xmake_note_widget(title, x, y, w, h, text)
  764. X    char *title, *text;
  765. X    int x, y, w, h;
  766. X{
  767. X    Widget *popup, form, note;
  768. X    Widget dismiss_button, title_button, clear_button, delete_button;
  769. X    Widget select_button;
  770. X
  771. X    popup = (Widget *) malloc(sizeof(Widget));
  772. X    if (!popup)
  773. X        die("Malloc in make_note_widget failed.");
  774. X
  775. X    *popup = XtVaCreatePopupShell(title,
  776. X        transientShellWidgetClass, toplevel,
  777. X        XtNx, x, XtNy, y, NULL);
  778. X
  779. X    form = XtCreateManagedWidget("form",
  780. X        formWidgetClass, *popup,
  781. X        NULL, ZERO);
  782. X
  783. X    dismiss_button = XtVaCreateManagedWidget("dismiss_button",
  784. X        commandWidgetClass, form,
  785. X        XtNlabel, "Dismiss",
  786. X        XtNwidth, 64,
  787. X        XtNtop, XawChainTop,
  788. X        XtNbottom, XawChainTop,
  789. X        XtNleft, XawChainLeft,
  790. X        XtNright, XawChainLeft,
  791. X        NULL);
  792. X        AddCallback(dismiss_button, dismiss_show_note, NULL);
  793. X
  794. X    note = XtVaCreateManagedWidget("note",
  795. X        asciiTextWidgetClass, form,
  796. X        XtNfromVert, dismiss_button,
  797. X        XtNstring, text,
  798. X        XtNwidth, w,
  799. X        XtNheight, h,
  800. X        XtNscrollVertical, XawtextScrollAlways,
  801. X        XtNeditType, XawtextEdit,
  802. X        XtNwrap, XawtextWrapLine,
  803. X        XtNtop, XawChainTop,
  804. X        XtNbottom, XawChainBottom,
  805. X        XtNleft, XawChainLeft,
  806. X        XtNright, XawChainRight,
  807. X        NULL);
  808. X
  809. X    title_button = XtVaCreateManagedWidget("title_button",
  810. X        commandWidgetClass, form,
  811. X        XtNfromHoriz, dismiss_button,
  812. X        XtNlabel, "Title",
  813. X        XtNwidth, 64,
  814. X        XtNtop, XawChainTop,
  815. X        XtNbottom, XawChainTop,
  816. X        XtNleft, XawChainLeft,
  817. X        XtNright, XawChainLeft,
  818. X        NULL);
  819. X        AddCallback(title_button, desensitize_all, NULL);
  820. X        AddCallback(title_button, new_title, *popup);
  821. X
  822. X    clear_button = XtVaCreateManagedWidget("clear_button",
  823. X        commandWidgetClass, form,
  824. X        XtNfromHoriz, title_button,
  825. X        XtNlabel, "Clear",
  826. X        XtNwidth, 64,
  827. X        XtNtop, XawChainTop,
  828. X        XtNbottom, XawChainTop,
  829. X        XtNleft, XawChainLeft,
  830. X        XtNright, XawChainLeft,
  831. X        NULL);
  832. X        AddCallback(clear_button, desensitize_all, NULL);
  833. X        AddCallback(clear_button, clear_note, note);
  834. X
  835. X    delete_button = XtVaCreateManagedWidget("delete_button",
  836. X        commandWidgetClass, form,
  837. X        XtNfromHoriz, clear_button,
  838. X        XtNlabel, "Destroy",
  839. X        XtNwidth, 64,
  840. X        XtNtop, XawChainTop,
  841. X        XtNbottom, XawChainTop,
  842. X        XtNleft, XawChainLeft,
  843. X        XtNright, XawChainLeft,
  844. X        NULL);
  845. X        AddCallback(delete_button, desensitize_all, NULL);
  846. X        AddCallback(delete_button, delete_note, *popup);
  847. X
  848. X    select_button = XtVaCreateManagedWidget("select_button",
  849. X        commandWidgetClass, form,
  850. X        XtNfromHoriz, delete_button,
  851. X        XtNlabel, "Select",
  852. X        XtNwidth, 64,
  853. X        XtNtop, XawChainTop,
  854. X        XtNbottom, XawChainTop,
  855. X        XtNleft, XawChainLeft,
  856. X        XtNright, XawChainLeft,
  857. X        NULL);
  858. X        AddCallback(select_button, select_note, note);
  859. X
  860. X    XtRealizeWidget(*popup);
  861. X
  862. X    return popup;
  863. X}
  864. X
  865. X
  866. X/*
  867. X * destroy_list ()
  868. X * this destroy_list is called by confirm_new_note
  869. X */
  870. Xvoid
  871. Xdestroy_list()
  872. X{
  873. X    Widget w;
  874. X
  875. X    w = XtNameToWidget(toplevel, "*Notes");
  876. X    if (w) {
  877. X        XtPopdown(w);
  878. X        XtDestroyWidget(w);
  879. X    }
  880. X}
  881. X
  882. X
  883. X/*
  884. X * show_list ()
  885. X * desensitize the toplevel startup button and put up
  886. X * the list of notes
  887. X */
  888. Xvoid
  889. Xshow_list(widget, client_data, call_data)
  890. X    Widget widget;
  891. X    XtPointer client_data, call_data;
  892. X{
  893. X    Widget popup, form, list;
  894. X    Widget dismiss_button, new_button, save_button, quit_button;
  895. X    Dimension top_w, popup_w;
  896. X    Position x, y;
  897. X
  898. X    popup = XtCreatePopupShell("Notes",
  899. X        transientShellWidgetClass, toplevel,
  900. X        NULL, ZERO);
  901. X
  902. X    form = XtCreateManagedWidget("form",
  903. X        formWidgetClass, popup,
  904. X        NULL, ZERO);
  905. X
  906. X    new_button = XtVaCreateManagedWidget("new_button",
  907. X        commandWidgetClass, form,
  908. X        XtNwidth, 64,
  909. X        XtNlabel, "New",
  910. X        XtNtop, XawChainTop,
  911. X        XtNbottom, XawChainTop,
  912. X        XtNleft, XawChainLeft,
  913. X        XtNright, XawChainLeft,
  914. X        NULL);
  915. X        AddCallback(new_button, desensitize_all, NULL);
  916. X        AddCallback(new_button, new_note, NULL);
  917. X
  918. X    dismiss_button = XtVaCreateManagedWidget("dismiss_button",
  919. X        commandWidgetClass, form,
  920. X        XtNfromHoriz, new_button,
  921. X        XtNwidth, 64,
  922. X        XtNlabel, "Dismiss",
  923. X        XtNtop, XawChainTop,
  924. X        XtNbottom, XawChainTop,
  925. X        XtNleft, XawChainLeft,
  926. X        XtNright, XawChainRight,
  927. X        NULL);
  928. X        AddCallback(dismiss_button, destroy_widget, NULL);
  929. X        AddCallback(dismiss_button, sensitize_start_button, NULL);
  930. X
  931. X    save_button = XtVaCreateManagedWidget("save_button",
  932. X        commandWidgetClass, form,
  933. X        XtNfromHoriz, dismiss_button,
  934. X        XtNwidth, 64,
  935. X        XtNlabel, "Save",
  936. X        XtNtop, XawChainTop,
  937. X        XtNbottom, XawChainTop,
  938. X        XtNleft, XawChainRight,
  939. X        XtNright, XawChainRight,
  940. X        NULL);
  941. X        AddCallback(save_button, save_callback, NULL);
  942. X
  943. X    list = XtVaCreateManagedWidget("list",
  944. X        listWidgetClass, form,
  945. X        XtNfromVert, dismiss_button,
  946. X        XtNwidth, 3*64+2*4+2*2,
  947. X        XtNlist, Titles,
  948. X        XtNtop, XawChainTop,
  949. X        XtNbottom, XawChainBottom,
  950. X        XtNleft, XawChainLeft,
  951. X        XtNright, XawChainRight,
  952. X        NULL);
  953. X        AddCallback(list, show_note, NULL);
  954. X
  955. X    quit_button = XtVaCreateManagedWidget("quit_button",
  956. X        commandWidgetClass, form,
  957. X        XtNfromVert, list,
  958. X        XtNwidth, 3*64+2*4+2*2,
  959. X        XtNlabel, "Quit",
  960. X        XtNtop, XawChainBottom,
  961. X        XtNbottom, XawChainBottom,
  962. X        XtNleft, XawChainLeft,
  963. X        XtNright, XawChainRight,
  964. X        NULL);
  965. X        AddCallback(quit_button, quit, NULL);
  966. X
  967. X    XtRealizeWidget(popup);
  968. X
  969. X    XtVaGetValues(toplevel, XtNwidth, &top_w, NULL);
  970. X    XtVaGetValues(popup, XtNwidth, &popup_w, NULL);
  971. X    XtTranslateCoords(toplevel, (top_w - popup_w)/2, 0, &x, &y);
  972. X    XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  973. X
  974. X    XtPopup(popup, XtGrabNone);
  975. X}
  976. END_OF_FILE
  977. if test 22566 -ne `wc -c <'callbacks.c'`; then
  978.     echo shar: \"'callbacks.c'\" unpacked with wrong size!
  979. fi
  980. # end of 'callbacks.c'
  981. fi
  982. echo shar: End of archive 2 \(of 2\).
  983. cp /dev/null ark2isdone
  984. MISSING=""
  985. for I in 1 2 ; do
  986.     if test ! -f ark${I}isdone ; then
  987.     MISSING="${MISSING} ${I}"
  988.     fi
  989. done
  990. if test "${MISSING}" = "" ; then
  991.     echo You have unpacked both archives.
  992.     rm -f ark[1-9]isdone
  993. else
  994.     echo You still need to unpack the following archives:
  995.     echo "        " ${MISSING}
  996. fi
  997. ##  End of shell archive.
  998. exit 0
  999. -- 
  1000. * Bob Smith          + mx: bob@snuffy.penfield.ny.us      *
  1001. * 838 Harmon Rd.     + uucp: ur-valhalla!snuffy!bob       *
  1002. * Penfield, NY 14526 + office|voice mail: +1 716 724-6186 *
  1003.  
  1004. exit 0 # Just in case...
  1005. -- 
  1006.   // chris@Sterling.COM           | Send comp.sources.x submissions to:
  1007. \X/  Amiga - The only way to fly! |    sources-x@sterling.com
  1008.  "It's intuitively obvious to the |
  1009.   most casual observer..."        | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
  1010.