home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / XAP / XFM / XFM-1.3 / XFM-1 / xfm-1.3 / xfm / FmFwCb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-02  |  7.1 KB  |  277 lines

  1. /*---------------------------------------------------------------------------
  2.   Module FmFwCb
  3.  
  4.   (c) Simon Marlow 1990-92
  5.   (c) Albert Graef 1994
  6.  
  7.   Callback routines for widgets in a file window
  8. ---------------------------------------------------------------------------*/
  9.  
  10. #include <X11/Intrinsic.h>
  11. #include <X11/StringDefs.h>
  12. #include <X11/Xaw/Toggle.h>
  13.  
  14. #include <string.h>
  15. #include <stdio.h>
  16.  
  17. #include "Fm.h"
  18.  
  19. /*-----------------------------------------------------------------------------
  20.   This function is also used in FmFwActions when a directory is pulled onto
  21.   the root window. In this case, w will be zero and we use this to popup
  22.   the new window by the cursor.
  23. -----------------------------------------------------------------------------*/
  24. void fileOpenCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  25. {
  26.   int i;
  27.   char pathname[MAXPATHLEN];
  28.  
  29.   if (fw == NULL)
  30.     fw = popup_fw;
  31.  
  32.   for (i=0; i<fw->n_files; i++) {
  33.     if (fw->files[i]->selected && S_ISDIR(fw->files[i]->stats.st_mode)) {
  34.       strcpy(pathname, fw->directory);
  35.       if (pathname[strlen(pathname)-1] != '/')
  36.     strcat(pathname, "/");
  37.       strcat(pathname, fw->files[i]->name);      
  38.       newFileWindow(pathname,resources.default_display_type,
  39.             w ? False : True);
  40.     }
  41.   }
  42. }
  43.  
  44. /*---------------------------------------------------------------------------*/
  45.  
  46. void fileEditCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  47. {
  48.   int i;
  49.  
  50.   if (fw == NULL)
  51.     fw = popup_fw;
  52.  
  53.   for (i=0; i<fw->n_files; i++)
  54.     if (fw->files[i]->selected && !S_ISDIR(fw->files[i]->stats.st_mode))
  55.     doEdit(fw->directory,fw->files[i]->name);
  56. }
  57.  
  58. /*---------------------------------------------------------------------------*/
  59.  
  60. void fileTreeCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  61. {
  62.   fw->display_type = Tree;
  63.   updateFileDisplay(fw);
  64. }
  65.  
  66. /*---------------------------------------------------------------------------*/
  67.  
  68. void fileIconsCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  69. {
  70.   DisplayType t = fw->display_type;
  71.  
  72.   fw->display_type = Icons;
  73.   if (t == Text)
  74.     reDisplayFileWindow(fw);
  75.   else
  76.     updateFileDisplay(fw);
  77. }
  78.  
  79. /*---------------------------------------------------------------------------*/
  80.  
  81. void fileTextCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  82. {
  83.   DisplayType t = fw->display_type;
  84.  
  85.   fw->display_type = Text;
  86.   if (t == Icons)
  87.     reDisplayFileWindow(fw);
  88.   else
  89.     updateFileDisplay(fw);
  90. }
  91.  
  92. /*---------------------------------------------------------------------------*/
  93.  
  94. void fileSelectAllCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  95. {
  96.   int i;
  97.   Pixel pix;
  98.   
  99.   fw->n_selections = 0;
  100.   fw->n_bytes_selected = 0;
  101.   for (i=0; i < fw->n_files; i++) {
  102.     if (fw->files[i]->icon.toggle &&
  103.     strcmp(fw->files[i]->name, ".") &&
  104.     strcmp(fw->files[i]->name, "..")) {
  105.       fw->files[i]->selected = True;
  106.       fw->n_selections++;
  107.       fw->n_bytes_selected += fw->files[i]->stats.st_size;
  108.     }
  109.     else
  110.       fw->files[i]->selected = False;
  111.     if (fw->files[i]->icon.toggle) {
  112.       XtVaGetValues(fw->files[i]->icon.toggle,
  113.             fw->files[i]->selected?XtNforeground:XtNbackground, &pix,
  114.             NULL);
  115.       XtVaSetValues(fw->files[i]->icon.toggle, XtNborder, (XtArgVal) pix,
  116.             NULL);
  117.     }
  118.   }
  119.   updateStatus(fw);
  120. }
  121.  
  122. /*---------------------------------------------------------------------------*/
  123.  
  124. void fileDeselectCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  125. {
  126.   int i;
  127.   Pixel pix;
  128.   
  129.   for (i=0; i < fw->n_files; i++)
  130.     if (fw->files[i]->selected && fw->files[i]->icon.toggle) {
  131.       fw->files[i]->selected = False;
  132.       XtVaGetValues(fw->files[i]->icon.toggle, XtNbackground, &pix, NULL);
  133.       XtVaSetValues(fw->files[i]->icon.toggle, XtNborder, (XtArgVal) pix,
  134.             NULL);
  135.     }
  136.   fw->n_selections = 0;
  137.   fw->n_bytes_selected = 0;
  138.   updateStatus(fw);
  139. }
  140.  
  141. /*---------------------------------------------------------------------------*/
  142.  
  143. void fileSortNameCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  144. {
  145.   fw->sort_type = SortByName;
  146.   reSortFileDisplay(fw);
  147. }
  148.  
  149. /*---------------------------------------------------------------------------*/
  150.  
  151. void fileSortSizeCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  152. {
  153.   fw->sort_type = SortBySize;
  154.   reSortFileDisplay(fw);
  155. }
  156.  
  157. /*---------------------------------------------------------------------------*/
  158.  
  159. void fileSortMTimeCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  160. {
  161.   fw->sort_type = SortByMTime;
  162.   reSortFileDisplay(fw);
  163. }
  164.  
  165. /*---------------------------------------------------------------------------*/
  166.  
  167. void fileCloseCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  168. {
  169.   FileWindowRec *p;
  170.   int d;
  171.  
  172.   if (fw == file_windows && fw->next == NULL && !resources.appmgr)
  173.     if (!resources.confirm_quit || confirm("", "Exit file manager?", ""))
  174.       quit();
  175.     else
  176.       return;
  177.  
  178.   if ((d = findDev(fw->directory)) != -1) umountDev(d);
  179.  
  180.   XtDestroyWidget(fw->shell);
  181.  
  182.   if (fw == file_windows)
  183.     file_windows = fw->next;
  184.   else {
  185.     for (p = file_windows; p->next != fw; p = p->next);
  186.     p->next = fw->next;
  187.   }
  188.  
  189.   freeFileList(fw);
  190.   XTFREE(fw->file_items);
  191.   XTFREE(fw->folder_items);
  192.   XTFREE(fw->view_items);
  193.   XTFREE(fw);
  194.  
  195.   chdir(user.home);
  196. }
  197.  
  198. /*---------------------------------------------------------------------------*/
  199.  
  200. void fileHomeCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  201. {
  202.   freeze = True;
  203.   if (chdir(user.home))
  204.     sysError("Can't open folder:");
  205.   else if (!getwd(fw->directory))
  206.     sysError("System error:");
  207.   updateFileDisplay(fw);
  208.   freeze = False;
  209. }
  210.  
  211. /*---------------------------------------------------------------------------*/
  212.  
  213. void fileUpCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  214. {
  215.   freeze = True;
  216.   if (chdir(fw->directory) || chdir(".."))
  217.     sysError("Can't open folder:");
  218.   else if (!getwd(fw->directory))
  219.     sysError("System error:");
  220.   updateFileDisplay(fw);
  221.   freeze = False;
  222. }
  223.  
  224. /*---------------------------------------------------------------------------*/
  225.  
  226. void mainArrowCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  227. {
  228.   int i;
  229.  
  230.   freeze = True;
  231.  
  232.   for (i=0; i<fw->n_files; i++)
  233.     if (fw->files[i]->icon.arrow == w) {
  234.       getwd(fw->directory);
  235.       if (chdir(fw->directory) || chdir(fw->files[i]->name))
  236.     sysError("Can't open folder:");
  237.       else if (!getwd(fw->directory))
  238.     sysError("System error:");
  239.       break;
  240.     }
  241.   updateFileDisplay(fw);
  242.   freeze = False;
  243. }
  244.  
  245.  
  246. /*---------------------------------------------------------------------------*/
  247.  
  248. void fileShowDirsCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  249. {
  250.   fw->show_dirs = !fw->show_dirs;
  251.   updateFileDisplay(fw);
  252. }
  253.  
  254. /*---------------------------------------------------------------------------*/
  255.  
  256. void fileDirsFirstCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  257. {
  258.   fw->dirs_first = !fw->dirs_first;
  259.   reSortFileDisplay(fw);
  260. }
  261.  
  262. /*---------------------------------------------------------------------------*/
  263.  
  264. void fileShowHiddenCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  265. {
  266.   fw->show_hidden = !fw->show_hidden;
  267.   updateFileDisplay(fw);
  268. }
  269.  
  270. /*---------------------------------------------------------------------------*/
  271.  
  272. void timeoutCb(XtPointer data, XtIntervalId *id)
  273. {
  274.   if (!freeze) intUpdate();
  275.   XtAppAddTimeOut(app_context, resources.update_interval, timeoutCb, NULL);
  276. }
  277.