home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / alt / sources / 2560 < prev    next >
Encoding:
Text File  |  1992-11-18  |  50.1 KB  |  1,793 lines

  1. Newsgroups: alt.sources
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!darwin.sura.net!sgiblab!munnari.oz.au!manuel.anu.edu.au!csc.canberra.edu.au!pandonia!jan
  3. From: jan@pandonia.canberra.edu.au (Jan Newmarch)
  4. Subject: X11/Motif file manager - part 05 of 17
  5. Message-ID: <1992Nov19.052248.25676@csc.canberra.edu.au>
  6. Sender: news@csc.canberra.edu.au
  7. Organization: University of Canberra
  8. Date: Thu, 19 Nov 92 05:22:48 GMT
  9. Lines: 1782
  10.  
  11.  
  12.  
  13. #!/bin/sh
  14. # this is part.05 (part 5 of a multipart archive)
  15. # do not concatenate these parts, unpack them in order with /bin/sh
  16. # file xmfm/file_act.c continued
  17. #
  18. if test ! -r _shar_seq_.tmp; then
  19.     echo 'Please unpack part 1 first!'
  20.     exit 1
  21. fi
  22. (read Scheck
  23.  if test "$Scheck" != 5; then
  24.     echo Please unpack part "$Scheck" next!
  25.     exit 1
  26.  else
  27.     exit 0
  28.  fi
  29. ) < _shar_seq_.tmp || exit 1
  30. if test ! -f _shar_wnt_.tmp; then
  31.     echo 'x - still skipping xmfm/file_act.c'
  32. else
  33. echo 'x - continuing file xmfm/file_act.c'
  34. sed 's/^X//' << 'SHAR_EOF' >> 'xmfm/file_act.c' &&
  35. X ************************************************************************/ 
  36. extern file_action * LoadFileActions (
  37. #ifdef UseFunctionPrototypes
  38. X    dir_pane_info *dpi
  39. #endif
  40. );
  41. X
  42. /*************************************************************************
  43. X * Variables exported
  44. X ************************************************************************/ 
  45. X
  46. /*************************************************************************
  47. X * Extern variables
  48. X ************************************************************************/ 
  49. X
  50. /*************************************************************************
  51. X * Extern functions
  52. X ************************************************************************/ 
  53. extern int fatal (
  54. #ifdef UseFunctionPrototypes
  55. X    char *s
  56. #endif
  57. );
  58. X
  59. /*************************************************************************
  60. X * Forward functions
  61. X ************************************************************************/ 
  62. X
  63. /*************************************************************************
  64. X * Local variables
  65. X ************************************************************************/ 
  66. #define BUF_SIZE 2048
  67. X
  68. static char buf[BUF_SIZE];
  69. X
  70. static int line_number = 1;
  71. X
  72. #define IS_TYPE(s)    (strcmp ((s), "type") == 0)
  73. #define IS_PATTERN(s)    (strcmp ((s), "pattern") == 0)
  74. #define IS_PIXMAP(s)    (strcmp ((s), "pixmap") == 0)
  75. #define IS_DESCRIPTION(s)    (strcmp ((s), "description") == 0)
  76. #define IS_LABEL(s)    (strcmp ((s), "label") == 0)
  77. #define IS_RUN_IN_XTERM(s)    (strcmp ((s), "run_in_xterm") == 0)
  78. #define IS_PAUSE_AFTER_EXEC(s)    (strcmp ((s), "pause_after_exec") == 0)
  79. #define IS_ACTION(s)    (strcmp ((s), "action") == 0)
  80. #define IS_PROMPT(s)    (strcmp ((s), "prompt") == 0)
  81. #define IS_L_BRACE(s)    (strcmp ((s), "{") == 0)
  82. #define IS_R_BRACE(s)    (strcmp ((s), "}") == 0)
  83. #define IS_FILE_FILTER(s)    (strcmp ((s), "file_filter") == 0)
  84. #define IS_DIR_FILTER(s)    (strcmp ((s), "dir_filter") == 0)
  85. #define IS_EXECUTABLE_FILTER(s)    (strcmp ((s), "executable_filter") == 0)
  86. #define IS_ALL_FILTER(s)    (strcmp ((s), "all_filter") == 0)
  87. X
  88. #define IS_WHITE_SPACE(ch)    ((ch) == ' ' || \
  89. X                 (ch) == '\t' || (ch) == '\n')
  90. X
  91. #define DEFAULT_FILE_FILTER        "[^.]*"
  92. #define DEFAULT_DIR_FILTER         "*"
  93. #define DEFAULT_EXECUTABLE_FILTER  "*"
  94. X
  95. static Bool token_put_back = False;
  96. X
  97. /*************************************************************************
  98. X * Function: syntax_error ()
  99. X * Purpose: complain about input errors
  100. X * In parameters: 
  101. X * Function returns: 
  102. X * Side effects: 
  103. X * Precondition: 
  104. X * Postcondition: false 
  105. X ************************************************************************/ 
  106. static void
  107. syntax_error 
  108. #ifdef UseFunctionPrototypes
  109. X    (void)
  110. #else
  111. X    ()
  112. X
  113. #endif
  114. {
  115. X    fprintf (stderr, "syntax error in xmfmrc near line %d\n",
  116. X             line_number);
  117. }
  118. X
  119. /*************************************************************************
  120. X * Function: GetC ()
  121. X * Purpose: interface to getc () that increments line count
  122. X * In parameters: fp
  123. X * Function returns: char read in
  124. X * Side effects: increments line_number on '\n'
  125. X * Precondition: 
  126. X * Postcondition: 
  127. X ************************************************************************/ 
  128. static char
  129. GetC 
  130. #ifdef UseFunctionPrototypes
  131. X    (FILE *fp)
  132. #else
  133. X    (fp)
  134. X    FILE *fp;
  135. X
  136. #endif
  137. {    char ch;
  138. X
  139. X    ch = getc (fp);
  140. X    if (ch == '\n')
  141. X        line_number++;
  142. X    return ch;
  143. }
  144. X
  145. /*************************************************************************
  146. X * Function: unget_next_token ()
  147. X * Purpose: push token back onto input queue (actually, just leaves it
  148. X *    there, and sets a flag to reuse it. Only allows one token push back
  149. X * In parameters: fp
  150. X * Function returns:
  151. X * Side effects: sets token_put_back
  152. X * Precondition: 
  153. X * Postcondition: 
  154. X ************************************************************************/ 
  155. static void
  156. unget_next_token 
  157. #ifdef UseFunctionPrototypes
  158. X    (void)
  159. #else
  160. X    ()
  161. X
  162. #endif
  163. {
  164. X    token_put_back = True;
  165. }
  166. X
  167. /*************************************************************************
  168. X * Function: next_token ()
  169. X * Purpose: read the next token from fp. token is all non-white, or in ""
  170. X * In parameters: fp
  171. X * Function returns: pointer to token or NULL on EOF
  172. X * Side effects: 
  173. X * Precondition: 
  174. X * Postcondition: 
  175. X ************************************************************************/ 
  176. static char *
  177. next_token 
  178. #ifdef UseFunctionPrototypes
  179. X    (FILE *fp)
  180. #else
  181. X    (fp)
  182. X    FILE *fp;
  183. X
  184. #endif
  185. {    char ch;
  186. X    char *p = buf;
  187. X
  188. X    if (token_put_back)
  189. X    {    token_put_back = False;
  190. X        return buf;
  191. X    }
  192. X
  193. X    while ((ch = GetC (fp)) != EOF &&
  194. X         IS_WHITE_SPACE (ch))
  195. X        /* empty */;
  196. X    if (ch == EOF)
  197. X        return NULL;
  198. X    if (ch == '"')
  199. X         while ((ch = GetC (fp)) != EOF && ch != '"')
  200. X            *p++ = ch;
  201. X    else
  202. X    {    *p++ = ch;
  203. X        while ((ch = GetC (fp)) != EOF &&
  204. X            ! IS_WHITE_SPACE (ch))
  205. X            *p++ = ch;
  206. X    }
  207. X    *p = '\0';
  208. #ifdef DEBUG
  209. X    fprintf (stderr, "token: %s\n", buf);
  210. #endif
  211. X    return buf;
  212. }
  213. X
  214. /*************************************************************************
  215. X * Function: ParseFileAction ()
  216. X * Purpose: parse a line into its actions
  217. X * In parameters: 
  218. X * Function returns: a list of actions for a file pattern
  219. X * Side effects: 
  220. X * Precondition: 
  221. X * Postcondition: 
  222. X ************************************************************************/ 
  223. static file_action *
  224. ParseFileAction 
  225. #ifdef UseFunctionPrototypes
  226. X    (FILE *fp)
  227. #else
  228. X    (fp)
  229. X    FILE *fp;
  230. X
  231. #endif
  232. {
  233. X    file_action *pfa;
  234. X    action_pair *pap;
  235. X    char regexp[FSM_LENGTH];
  236. X    char *token, *token2;
  237. X
  238. X    pfa = (file_action *) XtMalloc (sizeof (file_action));
  239. X    pfa -> actions = NULL;
  240. X
  241. X    /* upto 4 fields: type, pattern, pixmap, description */
  242. X    /* some defaults in case no entry */
  243. X    pfa -> file_type = '\0';
  244. X    pfa -> name_pattern = " ";  /* make non-null to force Label size */
  245. X    pfa -> pixmap = "xlogo32";  /* reasonable default */
  246. X    pfa -> description = "";
  247. X
  248. X    while ( ! IS_L_BRACE(token = next_token (fp)))
  249. X    {    
  250. X        if (IS_TYPE (token))
  251. X        {    token2 = next_token (fp);
  252. X            pfa -> file_type = *token2;
  253. X            continue;
  254. X        }
  255. X        if (IS_PATTERN (token))
  256. X        {    token2 = next_token (fp);
  257. X             pfa -> name_pattern =
  258. X                (char *) XtMalloc (strlen (token2) + 1);
  259. X            strcpy (pfa -> name_pattern, token2);
  260. X            continue;
  261. X        }
  262. X        if (IS_PIXMAP (token))
  263. X        {    token2 = next_token (fp);
  264. X            pfa -> pixmap = (char *) XtMalloc (strlen (token2) + 1);
  265. X            strcpy (pfa -> pixmap, token2);
  266. X            continue;
  267. X        }
  268. X        if (IS_DESCRIPTION (token))
  269. X        {    token2 = next_token (fp);
  270. X            pfa -> description = (char *) XtMalloc (strlen (token2) + 1);
  271. X            strcpy (pfa -> description, token2);
  272. X            continue;
  273. X        }
  274. X        syntax_error ();
  275. X    }
  276. X    /* this will have swallowed up the left brace for the first file
  277. X       action. put it back for later use */
  278. X    unget_next_token ();
  279. X
  280. X    /* each action is { ... } delimited */
  281. X    while (IS_L_BRACE (next_token (fp)))   /* stops on closing R_BRACE */
  282. X    {    
  283. X        if (pfa -> actions == NULL)
  284. X            pfa -> actions = 
  285. X            pap = (action_pair *) XtMalloc (sizeof (action_pair));
  286. X        else
  287. X        {     pap -> next = (action_pair *) XtMalloc (sizeof (action_pair));
  288. X            pap = pap -> next;
  289. X        }
  290. X        /* set default values */
  291. X        pap -> run_in_xterm = False;
  292. X        pap -> pause_after_exec = False;
  293. X        pap -> has_prompt = False;
  294. X
  295. X        /* now the fields for the action */
  296. X        while ( (token = next_token (fp)) &&
  297. X                !IS_R_BRACE (token))
  298. X        {    if (IS_LABEL (token))
  299. X            {    token2 = next_token (fp);
  300. X                pap -> action_label = 
  301. X                    (char *) XtMalloc (strlen (token2) + 1);
  302. X                strcpy (pap -> action_label, token2);
  303. X                continue;
  304. X            }
  305. X            if (IS_RUN_IN_XTERM (token))
  306. X            {     pap -> run_in_xterm = True;
  307. X                continue;
  308. X            }
  309. X            if (IS_PAUSE_AFTER_EXEC (token))
  310. X            {     pap -> pause_after_exec = True;
  311. X                continue;
  312. X            }
  313. X            if (IS_ACTION (token))
  314. X            {    token2 = next_token (fp);
  315. X                 pap -> action =
  316. X                    (char *) XtMalloc (strlen (token2) + 1);
  317. X                strcpy (pap -> action, token2);
  318. X                continue;
  319. X            }
  320. X            if (IS_PROMPT (token))
  321. X            {    token2 = next_token (fp);
  322. X                 pap -> prompt =
  323. X                    (char *) XtMalloc (strlen (token2) + 1);
  324. X                strcpy (pap -> prompt, token2);
  325. X                pap -> has_prompt = True;
  326. X                continue;
  327. X            }
  328. X            syntax_error ();
  329. X        }
  330. X    }
  331. X    pap -> next = NULL;
  332. X
  333. X    /* set the regexp filter pattern */
  334. X    RegExpPatternToRegExp (pfa -> name_pattern, regexp);
  335. X    RegExpCompile (regexp, (pfa -> fsm_ptr), FSM_LENGTH);
  336. X
  337. X    return pfa;
  338. }
  339. X
  340. X
  341. /*************************************************************************
  342. X * Function: DumpActions ()
  343. X * Purpose: debugging tool to show acctions set to screen
  344. X * In parameters: actions
  345. X * Out parameters:
  346. X * Precondition: valid list of actions
  347. X * Postcondition: actions displayed to stdout
  348. X ************************************************************************/ 
  349. void
  350. DumpActions 
  351. #ifdef UseFunctionPrototypes
  352. X    (file_action *actions)
  353. #else
  354. X    (actions)
  355. X    file_action *actions;
  356. X
  357. #endif
  358. {    action_pair *ap;
  359. X
  360. X    while (actions != NULL)
  361. X    {
  362. X        fprintf (stderr, "%c %s %s\n",
  363. X                    actions -> file_type,
  364. X                    actions -> name_pattern,
  365. X                    actions -> pixmap);
  366. X        ap = actions -> actions;
  367. X        while (ap != NULL)
  368. X        {
  369. X            fprintf (stderr, "  %s %s\n",
  370. X                    ap -> action_label,
  371. X                    ap -> action);
  372. X            ap = ap -> next;
  373. X        }
  374. X        actions = actions -> next;
  375. X    }
  376. }
  377. X
  378. X
  379. /*************************************************************************
  380. X * Function: OpenXmfmrc ()
  381. X * Purpose: open the xmfmrc file from HOME or app-defaults
  382. X * In parameters:
  383. X * Function returns: file pointer to xmfmrc file
  384. X * Precondition: $HOME/.xmfmrc or app-defaults/xmfmrc exist
  385. X * Postcondition: file is parsed and files + actions lists built
  386. X ************************************************************************/ 
  387. FILE *
  388. OpenXmfmrc 
  389. #ifdef UseFunctionPrototypes
  390. X    (Display *display)
  391. #else
  392. X    (display)
  393. X    Display *display;
  394. X
  395. #endif
  396. {    FILE *fp;
  397. X    char *path;
  398. X
  399. X    char *home_dir;
  400. X    char xmfmrc[MAXPATHLEN];
  401. X
  402. X    if ((home_dir = getenv ("HOME")) != NULL)
  403. X    {    strcpy (xmfmrc, home_dir);
  404. X        strcat (xmfmrc, "/.xmfmrc");
  405. X        if ((fp = fopen (xmfmrc, "r")) != NULL)
  406. X            return fp;
  407. X    }
  408. X
  409. X    /* is XAPPLRESDIR set? (expect it to end in /) */
  410. X    if ((path = getenv ("XAPPLRESDIR")) != NULL)
  411. X    {    
  412. X        strcpy (xmfmrc, path);
  413. X        strcat (xmfmrc, "xmfmrc");
  414. X        if ((fp = fopen (xmfmrc, "r")) != NULL)
  415. X            return fp;
  416. X    }
  417. X    if ((fp = fopen (XtResolvePathname (display,
  418. X                "app-defaults", "xmfmrc",
  419. X                NULL, NULL, NULL, 0, NULL),
  420. X             "r"))
  421. X            != NULL)
  422. X        return fp;
  423. X
  424. X    /* cant find anything useful anywhere so give up*/
  425. X    fatal ("Can't find xmfmrc file");
  426. X        /* keep lint happy */
  427. X        return NULL;
  428. }
  429. X
  430. /*************************************************************************
  431. X * Function: LoadFileActions ()
  432. X * Purpose: to read in the set of actions from $HOME/.xmfmrc
  433. X * In parameters:
  434. X * Function returns: a list of file patterns with associated actions
  435. X * Precondition: $HOME/.xmfmrc exists and contains a valid set of action
  436. X *               strings
  437. X * Postcondition: file is parsed and files + actions lists built
  438. X ************************************************************************/ 
  439. file_action *
  440. LoadFileActions 
  441. #ifdef UseFunctionPrototypes
  442. X    (dir_pane_info *dpi)
  443. #else
  444. X    (dpi)
  445. X    dir_pane_info *dpi;
  446. X
  447. #endif
  448. {    FILE *fp;
  449. X    file_action    *actions = NULL,
  450. X            *end_actions = NULL;
  451. X    char *token;
  452. X    char regexp[FSM_LENGTH];
  453. X
  454. X    fp = OpenXmfmrc (XtDisplay (dpi -> toplevel));
  455. X
  456. X    /* load the preamble - upto a first opening brace. set defaults:*/
  457. X        dpi -> file_filter = DEFAULT_FILE_FILTER;
  458. X    dpi -> dir_filter = DEFAULT_DIR_FILTER;
  459. X    dpi -> executable_filter = DEFAULT_EXECUTABLE_FILTER;
  460. X
  461. X    while ( ! IS_L_BRACE(token = next_token (fp)))
  462. X    {    if (IS_FILE_FILTER (token))
  463. X        {    token = next_token (fp);
  464. X            dpi -> file_filter = XtMalloc (strlen (token) + 1);
  465. X            strcpy (dpi -> file_filter, token);
  466. X            continue;
  467. X        }
  468. X        if (IS_DIR_FILTER (token))
  469. X        {    token = next_token (fp);
  470. X            dpi -> dir_filter = XtMalloc (strlen (token) + 1);
  471. X            strcpy (dpi -> dir_filter, token);
  472. X            continue;
  473. X        }
  474. X        if (IS_EXECUTABLE_FILTER (token))
  475. X        {    token = next_token (fp);
  476. X            dpi -> executable_filter = XtMalloc (strlen (token) + 1);
  477. X            strcpy (dpi -> executable_filter, token);
  478. X            continue;
  479. X        }
  480. X        syntax_error ();
  481. X    }
  482. X
  483. X    /* this will have swallowed up the left brace for the first file
  484. X       action. put it back for later use */
  485. X    unget_next_token ();
  486. X
  487. X    /* now compile to reg exps */
  488. X    RegExpPatternToRegExp (dpi -> file_filter, regexp);
  489. X    RegExpCompile (regexp, dpi -> file_filter_regexp, FSM_LENGTH);
  490. X
  491. X    RegExpPatternToRegExp (dpi -> dir_filter, regexp);
  492. X    RegExpCompile (regexp, dpi -> dir_filter_regexp, FSM_LENGTH);
  493. X
  494. X    RegExpPatternToRegExp (dpi -> executable_filter, regexp);
  495. X    RegExpCompile (regexp, dpi -> executable_filter_regexp, FSM_LENGTH);
  496. X
  497. X    /* and the set of file types and their actions */
  498. X    while (next_token(fp) != NULL)    /* actually, is L_BRACE */
  499. X    {
  500. X        if (end_actions == NULL)
  501. X        {    end_actions = ParseFileAction (fp);
  502. X            actions = end_actions;
  503. X        }  else
  504. X        {    end_actions->next = ParseFileAction (fp);
  505. X            end_actions = end_actions->next;
  506. X        }
  507. X    }
  508. X    end_actions->next = NULL;
  509. X
  510. #ifdef DEBUG
  511. X    DumpActions (actions);
  512. #endif
  513. X
  514. X    return actions;
  515. }
  516. SHAR_EOF
  517. echo 'File xmfm/file_act.c is complete' &&
  518. chmod 0644 xmfm/file_act.c ||
  519. echo 'restore of xmfm/file_act.c failed'
  520. Wc_c="`wc -c < 'xmfm/file_act.c'`"
  521. test 13971 -eq "$Wc_c" ||
  522.     echo 'xmfm/file_act.c: original size 13971, current size' "$Wc_c"
  523. rm -f _shar_wnt_.tmp
  524. fi
  525. # ============= xmfm/filecb.c ==============
  526. if test -f 'xmfm/filecb.c' -a X"$1" != X"-c"; then
  527.     echo 'x - skipping xmfm/filecb.c (File already exists)'
  528.     rm -f _shar_wnt_.tmp
  529. else
  530. > _shar_wnt_.tmp
  531. echo 'x - extracting xmfm/filecb.c (Text)'
  532. sed 's/^X//' << 'SHAR_EOF' > 'xmfm/filecb.c' &&
  533. /*************************************************************************
  534. X * File: $Source: /usr/usrs/xsource/xmfm/RCS/filecb.c,v $
  535. X * Author: Jan Newmarch
  536. X * Last modified: $Date: 1992/11/10 05:12:29 $
  537. X * Version: $Revision: 1.6 $
  538. X * Purpose: This file handles the file operations as callbacks from the
  539. X *    File menu buttons
  540. X *
  541. X * Revision history:
  542. X *    5 Aug 92    fixed failure to clear Toolbar on copy, move, new
  543. X *      25 Aug 92       removed : from dialog names for resource manager
  544. X *    16 Oct 92    caddr_t changed to XtPointer
  545. X *       3 Nov 92       lint-ed
  546. X ************************************************************************/ 
  547. X
  548. #include "copyright.h"
  549. /*************************************************************************
  550. X * System includes
  551. X ************************************************************************/ 
  552. #include <stdio.h> 
  553. #include <sys/param.h>
  554. X
  555. #include <Xm/CascadeB.h>     
  556. #include <Xm/FileSB.h>      
  557. #include <Xm/Label.h>
  558. #include <Xm/PushB.h>    
  559. #include <Xm/RowColumn.h>    
  560. #include <Xm/SelectioB.h>    
  561. #include <Xm/ScrolledW.h>
  562. #include <Xm/ScrollBar.h>
  563. X
  564. /*************************************************************************
  565. X * Local includes
  566. X ************************************************************************/ 
  567. #include "filecb.h"
  568. #include "const.h"
  569. #include "xmvararg.h"
  570. #include "types.h"
  571. X
  572. /*************************************************************************
  573. X * Functions exported
  574. X ************************************************************************/ 
  575. extern void FileNewFileCB (
  576. #ifdef UseFunctionPrototypes
  577. X    Widget w, XtPointer client_data, XtPointer call_data
  578. #endif
  579. );
  580. extern void FileNewDirCB (
  581. #ifdef UseFunctionPrototypes
  582. X    Widget w, XtPointer client_data, XtPointer call_data
  583. #endif
  584. );
  585. extern void FileCopyCB (
  586. #ifdef UseFunctionPrototypes
  587. X    Widget w, XtPointer client_data, XtPointer call_data
  588. #endif
  589. );
  590. extern void FileMoveCB (
  591. #ifdef UseFunctionPrototypes
  592. X    Widget w, XtPointer client_data, XtPointer call_data
  593. #endif
  594. );
  595. extern void FileCloseCB (
  596. #ifdef UseFunctionPrototypes
  597. X    Widget w, XtPointer client_data, XtPointer call_data
  598. #endif
  599. );
  600. extern void FileExitCB (
  601. #ifdef UseFunctionPrototypes
  602. X    Widget w, XtPointer client_data, XtPointer call_data
  603. #endif
  604. );
  605. X
  606. extern void ResetFilesInPanes (
  607. #ifdef UseFunctionPrototypes
  608. X    dir_pane_info *dpi
  609. #endif
  610. );
  611. X
  612. /*************************************************************************
  613. X * Variables exported
  614. X ************************************************************************/ 
  615. X
  616. /*************************************************************************
  617. X * Extern variables
  618. X ************************************************************************/ 
  619. X
  620. /*************************************************************************
  621. X * Extern functions
  622. X ************************************************************************/ 
  623. extern void WarningDialog (
  624. #ifdef UseFunctionPrototypes
  625. X    Widget parent, char *prompt, int modal, int *answer
  626. #endif
  627. );
  628. extern void DestroyDialogCB (
  629. #ifdef UseFunctionPrototypes
  630. X    Widget w, XtPointer c1, XtPointer c2
  631. #endif
  632. );
  633. extern DirectoryMgr *GetFilesInDir (
  634. #ifdef UseFunctionPrototypes
  635. X    void
  636. #endif
  637. );
  638. extern void invert_colours (
  639. #ifdef UseFunctionPrototypes
  640. X    Widget w
  641. #endif
  642. );
  643. extern void ClearToolbar (
  644. #ifdef UseFunctionPrototypes
  645. X    Widget *toolbar
  646. #endif
  647. );
  648. extern void FileButtonPressedCB (
  649. #ifdef UseFunctionPrototypes
  650. X    Widget w, XtPointer client_data, XtPointer call_data
  651. #endif
  652. );
  653. X
  654. /*************************************************************************
  655. X * Forward functions
  656. X ************************************************************************/ 
  657. X
  658. /*************************************************************************
  659. X * Local variables
  660. X ************************************************************************/ 
  661. int pane_count = 1;    /* mumber of window panes open */
  662. X
  663. /*************************************************************************
  664. X * Function: FileExitCB ()
  665. X * Purpose: terminate the entire application
  666. X * In parameters: w, client_data, call_data
  667. X * Out parameters:
  668. X * Precondition: Exit button pressed in file menu
  669. X * Postcondition:
  670. X ************************************************************************/ 
  671. X
  672. /* ARGSUSED */
  673. void FileExitCB 
  674. #ifdef UseFunctionPrototypes
  675. X    (Widget w, XtPointer client_data, XtPointer call_data)
  676. #else
  677. X    (w, client_data, call_data)  
  678. Widget        w;        /*  widget id        */ 
  679. XXtPointer        client_data;    /*  data from applicaiton   */ 
  680. XXtPointer        call_data;    /*  data from widget class  */ 
  681. X
  682. #endif
  683. X    int answer;
  684. X
  685. X    /*    Terminate the application. 
  686. X    */ 
  687. X    WarningDialog(w, "This will exit xmfm", True, &answer);
  688. X    if (answer == OK_ANSWER)
  689. X        exit (0);
  690. X
  691. /*************************************************************************
  692. X * Function: FindFileInPane()
  693. X * Purpose: given file name, find the widget button with that name
  694. X * In parameters: file_name, files
  695. X * Out parameters: button
  696. X * Precondition:
  697. X * Postcondition: button points to widget with file_name
  698. X ************************************************************************/ 
  699. static void FindFileInPane 
  700. #ifdef UseFunctionPrototypes
  701. X    (char *file_name, aWidgetList *files, Widget *button)
  702. #else
  703. X    (file_name, files, button)
  704. X    char *file_name;
  705. X    aWidgetList *files;
  706. X    Widget *button;
  707. X
  708. #endif
  709. {    pane_button_info *pbi;
  710. X
  711. X    /* traverse current list. list ends on NULL
  712. X       or when we hit an unmanaged widget
  713. X    */
  714. X    while (files != NULL && XtIsManaged (files -> widget))
  715. X    {    XtVaGetValues (files -> widget, 
  716. X                XmNuserData, &pbi,
  717. X                NULL);
  718. X        if (strcmp (file_name, pbi -> name) == 0)
  719. X        {    /* found button */
  720. X            *button = files -> widget;
  721. X            return;
  722. X        }
  723. X        files = files -> next;
  724. X    }
  725. X    *button = NULL;
  726. }
  727. X
  728. /*************************************************************************
  729. X * Function: MoveScrolledWindowToFile ()
  730. X * Purpose: set the scrolled window so that this file shows selected in it
  731. X * In parameters: fle_name, dpi
  732. X * Out parameters:
  733. X * Precondition:
  734. X * Postcondition:
  735. X ************************************************************************/ 
  736. static void 
  737. MoveScrolledWindowToFile 
  738. #ifdef UseFunctionPrototypes
  739. X    (char *file_name, dir_pane_info *dpi)
  740. #else
  741. X    (file_name, dpi)
  742. X    char *file_name;
  743. X    dir_pane_info *dpi;
  744. X
  745. #endif
  746. {
  747. X    Widget file_button;
  748. X    Widget vert_sb;
  749. X    Widget w;
  750. X    Position x, y;
  751. X    Dimension width, height;
  752. X    int max, min, value;
  753. X    int slider, incr, page;
  754. X
  755. X    if (file_name == NULL)
  756. X        return;
  757. X
  758. X    /* deselect old file */
  759. X    if (dpi -> file_selected != NULL)
  760. X    {
  761. X        invert_colours (dpi -> file_button_selected);
  762. X        ClearToolbar (dpi -> files_toolbar);
  763. X    }
  764. X    /* find the file_name in one of the three panes */
  765. X    file_button = NULL;
  766. X    FindFileInPane (file_name, dpi -> dirs_buttons, &file_button);
  767. X    if (file_button == NULL)
  768. X        FindFileInPane (file_name, dpi -> files_buttons, &file_button);
  769. X    if (file_button == NULL)
  770. X        FindFileInPane (file_name, dpi -> executables_buttons, &file_button);
  771. X    if (file_button == NULL)
  772. X        /* couldn't find it anywhere */
  773. X        return;
  774. X    
  775. X    /* select button, and set actions (a bit kludgy) */
  776. X    FileButtonPressedCB (file_button, NULL, NULL);
  777. X
  778. X    /* where is it in row col? */
  779. X    XtVaGetValues (file_button,
  780. X        XmNx, &x, XmNy, &y, NULL);
  781. X    XtVaGetValues (XtParent (file_button),
  782. X        XmNwidth, &width,
  783. X        XmNheight, &height,
  784. X        NULL);
  785. X
  786. X    /* find the vertical slider */
  787. X    w = XtParent (file_button);
  788. X    while ( !XtIsSubclass (w, xmScrolledWindowWidgetClass))
  789. X        w = XtParent (w);
  790. X    XtVaGetValues (w,
  791. X            XmNverticalScrollBar, &vert_sb,
  792. X            NULL);
  793. X    /* set the vertical slider to proportion of rowcol*/
  794. X    if (vert_sb == NULL)
  795. X        return;
  796. X    XtVaGetValues (vert_sb,
  797. X        XmNminimum, &min,
  798. X        XmNmaximum, &max,
  799. X        NULL);
  800. X    XmScrollBarGetValues (vert_sb, &value, &slider,
  801. X        &incr, &page);
  802. X    value = min + ((max - min) * y) / height;
  803. X
  804. X    /* make sure we leave space for slider */
  805. X    if (value > max - slider)
  806. X        value = max - slider;
  807. X
  808. X    XmScrollBarSetValues (vert_sb, value, slider,
  809. X        incr, page, True);
  810. }
  811. X
  812. /*************************************************************************
  813. X * Function: ResetPanesAndSelectFile ()
  814. X * Purpose: update pane (if needed) to show file changes, and
  815. X *     select new file (if possible)
  816. X * In parameters: file_name, dpi
  817. X * Out parameters:
  818. X * Precondition:
  819. X * Postcondition:
  820. X ************************************************************************/ 
  821. void
  822. ResetPanesAndSelectFile 
  823. #ifdef UseFunctionPrototypes
  824. X    (dir_pane_info *dpi, char *file_name)
  825. #else
  826. X    (dpi, file_name)
  827. X    dir_pane_info *dpi;
  828. X    char *file_name;
  829. X
  830. #endif
  831. {    DirectoryMgr *dm;
  832. X
  833. X    /* now reset panes and select this file ... */
  834. X    /* should only do this if (a) new worked, and (b) in current dir */
  835. X
  836. X    if (dpi -> file_selected != NULL)
  837. X    {    invert_colours (dpi -> file_button_selected);
  838. X        dpi -> file_selected = NULL;
  839. X        ClearToolbar (dpi -> files_toolbar);
  840. X    }
  841. X
  842. X        DirectoryMgrClose (dpi -> directory_manager);
  843. X        dm = GetFilesInDir ();
  844. X        dpi -> directory_manager = dm;
  845. X    ResetFilesInPanes (dpi);
  846. X    MoveScrolledWindowToFile (file_name, dpi);
  847. }
  848. X
  849. /*************************************************************************
  850. X * Function: NewFileOkCB ()
  851. X * Purpose: create a new file in curent directory
  852. X * In parameters: w, client_data, call_data
  853. X * Out parameters:
  854. X * Precondition: Ok Button pressed in New File dialog
  855. X * Postcondition: new file created, or user informed of error
  856. X ************************************************************************/
  857. X
  858. /* ARGSUSED */ 
  859. static void 
  860. NewFileOkCB 
  861. #ifdef UseFunctionPrototypes
  862. X    (Widget w, XtPointer client_data, XtPointer call_data)
  863. #else
  864. X    (w, client_data, call_data)  
  865. X    Widget        w;        /*  widget id        */ 
  866. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  867. X    XtPointer        call_data;
  868. X
  869. #endif
  870. {    XmString xmstr;
  871. X    char *file_name;
  872. X    char command[MAXPATHLEN];
  873. X    dir_pane_info *dpi;
  874. X
  875. X    XtVaGetValues (w, 
  876. X            XmNtextString, (XtArgVal) &xmstr,
  877. X            XmNuserData, (XtArgVal) &dpi,
  878. X            NULL);
  879. X    XtChdir (DirectoryPath (DirectoryMgrDir (dpi -> directory_manager)));
  880. X
  881. X    XmStringGetLtoR (xmstr, XmSTRING_DEFAULT_CHARSET, &file_name);
  882. X    strcpy (command, "sh -c echo >");
  883. X    strcat (command, file_name);
  884. X    system (command);
  885. X
  886. X    XtUnmanageChild (w);
  887. X    XtDestroyWidget (XtParent (w));
  888. X
  889. X    ResetPanesAndSelectFile (dpi, file_name);
  890. }
  891. X
  892. X
  893. /*************************************************************************
  894. X * Function: NewDirOkCB ()
  895. X * Purpose: create a new dir in current directory
  896. X * In parameters: w, client_data, call_data
  897. X * Out parameters:
  898. X * Precondition: OK button pressed in New Dir dialog
  899. X * Postcondition: new dir created, or user informed of error
  900. X ************************************************************************/ 
  901. X
  902. /* ARGSUSED */
  903. static void 
  904. NewDirOkCB 
  905. #ifdef UseFunctionPrototypes
  906. X    (Widget w, XtPointer client_data, XtPointer call_data)
  907. #else
  908. X    (w, client_data, call_data)  
  909. X    Widget        w;        /*  widget id        */ 
  910. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  911. X    XtPointer        call_data;
  912. X
  913. #endif
  914. {    XmString xmstr;
  915. X    char *dir_name;
  916. X    char command[MAXPATHLEN];
  917. X    dir_pane_info *dpi;
  918. X
  919. X    XtVaGetValues (w, 
  920. X            XmNtextString, &xmstr,
  921. X            XmNuserData, (XtArgVal) &dpi,
  922. X            NULL);
  923. X    XtChdir (DirectoryPath (DirectoryMgrDir (dpi -> directory_manager)));
  924. X
  925. X    XmStringGetLtoR (xmstr, XmSTRING_DEFAULT_CHARSET, &dir_name);
  926. X    strcpy (command, "mkdir ");
  927. X    strcat (command, dir_name);
  928. X    system (command);
  929. X
  930. X    XtUnmanageChild (w);
  931. X    XtDestroyWidget (XtParent (w));
  932. X
  933. X    /* now reset panes and select this directory ... */
  934. X    ResetPanesAndSelectFile (dpi, dir_name);
  935. }
  936. X
  937. X
  938. /*************************************************************************
  939. X * Function: MoveFileOkCB ()
  940. X * Purpose: 
  941. X * In parameters: w, client_data, call_data
  942. X * Out parameters:
  943. X * Precondition: OK button pressed in Move File dialog
  944. X * Postcondition: file moved to new file, which is got from a prompt
  945. X ************************************************************************/
  946. X
  947. /* ARGSUSED */ 
  948. static void 
  949. MoveFileOkCB 
  950. #ifdef UseFunctionPrototypes
  951. X    (Widget w, XtPointer client_data, XtPointer call_data)
  952. #else
  953. X    (w, client_data, call_data)  
  954. X    Widget        w;        /*  widget id        */ 
  955. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  956. X    XtPointer        call_data;
  957. X
  958. #endif
  959. {    XmString xmstr;
  960. X    char *new_file;
  961. X    char command[MAXPATHLEN];
  962. X    dir_pane_info *dpi;
  963. X
  964. X    XtVaGetValues (w, 
  965. X            XmNtextString, &xmstr,
  966. X            XmNuserData, (XtArgVal) &dpi,
  967. X            NULL);
  968. X    XtChdir (DirectoryPath (DirectoryMgrDir (dpi -> directory_manager)));
  969. X
  970. X    XmStringGetLtoR (xmstr, XmSTRING_DEFAULT_CHARSET, &new_file);
  971. X    strcpy (command, "mv ");
  972. X    strcat (command, dpi -> file_selected);
  973. X    strcat (command, " ");
  974. X    strcat (command, new_file);
  975. X    strcat (command, " < /dev/null");
  976. X    system (command);
  977. X
  978. X    XtUnmanageChild (w);
  979. X    XtDestroyWidget (XtParent (w));
  980. X
  981. X    /* now reset panes and select this file ... */
  982. X    ResetPanesAndSelectFile (dpi, new_file);
  983. }
  984. X
  985. /*************************************************************************
  986. X * Function: CopyFileOkCB
  987. X * Purpose: 
  988. X * In parameters: w, client_data, call_data
  989. X * Out parameters:
  990. X * Precondition: OK button pressed in Copy File dialog
  991. X * Postcondition: file copied to new file, which is got from a prompt
  992. X ************************************************************************/ 
  993. X
  994. /* ARGSUSED */
  995. static void 
  996. CopyFileOkCB 
  997. #ifdef UseFunctionPrototypes
  998. X    (Widget w, XtPointer client_data, XtPointer call_data)
  999. #else
  1000. X    (w, client_data, call_data)  
  1001. X    Widget        w;        /*  widget id        */ 
  1002. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1003. X    XtPointer        call_data;
  1004. X
  1005. #endif
  1006. {    XmString xmstr;
  1007. X    char *new_file;
  1008. X    char command[MAXPATHLEN];
  1009. X    dir_pane_info *dpi;
  1010. X
  1011. X    XtVaGetValues (w, 
  1012. X            XmNtextString, (XtArgVal) &xmstr,
  1013. X            XmNuserData, (XtArgVal) &dpi,
  1014. X            NULL);
  1015. X    XtChdir (DirectoryPath (DirectoryMgrDir (dpi -> directory_manager)));
  1016. X
  1017. X    XmStringGetLtoR (xmstr, XmSTRING_DEFAULT_CHARSET, &new_file);
  1018. X
  1019. X    /* -r option allows us to copy directories as well as files: */
  1020. X    strcpy (command, "cp -r ");
  1021. X    
  1022. X    strcat (command, dpi -> file_selected);
  1023. X    strcat (command, " ");
  1024. X    strcat (command, new_file);
  1025. X    strcat (command, " < /dev/null");
  1026. X    system (command);
  1027. X
  1028. X    /* now reset panes and select this file ... */
  1029. X    ResetPanesAndSelectFile (dpi, new_file);
  1030. X
  1031. X    XtUnmanageChild (w);
  1032. X    XtDestroyWidget (XtParent (w));
  1033. }
  1034. X
  1035. /*************************************************************************
  1036. X * Function: FileNewFileCB ()
  1037. X * Purpose: create a dialog to ask for new file name
  1038. X *    with callbacks to handle OK (create file), Cancel
  1039. X * In parameters: w, client_data, call_data
  1040. X * Out parameters:
  1041. X * Precondition: New file button pressed in File menu
  1042. X * Postcondition: New File.. dialog showing
  1043. X ************************************************************************/
  1044. X
  1045. /* ARGSUSED */ 
  1046. void
  1047. FileNewFileCB 
  1048. #ifdef UseFunctionPrototypes
  1049. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1050. #else
  1051. X    (w, client_data, call_data)  
  1052. X    Widget        w;        /*  widget id        */ 
  1053. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1054. X    XtPointer        call_data;
  1055. X
  1056. #endif
  1057. {    Widget new_file;
  1058. X    XtArgVal user_data;
  1059. X    Widget help_button;
  1060. X
  1061. X    XtVaGetValues (w, XmNuserData, &user_data, NULL);
  1062. X    new_file = XmVaCreatePromptDialog (w, "new file name",
  1063. X                XmNuserData, user_data, NULL);
  1064. X    XtAddCallback (new_file, XmNokCallback, NewFileOkCB, NULL);
  1065. X    XtAddCallback (new_file, XmNcancelCallback, DestroyDialogCB, NULL);
  1066. X
  1067. X    help_button = XmSelectionBoxGetChild (new_file,
  1068. X                XmDIALOG_HELP_BUTTON);
  1069. X    XtUnmanageChild (help_button);
  1070. X
  1071. X    XtManageChild(new_file);
  1072. }
  1073. X
  1074. X
  1075. X
  1076. /*************************************************************************
  1077. X * Function: FileNewDirCB ()
  1078. X * Purpose: create a dialog to ask for a new directory name
  1079. X *    with callbacks to handle OK (create dir), Cancel
  1080. X * In parameters: w, client_data, call_data
  1081. X * Out parameters:
  1082. X * Precondition: New Dir button pressed in File menu
  1083. X * Postcondition: dialog showing
  1084. X ************************************************************************/ 
  1085. X
  1086. /* ARGSUSED */
  1087. void
  1088. FileNewDirCB 
  1089. #ifdef UseFunctionPrototypes
  1090. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1091. #else
  1092. X    (w, client_data, call_data)  
  1093. X    Widget        w;        /*  widget id        */ 
  1094. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1095. X    XtPointer        call_data;
  1096. X
  1097. #endif
  1098. {    Widget new_dir;
  1099. X    Widget help_button;
  1100. X    XtArgVal user_data;
  1101. X
  1102. X    XtVaGetValues (w, XmNuserData, &user_data, NULL);
  1103. X    new_dir = XmVaCreatePromptDialog (w, "new dir name",
  1104. X            XmNuserData, user_data,
  1105. X            NULL);
  1106. X    XtAddCallback (new_dir, XmNokCallback, NewDirOkCB, NULL);
  1107. X    XtAddCallback (new_dir, XmNcancelCallback, DestroyDialogCB, NULL);
  1108. X
  1109. X    help_button = XmSelectionBoxGetChild (new_dir,
  1110. X                XmDIALOG_HELP_BUTTON);
  1111. X        XtUnmanageChild (help_button);
  1112. X
  1113. X    XtManageChild(new_dir);
  1114. }
  1115. X
  1116. X
  1117. X
  1118. X
  1119. /*************************************************************************
  1120. X * Function: FileMoveCB ()
  1121. X * Purpose: move a file to new prompted name
  1122. X * In parameters: w, client_data, call_data
  1123. X * Out parameters:
  1124. X * Precondition: Move button pressed in file menu
  1125. X * Postcondition: dialog showing asking for new file name
  1126. X ************************************************************************/ 
  1127. X
  1128. /* ARGSUSED */
  1129. void
  1130. FileMoveCB 
  1131. #ifdef UseFunctionPrototypes
  1132. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1133. #else
  1134. X    (w, client_data, call_data)  
  1135. X    Widget        w;        /*  widget id        */ 
  1136. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1137. X    XtPointer        call_data;
  1138. X
  1139. #endif
  1140. {    Widget new_file;
  1141. X    dir_pane_info *dpi;
  1142. X    int dummy;
  1143. X
  1144. X    XtVaGetValues (w, XmNuserData, &dpi, NULL);
  1145. X    if (dpi -> file_selected == NULL)
  1146. X    {
  1147. X        WarningDialog (w, "Must select a file to move",
  1148. X                True, &dummy);
  1149. X        return;
  1150. X    }
  1151. X
  1152. X    new_file = XmVaCreatePromptDialog (w, "Move to what file?",
  1153. X                XmNuserData, dpi, NULL);
  1154. X    XtAddCallback (new_file, XmNokCallback, MoveFileOkCB, NULL);
  1155. X    XtAddCallback (new_file, XmNcancelCallback, DestroyDialogCB, NULL);
  1156. X    XtManageChild(new_file);
  1157. }
  1158. X
  1159. X
  1160. /*************************************************************************
  1161. X * Function: FileCopyCB ()
  1162. X * Purpose: copy a file to new name
  1163. X * In parameters: w, client_data, call_data
  1164. X * Out parameters:
  1165. X * Precondition: Copy button pressed in File menu
  1166. X * Postcondition: dialog showing asking for new file name
  1167. X ************************************************************************/ 
  1168. X
  1169. /* ARGSUSED */
  1170. void
  1171. FileCopyCB 
  1172. #ifdef UseFunctionPrototypes
  1173. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1174. #else
  1175. X    (w, client_data, call_data)  
  1176. X    Widget        w;        /*  widget id        */ 
  1177. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1178. X    XtPointer        call_data;
  1179. X
  1180. #endif
  1181. {    Widget new_file;
  1182. X    dir_pane_info *dpi;
  1183. X    int dummy;
  1184. X
  1185. X    XtVaGetValues (w, XmNuserData, &dpi, NULL);
  1186. X    if (dpi -> file_selected == NULL)
  1187. X    {
  1188. X        WarningDialog (w, "Must select a file to copy",
  1189. X                True, &dummy);
  1190. X        return;
  1191. X    }
  1192. X
  1193. X    new_file = XmVaCreatePromptDialog (w, "Copy to what file?",
  1194. X                XmNuserData, dpi, NULL);
  1195. X    XtAddCallback (new_file, XmNokCallback, CopyFileOkCB, NULL);
  1196. X    XtAddCallback (new_file, XmNcancelCallback, DestroyDialogCB, NULL);
  1197. X    XtManageChild(new_file);
  1198. }
  1199. X
  1200. X
  1201. /*************************************************************************
  1202. X * Function: FileCloseCB ()
  1203. X * Purpose: close a pane on a directory
  1204. X *    if last pane, application exits after user confirmation
  1205. X * In parameters: w, client_data, call_data
  1206. X * Out parameters: 
  1207. X * Precondition: Close button pressed in File menu
  1208. X * Postcondition: current pane destroyed
  1209. X ************************************************************************/ 
  1210. X
  1211. /* ARGSUSED */
  1212. void
  1213. FileCloseCB 
  1214. #ifdef UseFunctionPrototypes
  1215. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1216. #else
  1217. X    (w, client_data, call_data)  
  1218. X    Widget        w;        /*  widget id        */ 
  1219. X    XtPointer        client_data;    /*  data from applicaiton   */ 
  1220. X    XtPointer        call_data;
  1221. X
  1222. #endif
  1223. {    int answer;
  1224. X
  1225. X    if (pane_count == 1)
  1226. X    {
  1227. X        WarningDialog(w, "This will exit xmfm", True, &answer);
  1228. X        if (answer == OK_ANSWER)
  1229. X            exit (0);
  1230. X        return;
  1231. X    }
  1232. X    
  1233. X    /* hop up to dropdown shell */
  1234. X    while ( !XtIsShell (w))
  1235. X        w = XtParent (w);
  1236. X    /* and to the main window */
  1237. X    w = XtParent (w);
  1238. X    /* hop up to toplevel shell */
  1239. X    while ( !XtIsShell (w))
  1240. X        w = XtParent (w);
  1241. X    XtDestroyWidget (w);
  1242. X
  1243. X    /* memory leaks in here - should reclaim
  1244. X       dpi stuff, DirMgr, etc
  1245. X    */
  1246. X    
  1247. X    pane_count--;
  1248. }
  1249. X
  1250. X
  1251. SHAR_EOF
  1252. chmod 0644 xmfm/filecb.c ||
  1253. echo 'restore of xmfm/filecb.c failed'
  1254. Wc_c="`wc -c < 'xmfm/filecb.c'`"
  1255. test 19813 -eq "$Wc_c" ||
  1256.     echo 'xmfm/filecb.c: original size 19813, current size' "$Wc_c"
  1257. rm -f _shar_wnt_.tmp
  1258. fi
  1259. # ============= xmfm/filtercb.c ==============
  1260. if test -f 'xmfm/filtercb.c' -a X"$1" != X"-c"; then
  1261.     echo 'x - skipping xmfm/filtercb.c (File already exists)'
  1262.     rm -f _shar_wnt_.tmp
  1263. else
  1264. > _shar_wnt_.tmp
  1265. echo 'x - extracting xmfm/filtercb.c (Text)'
  1266. sed 's/^X//' << 'SHAR_EOF' > 'xmfm/filtercb.c' &&
  1267. /*************************************************************************
  1268. X * File: $Source: /usr/usrs/xsource/xmfm/RCS/filtercb.c,v $
  1269. X * Author: Jan Newmarch
  1270. X * Last modified: $Date: 1992/11/10 05:12:31 $
  1271. X * Version: $Revision: 1.2 $
  1272. X * Purpose: This file handles the directory goto requests from the Goto
  1273. X *    menu, through callbacks attached to each button
  1274. X *
  1275. X * Revision history:
  1276. X *    16 Oct 92    caddr_t changed to XtPointer
  1277. X *       3 Nov 92       lint-ed
  1278. X ************************************************************************/ 
  1279. X
  1280. #include "copyright.h"
  1281. X
  1282. /*************************************************************************
  1283. X * System includes
  1284. X ************************************************************************/ 
  1285. #include <stdlib.h>
  1286. #include <stdio.h> 
  1287. X
  1288. #include <Xm/CascadeB.h>     
  1289. #include <Xm/FileSB.h>      
  1290. #include <Xm/Label.h>
  1291. #include <Xm/PushB.h>    
  1292. #include <Xm/RowColumn.h>    
  1293. #include <Xm/SelectioB.h>    
  1294. X
  1295. /*************************************************************************
  1296. X * Local includes
  1297. X ************************************************************************/ 
  1298. #include "filecb.h"
  1299. #include "types.h"
  1300. #include "RegExp.h"
  1301. X
  1302. /*************************************************************************
  1303. X * Functions exported
  1304. X ************************************************************************/ 
  1305. extern void FilterFileCB (
  1306. #ifdef UseFunctionPrototypes
  1307. X    Widget w, XtPointer client_data, XtPointer call_data
  1308. #endif
  1309. );
  1310. extern void FilterDirCB (
  1311. #ifdef UseFunctionPrototypes
  1312. X    Widget w, XtPointer client_data, XtPointer call_data
  1313. #endif
  1314. );
  1315. extern void FilterExecutableCB (
  1316. #ifdef UseFunctionPrototypes
  1317. X    Widget w, XtPointer client_data, XtPointer call_data
  1318. #endif
  1319. );
  1320. extern void SetFiltersInLabels (
  1321. #ifdef UseFunctionPrototypes
  1322. X    dir_pane_info *dpi
  1323. #endif
  1324. );
  1325. X
  1326. /*************************************************************************
  1327. X * Variables exported
  1328. X ************************************************************************/ 
  1329. X
  1330. /*************************************************************************
  1331. X * Extern variables
  1332. X ************************************************************************/ 
  1333. X
  1334. /*************************************************************************
  1335. X * Extern functions
  1336. X ************************************************************************/ 
  1337. extern void GotoCurrentDir (
  1338. #ifdef UseFunctionPrototypes
  1339. X    Widget w
  1340. #endif
  1341. );
  1342. extern void ResetFilesInPanes (
  1343. #ifdef UseFunctionPrototypes
  1344. X    dir_pane_info *dpi
  1345. #endif
  1346. );
  1347. extern void PromptDialog (
  1348. #ifdef UseFunctionPrototypes
  1349. X    Widget parent, char *prompt, int modal, char **answer
  1350. #endif
  1351. );
  1352. extern void invert_colours (
  1353. #ifdef UseFunctionPrototypes
  1354. X    Widget w
  1355. #endif
  1356. );
  1357. extern void ClearToolbar (
  1358. #ifdef UseFunctionPrototypes
  1359. X    Widget *toolbar
  1360. #endif
  1361. );
  1362. X
  1363. /*************************************************************************
  1364. X * Forward functions
  1365. X ************************************************************************/ 
  1366. X
  1367. /*************************************************************************
  1368. X * Local variables
  1369. X ************************************************************************/ 
  1370. /*************************************************************************
  1371. X * Function: SetFiltersInLabels ()
  1372. X * Purpose: set the filters in the three labels
  1373. X * In parameters:
  1374. X * Out parameters:
  1375. X * Precondition;
  1376. X * Postcondition:
  1377. X ************************************************************************/ 
  1378. void
  1379. SetFiltersInLabels 
  1380. #ifdef UseFunctionPrototypes
  1381. X    (dir_pane_info *dpi)
  1382. #else
  1383. X    (dpi)
  1384. X        dir_pane_info *dpi;
  1385. X
  1386. #endif
  1387. {       char filter[2048];
  1388. X        XmString xmfilter;
  1389. X
  1390. X        strcpy (filter, "Files - filter is ");
  1391. X        strcat (filter, dpi -> file_filter);
  1392. X        xmfilter = XmStringCreateSimple (filter);
  1393. X        XtVaSetValues (dpi -> file_filter_label,
  1394. X                        XmNlabelString, xmfilter,
  1395. X                        NULL);
  1396. X        XmStringFree (xmfilter);
  1397. X
  1398. X        strcpy (filter, "Executables - filter is ");
  1399. X        strcat (filter, dpi -> executable_filter);
  1400. X        xmfilter = XmStringCreateSimple (filter);
  1401. X        XtVaSetValues (dpi -> executable_filter_label,
  1402. X                        XmNlabelString, xmfilter,
  1403. X                        NULL);
  1404. X        XmStringFree (xmfilter);
  1405. X
  1406. X        strcpy (filter, "Directories - filter is ");
  1407. X        strcat (filter, dpi -> dir_filter);
  1408. X        xmfilter = XmStringCreateSimple (filter);
  1409. X        XtVaSetValues (dpi -> dir_filter_label,
  1410. X                        XmNlabelString, xmfilter,
  1411. X                        NULL);
  1412. X        XmStringFree (xmfilter);
  1413. }
  1414. /*************************************************************************
  1415. X * Function: FilterFileCB ()
  1416. X * Purpose: set the filter for ordinary files
  1417. X * In parameters: w, client_data, call_data
  1418. X * Out parameters:
  1419. X * Precondition;
  1420. X * Postcondition:
  1421. X ************************************************************************/ 
  1422. X
  1423. /* ARGSUSED */
  1424. void
  1425. FilterFileCB 
  1426. #ifdef UseFunctionPrototypes
  1427. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1428. #else
  1429. X    (w, client_data, call_data)  
  1430. Widget        w;        /*  widget id        */ 
  1431. XXtPointer        client_data;    /*  data from applicaiton   */ 
  1432. XXtPointer        call_data;    /*  data from widget class  */ 
  1433. X
  1434. #endif
  1435. {    dir_pane_info *dpi;
  1436. X        char regexp[FSM_LENGTH]; 
  1437. X
  1438. X    XtVaGetValues (w, XmNuserData, &dpi, NULL);
  1439. X
  1440. /*
  1441. X    XtFree (dpi -> file_filter);
  1442. X    XtFree (dpi -> file_filter_regexp);
  1443. */
  1444. X
  1445. X    PromptDialog (w, "File filter", True, &(dpi -> file_filter));
  1446. X
  1447. X    RegExpPatternToRegExp (dpi -> file_filter, regexp);
  1448. X    RegExpCompile (regexp, dpi -> file_filter_regexp, FSM_LENGTH);
  1449. X
  1450. X    /* empty out current selection, in case it is no longer visible */
  1451. X    if (dpi -> file_selected != NULL)
  1452. X    {    invert_colours (dpi -> file_button_selected);
  1453. X        dpi -> file_selected = NULL;
  1454. X        ClearToolbar (dpi -> files_toolbar);
  1455. X    }
  1456. X        SetFiltersInLabels (dpi);
  1457. X        ResetFilesInPanes (dpi);
  1458. }
  1459. /*************************************************************************
  1460. X * Function: FilterDirCB ()
  1461. X * Purpose: set the filter on ditectory names
  1462. X * In parameters: w, client_data, call_data
  1463. X * Out parameters:
  1464. X * Precondition;
  1465. X * Postcondition: 
  1466. X ************************************************************************/ 
  1467. X
  1468. /* ARGSUSED */
  1469. void
  1470. FilterDirCB 
  1471. #ifdef UseFunctionPrototypes
  1472. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1473. #else
  1474. X    (w, client_data, call_data)  
  1475. Widget        w;        /*  widget id        */ 
  1476. XXtPointer        client_data;    /*  data from applicaiton   */ 
  1477. XXtPointer        call_data;
  1478. X
  1479. #endif
  1480. {    dir_pane_info *dpi;
  1481. X        char regexp[FSM_LENGTH]; 
  1482. X
  1483. X
  1484. X    XtVaGetValues (w, XmNuserData, &dpi, NULL);
  1485. X
  1486. /*
  1487. X    XtFree (dpi -> dir_filter);
  1488. X    XtFree (dpi -> dir_filter_regexp);
  1489. */
  1490. X
  1491. X    PromptDialog (w, "Directory filter", True, &(dpi -> dir_filter));
  1492. X
  1493. X    RegExpPatternToRegExp (dpi -> dir_filter, regexp);
  1494. X    RegExpCompile (regexp, dpi -> dir_filter_regexp, FSM_LENGTH);
  1495. X
  1496. X    /* empty out current selection, in case it is no longer visible */
  1497. X    if (dpi -> file_selected != NULL)
  1498. X    {    invert_colours (dpi -> file_button_selected);
  1499. X        dpi -> file_selected = NULL;
  1500. X        ClearToolbar (dpi -> files_toolbar);
  1501. X    }        SetFiltersInLabels (dpi);
  1502. X
  1503. X        SetFiltersInLabels (dpi);
  1504. X
  1505. X        ResetFilesInPanes (dpi);
  1506. }
  1507. X
  1508. /*************************************************************************
  1509. X * Function: FilterExecutbaleCb ()
  1510. X * Purpose: set file filter on executbale files
  1511. X * In parameters: w, client_data, call_data
  1512. X * Out parameters:
  1513. X * Precondition; 
  1514. X * Postcondition: 
  1515. X ************************************************************************/ 
  1516. X
  1517. /* ARGSUSED */
  1518. void
  1519. FilterExecutableCB 
  1520. #ifdef UseFunctionPrototypes
  1521. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1522. #else
  1523. X    (w, client_data, call_data)  
  1524. Widget        w;        /*  widget id        */ 
  1525. XXtPointer        client_data;    /*  data from applicaiton   */ 
  1526. XXtPointer        call_data;    /*  data from widget class  */ 
  1527. X
  1528. #endif
  1529. {    dir_pane_info *dpi;
  1530. X        char regexp[FSM_LENGTH]; 
  1531. X
  1532. X    XtVaGetValues (w, XmNuserData, &dpi, NULL);
  1533. X
  1534. X    /* memory leak? clean up old data? 
  1535. X    XtFree (dpi -> executable_filter);
  1536. X    XtFree (dpi -> executable_filter_regexp);
  1537. X        */
  1538. X
  1539. X    PromptDialog (w, "Executable filter", True,
  1540. X            &(dpi -> executable_filter));
  1541. X
  1542. X    RegExpPatternToRegExp (dpi -> executable_filter, regexp);
  1543. X    RegExpCompile (regexp, dpi -> executable_filter_regexp, FSM_LENGTH);
  1544. X
  1545. X    /* empty out current selection, in case it is no longer visible */
  1546. X    if (dpi -> file_selected != NULL)
  1547. X    {    invert_colours (dpi -> file_button_selected);
  1548. X        dpi -> file_selected = NULL;
  1549. X        ClearToolbar (dpi -> files_toolbar);
  1550. X    }
  1551. X
  1552. X        SetFiltersInLabels (dpi);
  1553. X
  1554. X        ResetFilesInPanes (dpi);
  1555. }
  1556. SHAR_EOF
  1557. chmod 0644 xmfm/filtercb.c ||
  1558. echo 'restore of xmfm/filtercb.c failed'
  1559. Wc_c="`wc -c < 'xmfm/filtercb.c'`"
  1560. test 8489 -eq "$Wc_c" ||
  1561.     echo 'xmfm/filtercb.c: original size 8489, current size' "$Wc_c"
  1562. rm -f _shar_wnt_.tmp
  1563. fi
  1564. # ============= xmfm/gotocb.c ==============
  1565. if test -f 'xmfm/gotocb.c' -a X"$1" != X"-c"; then
  1566.     echo 'x - skipping xmfm/gotocb.c (File already exists)'
  1567.     rm -f _shar_wnt_.tmp
  1568. else
  1569. > _shar_wnt_.tmp
  1570. echo 'x - extracting xmfm/gotocb.c (Text)'
  1571. sed 's/^X//' << 'SHAR_EOF' > 'xmfm/gotocb.c' &&
  1572. /*************************************************************************
  1573. X * File: $Source: /usr/usrs/xsource/xmfm/RCS/gotocb.c,v $
  1574. X * Author: Jan Newmarch
  1575. X * Last modified: $Date: 1992/11/10 05:12:32 $
  1576. X * Version: $Revision: 1.5 $
  1577. X * Purpose: This file handles the directory goto requests from the Goto
  1578. X *    menu, through callbacks attached to each button
  1579. X *
  1580. X * Revision history:
  1581. X *    16 Oct 92    caddr_t changed to XtPointer
  1582. X *       3 Nov 92       lint-ed
  1583. X ************************************************************************/ 
  1584. X
  1585. #include "copyright.h"
  1586. X
  1587. /*************************************************************************
  1588. X * System includes
  1589. X ************************************************************************/ 
  1590. #include <stdlib.h>
  1591. #include <stdio.h> 
  1592. X
  1593. #include <Xm/CascadeB.h>     
  1594. #include <Xm/FileSB.h>      
  1595. #include <Xm/Label.h>
  1596. #include <Xm/PushB.h>    
  1597. #include <Xm/RowColumn.h>    
  1598. #include <Xm/SelectioB.h>    
  1599. X
  1600. /*************************************************************************
  1601. X * Local includes
  1602. X ************************************************************************/ 
  1603. #include "filecb.h"
  1604. #include "types.h"
  1605. X
  1606. /*************************************************************************
  1607. X * Functions exported
  1608. X ************************************************************************/ 
  1609. extern void GotoHomeCB (
  1610. #ifdef UseFunctionPrototypes
  1611. X    Widget w, XtPointer client_data, XtPointer call_data
  1612. #endif
  1613. );
  1614. extern void GotoDirCB (
  1615. #ifdef UseFunctionPrototypes
  1616. X    Widget w, XtPointer client_data, XtPointer call_data
  1617. #endif
  1618. );
  1619. extern void GotoOpenHomeCB (
  1620. #ifdef UseFunctionPrototypes
  1621. X    Widget w, XtPointer client_data, XtPointer call_data
  1622. #endif
  1623. );
  1624. extern void GotoOpenDirCB (
  1625. #ifdef UseFunctionPrototypes
  1626. X    Widget w, XtPointer client_data, XtPointer call_data
  1627. #endif
  1628. );
  1629. X
  1630. /*************************************************************************
  1631. X * Variables exported
  1632. X ************************************************************************/ 
  1633. X
  1634. /*************************************************************************
  1635. X * Extern variables
  1636. X ************************************************************************/ 
  1637. X
  1638. /*************************************************************************
  1639. X * Extern functions
  1640. X ************************************************************************/ 
  1641. extern void GotoCurrentDir (
  1642. #ifdef UseFunctionPrototypes
  1643. X    Widget w
  1644. #endif
  1645. );
  1646. extern void builtin_chdir (
  1647. #ifdef UseFunctionPrototypes
  1648. X    char *dir, dir_pane_info *dpi
  1649. #endif
  1650. );
  1651. extern void PromptDialog (
  1652. #ifdef UseFunctionPrototypes
  1653. X    Widget parent, char *prompt, int modal, char **answer
  1654. #endif
  1655. );
  1656. X
  1657. /*************************************************************************
  1658. X * Forward functions
  1659. X ************************************************************************/ 
  1660. X
  1661. /*************************************************************************
  1662. X * Local variables
  1663. X ************************************************************************/ 
  1664. X
  1665. /*************************************************************************
  1666. X * Function: GotoHomeCb ()
  1667. X * Purpose: change current pane to home directory
  1668. X * In parameters: w, client_data, call_data
  1669. X * Out parameters:
  1670. X * Precondition; Goto Home button pressed
  1671. X * Postcondition: Home dir showing in panes
  1672. X ************************************************************************/ 
  1673. X
  1674. /* ARGSUSED */
  1675. void
  1676. GotoHomeCB 
  1677. #ifdef UseFunctionPrototypes
  1678. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1679. #else
  1680. X    (w, client_data, call_data)  
  1681. X   Widget        w;        /*  widget id        */ 
  1682. X   XtPointer        client_data;    /*  data from applicaiton   */ 
  1683. X   XtPointer        call_data;    /*  data from widget class  */ 
  1684. X
  1685. #endif
  1686. X    char *home_dir;
  1687. X    dir_pane_info *dpi;
  1688. X
  1689. X    home_dir = getenv ("HOME");
  1690. X    XtVaGetValues (w,
  1691. X            XmNuserData, (XtArgVal) &dpi,
  1692. X            NULL);
  1693. X    builtin_chdir (home_dir, dpi);
  1694. X    XtFree (home_dir);
  1695. }
  1696. /*************************************************************************
  1697. X * Function: GotoDirCB ()
  1698. X * Purpose: handle a Goto Dir... request to reset pane to new dir
  1699. X *    prompts for new dir name
  1700. X * In parameters: w, client_data, call_data
  1701. X * Out parameters:
  1702. X * Precondition; Got Dir button pressed from Goto menu
  1703. X * Postcondition: new prompted dir showing in panes
  1704. X ************************************************************************/ 
  1705. X
  1706. /* ARGSUSED */
  1707. void GotoDirCB 
  1708. #ifdef UseFunctionPrototypes
  1709. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1710. #else
  1711. X    (w, client_data, call_data)
  1712. Widget        w;        /*  widget id        */ 
  1713. XXtPointer        client_data;    /*  data from applicaiton   */ 
  1714. XXtPointer        call_data;
  1715. X
  1716. #endif
  1717. {
  1718. X    char *goto_dir;
  1719. X    dir_pane_info *dpi;
  1720. X
  1721. X    GotoCurrentDir (w);
  1722. X
  1723. X    PromptDialog (w, "Goto what directory?", True, &goto_dir);
  1724. X    if (goto_dir == NULL)
  1725. X        return;
  1726. X    XtVaGetValues (w,
  1727. X            XmNuserData, (XtArgVal) &dpi,
  1728. X            NULL);
  1729. X    builtin_chdir (goto_dir, dpi);
  1730. X    XtFree (goto_dir);
  1731. }
  1732. X
  1733. /*************************************************************************
  1734. X * Function: GotoOpenHomeCb ()
  1735. X * Purpose: create a new pane on the Home directory
  1736. X * In parameters: w, client_data, call_data
  1737. X * Out parameters:
  1738. X * Precondition; Opne Home button pressed in Goto menu
  1739. X * Postcondition: new pane showing Home dir
  1740. X ************************************************************************/ 
  1741. X
  1742. /* ARGSUSED */
  1743. void
  1744. GotoOpenHomeCB 
  1745. #ifdef UseFunctionPrototypes
  1746. X    (Widget w, XtPointer client_data, XtPointer call_data)
  1747. #else
  1748. X    (w, client_data, call_data)  
  1749. Widget        w;        /*  widget id        */ 
  1750. XXtPointer        client_data;    /*  data from applicaiton   */ 
  1751. XXtPointer        call_data;    /*  data from widget class  */ 
  1752. X
  1753. #endif
  1754. X    char *home_dir;
  1755. X    dir_pane_info *dpi;
  1756. X
  1757. X    home_dir = getenv ("HOME");
  1758. X    XtVaGetValues (w,
  1759. X            XmNuserData, (XtArgVal) &dpi,
  1760. X            NULL);
  1761. X    builtin_opendir (home_dir, dpi);
  1762. X    XtFree (home_dir);
  1763. }
  1764. /*************************************************************************
  1765. X * Function: GotoOpenDirCB()
  1766. X * Purpose: create a new pane on a prompted directory
  1767. X * In parameters: w, client_data, call_data
  1768. X * Out parameters:
  1769. X * Precondition; Open Dir button pressed in Goto menu
  1770. X * Postcondition: new pane showing asked for directory
  1771. X ************************************************************************/ 
  1772. SHAR_EOF
  1773. true || echo 'restore of xmfm/gotocb.c failed'
  1774. fi
  1775. echo 'End of  part 5'
  1776. echo 'File xmfm/gotocb.c is continued in part 6'
  1777. echo 6 > _shar_seq_.tmp
  1778. exit 0
  1779. --
  1780. +----------------------+---+
  1781.   Jan Newmarch, Information Science and Engineering,
  1782.   University of Canberra, PO Box 1, Belconnen, Act 2616
  1783.   Australia. Tel: (Aust) 6-2012422. Fax: (Aust) 6-2015041
  1784.