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 / FmChmod.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-02  |  9.5 KB  |  342 lines

  1. /*---------------------------------------------------------------------------
  2.   Module FmChmod
  3.  
  4.   (c) Simon Marlow 1990-92
  5.   (c) Albert Graef 1994
  6.  
  7.   Functions & data for handling the chmod feature
  8. ---------------------------------------------------------------------------*/
  9.  
  10. #include <X11/Intrinsic.h>
  11. #include <X11/StringDefs.h>
  12. #include <X11/Shell.h>
  13. #include <X11/Xaw/Form.h>
  14. #include <X11/Xaw/Label.h>
  15. #include <X11/Xaw/Command.h>
  16. #include <X11/Xaw/Box.h>
  17.  
  18. #include "Am.h"
  19. #include "Fm.h"
  20.  
  21. #define FORM_WIDTH 96
  22.  
  23. #define OWNER 0
  24. #define GROUP 1
  25. #define OTHERS 2
  26.  
  27. #define READ 0
  28. #define WRITE 1
  29. #define EXECUTE 2
  30.  
  31. /*---------------------------------------------------------------------------
  32.   STATIC DATA
  33. ---------------------------------------------------------------------------*/
  34.  
  35. typedef struct {
  36.   Widget w;
  37.   int value;
  38. } ChmodItem;
  39.  
  40. typedef struct {
  41.   Widget shell;
  42.   Widget label;
  43.   FileWindowRec *fw;
  44.   int file;
  45.   ChmodItem items[3][3];
  46. } ChmodData;
  47.  
  48. static ChmodData chmode;
  49.  
  50. /*---------------------------------------------------------------------------
  51.   Widget Argument lists
  52. ---------------------------------------------------------------------------*/
  53.  
  54. static Arg shell_args[] = {
  55.   { XtNtitle, (XtArgVal) "Change Permissions" }
  56. };
  57.  
  58. static Arg label_args[] = {
  59.   { XtNfromHoriz, (XtArgVal) NULL },
  60.   { XtNfromVert, (XtArgVal) NULL },
  61.   { XtNlabel, (XtArgVal) NULL },
  62.   { XtNwidth, (XtArgVal) 0 },
  63.   { XtNfont, (XtArgVal) NULL },
  64.   { XtNjustify, XtJustifyLeft },
  65.   { XtNtop, XtChainTop },
  66.   { XtNbottom, XtChainTop },
  67.   { XtNleft, XtChainLeft },
  68.   { XtNright, XtChainRight }
  69. };
  70.  
  71. static Arg tickbox_args[] = {
  72.   { XtNfromHoriz, (XtArgVal) NULL },
  73.   { XtNfromVert, (XtArgVal) NULL },
  74.   { XtNbitmap, (XtArgVal) None },
  75.   { XtNwidth, (XtArgVal) 0 },
  76.   { XtNresize, (XtArgVal) False },
  77.   { XtNtop, XtChainTop },
  78.   { XtNbottom, XtChainTop },
  79.   { XtNleft, XtChainLeft },
  80.   { XtNright, XtChainRight }
  81. };
  82.  
  83. static Arg *form_args = NULL;
  84.  
  85. static Arg form2_args[] = {
  86.   { XtNfromHoriz, (XtArgVal) NULL },
  87.   { XtNfromVert, (XtArgVal) NULL },
  88.   { XtNwidth, (XtArgVal) FORM_WIDTH },
  89.   { XtNdefaultDistance, (XtArgVal) 0 },
  90.   { XtNtop, XtChainTop },
  91.   { XtNbottom, XtChainTop },
  92.   { XtNleft, XtChainLeft },
  93.   { XtNright, XtChainLeft }
  94. };
  95.  
  96. static Arg button_box_args[] = {
  97.   { XtNfromHoriz, (XtArgVal) NULL },
  98.   { XtNfromVert, (XtArgVal) NULL },
  99.   { XtNtop, XtChainTop },
  100.   { XtNbottom, XtChainTop },
  101.   { XtNleft, XtChainLeft },
  102.   { XtNright, XtChainLeft }
  103. };
  104.  
  105. /*---------------------------------------------------------------------------
  106.   Strings to display in labels
  107. ---------------------------------------------------------------------------*/
  108.  
  109. static String big_labels[] = { "Owner", "Group", "Others" };
  110.  
  111. static String small_labels[] = { "r", "w", "x" };
  112.  
  113.  
  114. /*--------------------------------------------------------------------------
  115.   PRIVATE FUNCTIONS
  116. ---------------------------------------------------------------------------*/
  117.  
  118. static FmCallbackProc chmodRestoreCb, chmodOkCb, chmodCancelCb;
  119.  
  120. static void setupTicks()
  121. {
  122.   register int i,j;
  123.   struct stat *stats;
  124.  
  125.   stats = &chmode.fw->files[chmode.file]->stats;
  126.  
  127.   chmode.items[OWNER][READ].value     = (stats->st_mode) & S_IRUSR;
  128.   chmode.items[OWNER][WRITE].value    = (stats->st_mode) & S_IWUSR;
  129.   chmode.items[OWNER][EXECUTE].value  = (stats->st_mode) & S_IXUSR;
  130.  
  131.   chmode.items[GROUP][READ].value     = (stats->st_mode) & S_IRGRP;
  132.   chmode.items[GROUP][WRITE].value    = (stats->st_mode) & S_IWGRP;
  133.   chmode.items[GROUP][EXECUTE].value  = (stats->st_mode) & S_IXGRP;
  134.  
  135.   chmode.items[OTHERS][READ].value    = (stats->st_mode) & S_IROTH;
  136.   chmode.items[OTHERS][WRITE].value   = (stats->st_mode) & S_IWOTH;
  137.   chmode.items[OTHERS][EXECUTE].value = (stats->st_mode) & S_IXOTH;
  138.  
  139.   for (i=0; i<3; i++) {
  140.     for (j=0; j<3; j++) {
  141.       XtVaSetValues(chmode.items[i][j].w, XtNbitmap, 
  142.             chmode.items[i][j].value ? bm[TICK_BM] : bm[NOTICK_BM],
  143.             NULL);
  144.     }
  145.   }
  146. }
  147.  
  148. /*---------------------------------------------------------------------------*/
  149.   
  150. static void chmodRestoreCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  151. {
  152.   setupTicks();
  153. }
  154.  
  155. /*---------------------------------------------------------------------------*/
  156.  
  157. static void tickBoxCb(Widget w, XtPointer client_data, XtPointer call_data)
  158. {
  159.   register int i,j;
  160.  
  161.   i = (int) client_data;
  162.  
  163.   for (j=0; j<3; j++)
  164.     if (w == chmode.items[i][j].w)
  165.       break;
  166.  
  167.   if (chmode.items[i][j].value)
  168.     chmode.items[i][j].value = False;
  169.   else
  170.     chmode.items[i][j].value = True;
  171.  
  172.   XtVaSetValues(chmode.items[i][j].w, XtNbitmap, 
  173.            chmode.items[i][j].value ? bm[TICK_BM] : bm[NOTICK_BM], NULL);
  174. }
  175.  
  176. /*---------------------------------------------------------------------------*/
  177.  
  178. static void chmodOkCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  179. {
  180.   mode_t mode;
  181.  
  182.   XtPopdown(chmode.shell);
  183.   mode = chmode.fw->files[chmode.file]->stats.st_mode;
  184.   mode &= ~(S_IRUSR | S_IWUSR | S_IXUSR |
  185.             S_IRGRP | S_IWGRP | S_IXGRP |
  186.             S_IROTH | S_IWOTH | S_IXOTH);
  187.  
  188.   mode |= chmode.items[OWNER][READ].value     ? S_IRUSR : 0;
  189.   mode |= chmode.items[OWNER][WRITE].value    ? S_IWUSR : 0;
  190.   mode |= chmode.items[OWNER][EXECUTE].value  ? S_IXUSR : 0;
  191.  
  192.   mode |= chmode.items[GROUP][READ].value     ? S_IRGRP : 0;
  193.   mode |= chmode.items[GROUP][WRITE].value    ? S_IWGRP : 0;
  194.   mode |= chmode.items[GROUP][EXECUTE].value  ? S_IXGRP : 0;
  195.  
  196.   mode |= chmode.items[OTHERS][READ].value    ? S_IROTH : 0;
  197.   mode |= chmode.items[OTHERS][WRITE].value   ? S_IWOTH : 0;
  198.   mode |= chmode.items[OTHERS][EXECUTE].value ? S_IXOTH : 0;
  199.  
  200.   if (chdir(chmode.fw->directory)) {
  201.     sysError("System error:");
  202.     goto out;
  203.   }
  204.  
  205.   if (chmod(chmode.fw->files[chmode.file]->name, mode)) {
  206.     char s[0xff];
  207.     sprintf(s, "Can't change modes for %s:", 
  208.         chmode.fw->files[chmode.file]->name);
  209.     sysError(s);
  210.   }
  211.   else {
  212.     markForUpdate(chmode.fw->directory);
  213.     intUpdate();
  214.   }
  215.  
  216.  out:
  217.   freeze = False;
  218. }
  219.  
  220. /*---------------------------------------------------------------------------*/
  221.  
  222. static void chmodCancelCb(Widget w, FileWindowRec *fw, XtPointer call_data)
  223. {
  224.   XtPopdown(chmode.shell);
  225.   freeze = False;
  226. }           
  227.  
  228. /*---------------------------------------------------------------------------
  229.   Button Information
  230. ---------------------------------------------------------------------------*/
  231.  
  232. static ButtonRec chmod_buttons[] = {
  233.   { "ok", "Ok", chmodOkCb },
  234.   { "restore", "Restore", chmodRestoreCb },
  235.   { "cancel", "Cancel", chmodCancelCb }
  236. };
  237.  
  238. /*---------------------------------------------------------------------------
  239.   PUBLIC FUNCTIONS
  240. ---------------------------------------------------------------------------*/
  241.  
  242. void createChmodPopup()
  243. {
  244.   Widget form, form2, blabel, w;
  245.   register int i,j;
  246.  
  247.   /* create shell */
  248.   chmode.shell = XtCreatePopupShell("chmod", transientShellWidgetClass,
  249.                    aw.shell, shell_args, XtNumber(shell_args));
  250.   /* create outer form */
  251.   form = XtCreateManagedWidget("form", formWidgetClass, chmode.shell,
  252.                    form_args, XtNumber(form_args) );
  253.  
  254.   /* create two labels for message */
  255.   label_args[0].value = (XtArgVal) NULL;
  256.   label_args[1].value = (XtArgVal) NULL;
  257.   label_args[3].value = (XtArgVal) FORM_WIDTH*3 + 30;
  258.   label_args[4].value = (XtArgVal) resources.label_font;
  259.   chmode.label = XtCreateManagedWidget("label1", labelWidgetClass, form, 
  260.                        label_args, XtNumber(label_args) );
  261.  
  262.   form2_args[1].value = (XtArgVal) chmode.label;
  263.   label_args[5].value = (XtArgVal) XtJustifyCenter;
  264.  
  265.   form2 = NULL;
  266.   /* create smaller forms */
  267.   for (i=0; i<3; i++) {
  268.     form2_args[0].value = (XtArgVal) form2;
  269.     form2 = XtCreateManagedWidget(big_labels[i], formWidgetClass, form,
  270.                   form2_args, XtNumber(form2_args) );
  271.  
  272.     label_args[0].value = label_args[1].value = (XtArgVal) NULL;
  273.     label_args[2].value = (XtArgVal) big_labels[i];
  274.     label_args[3].value = (XtArgVal) FORM_WIDTH;
  275.     blabel = XtCreateManagedWidget("label", labelWidgetClass, form2,
  276.                    label_args, XtNumber(label_args) );
  277.  
  278.  
  279.     w = NULL;
  280.     for (j=0; j<3; j++) {
  281.       label_args[0].value = tickbox_args[0].value = (XtArgVal) w;
  282.       label_args[1].value = (XtArgVal) blabel;
  283.       label_args[2].value = (XtArgVal) small_labels[j];
  284.       label_args[3].value = (XtArgVal) FORM_WIDTH/3;
  285.       w = XtCreateManagedWidget(small_labels[j], labelWidgetClass, form2,
  286.                      label_args, XtNumber(label_args) );
  287.  
  288.       tickbox_args[1].value = (XtArgVal) w;
  289.       tickbox_args[2].value = (XtArgVal) NULL;
  290.       tickbox_args[3].value = (XtArgVal) FORM_WIDTH/3;
  291.       w = XtCreateManagedWidget(small_labels[j], commandWidgetClass,
  292.                 form2, tickbox_args, XtNumber(tickbox_args) );
  293.       XtAddCallback(w, XtNcallback, (XtCallbackProc) tickBoxCb, (XtPointer) i);
  294.       chmode.items[i][j].w = w;
  295.     }
  296.   }
  297.   
  298.   /* create button box & buttons */
  299.   button_box_args[1].value = (XtArgVal) form2;
  300.   w = XtCreateManagedWidget("button box", boxWidgetClass, form, 
  301.                 button_box_args, XtNumber(button_box_args) );
  302.   createButtons(chmod_buttons, XtNumber(chmod_buttons), w, NULL);
  303.  
  304.   XtRealizeWidget(chmode.shell);
  305. }
  306.  
  307. /*---------------------------------------------------------------------------*/
  308.  
  309. void chmodPopup(Widget w, FileWindowRec *fw, XtPointer call_data)
  310. {
  311.   char message[MAXPATHLEN];
  312.   register int i;
  313.  
  314.   if (fw == NULL) fw = popup_fw;
  315.  
  316.   if (!fw->n_selections) return;
  317.  
  318.   chmode.fw = fw;
  319.  
  320.   for (i=0;; i++)
  321.     if (fw->files[i]->selected) {
  322.       chmode.file = i;
  323.       break;
  324.     }
  325.   
  326.   strcpy(message, "Changing access permissions for ");
  327.   strcat(message, chmode.fw->files[chmode.file]->name);
  328.   XtVaSetValues(chmode.label, XtNlabel, (XtArgVal) message, NULL);
  329.  
  330.   setupTicks();
  331.  
  332.   freeze = True;
  333.   popupByCursor(chmode.shell, XtGrabExclusive);
  334. }
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.