home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / sources / x / 463 < prev    next >
Encoding:
Text File  |  1992-08-18  |  28.7 KB  |  1,223 lines

  1. Path: sparky!uunet!usc!elroy.jpl.nasa.gov!swrinde!mips!msi!dcmartin
  2. From: Mike.Sullivan@EBay.Sun.COM (Mike Sullivan {AKA Simon BarSinister})
  3. Newsgroups: comp.sources.x
  4. Subject: v18i094: Ftptool 4.3 (XVIEW), Part12/12
  5. Message-ID: <1992Aug18.153829.29201@msi.com>
  6. Date: 18 Aug 92 15:38:29 GMT
  7. References: <csx-18i083-ftptool-4.3@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: Molecular Simulations, Inc.
  10. Lines: 1209
  11. Approved: dcmartin@msi.com
  12. Originator: dcmartin@fascet
  13.  
  14. Submitted-by: Mike.Sullivan@EBay.Sun.COM (Mike Sullivan {AKA Simon BarSinister})
  15. Posting-number: Volume 18, Issue 94
  16. Archive-name: ftptool-4.3/part12
  17.  
  18. #!/bin/sh
  19. # this is part.12 (part 12 of a multipart archive)
  20. # do not concatenate these parts, unpack them in order with /bin/sh
  21. # file button_funcs.c continued
  22. #
  23. if test ! -r _shar_seq_.tmp; then
  24.     echo 'Please unpack part 1 first!'
  25.     exit 1
  26. fi
  27. (read Scheck
  28.  if test "$Scheck" != 12; then
  29.     echo Please unpack part "$Scheck" next!
  30.     exit 1
  31.  else
  32.     exit 0
  33.  fi
  34. ) < _shar_seq_.tmp || exit 1
  35. if test ! -f _shar_wnt_.tmp; then
  36.     echo 'x - still skipping button_funcs.c'
  37. else
  38. echo 'x - continuing file button_funcs.c'
  39. sed 's/^X//' << 'SHAR_EOF' >> 'button_funcs.c' &&
  40. X        NULL);
  41. X    xv_set(tool_property_window.directory_lists.cache,
  42. X        PANEL_VALUE, dircache_size,
  43. X        NULL);
  44. X    xv_set(tool_property_window.directory_lists.remote_sort,
  45. X        PANEL_VALUE, remote_sort_mode,
  46. X        NULL);
  47. X    xv_set(tool_property_window.directory_lists.remote_sortdir, 
  48. X        PANEL_VALUE, remote_sort_direction, 
  49. X        NULL);
  50. X    xv_set(tool_property_window.directory_lists.remote_dotfiles, 
  51. X        PANEL_VALUE, remote_showdotfiles, 
  52. X        NULL);
  53. X    xv_set(tool_property_window.directory_lists.remote_group,
  54. X        PANEL_VALUE, group_remote_files,
  55. X        NULL);
  56. X    set_remote_sort_order(remote_sort_direction);
  57. X    xv_set(tool_property_window.directory_lists.local_sort,
  58. X        PANEL_VALUE, local_sort_mode,
  59. X        NULL);
  60. X    xv_set(tool_property_window.directory_lists.local_sortdir, 
  61. X        PANEL_VALUE, local_sort_direction, 
  62. X        NULL);
  63. X    set_local_sort_order(local_sort_direction);
  64. X    xv_set(tool_property_window.directory_lists.local_dotfiles, 
  65. X        PANEL_VALUE, local_showdotfiles, 
  66. X        NULL);
  67. X    xv_set(tool_property_window.directory_lists.local_group,
  68. X        PANEL_VALUE, group_local_files,
  69. X        NULL);
  70. }
  71. X
  72. #ifdef USE_PROTOTYPES
  73. void viewers_props_reset_proc(void)
  74. #else
  75. void viewers_props_reset_proc()
  76. #endif
  77. {
  78. X    xv_set(tool_property_window.viewers.viewer, 
  79. X        PANEL_VALUE, default_viewer,
  80. X        NULL);
  81. X    xv_set(tool_property_window.viewers.archive,
  82. X        PANEL_VALUE, archive_viewer,
  83. X        NULL);
  84. X    xv_set(tool_property_window.viewers.postscript,
  85. X        PANEL_VALUE, postscript_viewer,
  86. X        NULL);
  87. }
  88. X
  89. char    about_message[] =
  90. "Ftptool was written by Mike Sullivan in Course Development \n\
  91. X   1. To make it easier for Sun training centers to retrieve\n\
  92. X      course material from our server. \n\
  93. X   2. To learn about XView and X (somewhat). \n\
  94. X   3. To make FTP easier to use. \n\
  95. \n\
  96. Ftptool is still under development, so suggestions (and bug reports, of course!) are welcome (although bug reports aren't _quite_ so welcome :-). Send mail to me with the \"Send Mail\" button below.\n\
  97. \n\
  98. Retrieve the HISTORY file in the Tools directory on yavin.ebay (via anonymous FTP) to see what's changed, and what's planned.  \n\
  99. \n\
  100. There is now an ftptool-users alias on yavin.ebay.sun.com. I'll notify this alias of new releases. \n\
  101. \n\
  102. Credits:\n\
  103. \n\
  104. This about window is based on code from Larry Wake. Well, it is more like completely his code.\n\
  105. \n\
  106. The code dealing with pseudo-terminals (which I now think I understand) is from UNIX Network Programming by Richard Stevens.\n\
  107. \n\
  108. Many of the features in Ftptool were suggested by members of the internal tstech alias/newsgroup, along with the Internet community. Thanks to everyone!\n\
  109. \n\
  110. Ported to 386 SVR4 by Jerry Whelan <guru@stasi.bradley.edu>. \n\
  111. \n\
  112. Ported to Ultrix by Robert Evans <Robert.Evans@cm.cf.ac.uk>. \n\
  113. "
  114. ;
  115. X
  116. #ifdef USE_PROTOTYPES
  117. void about_proc(void)
  118. #else
  119. void about_proc()
  120. #endif
  121. {
  122. X    textsw_reset(about_window.message, 0, 0);
  123. X    textsw_insert(about_window.message, about_message,
  124. X        strlen(about_message));
  125. X    textsw_normalize_view(about_window.message, 0);
  126. X    xv_set(about_window.frame, XV_SHOW, TRUE, NULL);
  127. }
  128. X
  129. char    *sort_dir_strings[] = {
  130. X    "Alphabetical",             "Reverse Alphabetical",
  131. X    "Least Recently Changed",     "Most Recently Changed",
  132. X    "Smallest First",             "Largest First",
  133. };
  134. X
  135. #ifdef USE_PROTOTYPES
  136. void    remote_sort_choice_proc(void)
  137. #else
  138. void    remote_sort_choice_proc()
  139. #endif
  140. {
  141. X    int    val;
  142. X
  143. X    /* get the new value, and change the strings appropriately */
  144. X    
  145. X    val = xv_get(tool_property_window.directory_lists.remote_sort,
  146. X        PANEL_VALUE);
  147. X    set_remote_sort_order(val);
  148. X
  149. }
  150. X
  151. #ifdef USE_PROTOTYPES
  152. void set_remote_sort_order(int val)
  153. #else
  154. void set_remote_sort_order(val)
  155. int    val;
  156. #endif
  157. {
  158. X    xv_set(tool_property_window.directory_lists.remote_sortdir, 
  159. X        PANEL_CHOICE_STRINGS,
  160. X            sort_dir_strings[2 * val], 
  161. X            sort_dir_strings[2 * val + 1],
  162. X            NULL,
  163. X        NULL);
  164. }
  165. X
  166. #ifdef USE_PROTOTYPES
  167. void    local_sort_choice_proc(void)
  168. #else
  169. void    local_sort_choice_proc()
  170. #endif
  171. {
  172. X    int    val;
  173. X
  174. X    /* get the new value, and change the strings appropriately */
  175. X    
  176. X    val = xv_get(tool_property_window.directory_lists.local_sort,
  177. X        PANEL_VALUE);
  178. X    set_local_sort_order(val);
  179. X
  180. }
  181. X
  182. #ifdef USE_PROTOTYPES
  183. void set_local_sort_order(int val)
  184. #else
  185. void set_local_sort_order(val)
  186. int    val;
  187. #endif
  188. {
  189. X    xv_set(tool_property_window.directory_lists.local_sortdir, 
  190. X        PANEL_CHOICE_STRINGS,
  191. X            sort_dir_strings[2 * val], 
  192. X            sort_dir_strings[2 * val + 1],
  193. X            NULL,
  194. X        NULL);
  195. }
  196. X
  197. #ifdef USE_PROTOTYPES
  198. void    about_send_proc(void)
  199. #else
  200. void    about_send_proc()
  201. #endif
  202. {
  203. X    xv_set(feedback_window.frame, 
  204. X        XV_SHOW, TRUE, 
  205. X        NULL);
  206. }
  207. X
  208. #define OTHER_ADDRESS 2
  209. #define TO_LEN  64
  210. #define MAILER "/usr/ucb/mail"
  211. X
  212. #ifdef USE_PROTOTYPES
  213. void    feedback_address_proc(Panel_item item, unsigned int value, 
  214. X    Event *event)
  215. #else
  216. void    feedback_address_proc(item, value, event)
  217. Panel_item    item;
  218. unsigned int value;
  219. Event *event;
  220. #endif
  221. {
  222. X    if (value == OTHER_ADDRESS) {
  223. X        xv_set(feedback_window.other,
  224. X            XV_SHOW, TRUE, 
  225. X            NULL);
  226. X    } else {
  227. X        xv_set(feedback_window.other, 
  228. X            XV_SHOW, FALSE, 
  229. X            NULL);
  230. X    }
  231. X
  232. }
  233. X
  234. X
  235. #ifdef USE_PROTOTYPES
  236. void    feedback_send_proc(Panel_item item, Event *event)
  237. #else
  238. void    feedback_send_proc(item, event)
  239. Panel_item    item;
  240. Event    *event;
  241. #endif
  242. {
  243. X    FILE *pp;
  244. X    char addr[TO_LEN + 1], buf[BUFSIZ+1];
  245. X    int addr_sel, last_was_NL=0;
  246. X    Textsw_index cur_pos, next_pos;
  247. X    char    *sigfile;
  248. X    FILE    *sigfp;
  249. X    int        ch;
  250. X
  251. X    static char *fb_cmd = NULL;
  252. X
  253. X    if ((int)xv_get(feedback_window.feedback, TEXTSW_LENGTH) == 0) {
  254. X        footer_message("No text in message.", (char *)NULL);
  255. X        xv_set(item, 
  256. X            PANEL_NOTIFY_STATUS, XV_ERROR, 
  257. X            NULL);
  258. X        return;
  259. X    }
  260. X
  261. X    addr_sel = (int)xv_get(feedback_window.which, PANEL_VALUE);
  262. X    if (addr_sel == OTHER_ADDRESS)
  263. X        strncpy(addr, 
  264. X            (char *)xv_get(feedback_window.other, PANEL_VALUE), TO_LEN);
  265. X    else
  266. X        strncpy(addr, (char *)xv_get(feedback_window.which,
  267. X            PANEL_CHOICE_STRING, addr_sel), TO_LEN);
  268. X
  269. X    if (addr[0] == '\0') {
  270. X        footer_message("No address specified.", (char *)NULL);
  271. X        xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  272. X        return;
  273. X    }
  274. X
  275. X    if (fb_cmd == NULL)
  276. X        fb_cmd = (char *)malloc((unsigned int)(strlen(MAILER) + TO_LEN + 1));
  277. X     
  278. X    sprintf(fb_cmd, "%s %s", MAILER, addr);
  279. X    if ((pp = popen(fb_cmd, "w")) == NULL) {
  280. X        footer_message("popen error; couldn't send feedback message!");
  281. X        xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  282. X        return;
  283. X    }
  284. X    fprintf(pp, "~s %s Comment\n\n", header_name);
  285. X    fprintf(pp, "\n");
  286. X
  287. X    next_pos = 0;
  288. X    cur_pos = next_pos - BUFSIZ;
  289. X    while (next_pos == cur_pos + BUFSIZ) {
  290. X        cur_pos = next_pos;
  291. X        next_pos = (Textsw_index)xv_get(feedback_window.feedback,
  292. X            TEXTSW_CONTENTS, cur_pos, buf, BUFSIZ);
  293. X    if ((next_pos - cur_pos) != 0) {
  294. X        buf[next_pos - cur_pos] = '\0';
  295. X        fprintf(pp, "%s", buf);
  296. X        last_was_NL = (buf[next_pos-cur_pos-1] == '\n');
  297. X    }
  298. X    }
  299. X    /*
  300. X     *  Force last char out to be a newline
  301. X     */
  302. X    if (!last_was_NL)
  303. X        putc('\n', pp);
  304. X
  305. X    sigfile = find_dotfile(".signature");
  306. X    if (sigfile) {
  307. X        sigfp = fopen(sigfile, "r");
  308. X        if (sigfp != NULL) {
  309. X            while ((ch = getc(sigfp)) != EOF)
  310. X                putc(ch, pp);
  311. X            fclose(sigfp);
  312. X        }
  313. X        free(sigfile);
  314. X    }
  315. X       
  316. X    if(pclose(pp) != 0) {
  317. X        footer_message("Mail failed -- message not sent!", (char *)NULL);
  318. X        xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  319. X        return;
  320. X    }
  321. X    textsw_reset(feedback_window.feedback, 0, 0);
  322. X
  323. }
  324. X
  325. X
  326. #ifdef USE_PROTOTYPES
  327. void    feedback_cancel_proc(void)
  328. #else
  329. void    feedback_cancel_proc()
  330. #endif
  331. {
  332. X    textsw_reset(feedback_window.feedback, 0, 0);
  333. }
  334. X
  335. #ifdef USE_PROTOTYPES
  336. Panel_setting    reject_spaces(Panel_item item, Event *event)
  337. #else
  338. Panel_setting    reject_spaces(item, event)
  339. Panel_item    item;
  340. Event    *event;
  341. #endif
  342. {
  343. X    switch (event_action(event)) {
  344. X    case ' ':
  345. X    case '\t':
  346. X        return PANEL_NONE;
  347. X    default:
  348. X        return (panel_text_notify(item, event));
  349. X    }
  350. }
  351. X
  352. #ifdef USE_PROTOTYPES
  353. void    host_window_choice_proc(Panel_item item, unsigned int value, 
  354. X    Event *event)
  355. #else
  356. void    host_window_choice_proc(item, value, event)
  357. Panel_item    item;
  358. unsigned int value;
  359. Event *event;
  360. #endif
  361. {
  362. X    if (value == 1) {
  363. X        xv_set(host_window.advanced.proxy, 
  364. X            XV_SHOW, TRUE, 
  365. X            NULL);
  366. X    } else {
  367. X        xv_set(host_window.advanced.proxy, 
  368. X            XV_SHOW, FALSE, 
  369. X            NULL);
  370. X    }
  371. }
  372. X
  373. #ifdef USE_PROTOTYPES
  374. void    remote_delete_proc(void)
  375. #else
  376. void    remote_delete_proc()
  377. #endif
  378. {
  379. X    int    nitems, row;
  380. X    struct dirlist *tmp;
  381. X    int    mode, dirchanged=0;
  382. X    char    *name = NULL;
  383. X
  384. X    xfer_buttons_inactive();
  385. X    if (ping_server())
  386. X        goto out;
  387. X    nitems = xv_get(base_window.list, PANEL_LIST_NROWS);
  388. X    /* start at 1 to skip '..' */
  389. X    for (row = 1; row < nitems; row++)
  390. X        if (xv_get(base_window.list, PANEL_LIST_SELECTED, row)) {
  391. X            tmp = (struct dirlist *)xv_get(base_window.list, 
  392. X                PANEL_LIST_CLIENT_DATA, row);
  393. X            mode = tmp->mode & S_IFMT;
  394. X            switch(mode) {
  395. X            case S_IFDIR:
  396. X                if (delete_remote_dir(tmp->name))
  397. X                    goto out;
  398. X                dirchanged++;
  399. X                remote_list_ndirs--;
  400. X                break;
  401. X            case S_IFREG:
  402. X                if (delete_remote_file(tmp->name, "DELE"))
  403. X                    goto out;
  404. X                dirchanged++;
  405. X                remote_list_nfiles--;
  406. X                break;
  407. X            case S_IFLNK:
  408. X                name = linkname(tmp->name);
  409. X                if (name == NULL)
  410. X                    break;
  411. X                if (delete_remote_file(name, "DELE"))
  412. X                    goto out;
  413. X                remote_list_nfiles--;
  414. X                dirchanged++;
  415. X                free(name);
  416. X                name = NULL;
  417. X                break;
  418. X            default:
  419. X                remote_list_nothers--;
  420. X                footer_message("Ignoring non-file/directory %s.", 
  421. X                    tmp->name, (char *)NULL);
  422. X                log_message("Ignoring non-file.\n");
  423. X                break;
  424. X            }
  425. X            xv_set(base_window.list, 
  426. X                PANEL_LIST_SELECT, row, FALSE, 
  427. X                NULL);
  428. X            remote_show_items();
  429. X        }
  430. out:
  431. X    if (name)
  432. X        free(name);
  433. X    if (dirchanged) {
  434. X        which_remote_file = strdup(".");
  435. X        if (which_remote_file == NULL) {
  436. X            fprintf(stderr,"Out of memory.\n");
  437. X        } else {
  438. X            dowhat=DOREMOTECDFORCE;
  439. X            notify_stop();
  440. X        }
  441. X    }
  442. X    xfer_buttons_active();
  443. X    if (timedout)
  444. X        timeout_disconnect();
  445. X    return;
  446. }
  447. X
  448. #ifdef USE_PROTOTYPES
  449. void    local_delete_proc(void)
  450. #else
  451. void    local_delete_proc()
  452. #endif
  453. {
  454. X    int    nitems, row;
  455. X    struct dirlist *tmp;
  456. X    int    mode, dirchanged=0;
  457. X    char    *name = NULL;
  458. X
  459. X    xfer_buttons_inactive();
  460. X    nitems = xv_get(local_window.list, PANEL_LIST_NROWS);
  461. X    /* start at 1 to skip .. */
  462. X    for (row = 1; row < nitems; row++)
  463. X        if (xv_get(local_window.list, PANEL_LIST_SELECTED, row)) {
  464. X            tmp = (struct dirlist *)xv_get(local_window.list, 
  465. X                PANEL_LIST_CLIENT_DATA, row);
  466. X            mode = tmp->mode & S_IFMT;
  467. X            switch(mode) {
  468. X            case S_IFDIR:
  469. X                if (delete_local_dir(tmp->name))
  470. X                    goto out;
  471. X                local_list_ndirs--;
  472. X                dirchanged++;
  473. X                break;
  474. X            case S_IFREG:
  475. X                if (delete_local_file(tmp->name, unlink))
  476. X                    goto out;
  477. X                dirchanged++;
  478. X                local_list_nfiles--;
  479. X                break;
  480. X            case S_IFLNK:
  481. X                name = linkname(tmp->name);
  482. X                if (delete_local_file(name, unlink))
  483. X                    goto out;
  484. X                dirchanged++;
  485. X                local_list_nfiles--;
  486. X                free(name);
  487. X                name = NULL;
  488. X                break;
  489. X            default:
  490. X                local_list_nothers--;
  491. X                local_footer_message("Ignoring non-file/directory %s.", 
  492. X                    tmp->name, (char *)NULL);
  493. X                log_message("Ignoring non-file.\n");
  494. X                break;
  495. X            }
  496. X            xv_set(local_window.list, 
  497. X                PANEL_LIST_SELECT, row, FALSE, 
  498. X                NULL);
  499. X            local_show_items();
  500. X        }
  501. out:
  502. X    if (name)
  503. X        free(name);
  504. X    if (dirchanged)
  505. X        change_local_dir(".", 1);
  506. X    xfer_buttons_active();
  507. X    if (timedout)
  508. X        timeout_disconnect();
  509. X    return;
  510. }
  511. X
  512. #ifdef USE_PROTOTYPES
  513. void    show_load_receive_list_proc(void)
  514. #else
  515. void    show_load_receive_list_proc()
  516. #endif
  517. {
  518. X    xv_set(schedule_window.lsbutton, 
  519. X        PANEL_LABEL_STRING, "Load",
  520. X        PANEL_NOTIFY_PROC, load_receive_list_proc,
  521. X        NULL);
  522. X    xv_set(schedule_window.lsframe,
  523. X        XV_LABEL, "Load Receive Batch List",
  524. X        XV_SHOW, TRUE,
  525. X        NULL);
  526. }
  527. X
  528. #ifdef USE_PROTOTYPES
  529. void    show_save_receive_list_proc(void)
  530. #else
  531. void    show_save_receive_list_proc()
  532. #endif
  533. {
  534. X    xv_set(schedule_window.lsbutton, 
  535. X        PANEL_LABEL_STRING, "Save",
  536. X        PANEL_NOTIFY_PROC, save_receive_list_proc,
  537. X        NULL);
  538. X    xv_set(schedule_window.lsframe,
  539. X        XV_LABEL, "Save Receive Batch List",
  540. X        XV_SHOW, TRUE,
  541. X        NULL);
  542. }
  543. X
  544. #ifdef USE_PROTOTYPES
  545. void    show_load_send_list_proc(void)
  546. #else
  547. void    show_load_send_list_proc()
  548. #endif
  549. {
  550. X    xv_set(schedule_window.lsbutton, 
  551. X        PANEL_LABEL_STRING, "Load",
  552. X        PANEL_NOTIFY_PROC, load_send_list_proc,
  553. X        NULL);
  554. X    xv_set(schedule_window.lsframe,
  555. X        XV_LABEL, "Load Send Batch List",
  556. X        XV_SHOW, TRUE,
  557. X        NULL);
  558. }
  559. X
  560. #ifdef USE_PROTOTYPES
  561. void    show_save_send_list_proc(void)
  562. #else
  563. void    show_save_send_list_proc()
  564. #endif
  565. {
  566. X    xv_set(schedule_window.lsbutton, 
  567. X        PANEL_LABEL_STRING, "Save",
  568. X        PANEL_NOTIFY_PROC, save_send_list_proc,
  569. X        NULL);
  570. X    xv_set(schedule_window.lsframe,
  571. X        XV_LABEL, "Save Send Batch List",
  572. X        XV_SHOW, TRUE,
  573. X        NULL);
  574. }
  575. X
  576. #ifdef USE_PROTOTYPES
  577. void    load_send_list_proc(void)
  578. #else
  579. void    load_send_list_proc()
  580. #endif
  581. {
  582. X    char    *filename;
  583. X
  584. X    filename = expand_dirname((char *)xv_get(schedule_window.filename,
  585. X        PANEL_VALUE));
  586. X    if (filename == NULL)
  587. X        return;
  588. X
  589. X    load_batch_list(schedule_window.send_list, filename);
  590. X    free(filename);
  591. }
  592. X
  593. #ifdef USE_PROTOTYPES
  594. void    save_send_list_proc(void)
  595. #else
  596. void    save_send_list_proc()
  597. #endif
  598. {
  599. X    char    *filename;
  600. X
  601. X    filename = expand_dirname((char *)xv_get(schedule_window.filename, 
  602. X        PANEL_VALUE));
  603. X    if (filename == NULL)
  604. X        return;
  605. X
  606. X    save_batch_list(schedule_window.send_list, filename);
  607. X    free(filename);
  608. }
  609. X
  610. #ifdef USE_PROTOTYPES
  611. void    load_receive_list_proc(void)
  612. #else
  613. void    load_receive_list_proc()
  614. #endif
  615. {
  616. X    char    *filename;
  617. X
  618. X    filename = expand_dirname((char *)xv_get(schedule_window.filename, 
  619. X        PANEL_VALUE));
  620. X    if (filename == NULL)
  621. X        return;
  622. X
  623. X    load_batch_list(schedule_window.receive_list, filename);
  624. X    free(filename);
  625. }
  626. X
  627. #ifdef USE_PROTOTYPES
  628. void    save_receive_list_proc(void)
  629. #else
  630. void    save_receive_list_proc()
  631. #endif
  632. {
  633. X    char    *filename;
  634. X
  635. X    filename = expand_dirname((char *)xv_get(schedule_window.filename,
  636. X        PANEL_VALUE));
  637. X    if (filename == NULL)
  638. X        return;
  639. X
  640. X    save_batch_list(schedule_window.receive_list, filename);
  641. X    free(filename);
  642. }
  643. X
  644. #ifdef USE_PROTOTYPES
  645. void add_batch_send_proc(void)
  646. #else
  647. void add_batch_send_proc()
  648. #endif
  649. {
  650. X    struct dirlist *tmp;
  651. X    int    nitems, row;
  652. X    int    mode;
  653. X    char    *name;
  654. X
  655. X    nitems = xv_get(local_window.list, PANEL_LIST_NROWS);
  656. X    /* ignore '..' */
  657. X    for (row = 1; row < nitems; row++) {
  658. X        if (xv_get(local_window.list, PANEL_LIST_SELECTED, row) == FALSE)
  659. X            continue;
  660. X        tmp = (struct dirlist *)xv_get(local_window.list, 
  661. X            PANEL_LIST_CLIENT_DATA, row);
  662. X        mode = tmp->mode & S_IFMT;
  663. X        if (non_unix)
  664. X            mode = S_IFREG;
  665. X        switch(mode) {
  666. X        case S_IFDIR:
  667. X            add_batchname(schedule_window.send_list, tmp->name, tmp->mode,
  668. X                tmp->size, local_dircache.first->name);
  669. X            local_list_ndirs--;
  670. X            break;
  671. X        case S_IFREG:
  672. X            add_batchname(schedule_window.send_list, tmp->name, tmp->mode,
  673. X                tmp->size, local_dircache.first->name);
  674. X            local_list_nfiles--;
  675. X            break;
  676. X        case S_IFLNK:
  677. X            name = linkname(tmp->name);
  678. X            if (name == NULL)
  679. X                break;
  680. X            add_batchname(schedule_window.send_list, name, tmp->mode,
  681. X                tmp->size, local_dircache.first->name);
  682. X            local_list_nfiles--;
  683. X            free(name);
  684. X            break;
  685. X        default:
  686. X            footer_message("Ignoring non-directory/file %s", 
  687. X                tmp->name, (char *)NULL);
  688. X            local_list_nothers--;
  689. X            break;
  690. X        }
  691. X        xv_set(local_window.list, 
  692. X            PANEL_LIST_SELECT, row, FALSE, 
  693. X            NULL);
  694. X        local_show_items();
  695. X    }
  696. X    change_local_list_menu();
  697. }
  698. X
  699. #ifdef USE_PROTOTYPES
  700. void add_batch_receive_proc(void)
  701. #else
  702. void add_batch_receive_proc()
  703. #endif
  704. {
  705. X    struct dirlist *tmp;
  706. X    int    nitems, row;
  707. X    int    mode;
  708. X    char    *name;
  709. X
  710. X    nitems = xv_get(base_window.list, PANEL_LIST_NROWS);
  711. X    /* ignore '..' */
  712. X    for (row = 1; row < nitems; row++) {
  713. X        if (xv_get(base_window.list, PANEL_LIST_SELECTED, row) == FALSE)
  714. X            continue;
  715. X        tmp = (struct dirlist *)xv_get(base_window.list, 
  716. X            PANEL_LIST_CLIENT_DATA, row);
  717. X        mode = tmp->mode & S_IFMT;
  718. X        if (non_unix)
  719. X            mode = S_IFREG;
  720. X        switch(mode) {
  721. X        case S_IFDIR:
  722. X            add_batchname(schedule_window.receive_list, tmp->name, tmp->mode,
  723. X                tmp->size, remote_dircache.first->name);
  724. X            remote_list_ndirs--;
  725. X            break;
  726. X        case S_IFREG:
  727. X            add_batchname(schedule_window.receive_list, tmp->name, tmp->mode,
  728. X                tmp->size, remote_dircache.first->name);
  729. X            remote_list_nfiles--;
  730. X            break;
  731. X        case S_IFLNK:
  732. X            name = linkname(tmp->name);
  733. X            if (name == NULL)
  734. X                break;
  735. X            add_batchname(schedule_window.receive_list, name, tmp->mode,
  736. X                tmp->size, remote_dircache.first->name);
  737. X            remote_list_nfiles--;
  738. X            free(name);
  739. X            break;
  740. X        default:
  741. X            footer_message("Ignoring non-directory/file %s", 
  742. X                tmp->name, (char *)NULL);
  743. X            remote_list_nothers--;
  744. X            break;
  745. X        }
  746. X        xv_set(base_window.list, 
  747. X            PANEL_LIST_SELECT, row, FALSE, 
  748. X            NULL);
  749. X        remote_show_items();
  750. X    }
  751. X    change_remote_list_menu();
  752. }
  753. X
  754. #ifdef USE_PROTOTYPES
  755. void    props_inf_check_box(Panel_item item, Event *event)
  756. #else
  757. void    props_inf_check_box(item, event)
  758. Panel_item    item;
  759. Event    *event;
  760. #endif
  761. {
  762. X    if (xv_get(item, PANEL_VALUE) == 1) {
  763. X        xv_set(tool_property_window.directory_lists.cache, 
  764. X            PANEL_INACTIVE, TRUE, 
  765. X            NULL);
  766. X    } else {
  767. X        xv_set(tool_property_window.directory_lists.cache, 
  768. X            PANEL_INACTIVE, FALSE,
  769. X            NULL);
  770. X    }
  771. }
  772. X
  773. #ifdef USE_PROTOTYPES
  774. void    quit_proc(void)
  775. #else
  776. void    quit_proc()
  777. #endif
  778. {
  779. X    destroy_func((Notify_client)NULL, DESTROY_PROCESS_DEATH);
  780. X    /* should not be connected now */
  781. X    if (connected)
  782. X        return;
  783. X    dowhat = DOQUIT;
  784. X    notify_stop();
  785. }
  786. X
  787. #ifdef USE_PROTOTYPES
  788. void switch_category(int value, int show)
  789. #else
  790. void switch_category(value, show)
  791. int    value;
  792. int    show;
  793. #endif
  794. {
  795. X    Panel panel;
  796. X    Panel_item apply;
  797. X    void (*apply_func)();
  798. X
  799. X    switch (value) {
  800. X    default:
  801. X        fprintf(stderr, "Invalid category in switch_category.\n");
  802. X        /* fall through */
  803. X    case 0:
  804. X        panel = tool_property_window.ftptool.panel;
  805. X        apply = tool_property_window.ftptool.apply;
  806. X        break;
  807. X    case 1:
  808. X        panel = tool_property_window.directory_lists.panel;
  809. X        apply = tool_property_window.directory_lists.apply;
  810. X        break;
  811. X    case 2:
  812. X        panel = tool_property_window.viewers.panel;
  813. X        apply = tool_property_window.viewers.apply;
  814. X        break;
  815. X    }
  816. X    if (show == TRUE) {
  817. X        int    width;
  818. X
  819. X        width = xv_get(panel, XV_WIDTH);
  820. X
  821. X        xv_set(tool_property_window.panel,
  822. X            XV_WIDTH, width,
  823. X            NULL);
  824. X        xv_set(panel, 
  825. X            XV_SHOW, TRUE, 
  826. X            NULL);
  827. X        xv_set(tool_property_window.frame,
  828. X            XV_WIDTH, width,
  829. X            XV_HEIGHT, xv_get(panel, XV_HEIGHT) 
  830. X                + xv_get(tool_property_window.panel, XV_HEIGHT),
  831. X            NULL);
  832. X        tool_property_window.apply= apply;
  833. X    } else {
  834. X        apply_func = (void (*)())xv_get(apply, PANEL_NOTIFY_PROC);
  835. X        (*apply_func)();
  836. X        xv_set(panel,
  837. X            XV_SHOW, FALSE, 
  838. X            NULL);
  839. X    }
  840. }
  841. X
  842. #ifdef USE_PROTOTYPES
  843. void category_proc(void)
  844. #else
  845. void category_proc()
  846. #endif
  847. {
  848. X    int    value;
  849. X    static int oldvalue = 0;
  850. X
  851. X    value = xv_get(tool_property_window.category, PANEL_VALUE);
  852. X
  853. X    switch_category(oldvalue, FALSE);
  854. X    switch_category(value, TRUE);
  855. X    oldvalue = value;
  856. }
  857. X
  858. #ifdef USE_PROTOTYPES
  859. void    dismiss_local_window(void)
  860. #else
  861. void    dismiss_local_window()
  862. #endif
  863. {
  864. X    xv_set(local_window.frame,
  865. X        XV_SHOW, FALSE,
  866. #ifdef XVIEW3
  867. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  868. #else
  869. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  870. #endif
  871. X        NULL);
  872. }
  873. X
  874. #ifdef USE_PROTOTYPES
  875. void    dismiss_host_window(void)
  876. #else
  877. void    dismiss_host_window()
  878. #endif
  879. {
  880. X    xv_set(host_window.frame,
  881. X        XV_SHOW, FALSE,
  882. #ifdef XVIEW3
  883. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  884. #else
  885. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  886. #endif
  887. X        NULL);
  888. }
  889. X
  890. #ifdef USE_PROTOTYPES
  891. void    dismiss_about_window(void)
  892. #else
  893. void    dismiss_about_window()
  894. #endif
  895. {
  896. X    xv_set(about_window.frame,
  897. X        XV_SHOW, FALSE,
  898. #ifdef XVIEW3
  899. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  900. #else
  901. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  902. #endif
  903. X        NULL);
  904. }
  905. X
  906. #ifdef USE_PROTOTYPES
  907. void    dismiss_file_props_window(Panel_item item, Event *event)
  908. #else
  909. void    dismiss_file_props_window(item, event)
  910. Panel_item    item;
  911. Event    *event;
  912. #endif
  913. {
  914. X    Frame    frame;
  915. X
  916. X    frame = xv_get(item, PANEL_CLIENT_DATA);
  917. X    xv_set(frame,
  918. X        XV_SHOW, FALSE,
  919. #ifdef XVIEW3
  920. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  921. #else
  922. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  923. #endif
  924. X        NULL);
  925. }
  926. X
  927. #ifdef USE_PROTOTYPES
  928. void    dismiss_schedule_window(void)
  929. #else
  930. void    dismiss_schedule_window()
  931. #endif
  932. {
  933. X    xv_set(schedule_window.frame,
  934. X        XV_SHOW, FALSE,
  935. #ifdef XVIEW3
  936. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  937. #else
  938. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  939. #endif
  940. X        NULL);
  941. }
  942. X
  943. #ifdef USE_PROTOTYPES
  944. void    dismiss_status_window(void)
  945. #else
  946. void    dismiss_status_window()
  947. #endif
  948. {
  949. X    xv_set(status_window.frame,
  950. X        XV_SHOW, FALSE,
  951. #ifdef XVIEW3
  952. X        FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
  953. #else
  954. X        FRAME_CMD_PUSHPIN_IN, FALSE,
  955. #endif
  956. X        NULL);
  957. }
  958. X
  959. #ifdef USE_PROTOTYPES
  960. void dir_list_proc(void)
  961. #else
  962. void dir_list_proc()
  963. #endif
  964. {
  965. X    dowhat = DODIR;
  966. X    notify_stop();
  967. }
  968. X
  969. #ifdef USE_PROTOTYPES
  970. void ls_list_proc(void)
  971. #else
  972. void ls_list_proc()
  973. #endif
  974. {
  975. X    dowhat = DOLS;
  976. X    notify_stop();
  977. }
  978. X
  979. #ifdef USE_PROTOTYPES
  980. void list_remote_dir(void)
  981. #else
  982. void list_remote_dir()
  983. #endif
  984. {
  985. X    FILE    *din = NULL;
  986. X
  987. X    xfer_buttons_inactive();
  988. X    if (ping_server())
  989. X        goto out;
  990. X    if (dowhat == DODIR)
  991. X        din = open_remote_ls(0);
  992. X    else
  993. X        din = open_remote_ls(1);
  994. X    if (din == NULL) {
  995. X        goto out;
  996. X    }
  997. X    while (next_remote_line(din) != NULL) {
  998. X        log_message(response_line);
  999. X        log_char('\n');
  1000. X    }
  1001. out:
  1002. X    if (din)
  1003. X        close_remote_ls(din);
  1004. X    xfer_buttons_active();
  1005. X    if (timedout)
  1006. X        timeout_disconnect();
  1007. }
  1008. X
  1009. #ifdef USE_PROTOTYPES
  1010. void save_layout_func(void)
  1011. #else
  1012. void save_layout_func()
  1013. #endif
  1014. {
  1015. X    char    *filename=NULL;
  1016. X    FILE    *fp;
  1017. X    char    *false = "False";
  1018. X    char    *true = "True";
  1019. X
  1020. X    host_window.visible = xv_get(host_window.frame, XV_SHOW) == TRUE;
  1021. X
  1022. X    host_window.advanced.visible = 
  1023. X        xv_get(host_window.advanced.panel, XV_SHOW) == TRUE;
  1024. X
  1025. X    local_window.visible = xv_get(local_window.frame, XV_SHOW) == TRUE;
  1026. X    schedule_window.visible = xv_get(schedule_window.frame, XV_SHOW) == TRUE;
  1027. X    status_window.visible = xv_get(status_window.frame, XV_SHOW) == TRUE;
  1028. X
  1029. X    defaults_set_boolean("ftptool.HostInfoVisible", host_window.visible);
  1030. X
  1031. X    defaults_set_boolean("ftptool.HostInfoAdvancedVisible", 
  1032. X        host_window.advanced.visible);
  1033. X    defaults_set_boolean("ftptool.LocalWindowVisible", local_window.visible);
  1034. X    defaults_set_boolean("ftptool.BatchWindowVisible", schedule_window.visible);
  1035. X
  1036. X    defaults_set_boolean("ftptool.StatusWindowVisible", status_window.visible);
  1037. X
  1038. X    save_geometry(base_window.geometry, base_window.frame);
  1039. X    save_geometry(local_window.geometry, local_window.frame);
  1040. X    save_geometry(host_window.geometry, host_window.frame);
  1041. X    save_geometry(schedule_window.geometry, schedule_window.frame);
  1042. X    save_geometry(session_window.geometry, session_window.frame);
  1043. X    save_geometry(status_window.geometry, status_window.frame);
  1044. X
  1045. X    defaults_set_string("ftptool.RemoteWindowGeometry", base_window.geometry);
  1046. X       defaults_set_string("ftptool.LocalWindowGeometry", local_window.geometry);
  1047. X    defaults_set_string("ftptool.HostWindowGeometry", host_window.geometry);
  1048. X    defaults_set_string("ftptool.BatchWindowGeometry", schedule_window.geometry);
  1049. X    defaults_set_string("ftptool.SessionWindowGeometry",
  1050. X        session_window.geometry);
  1051. X    defaults_set_string("ftptool.StatusWindowGeometry", status_window.geometry);
  1052. X
  1053. X    filename = find_dotfile(FTPTOOL_LAYOUT);
  1054. X    if (filename == NULL) {
  1055. X        if ((filename = create_dotfile(FTPTOOL_LAYOUT, 0644)) == NULL)
  1056. X            return;
  1057. X    }
  1058. X    if ((fp = fopen(filename, "w")) == NULL) {
  1059. X        footer_message("Could not save layout: %s", sys_errlist[errno],
  1060. X            (char *)NULL);
  1061. X        return;
  1062. X    }
  1063. X    fprintf(fp, "ftptool.HostInfoVisible:\t%s\n", 
  1064. X        (host_window.visible == 0) ? false : true);
  1065. X    fprintf(fp, "ftptool.HostInfoAdvancedVisible:\t%s\n", 
  1066. X        (host_window.advanced.visible == 0) ? false : true);
  1067. X    fprintf(fp, "ftptool.LocalWindowVisible:\t%s\n", 
  1068. X        (local_window.visible == 0) ? false : true);
  1069. X    fprintf(fp, "ftptool.BatchWindowVisible:\t%s\n", 
  1070. X        (schedule_window.visible == 0) ? false : true);
  1071. X    fprintf(fp, "ftptool.StatusWindowVisible:\t%s\n", 
  1072. X        (status_window.visible == 0) ? false : true);
  1073. X
  1074. X    fprintf(fp, "ftptool.RemoteWindowGeometry:\t%s\n", base_window.geometry);
  1075. X    fprintf(fp, "ftptool.LocalWindowGeometry:\t%s\n", local_window.geometry);
  1076. X    fprintf(fp, "ftptool.HostWindowGeometry:\t%s\n", host_window.geometry);
  1077. X    fprintf(fp, "ftptool.BatchWindowGeometry:\t%s\n", schedule_window.geometry);
  1078. X    fprintf(fp, "ftptool.SessionWindowGeometry:\t%s\n",
  1079. X        session_window.geometry);
  1080. X    fprintf(fp, "ftptool.StatusWindowGeometry:\t%s\n", status_window.geometry);
  1081. X    fclose(fp);
  1082. X    footer_message("Layout saved to %s.", filename, (char *)NULL);
  1083. X    free(filename);
  1084. }
  1085. X
  1086. #ifdef USE_PROTOTYPES
  1087. void local_doubleclick(struct dirlist *tmp)
  1088. #else
  1089. void local_doubleclick(tmp)
  1090. struct dirlist *tmp;
  1091. #endif
  1092. {
  1093. X    xfer_buttons_inactive();
  1094. X    if (S_ISLNK(tmp->mode)) {
  1095. X        char    *name;
  1096. X
  1097. X        name = linkname(tmp->name);
  1098. X        if (name != NULL) {
  1099. X            if (change_local_dir(name, 0) == ENOTDIR) {
  1100. X                /* Try to view a file */
  1101. X                (void)view_local_file(name, DOLOCALVIEW, (int *)NULL);
  1102. X            }
  1103. X            free(name);
  1104. X        }
  1105. X    } else if (S_ISDIR(tmp->mode)) {
  1106. X        change_local_dir(tmp->name, 0);
  1107. X    } else if (S_ISREG(tmp->mode)) {
  1108. X        (void)view_local_file(tmp->name, DOLOCALVIEW, (int *)NULL);
  1109. X    }
  1110. X    xfer_buttons_active();
  1111. }
  1112. X
  1113. #ifdef USE_PROTOTYPES
  1114. void remote_doubleclick(void)
  1115. #else
  1116. void remote_doubleclick()
  1117. #endif
  1118. {
  1119. X    if (which_remote_file == NULL)
  1120. X        return;
  1121. X    xfer_buttons_inactive();
  1122. X    if (S_ISLNK(which_remote_mode) || non_unix) {
  1123. X        char    *name;
  1124. X
  1125. X        name = linkname(which_remote_file);
  1126. X        if (name != NULL) {
  1127. X            if (change_remote_dir(name, 0) == ENOTDIR) {
  1128. X                /* Try to view a file */
  1129. X                (void)view_remote_file(name, which_remote_size);
  1130. X            }
  1131. X            free(name);
  1132. X        }
  1133. X    } else if (S_ISDIR(which_remote_mode)) {
  1134. X        change_remote_dir(which_remote_file, 0);
  1135. X    } else if (S_ISREG(which_remote_mode)) {
  1136. X        (void)view_remote_file(which_remote_file, which_remote_size);
  1137. X    }
  1138. X    free(which_remote_file);
  1139. X    which_remote_file = NULL;
  1140. X    which_remote_mode = 0;
  1141. X    which_remote_size = 0;
  1142. X    xfer_buttons_active();
  1143. }
  1144. X
  1145. #ifdef USE_PROTOTYPES
  1146. void plus_proc(void)
  1147. #else
  1148. void plus_proc()
  1149. #endif
  1150. {
  1151. X    xv_set(host_window.frame,
  1152. X        XV_WIDTH, (int)xv_get(host_window.basic.panel, XV_WIDTH)
  1153. X            + (int)xv_get(host_window.advanced.panel, XV_WIDTH),
  1154. X        NULL);
  1155. X    xv_set(host_window.panel,
  1156. X        XV_WIDTH, (int)xv_get(host_window.frame, XV_WIDTH),
  1157. X        NULL);
  1158. X    xv_set(host_window.advanced.panel,
  1159. X        XV_HEIGHT, xv_get(host_window.basic.panel, XV_HEIGHT),
  1160. X        WIN_BORDER, TRUE,
  1161. X        XV_SHOW, TRUE,
  1162. X        NULL);
  1163. X    window_fit(host_window.panel);
  1164. X    window_fit(host_window.frame);
  1165. X    xv_set(host_window.basic.plus,
  1166. X        PANEL_INACTIVE, TRUE,
  1167. X        NULL);
  1168. X    xv_set(host_window.basic.plus, 
  1169. X        PANEL_NOTIFY_STATUS, XV_ERROR, 
  1170. X        NULL);
  1171. }
  1172. X
  1173. #ifdef USE_PROTOTYPES
  1174. void minus_proc(void)
  1175. #else
  1176. void minus_proc()
  1177. #endif
  1178. {
  1179. X    xv_set(host_window.basic.plus,
  1180. X        PANEL_INACTIVE, FALSE,
  1181. X        NULL);
  1182. X    xv_set(host_window.advanced.panel,
  1183. X        XV_SHOW, FALSE,
  1184. X        NULL);
  1185. X    window_fit(host_window.panel);
  1186. X    xv_set(host_window.panel,
  1187. X        WIN_BORDER, FALSE,
  1188. X        NULL);
  1189. X    window_fit(host_window.frame);
  1190. X    xv_set(host_window.advanced.minus, 
  1191. X        PANEL_NOTIFY_STATUS, XV_ERROR, 
  1192. X        NULL);
  1193. }
  1194. SHAR_EOF
  1195. echo 'File button_funcs.c is complete' &&
  1196. chmod 0644 button_funcs.c ||
  1197. echo 'restore of button_funcs.c failed'
  1198. Wc_c="`wc -c < 'button_funcs.c'`"
  1199. test 44896 -eq "$Wc_c" ||
  1200.     echo 'button_funcs.c: original size 44896, current size' "$Wc_c"
  1201. rm -f _shar_wnt_.tmp
  1202. fi
  1203. rm -f _shar_seq_.tmp
  1204. echo You have unpacked the last part
  1205. exit 0
  1206. -- 
  1207. Senior Systems Scientist        mail: dcmartin@msi.com
  1208. Molecular Simulations, Inc.        uucp: uunet!dcmartin
  1209. 796 North Pastoria Avenue        at&t: 408/522-9236
  1210. Sunnyvale, California 94086        fax: 408/732-0831
  1211.