home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume12 / xrolo / patch5 next >
Internet Message Format  |  1993-05-04  |  72KB

  1. From: luis@rice.edu (Luis Soltero)
  2. Newsgroups: comp.sources.x
  3. Subject: v12i001: xrolo -- an XView rolodex, Patch 4 and, Patch5, Part01/01
  4. Message-ID: <8979@exodus.Eng.Sun.COM>
  5. Date: 2 Mar 91 08:21:28 GMT
  6. Approved: argv@sun.com
  7.  
  8. Submitted-by: luis@rice.edu (Luis Soltero)
  9. Posting-number: Volume 12, Issue 1
  10. Archive-name: xrolo/patch5
  11. Patch-To: xrolo: Volume 9, Issue 84-86
  12. Patch-To: xrolo: Volume 10, Issue 71
  13. Patch-To: xrolo: Volume 11, Issue 1-2
  14.  
  15. This file contains patches to xrolo version 2.0 patchlevel 5.  To
  16. apply the patch unshar this file and the apply xrolo.patch4 using
  17. Larry Walls patch program.
  18.      cd XROLO_SRC ; patch < xrolo.patch4; xmkmf; make
  19.  
  20. Sources to xrolo and previous patches to xrolo can be obtained from
  21. the comp.sources.x archive volume9 and volume10.  patch2 and 3 have
  22. been submitted but have not yet been placed in the archive.
  23.  
  24. A set of patched sources can be obtained from expo.lcs.mit.edu look in
  25. contrib/xrolo.v2p5.tar.Z
  26.  
  27. Patch 5:
  28.     Added ability to use regex match when creating lists of cards.
  29.     This functionality has also been added to the print function. All
  30.     three types of regex matching (Soundex, Case Insensitive and Egrep)
  31.     are supported.
  32.  
  33.     Added dialing support for SparcStations.  Xrolo now knows how to
  34.     use the internal speaker in SS to dial touch tones.  3 new
  35.     resources have been added. xrolo.DefaultVolume, xrolo.DialPrefix
  36.     and xrolo.UseDialPrefix.
  37.  
  38.     Added OL ifdef to panel.c.  when OL is defined at compile time
  39.     xrolo used OL type buttons instead of PANEL_IMAGE buttons.
  40.  
  41.     Faster list_button function.
  42.  
  43.     Replaced load/save from/to file menu items in the file menu w/
  44.     item called "File IO" which creates a panel w/ file name, load, save,
  45.     and cancel widgets.  This panel stays sticks around until the user
  46.     selects the cancel button.  This feature allows users to switch
  47.     between rolo databases quickly.  I would have used a FRAME_CMD to
  48.     implement this functionality but I couldnt get FRAME_CMD to work
  49.     correctly for me.  In the future a pin will be provided to the user so
  50.     that he may control the File IO panel directly.
  51.  
  52.  
  53. #! /bin/sh
  54. # This is a shell archive.  Remove anything before this line, then unpack
  55. # it by saving it into a file and typing "sh file".  To overwrite existing
  56. # files, type "sh file -c".  You can also feed this as standard input via
  57. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  58. # will see the following message at the end:
  59. #        "End of shell archive."
  60. # Contents:  TODO phone.c phone.icon xrolo.patch4
  61. # Wrapped by luis@oort on Fri Feb 15 14:44:46 1991
  62. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  63. if test -f 'TODO' -a "${1}" != "-c" ; then 
  64.   echo shar: Will not clobber existing file \"'TODO'\"
  65. else
  66. echo shar: Extracting \"'TODO'\" \(232 characters\)
  67. sed "s/^X//" >'TODO' <<'END_OF_FILE'
  68. Xa) Includes in xrolo database.
  69. Xc) record locking and multiple xrolo communication using rpc.
  70. Xe) print formating of cards.  reduce x num cards / page.  landscape mode.
  71. Xh) check -Ww option. why does it not work?
  72. Xi) make buttons wrap.
  73. END_OF_FILE
  74. if test 232 -ne `wc -c <'TODO'`; then
  75.     echo shar: \"'TODO'\" unpacked with wrong size!
  76. fi
  77. # end of 'TODO'
  78. fi
  79. if test -f 'phone.c' -a "${1}" != "-c" ; then 
  80.   echo shar: Will not clobber existing file \"'phone.c'\"
  81. else
  82. echo shar: Extracting \"'phone.c'\" \(10124 characters\)
  83. sed "s/^X//" >'phone.c' <<'END_OF_FILE'
  84. X/*
  85. X * derived from the sun microsystems play.c demo.  Please send bugs,
  86. X * fixes or comments to me directly.
  87. X * 
  88. X * Luis Soltero (luis@rice.edu)
  89. X */
  90. X
  91. X#include <xview/xview.h>
  92. X#include <xview/panel.h>
  93. X#include <sys/dir.h>
  94. X#include "defs.h"
  95. X
  96. Xstatic Frame volume_frame;
  97. Xstatic Panel volume_panel;
  98. Xextern Frame frame;
  99. Xstatic Menu_item volume_prefix_item, volume_item,
  100. X  volume_use_prefix_item;
  101. X
  102. Xstatic void do_create_phone_attribute_panel();
  103. X
  104. Xstatic in_phone_button=0;
  105. Xvoid set_phone_attributes(item, event)
  106. XPanel_item item;
  107. XEvent *event;
  108. X{
  109. X    if ( in_phone_button ) {
  110. X        in_phone_button = 0;
  111. X        return;
  112. X    }
  113. X#ifdef SOUNDS
  114. X    do_create_phone_attribute_panel(item, event);
  115. X    xv_set(volume_frame, XV_SHOW, TRUE, NULL);
  116. X#else
  117. X    msg("Using the system speaker to dial only works on SparcStations");
  118. X#endif
  119. X}
  120. X
  121. Xextern Menu_item regex_item;
  122. X
  123. Xvoid dial_a_number(item, event)
  124. XPanel_item item;
  125. XEvent *event;
  126. X{
  127. X    char *get_selection();
  128. X    char *cp;
  129. X    char buff[100];
  130. X    if ( in_phone_button ) {
  131. X        in_phone_button = 0;
  132. X        return;
  133. X    }
  134. X#ifdef SOUNDS
  135. X    /* make sure the attribute panel and all default attributes are */
  136. X    /* initialized */
  137. X    do_create_phone_attribute_panel();
  138. X    cp = get_selection();
  139. X    if ( cp == NULL )
  140. X      cp = (char *)xv_get(regex_item, PANEL_VALUE);
  141. X    if ( cp == NULL || *cp == '\0' ) {
  142. X        msg("No number to dial");
  143. X        return;
  144. X    }
  145. X    buff[0] = '\0';
  146. X    if ( xv_get(volume_use_prefix_item, PANEL_VALUE) ) {
  147. X        strcpy(buff, xv_get(volume_prefix_item, PANEL_VALUE));
  148. X    }
  149. X    strcat(buff, cp);
  150. X    if ( !confirm("Dial %s", buff) )
  151. X      return;
  152. X    for( cp = buff; *cp != '\0'; cp++ ) {
  153. X        dial(*cp);
  154. X    }
  155. X#else
  156. X    msg("Using the system speaker to dial only works on SparcStations");
  157. X#endif
  158. X}
  159. X
  160. Xvoid phone_button(item, event)
  161. XPanel_item item;
  162. XEvent *event;
  163. X{
  164. X    if ( event_action(event) == ACTION_MENU )
  165. X      return;
  166. X
  167. X    switch (value_from_mask (event)) {
  168. X      case PLAIN_CLICK:            /* Plain save */
  169. X        dial_a_number(item, event);
  170. X        break;
  171. X
  172. X      case SHIFT_CLICK:            /* reload, no save first */
  173. X        set_phone_attributes(item, event);
  174. X        break;
  175. X    }
  176. X    in_phone_button = 1;
  177. X}
  178. X
  179. X#ifdef SOUNDS
  180. X
  181. X#include <stdio.h>
  182. X#include <errno.h>
  183. X#include <ctype.h>
  184. X#include <stdlib.h>
  185. X#include <fcntl.h>
  186. X#include <sys/types.h>
  187. X#include <sys/file.h>
  188. X#include <sys/stat.h>
  189. X#include <sys/param.h>
  190. X#include <sys/signal.h>
  191. X
  192. X#include <stropts.h>
  193. X#include <sys/ioctl.h>
  194. X
  195. X#include <multimedia/libaudio.h>
  196. X#include <multimedia/audio_device.h>
  197. X
  198. X
  199. X#define    MAX_GAIN        (100)        /* maximum gain */
  200. X
  201. Xchar tones[20][MAXNAMLEN];
  202. X
  203. X#define TONE(x)    tones[x]
  204. X#define POUND 10
  205. X#define STAR  11
  206. X#define GONG  12
  207. X
  208. X#define DEFAULT_VOLUME 50
  209. X
  210. X
  211. Xstatic void init_tones()
  212. X{
  213. X    int i;
  214. X    for ( i = 0; i < 10; i++ )
  215. X      sprintf(tones[i],"%s/touchtone.%1d.au", SOUNDS, i);
  216. X    sprintf(tones[i++], "%s/touchtone.pound.au", SOUNDS);
  217. X    sprintf(tones[i++], "%s/touchtone.star.au", SOUNDS);
  218. X    sprintf(tones[i++], "%s/drip.au", SOUNDS);
  219. X}
  220. X
  221. Xstatic void slider_volume_proc(item, value, event)
  222. XPanel_item item;
  223. Xint value;
  224. XEvent *event;
  225. X{
  226. X    volume(value);
  227. X    play(TONE(GONG));
  228. X}
  229. X
  230. Xstatic void volume_done_proc(item, event)
  231. XPanel_item item;
  232. XEvent *event;
  233. X{
  234. X    xv_set(volume_frame, XV_SHOW, FALSE, NULL);
  235. X}
  236. X
  237. Xstatic void do_create_phone_attribute_panel()
  238. X{
  239. X    static int inited = 0;
  240. X    Menu_item prefix_item;
  241. X    if ( inited )
  242. X      return;
  243. X    inited++;
  244. X        
  245. X    volume_frame = xv_create(frame, FRAME,
  246. X                             FRAME_LABEL, "Phone Attributes",
  247. X                             FRAME_SHOW_LABEL, TRUE,
  248. X                             NULL);
  249. X    volume_panel = xv_create(volume_frame, PANEL, NULL);
  250. X    volume_use_prefix_item = xv_create(volume_panel, PANEL_CHECK_BOX,
  251. X                            PANEL_CHOOSE_ONE, FALSE,
  252. X                            PANEL_CHOICE_STRINGS, "Use Dial Prefix:", NULL,
  253. X                            PANEL_VALUE, defaults_get_integer("xrolo.usedialprefix", 
  254. X                                                              "xrolo.UseDialPrefix", 1), 
  255. X                            NULL);
  256. X    volume_prefix_item = xv_create(volume_panel, PANEL_TEXT, 
  257. X                                   PANEL_BLINK_CARET, TRUE,
  258. X                                   PANEL_VALUE_DISPLAY_LENGTH, 24,
  259. X                                   PANEL_VALUE_STORED_LENGTH, 80,
  260. X                                   PANEL_VALUE, defaults_get_string("xrolo.dialprefix",
  261. X                                                                    "xrolo.DialPrefix", ""),
  262. X                                   NULL);
  263. X
  264. X    volume_item = xv_create(volume_panel, PANEL_SLIDER,
  265. X              XV_X, xv_col(volume_panel, 0),
  266. X              XV_Y, xv_row(volume_panel, 1),
  267. X              PANEL_LABEL_STRING, "Volume:",
  268. X              PANEL_VALUE, defaults_get_integer("xrolo.defaultvolume",
  269. X                               "xrolo.DefaultVolume", DEFAULT_VOLUME),
  270. X              PANEL_MIN_VALUE, 0,
  271. X              PANEL_MAX_VALUE, MAX_GAIN,
  272. X              PANEL_SLIDER_WIDTH, 100,
  273. X              PANEL_SHOW_RANGE, TRUE,
  274. X              PANEL_SHOW_VALUE, TRUE,
  275. X              PANEL_NOTIFY_LEVEL, PANEL_DONE,
  276. X              PANEL_NOTIFY_PROC, slider_volume_proc,
  277. X              NULL);
  278. X    xv_create(volume_panel, PANEL_BUTTON,
  279. X              PANEL_LABEL_STRING, "Done",
  280. X              PANEL_NOTIFY_PROC, volume_done_proc,
  281. X              NULL);
  282. X    window_fit(volume_panel);
  283. X    window_fit(volume_frame);
  284. X}
  285. X
  286. Xdial(c)
  287. Xchar c;
  288. X{
  289. X    int tone;
  290. X    if ( isdigit(c) ) {
  291. X        play_wait(TONE(c - '0'));
  292. X        return;
  293. X    }
  294. X    if ( c == '*'  ) {
  295. X        play_wait(TONE(STAR));
  296. X        return;
  297. X    }
  298. X    if ( c == '#' ) {
  299. X        play_wait(TONE(POUND));
  300. X        return;
  301. X    }
  302. X    if ( c == ',' ) {
  303. X        sleep(2);
  304. X        return;
  305. X    }
  306. X    tone = islower(c) ? toupper(c) : c;
  307. X    if ( tone >= 'A' && tone < 'Z') {
  308. X        if ( tone >= 'Q' )
  309. X          tone--;
  310. X        tone -= 'A';
  311. X        tone = (tone / 3) ;
  312. X        tone += 2;
  313. X        play_wait(TONE(tone));
  314. X    }
  315. X}
  316. X
  317. Xplay_wait(cp)
  318. Xchar *cp;
  319. X{
  320. X    play(cp);
  321. X    usleep(50000);
  322. X}
  323. X
  324. X/*
  325. X * This defines the tolerable sample rate error as a ratio between the
  326. X * sample rates of the audio data and the audio device.
  327. X */
  328. X#define    SAMPLE_RATE_THRESHOLD    (.01)
  329. X
  330. Xdouble        Savevol;        /* saved volume level */
  331. Xchar        *Audio_dev = "/dev/audio";
  332. X
  333. Xint        Audio_fd = -1;        /* file descriptor for audio device */
  334. XAudio_hdr    Dev_hdr;        /* audio header for device */
  335. XAudio_hdr    File_hdr;        /* audio header for file */
  336. X
  337. X
  338. Xinit_audio()
  339. X{
  340. X    int err;
  341. X    struct stat    st;
  342. X    static inited = 0;
  343. X
  344. X    if ( inited )
  345. X      return(1);
  346. X
  347. X    /* make sure that the volume panel + defaults have been intialized */
  348. X    do_create_phone_attribute_panel();
  349. X    init_tones();
  350. X
  351. X    /* Validate and open the audio device */
  352. X    err = stat(Audio_dev, &st);
  353. X    if (err < 0) {
  354. X        msg("Play: No audio device");
  355. X        return(0);
  356. X    }
  357. X    if (!S_ISCHR(st.st_mode)) {
  358. X        msg("Play: %s is not an audio device", Audio_dev);
  359. X        return(0);
  360. X    }
  361. X
  362. X    /* Try it quickly, first */
  363. X    Audio_fd = open(Audio_dev, O_WRONLY | O_NDELAY);
  364. X    if ((Audio_fd < 0) && (errno == EBUSY)) {
  365. X        msg("Play: Audio device in use");
  366. X        return(0);
  367. X    }
  368. X    if (Audio_fd < 0) {
  369. X        msg("Play: Error opening audio device");
  370. X        return(0);
  371. X    }
  372. X
  373. X    /* Get the device output encoding configuration */
  374. X    if (audio_get_play_config(Audio_fd, &Dev_hdr) != AUDIO_SUCCESS) {
  375. X        msg("Play: %s is not an audio device", Audio_dev);
  376. X        return(0);
  377. X    }
  378. X    inited++;
  379. X    /* set default volume level */
  380. X    volume(xv_get(volume_item, PANEL_VALUE));
  381. X    return(1);
  382. X}
  383. X
  384. Xclose_audio()
  385. X{
  386. X    /*
  387. X     * Though drain is implicit on close(), it's performed here
  388. X     * for the sake of completeness, and to ensure that the volume
  389. X     * is reset after all output is complete.
  390. X     */
  391. X    (void) audio_drain(Audio_fd, FALSE);
  392. X    (void) audio_set_play_gain(Audio_fd, &Savevol);
  393. X    (void) close(Audio_fd);            /* close output */
  394. X}
  395. X
  396. Xvolume(Volume)
  397. Xunsigned Volume;
  398. X{
  399. X    double        vol;
  400. X    int         err;
  401. X
  402. X    if ( !init_audio() )
  403. X      return;
  404. X
  405. X    if ( Volume > MAX_GAIN ) {
  406. X        msg("Volume: Volume must be in the range 0 to %d",
  407. X                MAX_GAIN);
  408. X        return;
  409. X    }
  410. X    vol = (double) Volume / (double) MAX_GAIN;
  411. X    (void) audio_get_play_gain(Audio_fd, &Savevol);
  412. X    err = audio_set_play_gain(Audio_fd, &vol);
  413. X    if (err != AUDIO_SUCCESS) {
  414. X        msg("Volume: Could not set volume for %s", Audio_dev);
  415. X        return;
  416. X    }
  417. X}
  418. X
  419. X/*
  420. X * Play a list of audio files.
  421. X */
  422. Xplay(Ifile)
  423. Xchar *Ifile;
  424. X{
  425. X    int        cnt;
  426. X    int        ifd;
  427. X    int     err;
  428. X    static unsigned char buf[1024 * 64];        /* size should depend on sample_rate */
  429. X
  430. X    if ( !init_audio() )
  431. X      return;
  432. X
  433. X/*
  434. Xfprintf(stderr,"file = %s\n", Ifile);
  435. X*/
  436. X    if ((ifd = open(Ifile, O_RDONLY, 0)) < 0) {
  437. X        msg("Play: Could not open audio file %s", Ifile);
  438. X        return;
  439. X    }
  440. X
  441. X    /* Check to make sure this is an audio file */
  442. X    err = audio_read_filehdr(ifd, &File_hdr, (char *)NULL, 0);
  443. X
  444. X    if (err != AUDIO_SUCCESS) {
  445. X        msg("Play: %s is not a valid audio file", Ifile);
  446. X        goto closeinput;
  447. X    }
  448. X
  449. X    /* Check the device configuration */
  450. X    if (audio_cmp_hdr(&Dev_hdr, &File_hdr) != 0) {
  451. X        /*
  452. X         * The device does not match the input file.
  453. X         * Wait for any old output to drain, then attempt
  454. X         * to reconfigure the audio device to match the
  455. X         * input data.
  456. X         */
  457. X        if (audio_drain(Audio_fd, FALSE) != AUDIO_SUCCESS) {
  458. X            msg("Play: AUDIO_DRAIN error");
  459. X            goto closeinput;
  460. X        }
  461. X        if (!reconfig(Ifile))
  462. X          goto closeinput;
  463. X    }
  464. X
  465. X    /*
  466. X     * At this point, we're all ready to copy the data.
  467. X     */
  468. X    while ((cnt = read(ifd, (char *)buf, sizeof (buf))) >= 0) {
  469. X        /* If input EOF, write an eof marker */
  470. X        err = write(Audio_fd, (char *)buf, cnt);
  471. X        if (err != cnt) {
  472. X            msg("Play: output error");
  473. X            break;
  474. X        }
  475. X        if (cnt == 0)
  476. X          break;
  477. X    }
  478. X    if (cnt < 0) {
  479. X        msg("Play: error reading file %s", Ifile);
  480. X    }
  481. X
  482. Xcloseinput:
  483. X    (void) close(ifd);        /* close input file */
  484. X    audio_drain(Audio_fd, FALSE);
  485. X}
  486. X
  487. X
  488. X/*
  489. X * Try to reconfigure the audio device to match the file encoding.
  490. X * If this fails, we should attempt to make the input data match the
  491. X * device encoding.  For now, we give up on this file.
  492. X *
  493. X * Returns TRUE if successful.  Returns FALSE if not.
  494. X */
  495. Xreconfig(Ifile)
  496. Xchar *Ifile;
  497. X{
  498. X    int    err;
  499. X    char    mesg[AUDIO_MAX_ENCODE_INFO];
  500. X
  501. X    Dev_hdr = File_hdr;
  502. X    err = audio_set_play_config(Audio_fd, &Dev_hdr);
  503. X
  504. X    switch (err) {
  505. X      case AUDIO_SUCCESS:
  506. X        return (TRUE);
  507. X
  508. X      case AUDIO_ERR_NOEFFECT:
  509. X        /*
  510. X         * Couldn't change the device.
  511. X         * Check to see if we're nearly compatible.
  512. X         * audio_cmp_hdr() returns >0 if only sample rate difference.
  513. X         */
  514. X        if (audio_cmp_hdr(&Dev_hdr, &File_hdr) > 0) {
  515. X            double    ratio;
  516. X            
  517. X            ratio = (double) abs((int)
  518. X                                 (Dev_hdr.sample_rate - File_hdr.sample_rate)) /
  519. X                                   (double) File_hdr.sample_rate;
  520. X            if (ratio <= SAMPLE_RATE_THRESHOLD) {
  521. X                msg("Play: WARNING: %s sampled at %d, playing at %d",
  522. X                        Ifile, File_hdr.sample_rate,
  523. X                        Dev_hdr.sample_rate);
  524. X                return(TRUE);
  525. X            }
  526. X            msg("Play: %s sample rate %d not available",
  527. X                    Ifile, File_hdr.sample_rate);
  528. X            return (FALSE);
  529. X        }
  530. X        (void) audio_enc_to_str(&File_hdr, mesg);
  531. X        msg("Play: %s encoding not available: %s",Ifile,mesg);
  532. X        return (FALSE);
  533. X
  534. X      default:
  535. X        msg("Play: i/o error (set config)");
  536. X        abort();
  537. X    }
  538. X}
  539. X
  540. X
  541. X#endif
  542. END_OF_FILE
  543. if test 10124 -ne `wc -c <'phone.c'`; then
  544.     echo shar: \"'phone.c'\" unpacked with wrong size!
  545. fi
  546. # end of 'phone.c'
  547. fi
  548. if test -f 'phone.icon' -a "${1}" != "-c" ; then 
  549.   echo shar: Will not clobber existing file \"'phone.icon'\"
  550. else
  551. echo shar: Extracting \"'phone.icon'\" \(589 characters\)
  552. sed "s/^X//" >'phone.icon' <<'END_OF_FILE'
  553. X/* Format_version=1, Width=32, Height=32, Depth=1, Valid_bits_per_item=16
  554. X */
  555. X    0x0000,0x0000,
  556. X    0x0000,0x0000,
  557. X    0x0000,0x0000,
  558. X    0x0000,0x0000,
  559. X    0x0000,0x0000,
  560. X    0x0000,0x0000,
  561. X    0x0FFF,0xFFF0,
  562. X    0x3000,0x000C,
  563. X    0x4000,0x0002,
  564. X    0x4030,0x0C02,
  565. X    0x807F,0xFE01,
  566. X    0x80B0,0x0D01,
  567. X    0x83FF,0xFFC1,
  568. X    0x8400,0x0021,
  569. X    0x7C0D,0xB03E,
  570. X    0x040D,0xB020,
  571. X    0x0400,0x0020,
  572. X    0x040D,0xB020,
  573. X    0x040D,0xB020,
  574. X    0x0400,0x0020,
  575. X    0x040D,0xB020,
  576. X    0x040D,0xB020,
  577. X    0x0400,0x0020,
  578. X    0x0400,0x0020,
  579. X    0x05FF,0xFFA0,
  580. X    0x0400,0x0020,
  581. X    0x0400,0x0020,
  582. X    0x07FF,0xFFE0,
  583. X    0x0000,0x0000,
  584. X    0x0000,0x0000,
  585. X    0x0000,0x0000,
  586. X    0x0000,0x0000
  587. END_OF_FILE
  588. if test 589 -ne `wc -c <'phone.icon'`; then
  589.     echo shar: \"'phone.icon'\" unpacked with wrong size!
  590. fi
  591. # end of 'phone.icon'
  592. fi
  593. if test -f 'xrolo.patch4' -a "${1}" != "-c" ; then 
  594.   echo shar: Will not clobber existing file \"'xrolo.patch4'\"
  595. else
  596. echo shar: Extracting \"'xrolo.patch4'\" \(55035 characters\)
  597. sed "s/^X//" >'xrolo.patch4' <<'END_OF_FILE'
  598. X*** Imakefile    Fri Feb 15 14:34:46 1991
  599. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/Imakefile    Fri Feb 15 14:23:56 1991
  600. X***************
  601. X*** 5,22 ****
  602. X  #
  603. X  
  604. X  #
  605. X- # linking against openlook libraries on suns after patching ol_button.c. 
  606. X- # see README for details.
  607. X- LOCAL_LIBRARIES = -L$$OPENWINHOME/lib -lxview -Bstatic -lolgx -Bdynamic
  608. X- 
  609. X- #
  610. X  # linking against XView libraries compiled from mit distribution after 
  611. X  # patching ol_button.c. see README for details.
  612. X! # LOCAL_LIBRARIES = -lxview -lolgx
  613. X  
  614. X!         CDEBUGFLAGS = -O
  615. X!            SRCS = main.c panel.c cards.c popup.c send_mail.c soundex.c
  616. X!            OBJS = main.o panel.o cards.o popup.o send_mail.o soundex.o
  617. X         INCLUDES = -I$$OPENWINHOME/include
  618. X  #
  619. X  # User setable defines
  620. X--- 5,17 ----
  621. X  #
  622. X  
  623. X  #
  624. X  # linking against XView libraries compiled from mit distribution after 
  625. X  # patching ol_button.c. see README for details.
  626. X! # LOCAL_LIBRARIES = -lxview -lolgx 
  627. X  
  628. X!     CDEBUGFLAGS = -O
  629. X!            SRCS = main.c panel.c cards.c popup.c send_mail.c soundex.c phone.c
  630. X!            OBJS = main.o panel.o cards.o popup.o send_mail.o soundex.o phone.o
  631. X         INCLUDES = -I$$OPENWINHOME/include
  632. X  #
  633. X  # User setable defines
  634. X***************
  635. X*** 23,33 ****
  636. X  # 
  637. X  #    MAILER = Mailer to use when send mail to author menu entry is selected.
  638. X  #   VERSION = Xrolo version number
  639. X! #   NEED_STRSTR = Include only if your system does not have a strstr(3C).
  640. X  
  641. X      MAILER  = /bin/mail
  642. X      VERSION = 2.0
  643. X!     DEFINES = -DSTANDALONE -DMAILER=\"$(MAILER)\" -DVERSION=\"$(VERSION)\"
  644. X  
  645. X  AllTarget(xrolo)
  646. X  NormalProgramTarget(xrolo,$(OBJS),$(DEPLIBS), $(LOCAL_LIBRARIES), $(XLIB))
  647. X--- 18,43 ----
  648. X  # 
  649. X  #    MAILER = Mailer to use when send mail to author menu entry is selected.
  650. X  #   VERSION = Xrolo version number
  651. X! #   OL = OpenLook menu buttons.
  652. X! #   STANDALONE = Xrolo will be run as a stand alone application.
  653. X! #   SOUNDS directory containing touch tone sound files. comment out the -DSOUNDS
  654. X! #       in DEFINES if your system is not a sparcstation w/ installed 
  655. X! #       sound libraries.  
  656. X  
  657. X      MAILER  = /bin/mail
  658. X      VERSION = 2.0
  659. X!     SOUNDS  =  /usr/local/lib/sounds  # or /usr/demo/SOUNDS/sounds
  660. X!     DEFINES = -DSTANDALONE -DMAILER=\"$(MAILER)\" -DVERSION=\"$(VERSION)\" \
  661. X!               -DSOUNDS=\"$(SOUNDS)\" # -DOL
  662. X! 
  663. X! #
  664. X! # comment this out if you do not have SOUNDS defined above
  665. X! AUDIOLIB = -laudio  -lm
  666. X! 
  667. X! #
  668. X! # linking against openlook libraries on suns after patching ol_button.c. 
  669. X! # see README for details.
  670. X! LOCAL_LIBRARIES = -L$$OPENWINHOME/lib -lxview -Bstatic -lolgx -Bdynamic $(AUDIOLIB)
  671. X  
  672. X  AllTarget(xrolo)
  673. X  NormalProgramTarget(xrolo,$(OBJS),$(DEPLIBS), $(LOCAL_LIBRARIES), $(XLIB))
  674. X*** Makefile    Fri Feb 15 14:32:28 1991
  675. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/Makefile    Fri Feb 15 14:24:07 1991
  676. X***************
  677. X*** 7,13 ****
  678. X  #
  679. X  
  680. X  ###########################################################################
  681. X! # Makefile generated from "Imake.tmpl" and </tmp/IIf.a13794>
  682. X  # $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
  683. X  #
  684. X  # Platform-specific parameters may be set in the appropriate .cf
  685. X--- 7,13 ----
  686. X  #
  687. X  
  688. X  ###########################################################################
  689. X! # Makefile generated from "Imake.tmpl" and </tmp/IIf.a22611>
  690. X  # $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
  691. X  #
  692. X  # Platform-specific parameters may be set in the appropriate .cf
  693. X***************
  694. X*** 236,254 ****
  695. X  #
  696. X  
  697. X  #
  698. X- # linking against openlook libraries on suns after patching ol_button.c.
  699. X- # see README for details.
  700. X- LOCAL_LIBRARIES = -L$$OPENWINHOME/lib -lxview -Bstatic -lolgx -Bdynamic
  701. X- 
  702. X- #
  703. X  # linking against XView libraries compiled from mit distribution after
  704. X  # patching ol_button.c. see README for details.
  705. X  # LOCAL_LIBRARIES = -lxview -lolgx
  706. X  
  707. X!            SRCS = main.c panel.c cards.c popup.c
  708. X!            OBJS = main.o panel.o cards.o popup.o
  709. X         INCLUDES = -I$$OPENWINHOME/include
  710. X!         DEFINES = -DSTANDALONE
  711. X  
  712. X  all:: xrolo
  713. X  
  714. X--- 236,274 ----
  715. X  #
  716. X  
  717. X  #
  718. X  # linking against XView libraries compiled from mit distribution after
  719. X  # patching ol_button.c. see README for details.
  720. X  # LOCAL_LIBRARIES = -lxview -lolgx
  721. X  
  722. X!     CDEBUGFLAGS = -O
  723. X!            SRCS = main.c panel.c cards.c popup.c send_mail.c soundex.c phone.c
  724. X!            OBJS = main.o panel.o cards.o popup.o send_mail.o soundex.o phone.o
  725. X         INCLUDES = -I$$OPENWINHOME/include
  726. X! #
  727. X! # User setable defines
  728. X! #
  729. X! #    MAILER = Mailer to use when send mail to author menu entry is selected.
  730. X! #   VERSION = Xrolo version number
  731. X! #   OL = OpenLook menu buttons.
  732. X! #   STANDALONE = Xrolo will be run as a stand alone application.
  733. X! #   SOUNDS directory containing touch tone sound files. comment out the -DSOUNDS
  734. X! #       in DEFINES if your system is not a sparcstation w/ installed
  735. X! #       sound libraries.
  736. X! 
  737. X!     MAILER  = /bin/mail
  738. X!     VERSION = 2.0
  739. X!     SOUNDS  =  /usr/local/lib/sounds  # or /usr/demo/SOUNDS/sounds
  740. X!     DEFINES = -DSTANDALONE -DMAILER=\"$(MAILER)\" -DVERSION=\"$(VERSION)\" \
  741. X!               -DSOUNDS=\"$(SOUNDS)\" # -DOL
  742. X! 
  743. X! #
  744. X! # comment this out if you do not have SOUNDS defined above
  745. X! AUDIOLIB = -laudio  -lm
  746. X! 
  747. X! #
  748. X! # linking against openlook libraries on suns after patching ol_button.c.
  749. X! # see README for details.
  750. X! LOCAL_LIBRARIES = -L$$OPENWINHOME/lib -lxview -Bstatic -lolgx -Bdynamic $(AUDIOLIB)
  751. X  
  752. X  all:: xrolo
  753. X  
  754. X*** Patchlevel    Fri Feb 15 14:34:47 1991
  755. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/Patchlevel    Fri Feb 15 14:23:49 1991
  756. X***************
  757. X*** 1,4 ****
  758. X! Rolo, release 2.0, patch level 4
  759. X  
  760. X  Patch 4:
  761. X      Replaced list_button procedure with one that is much faster and 
  762. X--- 1,29 ----
  763. X! Rolo, release 2.0, patch level 5
  764. X! 
  765. X! Patch 5:
  766. X!     Added ability to use regex match when creating lists of cards.
  767. X!     This functionality has also been added to the print function. All
  768. X!     three types of regex matching (Soundex, Case Insensitive and Egrep)
  769. X!     are supported.
  770. X! 
  771. X!     Added dialing support for SparcStations.  Xrolo now knows how to
  772. X!     use the internal speaker in SS to dial touch tones.  3 new
  773. X!     resources have been added. xrolo.DefaultVolume, xrolo.DialPrefix
  774. X!     and xrolo.UseDialPrefix.
  775. X! 
  776. X!     Added OL ifdef to panel.c.  when OL is defined at compile time
  777. X!     xrolo used OL type buttons instead of PANEL_IMAGE buttons.
  778. X! 
  779. X!     Faster list_button function.
  780. X! 
  781. X!     Replaced load/save from/to file menu items in the file menu w/
  782. X!     item called "File IO" which creates a panel w/ file name, load, save,
  783. X!     and cancel widgets.  This panel stays sticks around until the user
  784. X!     selects the cancel button.  This feature allows users to switch
  785. X!     between rolo databases quickly.  I would have used a FRAME_CMD to
  786. X!     implement this functionality but I couldnt get FRAME_CMD to work
  787. X!     correctly for me.  In the future a pin will be provided to the user so
  788. X!     that he may control the File IO panel directly.
  789. X  
  790. X  Patch 4:
  791. X      Replaced list_button procedure with one that is much faster and 
  792. X*** help.h    Fri Feb 15 14:34:47 1991
  793. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/help.h    Fri Feb 15 14:23:52 1991
  794. X***************
  795. X*** 96,101 ****
  796. X--- 96,106 ----
  797. X  desired entry followed by a <SHIFT>-click \n\
  798. X  on the list button (or use the list button \n\
  799. X  menu) to bring up the selected card.\n\
  800. X+ The \"List Cards Matching Regex\" menu\n\
  801. X+ entry produces an index list of cards\n\
  802. X+ matching the regular expression in the\n\
  803. X+ Expression text panel using the selected\n\
  804. X+ match type.\n\
  805. X  \n\
  806. X  FILE BUTTON\n\
  807. X     This button loads and saves your rolodex\n\
  808. X***************
  809. X*** 113,126 ****
  810. X  menu or by setting the \n\
  811. X         \"xrolo.CaseInsensitiveSort\"\n\
  812. X  resource to 0 or 1. Xrolo implements a very \n\
  813. X! rudimentary field sort. each line in the card\n\
  814. X  is considered to be a field. Pointing and\n\
  815. X  clicking on a selected field before invoking \n\
  816. X  the sort will cause xrolo to sort the cards\n\
  817. X! by the selected field. The last two items on\n\
  818. X  the menu, which can only be selected from\n\
  819. X  the menu, will load from or save to a named\n\
  820. X! file.  You must select a string in some\n\
  821. X  window to provide the file name, similar\n\
  822. X  to the way the TextEdit tool\n\
  823. X  works.  The path you give must be relative to\n\
  824. X--- 118,131 ----
  825. X  menu or by setting the \n\
  826. X         \"xrolo.CaseInsensitiveSort\"\n\
  827. X  resource to 0 or 1. Xrolo implements a very \n\
  828. X! rudimentary field sort. Each line in the card\n\
  829. X  is considered to be a field. Pointing and\n\
  830. X  clicking on a selected field before invoking \n\
  831. X  the sort will cause xrolo to sort the cards\n\
  832. X! by the selected field. The last item on\n\
  833. X  the menu, which can only be selected from\n\
  834. X  the menu, will load from or save to a named\n\
  835. X! file.  You can select a string in some\n\
  836. X  window to provide the file name, similar\n\
  837. X  to the way the TextEdit tool\n\
  838. X  works.  The path you give must be relative to\n\
  839. X***************
  840. X*** 133,140 ****
  841. X  existing files, etc.\n\
  842. X  \n\
  843. X  HELP BUTTON\n\
  844. X!    Displays the information you're reading now.\n\
  845. X  \n\
  846. X  FINISHED BUTTON\n\
  847. X     This button is used when you are finished\n\
  848. X  using Rolo.  A normal click saves any changes\n\
  849. X--- 138,171 ----
  850. X  existing files, etc.\n\
  851. X  \n\
  852. X  HELP BUTTON\n\
  853. X!    Displays the information you're reading now\n\
  854. X! and allows you to send mail to me.\n\
  855. X  \n\
  856. X+ PHONE BUTTON\n\
  857. X+    On SparcStations this button can be used to\n\
  858. X+ dial a number entered in the expression field\n\
  859. X+ or highlighted with the mouse.  When selected\n\
  860. X+ the \"Set Phone Attributes\" menu item creates\n\
  861. X+ a panel that allows speaker volume adjustment,\n\
  862. X+ the entering of a dial prefix and the enabling\n\
  863. X+ or disabling of the dial prefix.  Phone\n\
  864. X+ numbers and dial prefixes may consist of any\n\
  865. X+ alpha numeric character, *, # and \",\". \n\
  866. X+ A comma in the dial string causes the dial\n\
  867. X+ routine to pause for 2 seconds before\n\
  868. X+ dialing the next character in the sequence.\n\
  869. X+ Xrolo supports several X resources used to\n\
  870. X+ to control default phone attributes.\n\
  871. X+ \"xrolo.DefaultVolume\" sets the default\n\
  872. X+ speaker volume. The volume must be entered\n\
  873. X+ as an integer value ranging in value from\n\
  874. X+ 0 to 100 where 100 is the maximum gain.\n\
  875. X+ \"xrolo.UseDialPrefix\" accepts a boolean value\n\
  876. X+ which enables or disables the use of the dial\n\
  877. X+ prefix while dialing.\n\
  878. X+ \"xrolo.DialPrefix\" sets the default dial prefix\n\
  879. X+ string.\n\
  880. X+ \n\
  881. X  FINISHED BUTTON\n\
  882. X     This button is used when you are finished\n\
  883. X  using Rolo.  A normal click saves any changes\n\
  884. X***************
  885. X*** 157,162 ****
  886. X--- 188,198 ----
  887. X  the default printer command by creating an\n\
  888. X  X resource entry called\n\
  889. X       \"xrolo.PrintCommand\".\n\
  890. X+ The \"Print Records Matching Regex\" menu\n\
  891. X+ entry spools to the print command all cards\n\
  892. X+ matching the regular expression in the\n\
  893. X+ Expression text panel using the selected\n\
  894. X+ match type.\n\
  895. X  \n\
  896. X  FIND BUTTON\n\
  897. X     This button searches for a regular expression\n\
  898. X***************
  899. X*** 208,214 ****
  900. X     Xrolo supports a number of resources which\n\
  901. X  include:\n\
  902. X      xrolo.TextWidth - set width of text window\n\
  903. X!                       in pixels.\n\
  904. X      xrolo.CaseInsensitive - 1 causes xrolo to\n\
  905. X           ignore case when sorting. 0 turns on\n\
  906. X           case sensitive sorts.\n\
  907. X--- 244,250 ----
  908. X     Xrolo supports a number of resources which\n\
  909. X  include:\n\
  910. X      xrolo.TextWidth - set width of text window\n\
  911. X!           in pixels.\n\
  912. X      xrolo.CaseInsensitive - 1 causes xrolo to\n\
  913. X           ignore case when sorting. 0 turns on\n\
  914. X           case sensitive sorts.\n\
  915. X***************
  916. X*** 217,222 ****
  917. X--- 253,266 ----
  918. X      xrolo.SearchType - default search mode for\n\
  919. X           find. 0, 1 or 2 for EGREP, SLOPPY or\n\
  920. X           SOUNDEX search modes respectively.\n\
  921. X+     xrolo.UseDialPrefix - 1 causes xrolo to\n\
  922. X+          use the dial prefix when dialing.\n\
  923. X+     xrolo.DefaultVolume - volume gain for\n\
  924. X+         SS1 internal speaker.  The gain must\n\
  925. X+         be entered as an integer value between\n\
  926. X+         0 and 100 where 100 is the maximum gain.\n\
  927. X+     xrolo.DialPrefix - text string used to set\n\
  928. X+         the default dial prefix.\n\
  929. X  \n",
  930. X  
  931. X  "\
  932. X***************
  933. X*** 223,228 ****
  934. X--- 267,275 ----
  935. X  AUTHOR\n\
  936. X     Ron Hitchens\n\
  937. X      ronbo@vixen.uucp, hitchens@cs.utexas.edu\n\
  938. X+    And\n\
  939. X+    Luis Soltero\n\
  940. X+     luis@rice.edu\n\
  941. X  \n\
  942. X     March  1987, version 1.0\n\
  943. X     August 1988, version 2.0\n\
  944. X*** panel.c    Fri Feb 15 14:34:49 1991
  945. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/panel.c    Fri Feb 15 14:23:54 1991
  946. X***************
  947. X*** 91,103 ****
  948. X  
  949. X  /* ------------------------------ Locals ----------------------------------- */
  950. X  
  951. X! static Panel_item    regex_item, slider_item;
  952. X  
  953. X  static int        panel_height, panel_width;
  954. X  
  955. X! static int        mask_from_menu_value (), value_from_mask (),
  956. X              filename_ok ();
  957. X  
  958. X  static void        next_button (), next_button_next(),  next_button_S_next(),
  959. X    prev_button (), prev_button_prev(), prev_button_S_prev(),
  960. X    new_button (), new_card_after(), new_card_before(),
  961. X--- 91,105 ----
  962. X  
  963. X  /* ------------------------------ Locals ----------------------------------- */
  964. X  
  965. X! Panel_item    regex_item, slider_item;
  966. X  
  967. X  static int        panel_height, panel_width;
  968. X  
  969. X! static int        mask_from_menu_value (), 
  970. X              filename_ok ();
  971. X  
  972. X+ int value_from_mask ();
  973. X+ 
  974. X  static void        next_button (), next_button_next(),  next_button_S_next(),
  975. X    prev_button (), prev_button_prev(), prev_button_S_prev(),
  976. X    new_button (), new_card_after(), new_card_before(),
  977. X***************
  978. X*** 104,111 ****
  979. X    delete_button (), delete_button_delete(), delete_button_undelete(),
  980. X    delete_button_undelete_before(), 
  981. X    file_button (), file_button_save(), file_button_reload(), file_button_sort(),
  982. X!   file_button_sort_backwards(), file_button_load(),
  983. X!   file_button_save_to_file(), turn_on_case_insensitive_sort(),
  984. X    turn_off_case_insensitive_sort(), 
  985. X  
  986. X    done_button (), done_n_save(), done_n_save_exit(), done_n_exit(),
  987. X--- 106,113 ----
  988. X    delete_button (), delete_button_delete(), delete_button_undelete(),
  989. X    delete_button_undelete_before(), 
  990. X    file_button (), file_button_save(), file_button_reload(), file_button_sort(),
  991. X!   file_button_sort_backwards(), file_button_io(),
  992. X!   turn_on_case_insensitive_sort(),
  993. X    turn_off_case_insensitive_sort(), 
  994. X  
  995. X    done_button (), done_n_save(), done_n_save_exit(), done_n_exit(),
  996. X***************
  997. X*** 112,134 ****
  998. X    find_button (), find_button_forward(), find_button_reverse(),
  999. X    turn_on_sloppy(), turn_on_egrep(), turn_on_soundex(),
  1000. X  
  1001. X!   print_button(), print_entry(), print_all(), set_print_command(),
  1002. X  
  1003. X!   list_button_main(), list_goto_button(), list_button (),
  1004. X    help_button(), popup_send_mail(),
  1005. X  
  1006. X    slider_proc (), button_event(), goto_card (),
  1007. X    no_comprendo ();
  1008. X  
  1009. X! static Menu_item list_menu, find_menu, file_menu;
  1010. X! static char        *get_selection ();
  1011. X  
  1012. X  
  1013. X  /* prev new next delete */
  1014. X  static u_short        buttons1_image [] = {
  1015. X  #include "buttons1.icon"
  1016. X  };
  1017. X  
  1018. X  static u_short printer_image[] = {
  1019. X  #include "print.icon"   
  1020. X  };
  1021. X--- 114,143 ----
  1022. X    find_button (), find_button_forward(), find_button_reverse(),
  1023. X    turn_on_sloppy(), turn_on_egrep(), turn_on_soundex(),
  1024. X  
  1025. X!   print_button(), print_entry(), print_all(), set_print_command(), print_regex(),
  1026. X  
  1027. X!   list_button_main(), list_goto_button(), list_button (), list_button_match(),
  1028. X    help_button(), popup_send_mail(),
  1029. X  
  1030. X    slider_proc (), button_event(), goto_card (),
  1031. X+ 
  1032. X    no_comprendo ();
  1033. X  
  1034. X! extern void dial_a_number(), set_phone_attributes(), phone_button();
  1035. X  
  1036. X+ static Menu_item list_menu, find_menu, file_menu, regex_menu, print_menu;
  1037. X+ char        *get_selection ();
  1038. X  
  1039. X+ 
  1040. X  /* prev new next delete */
  1041. X  static u_short        buttons1_image [] = {
  1042. X  #include "buttons1.icon"
  1043. X  };
  1044. X  
  1045. X+ static u_short phone_image[] = {
  1046. X+ #include "phone.icon"
  1047. X+ };
  1048. X+ 
  1049. X  static u_short printer_image[] = {
  1050. X  #include "print.icon"   
  1051. X  };
  1052. X***************
  1053. X*** 188,196 ****
  1054. X      frame = _frame;
  1055. X      panel = xv_create (frame, PANEL,
  1056. X                         PANEL_LAYOUT, PANEL_HORIZONTAL,
  1057. X                         WIN_COLUMN_GAP, 15,
  1058. X                         WIN_ROW_GAP, 25,
  1059. X!         0);
  1060. X  
  1061. X      /* 1st row */
  1062. X      /* next prev new delete list file help done */
  1063. X--- 197,207 ----
  1064. X      frame = _frame;
  1065. X      panel = xv_create (frame, PANEL,
  1066. X                         PANEL_LAYOUT, PANEL_HORIZONTAL,
  1067. X+ #ifndef OL
  1068. X                         WIN_COLUMN_GAP, 15,
  1069. X                         WIN_ROW_GAP, 25,
  1070. X! #endif
  1071. X!         NULL);
  1072. X  
  1073. X      /* 1st row */
  1074. X      /* next prev new delete list file help done */
  1075. X***************
  1076. X*** 200,222 ****
  1077. X                             NULL, NULL);
  1078. X  
  1079. X      (void) xv_create (panel, PANEL_BUTTON,
  1080. X!         PANEL_LABEL_IMAGE,    pr_region(buttons1_image, 64, 0, 32, 32, 32),
  1081. X!         PANEL_ITEM_MENU,    tmpmenu,
  1082. X!         PANEL_NOTIFY_PROC,    next_button, 
  1083. X!         XV_X, xv_col(panel, 0),
  1084. X!         XV_Y, xv_row(panel, 0),
  1085. X!         0);
  1086. X  
  1087. X      tmpmenu = menu_create (
  1088. X                             MENU_ACTION_ITEM,"    Previous Card", prev_button_prev,
  1089. X                             MENU_ACTION_ITEM, "(S) First Card   ", prev_button_S_prev,
  1090. X                             NULL, NULL);
  1091. X      (void) xv_create (panel, PANEL_BUTTON,
  1092. X!         PANEL_LABEL_IMAGE,    pr_region(buttons1_image, 64, 0, 0, 32, 32),
  1093. X!         PANEL_ITEM_MENU,    tmpmenu,
  1094. X!         PANEL_NOTIFY_PROC,    prev_button,
  1095. X!         XV_Y, xv_row(panel, 0),
  1096. X!         0);
  1097. X  
  1098. X      tmpmenu = menu_create (
  1099. X                             MENU_ACTION_ITEM, "    New Card After this One ", new_card_after,
  1100. X--- 211,242 ----
  1101. X                             NULL, NULL);
  1102. X  
  1103. X      (void) xv_create (panel, PANEL_BUTTON,
  1104. X! #ifndef OL
  1105. X!                       PANEL_LABEL_IMAGE,    pr_region(buttons1_image, 64,0,32,32,32),
  1106. X! #else
  1107. X!                       PANEL_LABEL_STRING, "Next",
  1108. X! #endif
  1109. X  
  1110. X+                       PANEL_ITEM_MENU,    tmpmenu,
  1111. X+                       PANEL_NOTIFY_PROC,    next_button, 
  1112. X+                       XV_X, xv_col(panel, 0),
  1113. X+                       XV_Y, xv_row(panel, 0),
  1114. X+                       NULL);
  1115. X+ 
  1116. X      tmpmenu = menu_create (
  1117. X                             MENU_ACTION_ITEM,"    Previous Card", prev_button_prev,
  1118. X                             MENU_ACTION_ITEM, "(S) First Card   ", prev_button_S_prev,
  1119. X                             NULL, NULL);
  1120. X      (void) xv_create (panel, PANEL_BUTTON,
  1121. X! #ifndef OL
  1122. X!                       PANEL_LABEL_IMAGE,    pr_region(buttons1_image, 64,0,0,32,32),
  1123. X! #else
  1124. X!                       PANEL_LABEL_STRING, "Prev",
  1125. X! #endif
  1126. X!                       PANEL_ITEM_MENU,    tmpmenu,
  1127. X!                       PANEL_NOTIFY_PROC,    prev_button,
  1128. X!                       XV_Y, xv_row(panel, 0),
  1129. X!                       0);
  1130. X  
  1131. X      tmpmenu = menu_create (
  1132. X                             MENU_ACTION_ITEM, "    New Card After this One ", new_card_after,
  1133. X***************
  1134. X*** 223,234 ****
  1135. X                             MENU_ACTION_ITEM, "(S) New Card Before this One", new_card_before,
  1136. X                             NULL, NULL);
  1137. X      (void) xv_create (panel, PANEL_BUTTON,
  1138. X-         PANEL_LABEL_IMAGE,    pr_region (buttons1_image, 64, 32, 0, 32, 32),
  1139. X-         PANEL_ITEM_MENU,    tmpmenu,
  1140. X-         PANEL_NOTIFY_PROC,    new_button,
  1141. X-         XV_Y, xv_row(panel, 0),
  1142. X-         0);
  1143. X  
  1144. X      tmpmenu =  xv_create (NULL, MENU,
  1145. X                  MENU_NOTIFY_PROC, delete_button_delete,
  1146. X                  MENU_ITEM,
  1147. X--- 243,260 ----
  1148. X                             MENU_ACTION_ITEM, "(S) New Card Before this One", new_card_before,
  1149. X                             NULL, NULL);
  1150. X      (void) xv_create (panel, PANEL_BUTTON,
  1151. X  
  1152. X+ #ifndef OL
  1153. X+                       PANEL_LABEL_IMAGE,    pr_region (buttons1_image, 64,32,0,32,32),
  1154. X+ #else
  1155. X+                       PANEL_LABEL_STRING,  "New",
  1156. X+ #endif
  1157. X+ 
  1158. X+                       PANEL_ITEM_MENU,    tmpmenu,
  1159. X+                       PANEL_NOTIFY_PROC,    new_button,
  1160. X+                       XV_Y, xv_row(panel, 0),
  1161. X+                       0);
  1162. X+ 
  1163. X      tmpmenu =  xv_create (NULL, MENU,
  1164. X                  MENU_NOTIFY_PROC, delete_button_delete,
  1165. X                  MENU_ITEM,
  1166. X***************
  1167. X*** 256,283 ****
  1168. X                 NULL);
  1169. X  
  1170. X      (void) xv_create (panel, PANEL_BUTTON,
  1171. X!         PANEL_LABEL_IMAGE,    pr_region (buttons1_image, 64, 32, 32, 32, 32),
  1172. X!         PANEL_ITEM_MENU, tmpmenu,
  1173. X!         PANEL_NOTIFY_PROC,    delete_button,
  1174. X!         XV_Y, xv_row(panel, 0),
  1175. X!         0);
  1176. X  
  1177. X      list_menu = menu_create (
  1178. X!                            MENU_ACTION_ITEM, "Show Index List of Cards",  list_button,
  1179. X                              
  1180. X!                             MENU_ITEM,
  1181. X!                             MENU_STRING, "(S) Go to Selected Entry",
  1182. X!                             MENU_NOTIFY_PROC, list_goto_button,
  1183. X!                             MENU_INACTIVE, TRUE,
  1184. X!                             NULL,
  1185. X  
  1186. X!                            NULL);
  1187. X      (void) xv_create (panel, PANEL_BUTTON,
  1188. X!         PANEL_LABEL_IMAGE,    pr_region(buttons2_image, 64, 32, 32, 32, 32),
  1189. X!         PANEL_ITEM_MENU,    list_menu,
  1190. X!         PANEL_NOTIFY_PROC, list_button_main,
  1191. X!         XV_Y, xv_row(panel, 0),
  1192. X!         0);
  1193. X  
  1194. X  #define CASE_INSENSITIVE_SORT_STR "Case Insensitive Sort"
  1195. X  #define CASE_SORT_STR             "Case Sensitive Sort"
  1196. X--- 282,360 ----
  1197. X                 NULL);
  1198. X  
  1199. X      (void) xv_create (panel, PANEL_BUTTON,
  1200. X! #ifndef OL
  1201. X!                       PANEL_LABEL_IMAGE,    pr_region (buttons1_image,64,32,32,32,32),
  1202. X! #else
  1203. X!                       PANEL_LABEL_STRING, "Del",
  1204. X! #endif
  1205. X  
  1206. X+                       PANEL_ITEM_MENU, tmpmenu,
  1207. X+                       PANEL_NOTIFY_PROC,    delete_button,
  1208. X+                       XV_Y, xv_row(panel, 0),
  1209. X+                       0);
  1210. X+ 
  1211. X+ #define SLOPPY_EXPR_STR      "Sloppy Regex Match"
  1212. X+ #define EGREP_EXPR_STR      "Egrep(1) Regex Match"
  1213. X+ #define SOUNDEX_EXPR_STR  "Soundex Match"
  1214. X+ #define EGREP   0
  1215. X+ #define SLOPPY  1
  1216. X+ #define SOUNDEX 2
  1217. X+ 
  1218. X+     regex_menu = menu_create(
  1219. X+                           MENU_ITEM,
  1220. X+                           MENU_STRING,
  1221. X+                           SLOPPY_EXPR_STR,
  1222. X+                           MENU_NOTIFY_PROC,
  1223. X+                           turn_on_sloppy,
  1224. X+                           NULL,
  1225. X+                           
  1226. X+                           MENU_ITEM,
  1227. X+                           MENU_STRING,
  1228. X+                           EGREP_EXPR_STR,
  1229. X+                           MENU_NOTIFY_PROC,
  1230. X+                           turn_on_egrep,
  1231. X+                           NULL,
  1232. X+ 
  1233. X+                           MENU_ITEM,
  1234. X+                           MENU_STRING,
  1235. X+                           SOUNDEX_EXPR_STR,
  1236. X+                           MENU_NOTIFY_PROC,
  1237. X+                           turn_on_soundex,
  1238. X+                           NULL,
  1239. X+ 
  1240. X+                           NULL);
  1241. X+ 
  1242. X      list_menu = menu_create (
  1243. X!                              MENU_ACTION_ITEM, "Show Index List of Cards",  list_button,
  1244. X                              
  1245. X!                              MENU_ITEM,
  1246. X!                              MENU_STRING, "(S) Go to Selected Entry",
  1247. X!                              MENU_NOTIFY_PROC, list_goto_button,
  1248. X!                              MENU_INACTIVE, TRUE,
  1249. X!                              NULL,
  1250. X!                             
  1251. X!                              MENU_ACTION_ITEM, "(C) List of Cards Matching Regex",
  1252. X!                              list_button_match,
  1253. X  
  1254. X!                              MENU_ITEM,
  1255. X!                              MENU_STRING,
  1256. X!                              defaults_set_search_type_str(),
  1257. X!                              MENU_PULLRIGHT, regex_menu,
  1258. X!                              MENU_CLIENT_DATA, -1,
  1259. X!                              NULL,
  1260. X! 
  1261. X!                              NULL);
  1262. X! 
  1263. X      (void) xv_create (panel, PANEL_BUTTON,
  1264. X! #ifndef OL
  1265. X!                       PANEL_LABEL_IMAGE,pr_region(buttons2_image,64,32,32,32,32),
  1266. X! #else
  1267. X!                       PANEL_LABEL_STRING, "List",
  1268. X! #endif
  1269. X!                       PANEL_ITEM_MENU,    list_menu,
  1270. X!                       PANEL_NOTIFY_PROC, list_button_main,
  1271. X!                       XV_Y, xv_row(panel, 0),
  1272. X!                       NULL);
  1273. X  
  1274. X  #define CASE_INSENSITIVE_SORT_STR "Case Insensitive Sort"
  1275. X  #define CASE_SORT_STR             "Case Sensitive Sort"
  1276. X***************
  1277. X*** 333,348 ****
  1278. X                               NULL,
  1279. X                             
  1280. X                               MENU_ACTION_ITEM,
  1281. X!                              "      Load From Named File",
  1282. X!                              file_button_load,
  1283. X  
  1284. X-                              MENU_ACTION_ITEM,
  1285. X-                              "      Save To Named File  ",
  1286. X-                              file_button_save_to_file,
  1287. X                               NULL);
  1288. X  
  1289. X      (void) xv_create (panel, PANEL_BUTTON,
  1290. X!                       PANEL_LABEL_IMAGE,    pr_region(buttons2_image, 64, 0, 0, 32, 32),
  1291. X                        PANEL_NOTIFY_PROC,    file_button,
  1292. X                        PANEL_ITEM_MENU, file_menu,
  1293. X                        XV_X, xv_col(panel, 0),
  1294. X--- 410,426 ----
  1295. X                               NULL,
  1296. X                             
  1297. X                               MENU_ACTION_ITEM,
  1298. X!                              "(C+M) File I/O",
  1299. X!                              file_button_io,
  1300. X  
  1301. X                               NULL);
  1302. X  
  1303. X      (void) xv_create (panel, PANEL_BUTTON,
  1304. X! #ifndef OL
  1305. X!                       PANEL_LABEL_IMAGE,pr_region(buttons2_image,64,0,0,32,32),
  1306. X! #else
  1307. X!                       PANEL_LABEL_STRING, "File",
  1308. X! #endif
  1309. X                        PANEL_NOTIFY_PROC,    file_button,
  1310. X                        PANEL_ITEM_MENU, file_menu,
  1311. X                        XV_X, xv_col(panel, 0),
  1312. X***************
  1313. X*** 357,445 ****
  1314. X                             NULL);
  1315. X  
  1316. X      (void) xv_create (panel, PANEL_BUTTON,
  1317. X!         PANEL_LABEL_IMAGE,    pr_region(buttons2_image, 64, 32, 0, 32, 32),
  1318. X!         PANEL_ITEM_MENU,    tmpmenu,
  1319. X!         XV_Y, xv_row(panel, 1),
  1320. X!         0);
  1321. X! 
  1322. X! #define SLOPPY_EXPR_STR      "Sloppy Regex Match"
  1323. X! #define EGREP_EXPR_STR      "Egrep(1) Regex Match"
  1324. X! #define SOUNDEX_EXPR_STR  "Soundex"
  1325. X! #define EGREP   0
  1326. X! #define SLOPPY  1
  1327. X! #define SOUNDEX 2
  1328. X! 
  1329. X!     tmpmenu = menu_create(
  1330. X!                           MENU_ITEM,
  1331. X!                           MENU_STRING,
  1332. X!                           SLOPPY_EXPR_STR,
  1333. X!                           MENU_NOTIFY_PROC,
  1334. X!                           turn_on_sloppy,
  1335. X!                           NULL,
  1336. X!                           
  1337. X!                           MENU_ITEM,
  1338. X!                           MENU_STRING,
  1339. X!                           EGREP_EXPR_STR,
  1340. X!                           MENU_NOTIFY_PROC,
  1341. X!                           turn_on_egrep,
  1342. X!                           NULL,
  1343. X! 
  1344. X!                           MENU_ITEM,
  1345. X!                           MENU_STRING,
  1346. X!                           SOUNDEX_EXPR_STR,
  1347. X!                           MENU_NOTIFY_PROC,
  1348. X!                           turn_on_soundex,
  1349. X!                           NULL,
  1350. X! 
  1351. X!                           NULL);
  1352. X! 
  1353. X!     find_menu = menu_create (
  1354. X!                              MENU_ACTION_ITEM,
  1355. X!                              "    Find Regular Expression, Forward",
  1356. X!                              find_button_forward,
  1357. X                             
  1358. X!                              MENU_ACTION_ITEM,
  1359. X!                              "(S) Find Regular Expression, Reverse", 
  1360. X!                              find_button_reverse, 
  1361. X! 
  1362. X!                              MENU_CLIENT_DATA, 
  1363. X!                              defaults_set_search_type(), 
  1364. X!                              
  1365. X!                              MENU_ITEM,
  1366. X!                              MENU_STRING, 
  1367. X!                              defaults_set_search_type_str(),
  1368. X!                              MENU_CLIENT_DATA, -1,
  1369. X!                              MENU_PULLRIGHT, tmpmenu,
  1370. X!                              NULL,
  1371. X                             
  1372. X                             NULL);
  1373. X- 
  1374. X      (void) xv_create (panel, PANEL_BUTTON,
  1375. X                        PANEL_LABEL_IMAGE, xv_create(NULL, SERVER_IMAGE,
  1376. X!                                                    XV_WIDTH, 32,
  1377. X!                                                    XV_HEIGHT, 32,
  1378. X!                                                    SERVER_IMAGE_BITS,
  1379. X!                                                    find_image,
  1380. X!                                                    NULL),
  1381. X!                       PANEL_ITEM_MENU,    find_menu, 
  1382. X!                       PANEL_NOTIFY_PROC,    find_button,
  1383. X                        NULL);
  1384. X  
  1385. X-     tmpmenu = menu_create(
  1386. X-                           MENU_ACTION_ITEM, 
  1387. X-                           "Print Entry",
  1388. X-                           print_entry,
  1389. X  
  1390. X!                           MENU_ACTION_ITEM, 
  1391. X!                           "Print All",
  1392. X!                           print_all,
  1393. X  
  1394. X!                           MENU_ACTION_ITEM,
  1395. X!                           "Set Print Command",
  1396. X!                           set_print_command,
  1397. X!                           NULL);
  1398. X  
  1399. X      (void) xv_create(panel, PANEL_BUTTON,
  1400. X                       PANEL_LABEL_IMAGE, xv_create(NULL, SERVER_IMAGE,
  1401. X                                                    XV_WIDTH, 32,
  1402. X                                                    XV_HEIGHT, 32,
  1403. X--- 435,502 ----
  1404. X                             NULL);
  1405. X  
  1406. X      (void) xv_create (panel, PANEL_BUTTON,
  1407. X! #ifndef OL
  1408. X!                       PANEL_LABEL_IMAGE,pr_region(buttons2_image,64,32,0,32,32),
  1409. X! #else
  1410. X!                       PANEL_LABEL_STRING, "Help",
  1411. X! #endif
  1412. X!                       PANEL_ITEM_MENU,    tmpmenu,
  1413. X!                       XV_Y, xv_row(panel, 1),
  1414. X!                       0);
  1415. X!     
  1416. X!     tmpmenu = menu_create (
  1417. X!                            MENU_ACTION_ITEM, 
  1418. X!                            "    Dial Number", 
  1419. X!                            dial_a_number,
  1420. X                             
  1421. X!                            MENU_ACTION_ITEM,
  1422. X!                            "(S) Set Phone Attributes",
  1423. X!                            set_phone_attributes,
  1424. X                             
  1425. X                             NULL);
  1426. X      (void) xv_create (panel, PANEL_BUTTON,
  1427. X+ #ifndef OL
  1428. X                        PANEL_LABEL_IMAGE, xv_create(NULL, SERVER_IMAGE,
  1429. X!                                                   XV_WIDTH, 32,
  1430. X!                                                   XV_HEIGHT, 32,
  1431. X!                                                   SERVER_IMAGE_BITS,
  1432. X!                                                   phone_image,
  1433. X!                                                   NULL),
  1434. X! #else
  1435. X!                       PANEL_LABEL_STRING, "Tel",
  1436. X! #endif
  1437. X!                       PANEL_NOTIFY_PROC,    phone_button,
  1438. X!                       PANEL_ITEM_MENU,    tmpmenu,
  1439. X                        NULL);
  1440. X  
  1441. X  
  1442. X!     print_menu = menu_create(
  1443. X!                              MENU_ACTION_ITEM, 
  1444. X!                              "Print Entry",
  1445. X!                              print_entry,
  1446. X!                              
  1447. X!                              MENU_ACTION_ITEM, 
  1448. X!                              "(S) Print All",
  1449. X!                              print_all,
  1450. X  
  1451. X!                              MENU_ACTION_ITEM,
  1452. X!                              "(C) Print Records Matching Regex",
  1453. X!                              print_regex,
  1454. X  
  1455. X+                              MENU_ITEM,
  1456. X+                              MENU_STRING,
  1457. X+                              defaults_set_search_type_str(),
  1458. X+                              MENU_PULLRIGHT, regex_menu,
  1459. X+                              MENU_CLIENT_DATA, -1,
  1460. X+                              NULL,
  1461. X+                              
  1462. X+                              MENU_ACTION_ITEM,
  1463. X+                              "(C+S) Set Print Command",
  1464. X+                              set_print_command,
  1465. X+                              NULL);
  1466. X+ 
  1467. X      (void) xv_create(panel, PANEL_BUTTON,
  1468. X+ #ifndef OL
  1469. X                       PANEL_LABEL_IMAGE, xv_create(NULL, SERVER_IMAGE,
  1470. X                                                    XV_WIDTH, 32,
  1471. X                                                    XV_HEIGHT, 32,
  1472. X***************
  1473. X*** 446,455 ****
  1474. X                                                    SERVER_IMAGE_BITS,
  1475. X                                                    printer_image,
  1476. X                                                    NULL),
  1477. X                       PANEL_NOTIFY_PROC, print_button,
  1478. X!                      PANEL_ITEM_MENU, tmpmenu,
  1479. X                       XV_Y, xv_row(panel, 1),
  1480. X- 
  1481. X                       NULL);
  1482. X  
  1483. X      tmpmenu = menu_create (
  1484. X--- 503,514 ----
  1485. X                                                    SERVER_IMAGE_BITS,
  1486. X                                                    printer_image,
  1487. X                                                    NULL),
  1488. X+ #else
  1489. X+                      PANEL_LABEL_STRING, "Print",
  1490. X+ #endif
  1491. X                       PANEL_NOTIFY_PROC, print_button,
  1492. X!                      PANEL_ITEM_MENU, print_menu,
  1493. X                       XV_Y, xv_row(panel, 1),
  1494. X                       NULL);
  1495. X  
  1496. X      tmpmenu = menu_create (
  1497. X***************
  1498. X*** 466,477 ****
  1499. X                             done_n_exit,
  1500. X                             NULL);
  1501. X      (void) xv_create (panel, PANEL_BUTTON,
  1502. X!         PANEL_LABEL_IMAGE,    pr_region(buttons2_image, 64, 0, 32, 32, 32),
  1503. X!         PANEL_NOTIFY_PROC,    done_button,
  1504. X!         PANEL_ITEM_MENU,    tmpmenu,
  1505. X!         XV_Y, xv_row(panel, 1),
  1506. X!         0);
  1507. X  
  1508. X      /*
  1509. X       * Tighten up the window around the buttons in the first row, this
  1510. X       * will be the width of the panel window, so we save that size for
  1511. X--- 525,579 ----
  1512. X                             done_n_exit,
  1513. X                             NULL);
  1514. X      (void) xv_create (panel, PANEL_BUTTON,
  1515. X! #ifndef OL
  1516. X!                       PANEL_LABEL_IMAGE,pr_region(buttons2_image,64,0,32,32,32),
  1517. X! #else
  1518. X!                       PANEL_LABEL_STRING, "Fini",
  1519. X! #endif
  1520. X!                       PANEL_NOTIFY_PROC,    done_button,
  1521. X!                       PANEL_ITEM_MENU,    tmpmenu,
  1522. X!                       XV_Y, xv_row(panel, 1),
  1523. X!                       NULL);
  1524. X  
  1525. X+ 
  1526. X+     find_menu = menu_create (
  1527. X+                              MENU_ACTION_ITEM,
  1528. X+                              "    Find Regular Expression, Forward",
  1529. X+                              find_button_forward,
  1530. X+                            
  1531. X+                              MENU_ACTION_ITEM,
  1532. X+                              "(S) Find Regular Expression, Reverse", 
  1533. X+                              find_button_reverse, 
  1534. X+ 
  1535. X+                              MENU_CLIENT_DATA, 
  1536. X+                              defaults_set_search_type(), 
  1537. X+                              
  1538. X+                              MENU_ITEM,
  1539. X+                              MENU_STRING, 
  1540. X+                              defaults_set_search_type_str(),
  1541. X+                              MENU_CLIENT_DATA, -1,
  1542. X+                              MENU_PULLRIGHT, regex_menu,
  1543. X+                              NULL,
  1544. X+                            
  1545. X+                            NULL);
  1546. X+ 
  1547. X+     (void) xv_create (panel, PANEL_BUTTON,
  1548. X+ #ifdef  NEVER
  1549. X+                       PANEL_LABEL_IMAGE, xv_create(NULL, SERVER_IMAGE,
  1550. X+                                                    XV_WIDTH, 32,
  1551. X+                                                    XV_HEIGHT, 32,
  1552. X+                                                    SERVER_IMAGE_BITS,
  1553. X+                                                    find_image,
  1554. X+                                                    NULL),
  1555. X+ #else
  1556. X+                       PANEL_LABEL_STRING, "Find",
  1557. X+ #endif
  1558. X+                       PANEL_ITEM_MENU,    find_menu, 
  1559. X+                       PANEL_NOTIFY_PROC,    find_button,
  1560. X+                       XV_Y, xv_row(panel, 2),
  1561. X+                       XV_X, xv_col(panel, 0),
  1562. X+                       NULL);
  1563. X+ 
  1564. X      /*
  1565. X       * Tighten up the window around the buttons in the first row, this
  1566. X       * will be the width of the panel window, so we save that size for
  1567. X***************
  1568. X*** 481,509 ****
  1569. X      window_fit_width (panel); 
  1570. X      panel_width = (int) xv_get (panel, XV_WIDTH);
  1571. X      panel_columns = (int) xv_get (panel, WIN_COLUMNS);
  1572. X- 
  1573. X-     /*
  1574. X-      * Begin second row, set the inter-item gap so the Find button and
  1575. X-      * the text item following it are placed nicely.
  1576. X-      */
  1577. X-     xv_set (panel, PANEL_ITEM_X_GAP, 8, 0);
  1578. X- 
  1579. X      regex_item = xv_create (panel, PANEL_TEXT,
  1580. X                              PANEL_BLINK_CARET,        TRUE,
  1581. X!                             PANEL_LABEL_STRING,        "Find Expression:",
  1582. X!                             PANEL_VALUE_DISPLAY_LENGTH,    panel_width - 344,
  1583. X!                             XV_X, xv_col(panel, 0),
  1584. X                              XV_Y, xv_row(panel, 2),
  1585. X                              PANEL_VALUE_STORED_LENGTH,    80,
  1586. X                              PANEL_NOTIFY_PROC,    find_button,
  1587. X                              0);
  1588. X  
  1589. X-     /*
  1590. X-      * Begin the third row, squeeze the inter-item gap back down so that
  1591. X-      * the slider value is displayed close to the slider bar.
  1592. X-      */
  1593. X-     xv_set (panel, PANEL_ITEM_X_GAP, 4, 0);
  1594. X  
  1595. X      tmpmenu = menu_create (
  1596. X                  MENU_ITEM,
  1597. X                      MENU_STRING,    "Pick a card, any card",
  1598. X--- 583,599 ----
  1599. X      window_fit_width (panel); 
  1600. X      panel_width = (int) xv_get (panel, XV_WIDTH);
  1601. X      panel_columns = (int) xv_get (panel, WIN_COLUMNS);
  1602. X      regex_item = xv_create (panel, PANEL_TEXT,
  1603. X                              PANEL_BLINK_CARET,        TRUE,
  1604. X!                             PANEL_LABEL_STRING,        "Expression:",
  1605. X!                             PANEL_VALUE_DISPLAY_LENGTH,    panel_width - 349,
  1606. X                              XV_Y, xv_row(panel, 2),
  1607. X                              PANEL_VALUE_STORED_LENGTH,    80,
  1608. X                              PANEL_NOTIFY_PROC,    find_button,
  1609. X                              0);
  1610. X  
  1611. X  
  1612. X+ 
  1613. X      tmpmenu = menu_create (
  1614. X                  MENU_ITEM,
  1615. X                      MENU_STRING,    "Pick a card, any card",
  1616. X***************
  1617. X*** 926,942 ****
  1618. X  static Frame file_frame;
  1619. X  static Panel file_panel;
  1620. X  static Panel_item file_item;
  1621. X! static char FileName[256];
  1622. X! static int FileLoad;
  1623. X! static void file_ok_proc()
  1624. X  {
  1625. X!     strcpy(FileName, xv_get(file_item, PANEL_VALUE));
  1626. X!     xv_set(file_frame, WIN_SHOW, FALSE, NULL);
  1627. X!     FileLoad ? do_read_rolo(FileName) : do_write_rolo(FileName);
  1628. X  }
  1629. X  static void file_cancel_proc()
  1630. X  {
  1631. X!     xv_set(file_frame, WIN_SHOW, FALSE, NULL);
  1632. X  }
  1633. X  
  1634. X  static void do_create_file_frame(item, event)
  1635. X--- 1016,1034 ----
  1636. X  static Frame file_frame;
  1637. X  static Panel file_panel;
  1638. X  static Panel_item file_item;
  1639. X! static void load_from_file_proc()
  1640. X  {
  1641. X!     do_read_rolo(xv_get(file_item, PANEL_VALUE));
  1642. X  }
  1643. X+ 
  1644. X+ static void save_to_file_proc()
  1645. X+ {
  1646. X+     do_write_rolo(xv_get(file_item, PANEL_VALUE));
  1647. X+ }
  1648. X+ 
  1649. X  static void file_cancel_proc()
  1650. X  {
  1651. X!     xv_set(file_frame, XV_SHOW, FALSE, NULL);
  1652. X  }
  1653. X  
  1654. X  static void do_create_file_frame(item, event)
  1655. X***************
  1656. X*** 944,969 ****
  1657. X  Event      *event;
  1658. X  {
  1659. X      file_frame = xv_create(frame, FRAME,
  1660. X!                             XV_LABEL, "Set File Name",
  1661. X!                             FRAME_SHOW_LABEL, TRUE,
  1662. X!                             NULL);
  1663. X      file_panel = xv_create(file_frame, PANEL, NULL);
  1664. X      file_item = xv_create(file_panel, PANEL_TEXT,
  1665. X                               XV_X, 4,
  1666. X!                              XV_Y, 4,
  1667. X                               PANEL_LABEL_STRING, "File Name:", 
  1668. X                               PANEL_VALUE_STORED_LENGTH, 256,
  1669. X!                              PANEL_VALUE_DISPLAY_LENGTH, 40,
  1670. X                               NULL);
  1671. X      xv_create(file_panel, PANEL_BUTTON,
  1672. X!               PANEL_LABEL_STRING, "   OK   ",
  1673. X!               XV_X, 450,
  1674. X!               XV_Y, 4,
  1675. X!               PANEL_NOTIFY_PROC, file_ok_proc,
  1676. X                NULL);
  1677. X      xv_create(file_panel, PANEL_BUTTON,
  1678. X                PANEL_LABEL_STRING, "Cancel",
  1679. X!               XV_X, 450,
  1680. X                XV_Y, 35,
  1681. X                PANEL_NOTIFY_PROC, file_cancel_proc,
  1682. X                NULL);
  1683. X--- 1036,1072 ----
  1684. X  Event      *event;
  1685. X  {
  1686. X      file_frame = xv_create(frame, FRAME,
  1687. X!                            FRAME_LABEL, "File IO",
  1688. X!                            FRAME_SHOW_LABEL, TRUE,
  1689. X!                            NULL);
  1690. X! /*
  1691. X!     file_panel = xv_get(file_frame, FRAME_CMD_PANEL);
  1692. X! */
  1693. X      file_panel = xv_create(file_frame, PANEL, NULL);
  1694. X+ 
  1695. X      file_item = xv_create(file_panel, PANEL_TEXT,
  1696. X                               XV_X, 4,
  1697. X!                              XV_Y, 6,
  1698. X                               PANEL_LABEL_STRING, "File Name:", 
  1699. X                               PANEL_VALUE_STORED_LENGTH, 256,
  1700. X!                              PANEL_VALUE_DISPLAY_LENGTH, 30,
  1701. X                               NULL);
  1702. X+ 
  1703. X      xv_create(file_panel, PANEL_BUTTON,
  1704. X!               PANEL_LABEL_STRING, "Load From File",
  1705. X!               XV_X, 4,
  1706. X!               XV_Y, 35,
  1707. X!               PANEL_NOTIFY_PROC, load_from_file_proc,
  1708. X                NULL);
  1709. X      xv_create(file_panel, PANEL_BUTTON,
  1710. X+               PANEL_LABEL_STRING, "Save To File",
  1711. X+               XV_X, 120,
  1712. X+               XV_Y, 35,
  1713. X+               PANEL_NOTIFY_PROC, save_to_file_proc,
  1714. X+               NULL);
  1715. X+     xv_create(file_panel, PANEL_BUTTON,
  1716. X                PANEL_LABEL_STRING, "Cancel",
  1717. X!               XV_X, 220,
  1718. X                XV_Y, 35,
  1719. X                PANEL_NOTIFY_PROC, file_cancel_proc,
  1720. X                NULL);
  1721. X***************
  1722. X*** 971,1011 ****
  1723. X      window_fit(file_frame);
  1724. X  }
  1725. X  
  1726. X! static void get_file_name(fileload)
  1727. X! int fileload;
  1728. X  {
  1729. X      static int firsttime = 1;
  1730. X      if (firsttime) {
  1731. X          do_create_file_frame();
  1732. X          firsttime = 0;
  1733. X      }
  1734. X!     FileLoad = fileload;
  1735. X!     xv_set(file_frame, WIN_SHOW, TRUE, NULL);
  1736. X  }
  1737. X  
  1738. X! static void file_button_load (item, event)
  1739. X  Panel_item    item;
  1740. X  Event        *event;
  1741. X  {
  1742. X-     char *filename;
  1743. X      if ( in_file_button ) {
  1744. X          in_file_button = 0;
  1745. X          return;
  1746. X      }
  1747. X      save_card (current);
  1748. X!     filename = get_selection ();
  1749. X!     if ( filename == NULL ) {
  1750. X!         get_file_name(1);
  1751. X!         return;
  1752. X!     } else if ( !confirm("Load from file %s?", filename) ) {
  1753. X!         return;
  1754. X!     }
  1755. X!     
  1756. X!     if (filename == NULL || filename[0] == '\0' ) {
  1757. X!         msg ("No active selection, need a filename to load from");
  1758. X!         return;
  1759. X!     }
  1760. X!     do_read_rolo(filename);
  1761. X  }
  1762. X  
  1763. X  do_read_rolo(filename)
  1764. X--- 1074,1103 ----
  1765. X      window_fit(file_frame);
  1766. X  }
  1767. X  
  1768. X! static void do_file_io_panel()
  1769. X  {
  1770. X      static int firsttime = 1;
  1771. X+     char *cp = get_selection();
  1772. X      if (firsttime) {
  1773. X          do_create_file_frame();
  1774. X          firsttime = 0;
  1775. X      }
  1776. X!     if ( cp != NULL ) {
  1777. X!         xv_set(file_item, PANEL_VALUE, cp);
  1778. X!     }
  1779. X!     xv_set(file_frame, XV_SHOW, TRUE, NULL);
  1780. X  }
  1781. X  
  1782. X! static void file_button_io (item, event)
  1783. X  Panel_item    item;
  1784. X  Event        *event;
  1785. X  {
  1786. X      if ( in_file_button ) {
  1787. X          in_file_button = 0;
  1788. X          return;
  1789. X      }
  1790. X      save_card (current);
  1791. X!     do_file_io_panel();
  1792. X  }
  1793. X  
  1794. X  do_read_rolo(filename)
  1795. X***************
  1796. X*** 1028,1058 ****
  1797. X      }
  1798. X      write_rolo (filename);
  1799. X  }
  1800. X- static void file_button_save_to_file (item, event)
  1801. X- Panel_item    item;
  1802. X- Event        *event;
  1803. X- {
  1804. X-     char *filename;
  1805. X-     if ( in_file_button ) {
  1806. X-         in_file_button = 0;
  1807. X-         return;
  1808. X-     }
  1809. X-     save_card (current);
  1810. X-     filename = get_selection ();
  1811. X-     if (filename == NULL ) {
  1812. X-         get_file_name(0);
  1813. X-         return;
  1814. X-     } else if ( !confirm("Save to file %s?", filename) ) {
  1815. X-         return;
  1816. X-     }
  1817. X-     if (filename == NULL || filename[0] == '\0' ) {
  1818. X-         msg ("No active selection, need a filename to save to");
  1819. X-         return;
  1820. X-     }
  1821. X-     do_write_rolo(filename);
  1822. X- }
  1823. X- 
  1824. X- /*ARGSUSED*/
  1825. X  static void file_button (item, event)
  1826. X  Panel_item    item;
  1827. X  Event        *event;
  1828. X--- 1120,1125 ----
  1829. X***************
  1830. X*** 1067,1093 ****
  1831. X          file_button_save(item, event);
  1832. X          break;
  1833. X  
  1834. X!     case SHIFT_CLICK:            /* reload, no save first */
  1835. X          file_button_reload(item, event);
  1836. X          break;
  1837. X  
  1838. X!     case CTRL_CLICK:            /* sort ascending */
  1839. X          file_button_sort(item, event);
  1840. X          break;
  1841. X  
  1842. X!     case CTRL_SHIFT_CLICK:            /* sort descending */
  1843. X          file_button_sort_backwards(item, event);
  1844. X          break;
  1845. X  
  1846. X!     case META_CLICK:            /* load named file */
  1847. X!         file_button_load(item, event);
  1848. X          break;
  1849. X  
  1850. X!     case META_SHIFT_CLICK:            /* store to named file */
  1851. X!         file_button_save_to_file(item, event);
  1852. X!         break;
  1853. X! 
  1854. X!     default:                /* say what? */
  1855. X          no_comprendo (event, "file_button");
  1856. X          return;
  1857. X      }
  1858. X--- 1134,1156 ----
  1859. X          file_button_save(item, event);
  1860. X          break;
  1861. X  
  1862. X!       case SHIFT_CLICK:            /* reload, no save first */
  1863. X          file_button_reload(item, event);
  1864. X          break;
  1865. X  
  1866. X!       case CTRL_CLICK:            /* sort ascending */
  1867. X          file_button_sort(item, event);
  1868. X          break;
  1869. X  
  1870. X!       case CTRL_SHIFT_CLICK:            /* sort descending */
  1871. X          file_button_sort_backwards(item, event);
  1872. X          break;
  1873. X  
  1874. X!       case META_CTRL_CLICK:            /* load named file */
  1875. X!         file_button_io(item, event);
  1876. X          break;
  1877. X  
  1878. X!       default:                /* say what? */
  1879. X          no_comprendo (event, "file_button");
  1880. X          return;
  1881. X      }
  1882. X***************
  1883. X*** 1207,1212 ****
  1884. X--- 1270,1276 ----
  1885. X   */
  1886. X  static char Print_Command[256] = "lpr";
  1887. X  static int First_Print_Call = 1;
  1888. X+ static int in_print_button = 0;
  1889. X  
  1890. X  get_print_resource()
  1891. X  {
  1892. X***************
  1893. X*** 1221,1226 ****
  1894. X--- 1285,1315 ----
  1895. X  Panel_item item;
  1896. X  Event      *event;
  1897. X  {
  1898. X+     if ( event_action(event) == ACTION_MENU )
  1899. X+       return;
  1900. X+ 
  1901. X+     switch (value_from_mask (event)) {
  1902. X+       case PLAIN_CLICK:            /* Plain save */
  1903. X+         print_entry(item, event);
  1904. X+         break;
  1905. X+ 
  1906. X+       case SHIFT_CLICK:            /* reload, no save first */
  1907. X+         print_all(item, event);
  1908. X+         break;
  1909. X+ 
  1910. X+       case CTRL_CLICK:            /* sort ascending */
  1911. X+         print_regex(item, event);
  1912. X+         break;
  1913. X+ 
  1914. X+       case CTRL_SHIFT_CLICK:            /* sort descending */
  1915. X+         set_print_command(item, event);
  1916. X+         break;
  1917. X+ 
  1918. X+       default:                /* say what? */
  1919. X+         no_comprendo (event, "file_button");
  1920. X+         return;
  1921. X+     }
  1922. X+     in_print_button = 1;
  1923. X  }
  1924. X  
  1925. X  static void print_entry(item, event)
  1926. X***************
  1927. X*** 1227,1252 ****
  1928. X  Panel_item item;
  1929. X  Event      *event;
  1930. X  {
  1931. X!     FILE *fp = popen(Print_Command, "w");
  1932. X      if (First_Print_Call)
  1933. X        get_print_resource();
  1934. X      save_card(current);
  1935. X      fprintf(fp, "%s\n", current->c_text);
  1936. X      pclose(fp);
  1937. X  }
  1938. X  
  1939. X  static void print_all(item, event)
  1940. X  Panel_item item;
  1941. X  Event      *event;
  1942. X  {
  1943. X      struct card *p;
  1944. X!     int i;
  1945. X!     FILE *fp = popen(Print_Command, "w");
  1946. X      if (First_Print_Call)
  1947. X        get_print_resource();
  1948. X      save_card(current);
  1949. X!     for (p = first, i =0; p != NULL_CARD; i++, p=p->c_next)
  1950. X!       fprintf(fp, "Record # %d \n%s\n\n", i, p->c_text);
  1951. X      pclose(fp);
  1952. X  }
  1953. X  
  1954. X--- 1316,1387 ----
  1955. X  Panel_item item;
  1956. X  Event      *event;
  1957. X  {
  1958. X!     FILE *fp;
  1959. X!     if ( in_print_button ) {
  1960. X!         in_print_button = 0;
  1961. X!         return;
  1962. X!     }
  1963. X      if (First_Print_Call)
  1964. X        get_print_resource();
  1965. X+     fp = popen(Print_Command, "w");
  1966. X+     if ( fp == NULL ) {
  1967. X+         confirm("Could not execute print command %s", Print_Command);
  1968. X+         return;
  1969. X+     }
  1970. X      save_card(current);
  1971. X      fprintf(fp, "%s\n", current->c_text);
  1972. X      pclose(fp);
  1973. X  }
  1974. X  
  1975. X+ static void print_regex(item, event)
  1976. X+ Panel_item item;
  1977. X+ Event      *event;
  1978. X+ {
  1979. X+     struct card *p;
  1980. X+     int search_type = xv_get(find_menu, MENU_CLIENT_DATA);
  1981. X+     char *match();
  1982. X+     FILE *fp;
  1983. X+     if ( in_print_button ) {
  1984. X+         in_print_button = 0;
  1985. X+         return;
  1986. X+     }
  1987. X+     if ( !init_find_button(search_type) )
  1988. X+       return;
  1989. X+     if (First_Print_Call)
  1990. X+       get_print_resource();
  1991. X+     fp = popen(Print_Command, "w");
  1992. X+     if ( fp == NULL ) {
  1993. X+         confirm("Could not execute print command %s", Print_Command);
  1994. X+         return;
  1995. X+     }
  1996. X+     save_card(current);
  1997. X+     for (p = first; p != NULL_CARD; p=p->c_next) {
  1998. X+         if ( match(p->c_text, search_type) )
  1999. X+           fprintf(fp, "Record # %d \n%s\n\n", p->c_num, p->c_text);
  2000. X+     }
  2001. X+     pclose(fp);
  2002. X+ }
  2003. X+ 
  2004. X  static void print_all(item, event)
  2005. X  Panel_item item;
  2006. X  Event      *event;
  2007. X  {
  2008. X      struct card *p;
  2009. X!     FILE *fp;
  2010. X!     if ( in_print_button ) {
  2011. X!         in_print_button = 0;
  2012. X!         return;
  2013. X!     }
  2014. X      if (First_Print_Call)
  2015. X        get_print_resource();
  2016. X+     fp = popen(Print_Command, "w");
  2017. X+     if ( fp == NULL ) {
  2018. X+         confirm("Could not execute print command %s", Print_Command);
  2019. X+         return;
  2020. X+     }
  2021. X      save_card(current);
  2022. X!     for (p = first; p != NULL_CARD; p=p->c_next)
  2023. X!       fprintf(fp, "Record # %d \n%s\n\n", p->c_num, p->c_text);
  2024. X      pclose(fp);
  2025. X  }
  2026. X  
  2027. X***************
  2028. X*** 1270,1275 ****
  2029. X--- 1405,1414 ----
  2030. X  Event      *event;
  2031. X  {
  2032. X      static int firsttime = 1;
  2033. X+     if ( in_print_button ) {
  2034. X+         in_print_button = 0;
  2035. X+         return;
  2036. X+     }
  2037. X      if ( firsttime ) {
  2038. X          firsttime = 0;
  2039. X          if (First_Print_Call)
  2040. X***************
  2041. X*** 1506,1517 ****
  2042. X  {
  2043. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2044. X                                    MENU_CLIENT_DATA, -1, NULL);
  2045. X!     if ( find_item == NULL ) {
  2046. X!         confirm("turn_on_sloppy: Bad news!");
  2047. X          return;
  2048. X      }
  2049. X      xv_set(find_item, MENU_STRING, SLOPPY_EXPR_STR, NULL);
  2050. X      xv_set(find_menu, MENU_CLIENT_DATA, SLOPPY);
  2051. X  }
  2052. X  
  2053. X  static void turn_on_egrep(item, event)
  2054. X--- 1645,1664 ----
  2055. X  {
  2056. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2057. X                                    MENU_CLIENT_DATA, -1, NULL);
  2058. X!     Menu_item list_item = xv_find(list_menu, MENUITEM,
  2059. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2060. X!     Menu_item print_item = xv_find(print_menu, MENUITEM,
  2061. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2062. X! 
  2063. X!     if ( find_item == NULL || list_item == NULL ) {
  2064. X!         confirm("turn_on_sloppy: Bad news! xrolo internal error");
  2065. X          return;
  2066. X      }
  2067. X      xv_set(find_item, MENU_STRING, SLOPPY_EXPR_STR, NULL);
  2068. X+     xv_set(list_item, MENU_STRING, SLOPPY_EXPR_STR, NULL);
  2069. X+     xv_set(print_item, MENU_STRING, SLOPPY_EXPR_STR, NULL);
  2070. X      xv_set(find_menu, MENU_CLIENT_DATA, SLOPPY);
  2071. X+ 
  2072. X  }
  2073. X  
  2074. X  static void turn_on_egrep(item, event)
  2075. X***************
  2076. X*** 1520,1530 ****
  2077. X  {
  2078. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2079. X                                    MENU_CLIENT_DATA, -1, NULL);
  2080. X!     if ( find_item == NULL ) {
  2081. X!         confirm("turn_on_egrep: Bad news!");
  2082. X          return;
  2083. X      }
  2084. X      xv_set(find_item, MENU_STRING, EGREP_EXPR_STR, NULL);
  2085. X      xv_set(find_menu, MENU_CLIENT_DATA, EGREP);
  2086. X  }
  2087. X  
  2088. X--- 1667,1683 ----
  2089. X  {
  2090. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2091. X                                    MENU_CLIENT_DATA, -1, NULL);
  2092. X!     Menu_item list_item = xv_find(list_menu, MENUITEM, 
  2093. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2094. X!     Menu_item print_item = xv_find(print_menu, MENUITEM, 
  2095. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2096. X!     if ( find_item == NULL || list_item == NULL) {
  2097. X!         confirm("turn_on_egrep: Bad news! xrolo internal error");
  2098. X          return;
  2099. X      }
  2100. X      xv_set(find_item, MENU_STRING, EGREP_EXPR_STR, NULL);
  2101. X+     xv_set(list_item, MENU_STRING, EGREP_EXPR_STR, NULL);
  2102. X+     xv_set(print_item, MENU_STRING, EGREP_EXPR_STR, NULL);
  2103. X      xv_set(find_menu, MENU_CLIENT_DATA, EGREP);
  2104. X  }
  2105. X  
  2106. X***************
  2107. X*** 1534,1544 ****
  2108. X  {
  2109. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2110. X                                    MENU_CLIENT_DATA, -1, NULL);
  2111. X!     if ( find_item == NULL ) {
  2112. X!         confirm("turn_on_soundex: Bad news!");
  2113. X          return;
  2114. X      }
  2115. X      xv_set(find_item, MENU_STRING, SOUNDEX_EXPR_STR, NULL);
  2116. X      xv_set(find_menu, MENU_CLIENT_DATA, SOUNDEX);
  2117. X  }
  2118. X  
  2119. X--- 1687,1703 ----
  2120. X  {
  2121. X      Menu_item find_item = xv_find(find_menu, MENUITEM, 
  2122. X                                    MENU_CLIENT_DATA, -1, NULL);
  2123. X!     Menu_item list_item = xv_find(list_menu, MENUITEM, 
  2124. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2125. X!     Menu_item print_item = xv_find(print_menu, MENUITEM, 
  2126. X!                                   MENU_CLIENT_DATA, -1, NULL);
  2127. X!     if ( find_item == NULL || list_item == NULL ) {
  2128. X!         confirm("turn_on_soundex: Bad news! xrolo internal error");
  2129. X          return;
  2130. X      }
  2131. X      xv_set(find_item, MENU_STRING, SOUNDEX_EXPR_STR, NULL);
  2132. X+     xv_set(list_item, MENU_STRING, SOUNDEX_EXPR_STR, NULL);
  2133. X+     xv_set(print_item, MENU_STRING, SOUNDEX_EXPR_STR, NULL);
  2134. X      xv_set(find_menu, MENU_CLIENT_DATA, SOUNDEX);
  2135. X  }
  2136. X  
  2137. X***************
  2138. X*** 1559,1571 ****
  2139. X      if (event_action(event) == ACTION_MENU )
  2140. X        return;
  2141. X  
  2142. X!     if (value_from_mask (event) == SHIFT_CLICK ) {
  2143. X          if (xv_get(list_item, MENU_INACTIVE) == FALSE) {
  2144. X              list_goto_button(item, event);
  2145. X-             in_list_button = 1;
  2146. X-             return;
  2147. X          }
  2148. X      }
  2149. X  }
  2150. X  
  2151. X  char *catbuf(buf, str)
  2152. X--- 1718,1737 ----
  2153. X      if (event_action(event) == ACTION_MENU )
  2154. X        return;
  2155. X  
  2156. X!     switch (value_from_mask (event) ) {
  2157. X!       case SHIFT_CLICK: 
  2158. X          if (xv_get(list_item, MENU_INACTIVE) == FALSE) {
  2159. X              list_goto_button(item, event);
  2160. X          }
  2161. X+         break;
  2162. X+       case CTRL_CLICK:
  2163. X+         list_button_match(item,event);
  2164. X+         break;
  2165. X+       default:
  2166. X+         list_button(item, event);
  2167. X+         break;
  2168. X      }
  2169. X+     in_list_button = 1;
  2170. X  }
  2171. X  
  2172. X  char *catbuf(buf, str)
  2173. X***************
  2174. X*** 1582,1591 ****
  2175. X      return(buf);
  2176. X  }
  2177. X  
  2178. X  /*ARGSUSED*/
  2179. X! static void list_button (item, event)
  2180. X      Panel_item    item;
  2181. X      Event        *event;
  2182. X  {
  2183. X      struct card     *p;
  2184. X      void notify_proc();
  2185. X--- 1748,1782 ----
  2186. X      return(buf);
  2187. X  }
  2188. X  
  2189. X+ static void list_button_egrep();
  2190. X+ 
  2191. X+ static void list_button(item, event)
  2192. X+     Panel_item    item;
  2193. X+     Event        *event;
  2194. X+ {
  2195. X+     char *cp=re_comp("..");
  2196. X+     if ( cp ) {
  2197. X+         fprintf(stderr,cp);
  2198. X+         abort();
  2199. X+     }
  2200. X+     list_button_egrep(item, event, EGREP);
  2201. X+ }
  2202. X+ 
  2203. X+ static void list_button_match(item, event)
  2204. X+     Panel_item    item;
  2205. X+     Event        *event;
  2206. X+ {
  2207. X+     int search_type = xv_get(find_menu, MENU_CLIENT_DATA);
  2208. X+     if ( !init_find_button(search_type) )
  2209. X+       return;
  2210. X+     list_button_egrep(item, event, search_type);
  2211. X+ }
  2212. X+ 
  2213. X  /*ARGSUSED*/
  2214. X! static void list_button_egrep (item, event, search_type)
  2215. X      Panel_item    item;
  2216. X      Event        *event;
  2217. X+     int         search_type;
  2218. X  {
  2219. X      struct card     *p;
  2220. X      void notify_proc();
  2221. X***************
  2222. X*** 1593,1598 ****
  2223. X--- 1784,1790 ----
  2224. X  
  2225. X  #ifndef DONT_USE_MALLOC_LIST
  2226. X      char *index_buf = NULL;
  2227. X+     char *index_current;
  2228. X      int len;
  2229. X  #endif
  2230. X  
  2231. X***************
  2232. X*** 1612,1633 ****
  2233. X      textsw_reset (rolocard, 0, 0);        /* clear the text window */
  2234. X  
  2235. X  #ifndef DONT_USE_MALLOC_LIST
  2236. X      for (p = first; p != NULL_CARD; p = p->c_next) {
  2237. X          char    *nl;
  2238. X          char    line_buf [MAX_INDEX_LINE + 2];
  2239. X  
  2240. X!         (void) sprintf (line_buf, "%d: ", p->c_num);    /* prepend # */
  2241. X!         (void) strncat (line_buf, first_char (p->c_text),
  2242. X!             MAX_INDEX_LINE);
  2243. X!         line_buf [MAX_INDEX_LINE] = 0;    /* make sure it's terminated */
  2244. X  
  2245. X!         (void) strcat (line_buf, "\n");    /* make sure of newline */
  2246. X!         nl = index (line_buf, '\n');
  2247. X!         *++nl = '\0';            /* chop at first line break */
  2248. X!         index_buf = catbuf (index_buf, line_buf);
  2249. X      }
  2250. X  
  2251. X-     len = strlen (index_buf);
  2252. X      window_set (rolocard, TEXTSW_MEMORY_MAXIMUM, len + 20000, 0);
  2253. X  
  2254. X      (void) textsw_insert (rolocard, index_buf, len);
  2255. X--- 1804,1853 ----
  2256. X      textsw_reset (rolocard, 0, 0);        /* clear the text window */
  2257. X  
  2258. X  #ifndef DONT_USE_MALLOC_LIST
  2259. X+ 
  2260. X+     /*  first calculate length of string to insert, then actually */
  2261. X+     /*  malloc the string and put the text into it.  even though this */
  2262. X+     /*  means two list traversals, for really large lists it will */
  2263. X+     /*  probably save a lot of time.  */
  2264. X+ 
  2265. X+     len = 0;
  2266. X      for (p = first; p != NULL_CARD; p = p->c_next) {
  2267. X          char    *nl;
  2268. X          char    line_buf [MAX_INDEX_LINE + 2];
  2269. X  
  2270. X!         if ( match(p->c_text, search_type) ) {
  2271. X!             (void) sprintf (line_buf, "%d: ", p->c_num);    /* prepend # */
  2272. X!             (void) strncat (line_buf, first_char (p->c_text),
  2273. X!                             MAX_INDEX_LINE);
  2274. X!             line_buf [MAX_INDEX_LINE] = 0;    /* make sure it's terminated */
  2275. X!             
  2276. X!             (void) strcat (line_buf, "\n");    /* make sure of newline */
  2277. X!             nl = index (line_buf, '\n');
  2278. X!             *++nl = '\0';            /* chop at first line break */
  2279. X!             len += strlen (line_buf);
  2280. X!         }
  2281. X!     }
  2282. X!     index_buf = malloc (len);
  2283. X  
  2284. X!     index_current = index_buf;    /* strcat slower than strcpy */
  2285. X!     for (p = first; p != NULL_CARD; p = p->c_next) {
  2286. X!         char    *nl;
  2287. X!         char    line_buf [MAX_INDEX_LINE + 2];
  2288. X! 
  2289. X!         if ( match(p->c_text, search_type) ) {
  2290. X!             (void) sprintf (line_buf, "%d: ", p->c_num);    /* prepend # */
  2291. X!             (void) strncat (line_buf, first_char (p->c_text),
  2292. X!                             MAX_INDEX_LINE);
  2293. X!             line_buf [MAX_INDEX_LINE] = 0;    /* make sure it's terminated */
  2294. X! 
  2295. X!             (void) strcat (line_buf, "\n");    /* make sure of newline */
  2296. X!             nl = index (line_buf, '\n');
  2297. X!             *++nl = '\0';            /* chop after first line break */
  2298. X!             strcpy (index_current, line_buf);
  2299. X!             index_current = index (index_current, '\n') + 1;
  2300. X!         }
  2301. X      }
  2302. X  
  2303. X      window_set (rolocard, TEXTSW_MEMORY_MAXIMUM, len + 20000, 0);
  2304. X  
  2305. X      (void) textsw_insert (rolocard, index_buf, len);
  2306. X***************
  2307. X*** 1637,1653 ****
  2308. X          char    *nl;
  2309. X          char    line_buf [MAX_INDEX_LINE + 2];
  2310. X  
  2311. X!         (void) sprintf (line_buf, "%d: ", p->c_num);/* prepend number */
  2312. X!         textsw_insert (rolocard, line_buf, strlen (line_buf));
  2313. X  
  2314. X!         (void) strncpy (line_buf, first_char (p->c_text),
  2315. X!             MAX_INDEX_LINE);
  2316. X!         line_buf [MAX_INDEX_LINE] = 0;    /* make sure it's terminated */
  2317. X! 
  2318. X!         (void) strcat (line_buf, "\n");    /* make sure of newline */
  2319. X!         nl = index (line_buf, '\n');
  2320. X!         *++nl = '\0';            /* chop at first line break */
  2321. X!         textsw_insert (rolocard, line_buf, strlen (line_buf));
  2322. X      }
  2323. X  #endif
  2324. X  
  2325. X--- 1857,1875 ----
  2326. X          char    *nl;
  2327. X          char    line_buf [MAX_INDEX_LINE + 2];
  2328. X  
  2329. X!         if ( match(p->c_text, search_type) ) {
  2330. X!             (void) sprintf (line_buf, "%d: ", p->c_num);/* prepend number */
  2331. X!             textsw_insert (rolocard, line_buf, strlen (line_buf));
  2332. X  
  2333. X!             (void) strncpy (line_buf, first_char (p->c_text),
  2334. X!                             MAX_INDEX_LINE);
  2335. X!             line_buf [MAX_INDEX_LINE] = 0;    /* make sure it's terminated */
  2336. X!             
  2337. X!             (void) strcat (line_buf, "\n");    /* make sure of newline */
  2338. X!             nl = index (line_buf, '\n');
  2339. X!             *++nl = '\0';            /* chop at first line break */
  2340. X!             textsw_insert (rolocard, line_buf, strlen (line_buf));
  2341. X!         }
  2342. X      }
  2343. X  #endif
  2344. X  
  2345. X***************
  2346. X*** 2008,2014 ****
  2347. X   *    current primary selection to get.
  2348. X   */
  2349. X  
  2350. X! static char *
  2351. X  get_selection()
  2352. X  {
  2353. X      static Seln_holder    holder;
  2354. X--- 2230,2236 ----
  2355. X   *    current primary selection to get.
  2356. X   */
  2357. X  
  2358. X! char *
  2359. X  get_selection()
  2360. X  {
  2361. X      static Seln_holder    holder;
  2362. X***************
  2363. X*** 2050,2056 ****
  2364. X   *    the value initially passed into mask_from_menu_value().
  2365. X   */
  2366. X  
  2367. X- static
  2368. X  int
  2369. X  value_from_mask (event)
  2370. X      Event    *event;
  2371. X--- 2272,2277 ----
  2372. X*** patchlevel.h    Fri Feb 15 14:34:49 1991
  2373. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/patchlevel.h    Fri Feb 15 14:23:59 1991
  2374. X***************
  2375. X*** 1 ****
  2376. X! #define PATCHLEVEL 4
  2377. X--- 1 ----
  2378. X! #define PATCHLEVEL 5
  2379. X*** xrolo.man    Fri Feb 15 14:34:50 1991
  2380. X--- /lutetia/luis/src/xrolo/xrolo.v2.5/xrolo.man    Fri Feb 15 14:23:48 1991
  2381. X***************
  2382. X*** 100,105 ****
  2383. X--- 100,110 ----
  2384. X  desired entry followed by a <SHIFT>-click
  2385. X  on the list button (or use the list button 
  2386. X  menu) to bring up the selected card.
  2387. X+ The "List Cards Matching Regex" menu
  2388. X+ entry produces an index list of cards
  2389. X+ matching the regular expression in the
  2390. X+ Expression text panel using the selected
  2391. X+ match type.
  2392. X  .TP
  2393. X  FILE BUTTON
  2394. X  This button loads and saves your rolodex
  2395. X***************
  2396. X*** 116,128 ****
  2397. X  by selecting the case [In]Sensitive pullright
  2398. X  menu or by setting the "xrolo.CaseInsensitiveSort"
  2399. X  resource to 0 or 1. Xrolo implements a very 
  2400. X! rudimentary field sort. each line in the card
  2401. X!  is considered to be a field. Pointing and
  2402. X  clicking on a selected field before invoking
  2403. X  the sort will cause xrolo to sort the cards
  2404. X! by the selected field. The last two items on the menu, which
  2405. X  can only be selected from the menu, will load
  2406. X! from or save to a named file.  You must select
  2407. X  a string in some window to provide the file
  2408. X  name, similar to the way the
  2409. X  .I TextEdit
  2410. X--- 121,133 ----
  2411. X  by selecting the case [In]Sensitive pullright
  2412. X  menu or by setting the "xrolo.CaseInsensitiveSort"
  2413. X  resource to 0 or 1. Xrolo implements a very 
  2414. X! rudimentary field sort. Each line in the card
  2415. X! is considered to be a field. Pointing and
  2416. X  clicking on a selected field before invoking
  2417. X  the sort will cause xrolo to sort the cards
  2418. X! by the selected field. The last item on the menu, which
  2419. X  can only be selected from the menu, will load
  2420. X! from or save to a named file.  You can select
  2421. X  a string in some window to provide the file
  2422. X  name, similar to the way the
  2423. X  .I TextEdit
  2424. X***************
  2425. X*** 141,148 ****
  2426. X  existing files, etc.
  2427. X  .TP
  2428. X  HELP BUTTON
  2429. X! Displays the information you're reading now.
  2430. X  .TP
  2431. X  FINISHED BUTTON
  2432. X     This button is used when you are finished
  2433. X  using
  2434. X--- 146,179 ----
  2435. X  existing files, etc.
  2436. X  .TP
  2437. X  HELP BUTTON
  2438. X! Displays the information you're reading now
  2439. X! and allows you to send mail to me.
  2440. X  .TP
  2441. X+ PHONE BUTTON
  2442. X+ On SparcStations this button can be used to
  2443. X+ dial a number entered in the expression field
  2444. X+ or highlighted with the mouse.  When selected
  2445. X+ the "Set Phone Attributes\" menu item creates
  2446. X+ a panel that allows speaker volume adjustment,
  2447. X+ the entering of a dial prefix and the enabling
  2448. X+ or disabling of the dial prefix.  Phone
  2449. X+ numbers and dial prefixes may consist of any
  2450. X+ alpha numeric character, *, # and \",\". 
  2451. X+ A comma in the dial string causes the dial
  2452. X+ routine to pause for 2 seconds before
  2453. X+ dialing the next character in the sequence.
  2454. X+ Xrolo supports several X resources used to
  2455. X+ to control default phone attributes.
  2456. X+ "xrolo.DefaultVolume" sets the default
  2457. X+ speaker volume. The volume must be entered
  2458. X+ as an integer value ranging in value from
  2459. X+ 0 to 100 where 100 is the maximum gain.
  2460. X+ "xrolo.UseDialPrefix" accepts a boolean value
  2461. X+ which enables or disables the use of the dial
  2462. X+ prefix while dialing.
  2463. X+ "xrolo.DialPrefix" set the default dial prefix
  2464. X+ string.
  2465. X+ .TP
  2466. X  FINISHED BUTTON
  2467. X     This button is used when you are finished
  2468. X  using
  2469. X***************
  2470. X*** 172,177 ****
  2471. X--- 203,213 ----
  2472. X  command is "lpr".  A user can customize
  2473. X  the default printer command by creating an
  2474. X  X resource entry called "xrolo.PrintCommand".
  2475. X+ The "Print Records Matching Regex" menu
  2476. X+ entry spools to the print command all cards
  2477. X+ matching the regular expression in the
  2478. X+ Expression text panel using the selected
  2479. X+ match type.
  2480. X  .TP
  2481. X  FIND BUTTON
  2482. X  This button searches for a regular expression
  2483. X***************
  2484. X*** 228,233 ****
  2485. X--- 264,276 ----
  2486. X  
  2487. X  xrolo.SearchType - default search mode for find. 0, 1 or 2 for EGREP,
  2488. X  SLOPPY or SOUNDEX search modes respectively.
  2489. X+ 
  2490. X+ xrolo.UseDialPrefix - 1 causes xrolo to use the dial prefix when dialing.
  2491. X+ 
  2492. X+ xrolo.DefaultVolume - volume gain for SS1 internal speaker.  The gain must
  2493. X+ be entered as an integer value between 0 and 100 where 100 is the maximum gain.
  2494. X+ 
  2495. X+ xrolo.DialPrefix - text string used to set the default dial prefix.
  2496. X  .SH FILES
  2497. X  .TP
  2498. X  $HOME/.rolo
  2499. X***************
  2500. X*** 241,247 ****
  2501. X  .I Rolo
  2502. X  changes to your home directory when it begins.
  2503. X  .SH AUTHOR
  2504. X! Ron Hitchens   (ronbo@vixen.uucp, hitchens@cs.utexas.edu)
  2505. X  .br
  2506. X     Version 1.0, March  1987
  2507. X     Version 2.0, August 1988
  2508. X--- 284,293 ----
  2509. X  .I Rolo
  2510. X  changes to your home directory when it begins.
  2511. X  .SH AUTHOR
  2512. X!  Ron Hitchens   (ronbo@vixen.uucp, hitchens@cs.utexas.edu)
  2513. X!    And
  2514. X!  Luis Soltero (luis@rice.edu)
  2515. X! 
  2516. X  .br
  2517. X     Version 1.0, March  1987
  2518. X     Version 2.0, August 1988
  2519. END_OF_FILE
  2520. if test 55035 -ne `wc -c <'xrolo.patch4'`; then
  2521.     echo shar: \"'xrolo.patch4'\" unpacked with wrong size!
  2522. fi
  2523. # end of 'xrolo.patch4'
  2524. fi
  2525. echo shar: End of shell archive.
  2526. exit 0
  2527.