home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / XAP / XFILEMAN / XFILEMAN.TAR / xfilemanager / action.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-22  |  41.0 KB  |  1,542 lines

  1. /*
  2.  * Copyright 1993 by Ove Kalkan, Cremlingen, Germany
  3.  *
  4.  * Permission to use, copy, modify, distribute and sell this software and it's
  5.  * documentation for any purpose is hereby granted without fee, rpovided that
  6.  * the above copyright notice and this permission appear in supporting
  7.  * documentation, and that the name of Ove Kalkan not to be used in
  8.  * advertising or publicity pertaining to distributiopn of the software without
  9.  * specific, written prior permission. Ove Kalkan makes no representations
  10.  * about the suitability of this software for any purpose. It is provided
  11.  * as is without express or implied warranty.
  12.  *
  13.  * OVE KALKAN DISPLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  14.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABLILITY AND FITNESS, IN NO
  15.  * EVENT SHALL OVE KALKAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  16.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  17.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  18.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  19.  * PERFORMANCE OF THIS SOFTWARE.
  20.  *
  21.  * $Header: filename,v 1.0 yyyy/mm/dd hh:mm:ss loginname Exp $
  22.  */
  23.  
  24.  
  25. #include "global.h"
  26.  
  27. /*
  28.  * Global variables
  29.  */
  30. static    Widget    text_5, text_6;
  31. static    void    set_root(void);
  32. static    void    do_root(void);
  33.  
  34. static    char    *newroot;
  35.  
  36.  
  37. /*********************************************************
  38.  * name:    hide_dialog
  39.  * description:    loescht das Dialog-Fenster
  40.  * input:    none
  41.  * output:    none
  42.  * date:    0.5.93
  43.  *********************************************************/
  44. void    hide_dialog (void)
  45. {
  46.     XUngrabPointer(XtDisplay(toplevel),CurrentTime);
  47.     XtDestroyWidget (dialog);
  48.     dialog = NULL;
  49. }
  50.  
  51. /*********************************************************
  52.  * name:    hide_dialog
  53.  * description:    loescht das Dialog-Fenster
  54.  * input:    none
  55.  * output:    none
  56.  * date:    0.5.93
  57.  *********************************************************/
  58. void    hide_idialog (void)
  59. {
  60.     if (oldfile)
  61.         free(oldfile);
  62.     XtDestroyWidget (info_shell);
  63.     info_shell = NULL;
  64. }
  65.  
  66.  
  67. /*********************************************************
  68.  * name:    setSize
  69.  * description:    richtiges Setzen der Min-Max-Grenzen
  70.  * input:    none
  71.  * output:    none
  72.  * date:    0.5.93
  73.  *********************************************************/
  74. void    setSize (void)
  75. {
  76.     Arg    args[3];
  77.     Dimension    w,h;
  78.  
  79.     /*
  80.      * Max und Minsize setzen
  81.      */
  82.     XtSetArg(args[0],XtNheight,&h);
  83.     XtSetArg(args[1],XtNwidth,&w);
  84.     XtGetValues(dialog,args,2);
  85.  
  86.     XtSetArg(args[2],XtNminWidth,w);
  87.     XtSetArg(args[1],XtNmaxHeight,h);
  88.     XtSetArg(args[0],XtNminHeight,h);
  89.     XtSetValues(dialog,args,3);
  90. }
  91.  
  92.  
  93. /*********************************************************
  94.  * name:    WARNING
  95.  * description:    erzeugt ein Hinweisfenster
  96.  * input:    char *text
  97.  * output:    none
  98.  * date:    10.6.93
  99.  *********************************************************/
  100. void    WARNING (char *text)
  101. {
  102.     Widget    but;
  103.  
  104.     /*
  105.      * Das Dialogfenster erzeugen
  106.      */
  107.     but = makeDialog(0,NULL,NULL,NULL,NULL,text,FALSE,TRUE,Icon_Warning_PM);
  108.  
  109.     XtAddCallback(but,XtNcallback,(XtCallbackProc) hide_dialog,NULL);
  110.  
  111.     /*
  112.      * Zum Schluss die Dialogshell managen
  113.      */
  114.     XtManageChild (dialog);
  115. /*    XGrabPointer(XtDisplay(toplevel),XtWindow(toplevel), True,
  116.             ButtonReleaseMask | ButtonPressMask,
  117.             GrabModeAsync, GrabModeAsync, XtWindow(dialog), None,
  118.             CurrentTime);
  119. */}
  120.  
  121. /*********************************************************
  122.  * name:    init_goto
  123.  * description:    erzeugt den requester fuer das goto
  124.  * input:    none
  125.  * output:    none
  126.  * author:    Ove Kalkan
  127.  * date:    5.8.1993
  128.  *********************************************************/
  129. void    init_goto (void)
  130. {
  131.     Widget    but;
  132.     char    *got;
  133.  
  134.     got = getPath(&root);
  135.     NO_MULTI = TRUE;
  136.     but = makeDialog(1,"Path:",NULL,got,NULL,"Show Directory",TRUE,FALSE,
  137.              Icon_Goto_PM);
  138.     XtAddCallback(but,XtNcallback,(XtCallbackProc) gotoDir, NULL);
  139.     XtManageChild (dialog);
  140.     free(got);
  141. }
  142.  
  143.  
  144. /*********************************************************
  145.  * name:    gotoDir
  146.  * description:    Die Callbackroutine fuer den Goto-Dir-Requester.
  147.  *        Ziel ist es, zunaechst einmal den bestehenden
  148.  *        Pfad nach dem entsprechenden Directory zu
  149.  *        durchsuchen, und eventuell den Pfad aufzufuellen.
  150.  * input:    none.
  151.  * output:    none, Zeigt wenn gefunden das Directory an
  152.  *        und veraendert entsprechend den Directory-baum.
  153.  * author:    Ove Kalkan
  154.  * date:    26.Aug.1993
  155.  *********************************************************/
  156. void    gotoDir (void)
  157. {
  158.     char    *path;
  159.     struct stat    buf;
  160.     Dir_Glyph    *from = NULL;
  161.     char        *got;
  162.     char        *mark;
  163.  
  164.     /*
  165.      * Zunaechst einmal muss der Text aus dem Dialog geholt werden
  166.      */
  167.     XtVaGetValues(text_1,XtNstring,&path,NULL);
  168.  
  169.     /* Shell zerstoeren */
  170.     if (dialog)
  171.         XtDestroyWidget(dialog);
  172.     dialog = NULL;
  173.  
  174.     /*
  175.      * Nachsehen, ob das File auch exisitert und ein Directory-name ist
  176.      */
  177.     if (stat(path,&buf) == -1) {
  178.         WARNING("Error: Unknown Path!\nCannot show Directory.");
  179.         return;
  180.     }
  181.     if (!S_ISDIR(buf.st_mode)) {
  182.         WARNING("Error: File exists, but\nis not a Directory.");
  183.         return;
  184.     }
  185.  
  186.     /*
  187.      * Directory raussuchen
  188.      */
  189.     from = &root;
  190.     got = getPath(from);
  191.     if (strcmp(got,path)) {
  192.         int    i;
  193.         Boolean    NOTENDE = TRUE;
  194.  
  195.         /* Hier die Marke setzen */
  196.         if (strncmp(path,got,strlen(got))) {
  197.             NOTENDE = FALSE;
  198.             from = NULL;
  199.         }
  200.         else {
  201.             mark = path+strlen(got)+1;
  202.             mark = strchr(mark,'/');
  203.             if (mark)
  204.                 *mark = '\0';
  205.         }
  206.         while (NOTENDE) {
  207.             i = 0;
  208.  
  209.             if (!from->open)
  210.                 fillDir(from);
  211.             while (i < from->dir_count) {
  212.                 free(got);
  213.                 got = getPath(from->dir[i]);
  214.                 if (strcmp(path,got)) {
  215.                     i++;
  216.                 }
  217.                 else {
  218.                     from = from->dir[i];
  219.                     i = 16000;
  220.                     if (mark) {
  221.                         *mark++ = '/';
  222.                         mark = strchr(mark,'/');
  223.                         if (mark)
  224.                             *mark = '\0';
  225.                     }
  226.                     else
  227.                         NOTENDE = FALSE;
  228.                 }
  229.             }
  230.             if (i < 16000) {
  231.                 NOTENDE = FALSE;
  232.                 from = NULL;
  233.             }
  234.         }
  235.     }
  236.  
  237.     /*
  238.      * Bingo wenn from != NULL
  239.      */
  240.     free(got);
  241.     if (from) {
  242.         if (defaults.multi_window) {
  243.             if (!from->open && from->dir_count == 0) {
  244.                 fillDir(from);
  245.             }
  246.             newFolder (from);
  247.         }
  248.         else {
  249.             selc_f = 16000;
  250.             selc_fo = NULL;
  251.             folders[0]->dir = from;
  252.             if (!from->open && from->dir_count == 0) {
  253.                 fillDir(from);
  254.             }
  255.             fillFolder(folders[0]);
  256.             FILE_CHANGED = TRUE;
  257.             refresh_files(folders[0]->window,NULL,NULL,NULL);
  258.             XtVaSetValues(folders[0]->label,XtNlabel,path,NULL);
  259.         }
  260.         DIR_CHANGED = TRUE;
  261.         refresh_dirs(NULL,NULL,NULL,NULL);
  262.     }
  263.     else
  264.         WARNING("Error: Cannot find Directory.\nMake sure that the directory\nresides on your root path.");
  265. }
  266.  
  267.  
  268. /*********************************************************
  269.  * name:    init_root
  270.  * description:    erzeugt den requester fuer das change root
  271.  * input:    none
  272.  * output:    none
  273.  * author:    Ove Kalkan
  274.  * date:    5.8.1993
  275.  *********************************************************/
  276. void    init_root (void)
  277. {
  278.     Widget    but;
  279.     char    *path = NULL;
  280.  
  281. #ifdef RESTRICTED_DIRS
  282.     path = getenv("HOME");
  283. #endif
  284.     NO_MULTI = TRUE;
  285.     but = makeDialog(1,"Path:",path,NULL,NULL,"Change Root of Directorytree",
  286.              TRUE,FALSE,Icon_Root_PM);
  287.     XtAddCallback(but,XtNcallback,(XtCallbackProc) set_root,NULL);
  288.     XtManageChild (dialog);
  289. }
  290.  
  291. static    void    set_root (void)
  292. {
  293.     struct    stat    buf;
  294.     char    *home;
  295.     Widget    but;
  296.  
  297.     XtDestroyWidget(dialog);
  298.     dialog = NULL;
  299.     XtVaGetValues(text_1,XtNstring,&home,NULL);
  300.     if (stat(home,&buf)) {
  301.         WARNING("Error: Cannot change rootdir. Path does not exist!");
  302.         return;
  303.     }
  304.     if (!S_ISDIR(buf.st_mode)) {
  305.         WARNING("Error: Cannot change rootdir. File is not a directory");
  306.         return;
  307.     }
  308.     if (!(getFlags(&buf) & DIR_READABLE)) {
  309.         WARNING("Error: Cannot change rootdir. Directory exists but is not accessable!");
  310.         return;
  311.     }
  312.     newroot = (char *) malloc(strlen(home)+1);
  313.     if (!newroot)
  314.         FATAL_ERROR("set_root: malloc failed!");
  315.     sprintf(newroot,"%s",home);
  316.  
  317. #ifdef    RESTRICTED_DIRS
  318.     home = getenv("HOME");
  319.     if (!strncmp(newroot,home,strlen(home))) {
  320.         WARNING("Error: Cannot access directorys out of the HOME path!");
  321.         free(newroot);
  322.         return;
  323.     }
  324. #endif
  325.     but = makeDialog(0,NULL,NULL,NULL,NULL,"Warning: Because of some internal functions it would\nbe necessary to close all directorywindows to change the root-directory.\nTo continue press the ok button.",
  326.              TRUE,FALSE,Icon_Warning_PM);
  327.     XtAddCallback(but,XtNcallback,(XtCallbackProc) do_root,NULL);
  328.     XtManageChild (dialog);    
  329. }
  330.  
  331.  
  332. static    void    do_root (void)
  333. {
  334.     int    i;
  335.  
  336.     XtDestroyWidget(dialog);
  337.     dialog = NULL;
  338.  
  339.     i = folder_count;
  340.     /*
  341.      * Alle folder loeschen, da sie spaeter auf root zugreifen wuerden
  342.      * und somit die Pfade zermanscht wuerden.
  343.      */
  344.     if (defaults.multi_window)
  345.         while (i--)
  346.             hideFolder(NULL,(XtPointer) folders[i],NULL);
  347.  
  348.     root.name = newroot;
  349.     root.x = 0;
  350.     root.y = 0;
  351.     root.open = TRUE;
  352.     root.parent = NULL;
  353.     root.dir = NULL;
  354.     root.dir_count = 0;
  355.  
  356.     /*
  357.      * Den Status des Root-Directories holen
  358.      */
  359.     {
  360.         struct stat buf;
  361.  
  362.         (void) stat (root.name,&buf);
  363.         root.flags = getFlags(&buf);
  364.     }
  365.  
  366.     fillDir(&root);
  367.     if (!defaults.multi_window) {
  368.         Arg    args[1];
  369.         char    *s = getPath(&root);
  370.  
  371.         selc_f = 16000;
  372.         FILE_CHANGED = TRUE;
  373.         folders[0]->fs_type = FS_NORMAL;
  374.         folders[0]->dir = &root;
  375.         fillFolder(folders[0]);
  376.         refresh_files(folders[0]->window,NULL,NULL,NULL);
  377.         XtSetArg(args[0],XtNlabel,(*s == '\0' ? "/" : s));
  378.         XtSetValues(folders[0]->label,args,1);
  379.     }
  380.     DIR_CHANGED = TRUE;
  381.     refresh_dirs(NULL,NULL,NULL,NULL);
  382. }
  383.  
  384.  
  385. /*********************************************************
  386.  * name:    init_quit
  387.  * description:    Fragen ob Programm beenden oder nicht
  388.  * input:    none
  389.  * output:    none
  390.  * date:    10.6.93
  391.  *********************************************************/
  392. void    init_quit (void)
  393. {
  394.     Widget    but;
  395.  
  396.     /*
  397.      * Das Dialogfenster erzeugen
  398.      */
  399.     but = makeDialog(0,NULL,NULL,NULL,NULL,"Termintate Xfilemanager?",TRUE,TRUE,
  400.              Icon_Warning_PM);
  401.  
  402.     XtAddCallback(but,XtNcallback,(XtCallbackProc) quit_all,NULL);
  403.  
  404.     /*
  405.      * Zum Schluss die Dialogshell managen
  406.      */
  407.     XtManageChild (dialog);
  408. /*    XGrabPointer(XtDisplay(toplevel),XtWindow(toplevel), True,
  409.             ButtonReleaseMask | ButtonPressMask,
  410.             GrabModeAsync, GrabModeAsync, XtWindow(dialog), None,
  411.             CurrentTime);
  412. */
  413. }
  414.  
  415.  
  416.  
  417.  
  418. /*
  419.  * name:    makeDialog
  420.  * description:    erzeugt ein Dialogfenster
  421.  * input:    Dimension text    Anzahl der Textfenster
  422.  *        char    *label1        - Label fuer Textfeld 1
  423.  *        char    *label2        - Label fuer Textfeld 2
  424.  *        char    *text1        - Text der in Textfeld 1 stehen soll
  425.  *        char    *text2        - Text der in Textfeld 2 stehen soll
  426.  *        char    *title        - Ueberschrift des Dialogs
  427.  *        Boolean    CANCEL        - CancelButton erzeugen
  428.  *        Boolean    OVERRIDE    - Ob es eine Override-Shell werden soll
  429.  *        Pixmap    icon        - das Icon
  430.  * output:    den Acceptbuttton zum setzen des Callbacks
  431.  */
  432. Widget    makeDialog(Dimension text, char *label1, char *label2, char *text1,
  433.            char *text2, char *title, Boolean CANCEL, Boolean OVERRIDE,
  434.            Pixmap picon)
  435. {
  436.     Arg    args[11];
  437.     Widget    form;
  438.     Widget    icon;
  439.     Widget    label;
  440.     Widget    fl, tl;
  441.     Widget    but, obut;
  442.     int    w;
  443.  
  444.     /*
  445.      * Falls noch ein Dialog-Fenster geoeffnet ist, dann loeschen
  446.      */
  447.     if (dialog)
  448.         XtDestroyWidget(dialog);
  449.  
  450.     XUngrabPointer(XtDisplay(toplevel),CurrentTime);
  451.  
  452.     /*
  453.      * Das DialogWidget erzeugen
  454.      */
  455.     if (OVERRIDE)
  456.         dialog = XtVaCreatePopupShell ("dialog_shell", 
  457.                         overrideShellWidgetClass,
  458.                         toplevel, 
  459.                         XtNallowShellResize, TRUE,
  460.                         XtNtitle,"Xfilemanager - Dialog",
  461.                         NULL);
  462.     else
  463.         dialog = XtVaCreatePopupShell ("dialog_shell",
  464.                         topLevelShellWidgetClass,
  465.                         toplevel, 
  466.                         XtNallowShellResize, TRUE,
  467.                         NULL);
  468.  
  469.     /*
  470.      * Die Form zum Anordnen der Widgets darauf erzeugen
  471.      */
  472.     form = XtCreateManagedWidget ("dialog_form", formWidgetClass, dialog,
  473.                     args, 0);
  474.  
  475.     /*
  476.      * Den Simple fuer das Icon erstellen
  477.      */
  478.     XtSetArg(args[0],XtNtop, XtChainTop);
  479.     XtSetArg(args[1],XtNbottom, XtChainTop);
  480.     XtSetArg(args[2],XtNright, XtChainLeft);
  481.     XtSetArg(args[3],XtNleft, XtChainLeft);
  482.     XtSetArg(args[4],XtNborderWidth, 0);
  483.     XtSetArg(args[5],XtNimageWidth, 32);
  484.     XtSetArg(args[6],XtNimageHeight, 32);
  485.     XtSetArg(args[7],XtNimage, picon);
  486.     icon = XtCreateManagedWidget ("dialog_icon", iconWidgetClass, form,
  487.                     args, 8);
  488.  
  489.     /*
  490.      * den Label darauf erzeugen, der sagt, das es sich hierbei um
  491.      * eine Verschiebe-Aktion handelt
  492.      */
  493.     XtSetArg(args[5],XtNlabel, title);
  494.     XtSetArg(args[6],XtNfromHoriz, icon);
  495.     label = XtCreateManagedWidget ("dialog_title", labelWidgetClass, form,
  496.                     args, 7);
  497.     tl = icon;
  498.     if (strchr(title,'\n'))
  499.         tl = label;
  500.  
  501.     if (text > 0) {
  502.         /*
  503.          * Die Breite des Widgets fuer eine schoene Ausrichtung des
  504.          * Widgets ermitteln
  505.          */
  506.         w = strlen(label1);
  507.         if (text > 1 && strlen(label2) > w)
  508.             w = strlen(label2);
  509.         w *= 10;
  510.  
  511.         /*
  512.          * Nun die From Sachen (Label & Text)
  513.          */
  514.         XtSetArg(args[5],XtNlabel, label1);
  515.         XtSetArg(args[6],XtNfromVert, icon);
  516.         XtSetArg(args[7],XtNwidth, w);
  517.         XtSetArg(args[8],XtNjustify,XtJustifyLeft);
  518.         fl = XtCreateManagedWidget ("dialog_from", labelWidgetClass, form,
  519.                         args, 9);
  520.  
  521.         XtSetArg(args[2],XtNright, XtChainRight);
  522.         XtSetArg(args[4],XtNresizable,TRUE);
  523.         XtSetArg(args[5],XtNfromHoriz, fl);
  524.         XtSetArg(args[7],XtNeditType, XawtextEdit);
  525.         XtSetArg(args[8],XtNresize, XawtextResizeWidth);
  526.         XtSetArg(args[9],XtNstring, text1);
  527.         XtSetArg(args[10], XtNwidth, 150);
  528.         text_1 = XtCreateManagedWidget("dialog_text1", asciiTextWidgetClass,
  529.                         form, args,11);
  530.         XtOverrideTranslations(text_1, XtParseTranslationTable(
  531.                         "<Key>Return: no-op()"));
  532.         if (MULTI && !NO_MULTI) {
  533.             XtVaSetValues(text_1,
  534.                     XtNeditType,XawtextRead,
  535.                     XtNdisplayCaret,FALSE,
  536.                     XtNcursor, def_cursor,
  537.                     XtNheight, 70,
  538.                     XtNscrollVertical, XawtextScrollWhenNeeded,
  539.                     NULL);
  540.         }
  541.         tl = text_1;
  542.     }
  543.     NO_MULTI = FALSE;
  544.     if (text > 1) {
  545.         /*
  546.          * Nun die To Sachen (Label & Text)
  547.          */
  548.         XtSetArg(args[2],XtNright, XtChainLeft);
  549.         XtSetArg(args[4],XtNborderWidth, 0);
  550.         XtSetArg(args[5],XtNlabel, label2);
  551.         XtSetArg(args[6],XtNfromVert, tl);
  552.         XtSetArg(args[7],XtNwidth, w);
  553.         XtSetArg(args[8],XtNjustify,XtJustifyLeft);
  554.         fl = XtCreateManagedWidget ("dialog_from", labelWidgetClass, form,
  555.                         args, 9);
  556.  
  557.         XtSetArg(args[2],XtNright, XtChainRight);
  558.         XtSetArg(args[4],XtNresizable,TRUE);
  559.         XtSetArg(args[5],XtNfromHoriz, fl);
  560.         XtSetArg(args[7],XtNeditType, XawtextEdit);
  561.         XtSetArg(args[8],XtNresize, XawtextResizeWidth);
  562.         XtSetArg(args[9],XtNstring, text2);
  563.         text_2 = XtCreateManagedWidget("dialog_text2", asciiTextWidgetClass,
  564.                         form, args,11);
  565.         XtOverrideTranslations(text_2, XtParseTranslationTable(
  566.                         "<Key>Return: no-op()"));
  567.         tl = fl;
  568.     }
  569.  
  570.     /*
  571.      * Zum Schluss noch die 2 Buttons
  572.      */
  573.     but = NULL;
  574.     XtSetArg(args[2],XtNright, XtChainLeft);
  575.     XtSetArg(args[5],XtNfromVert, tl);
  576.     XtSetArg(args[6],XtNvertDistance, 10);
  577.  
  578.     /*
  579.      * wenn gewuenscht, den Cancel Button
  580.      */
  581.     if (CANCEL) {
  582.         XtSetArg(args[4],XtNlabel, " Cancel ");
  583.         but = XtCreateManagedWidget ("dialog_cancel", commandWidgetClass, form,
  584.                         args, 7);
  585.         XtAddCallback(but,XtNcallback, (XtCallbackProc) hide_dialog, NULL);
  586.     }
  587.  
  588.     /*
  589.      * Immer den OK-Button
  590.      */
  591.     XtSetArg(args[4],XtNlabel, "   Ok   ");
  592.     XtSetArg(args[7],XtNfromHoriz, but);
  593.     obut = XtCreateManagedWidget ("dialog_accept", commandWidgetClass, form,
  594.                     args, 8);
  595.  
  596.     /*
  597.      * Hier die Position der Maus feststellen und das Fenster so plazieren,
  598.      * das der Mauszeiger genau ueber dem Cancel-Button ist
  599.      */
  600.     {
  601.         Window    a,b;
  602.         int    ax,ay,bx,by;
  603.         unsigned int    m;
  604.         XtWidgetGeometry    ra,rb;
  605.  
  606.         XQueryPointer(XtDisplay(toplevel),XtWindow(toplevel),
  607.                 &a,&b,&ax,&ay,&bx,&by,&m);
  608.         ra.x = (0 > ax - 30 ? 0 : ax - 30);
  609.         ra.y = (0 > ay - 60 - text*24 ? 0 : ay - 60 - text*24);
  610.         ra.request_mode = CWX | CWY;
  611.         XtMakeGeometryRequest(dialog,&ra,&rb);
  612.     }
  613.     return(obut);
  614. }
  615.  
  616.  
  617.  
  618.  
  619. /*********************************************************
  620.  * name:    quit_all
  621.  * description:    Programmende, nachdem Quit bestaetigt wurde
  622.  * input:    none
  623.  * output:    none
  624.  * date:    14.6.93
  625.  *********************************************************/
  626. void    quit_all (void)
  627. {
  628.     if (defaults.save_ws_on_exit)
  629.         saveWorkspace(&workspace);
  630.     exit(0);
  631. }
  632.  
  633.  
  634.  
  635. /*********************************************************
  636.  * name:    init_info
  637.  * description:    erzeugt den file_info-dialog
  638.  * input:    none
  639.  * output:    none
  640.  * author:    Ove Kalkan
  641.  * date:    18.6.93
  642.  *********************************************************/
  643. void    init_info(void)
  644. {
  645.     Widget    form, icon,f;
  646.     Widget    label, w, bw[4];
  647.     extern    char *getString(void);
  648.     extern    char *getPath(Dir_Glyph *dir);
  649.     char    *file;
  650.     Arg    args[11];
  651.     struct    stat    buf;
  652.     char    dummy[256];
  653.     uid_t    uid = getuid();
  654.     gid_t    gid = getgid();
  655.     int    b = 0;
  656.     struct    passwd *pw;
  657.     struct    group *gr;
  658.     WidgetClass    class;
  659.  
  660.  
  661.     /*
  662.      * erst alten Dialog zerstoeren
  663.      */
  664.     if (info_shell)
  665.         XtDestroyWidget(info_shell);
  666.  
  667.     XUngrabPointer(XtDisplay(toplevel),CurrentTime);
  668.     oldfile = getString();        /* Filenamen zum verifizieren sichern */
  669.  
  670.     /*
  671.      * Das DialogWidget erzeugen
  672.      */
  673.     XtSetArg(args[0],XtNallowShellResize,TRUE);
  674.     XtSetArg(args[1],XtNtransientFor, toplevel);
  675.     XtSetArg(args[2],XtNtitle,"Xfilemanager - Fileinformation");
  676.     info_shell = XtCreatePopupShell ("dialog_shell", topLevelShellWidgetClass,
  677.                     toplevel, args, 3);
  678.  
  679.     /*
  680.      * Die Form zum Anordnen der Widgets darauf erzeugen
  681.      */
  682.     form = XtCreateManagedWidget ("dialog_form", formWidgetClass, info_shell,
  683.                     args, 0);
  684.     /*
  685.      * Den Simple fuer das Icon erstellen
  686.      */
  687.     XtSetArg(args[0],XtNtop, XtChainTop);
  688.     XtSetArg(args[1],XtNbottom, XtChainTop);
  689.     XtSetArg(args[2],XtNright, XtChainLeft);
  690.     XtSetArg(args[3],XtNleft, XtChainLeft);
  691.     XtSetArg (args[4],XtNimageWidth, 32);
  692.     XtSetArg (args[5],XtNimageHeight, 32);
  693.     XtSetArg (args[6],XtNborderWidth, 0);
  694.     XtSetArg (args[7],XtNimage, Icon_Info_PM);
  695.     icon = XtCreateManagedWidget ("dialog_icon", iconWidgetClass, form,
  696.                     args, 8);
  697.  
  698.     /*
  699.      * den Label darauf erzeugen, der sagt, das es sich hierbei um
  700.      * eine Verschiebe-Aktion handelt
  701.      */
  702.     XtSetArg(args[4],XtNborderWidth, 0);
  703.     XtSetArg(args[5],XtNfromHoriz, icon);
  704.     XtSetArg(args[6],XtNlabel,"File-Information");
  705.     label = XtCreateManagedWidget ("info_title", labelWidgetClass, form,
  706.                     args, 7);
  707.  
  708.     /*
  709.      * Den Status des Files fuer die uebrigen Boxen holen
  710.      */
  711.     file = getString();
  712.     lstat (file,&buf);
  713.  
  714.     /*
  715.      * Die Box fuer den Filenamen
  716.      */
  717.     XtSetArg(args[4],XtNborderWidth, 0);
  718.     XtSetArg(args[5],XtNwidth, 150);
  719.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  720.     XtSetArg(args[7],XtNlabel,"Filename :");
  721.     XtSetArg(args[8],XtNfromVert, icon);
  722.     label = XtCreateManagedWidget ("info_name", labelWidgetClass, form,
  723.                     args, 9);
  724.  
  725.     free (file);
  726.     if (selc_g)
  727.         file = selc_g->name;
  728.     else
  729.         file = selc_fo->file[selc_f]->name;
  730.  
  731.     XtSetArg(args[2],XtNright, XtChainRight);
  732.     XtSetArg(args[4],XtNfromHoriz, label);
  733.     XtSetArg(args[5],XtNfromVert, icon);
  734.     if ((uid == buf.st_uid || uid == 0) && strcmp(file,"..")) {    /* Filename veraenderbar fuer Owner
  735.                            und Root */
  736.         XtSetArg(args[6],XtNeditType, XawtextEdit);
  737.         XtSetArg(args[7],XtNstring, file);
  738.         XtSetArg(args[8],XtNresize, XawtextResizeWidth);
  739.         XtSetArg(args[9],XtNwidth, 13*strlen(file));
  740.         XtSetArg(args[10],XtNresizable, TRUE);
  741.         text_5 = XtCreateManagedWidget("name_text", asciiTextWidgetClass,
  742.                         form, args,11);
  743.         XtOverrideTranslations(text_5, XtParseTranslationTable(
  744.                         "<Key>Return: no-op()"));
  745.     }
  746.     else {
  747.         XtSetArg(args[6],XtNlabel, file);
  748.         XtSetArg(args[7],XtNborderWidth, 0);
  749.         XtSetArg(args[8],XtNjustify, XtJustifyLeft);
  750.         text_5 = XtCreateManagedWidget("name_text", labelWidgetClass,
  751.                         form, args,9);
  752.     }
  753.  
  754. #ifndef COHERENT
  755.     /* Es handelt sich um einen Link, also noch das Target ausgeben */
  756.     text_4 = NULL;
  757.     if ((selc_g && (selc_g->flags & DIR_LINK)) || (selc_fo && selc_f < 16000 &&
  758.          (selc_fo->file[selc_f]->prog_type == FILE_LINK ||
  759.           selc_fo->file[selc_f]->prog_type == FILE_LDIR))) {
  760.         int    length = 0;
  761.         int    flag = 0;
  762.  
  763.         XtSetArg(args[2],XtNright,XtChainLeft);
  764.         XtSetArg(args[3],XtNleft,XtChainLeft);
  765.         XtSetArg(args[4],XtNborderWidth,0);
  766.         XtSetArg(args[5],XtNlabel,"Link to :");
  767.         XtSetArg(args[7],XtNfromVert, text_5);
  768.         XtSetArg(args[6],XtNjustify, XtJustifyRight);
  769.         XtSetArg(args[8],XtNwidth,150);
  770.         label = XtCreateManagedWidget("link_info",labelWidgetClass,form,args,9);
  771.  
  772.         file = getString();
  773.         if (oldfile)
  774.             length = readlink(oldfile,link_target,255);
  775.         if (length < 0) {
  776.             flag = 1;
  777.             sprintf(link_target,"Link failure");
  778.         }
  779.         else
  780.             link_target[length] = '\0';
  781.  
  782.         XtSetArg(args[2],XtNright,XtChainLeft);
  783.         XtSetArg(args[4],XtNfromHoriz, label);
  784.         XtSetArg(args[5],XtNfromVert, text_5);
  785.         if ((uid == buf.st_uid || uid == 0) && !flag) {
  786.             XtSetArg(args[6],XtNlabel, link_target);
  787.             text_4 = XtCreateManagedWidget("link_text", commandWidgetClass,
  788.                             form, args,7);
  789.             XtAddCallback(text_4,XtNcallback,(XtCallbackProc) call_link_cb,NULL);
  790.         }
  791.         else {
  792.             XtSetArg(args[6],XtNlabel, link_target);
  793.             XtSetArg(args[7],XtNborderWidth, 0);
  794.             XtSetArg(args[8],XtNjustify, XtJustifyLeft);
  795.             text_4 = XtCreateManagedWidget("name_text", labelWidgetClass,
  796.                             form, args,9);
  797.         }
  798.     }
  799.     else 
  800. #endif    /* Coherent Unix kann keine Links */
  801.     {
  802.         XtSetArg(args[2],XtNright, XtChainLeft);
  803.         XtSetArg(args[3],XtNleft, XtChainLeft);
  804.         XtSetArg(args[4],XtNborderWidth, 0);
  805.         XtSetArg(args[5],XtNwidth, 150);
  806.         XtSetArg(args[6],XtNjustify, XtJustifyRight);
  807.         XtSetArg(args[7],XtNlabel,"Filetype :");
  808.         XtSetArg(args[8],XtNfromVert, text_5);
  809.         label = XtCreateManagedWidget ("info_name", labelWidgetClass, form,
  810.                     args, 9);
  811.         /*
  812.          * Kurzbeschreibung
  813.          */
  814.         XtSetArg(args[5],XtNfromHoriz,label);
  815.         XtSetArg(args[8],XtNfromVert,text_5);
  816.         if (selc_g)
  817.             XtSetArg(args[7],XtNlabel,"Directory");
  818.         else if (selc_fo && selc_f < 16000) {
  819.             File_Glyph    *ff = selc_fo->file[selc_f];
  820.  
  821.             if (ff->prog_type < max_filetypes) {
  822.                 XtSetArg(args[7],XtNlabel,
  823.                      filetypes[ff->prog_type].description);
  824.             }
  825.             else {
  826.                 switch (ff->prog_type) {
  827.                 case FILE_EXEC:
  828.                     XtSetArg(args[7],XtNlabel,"Executable");
  829.                     break;
  830.                 case FILE_TAR:
  831.                     XtSetArg(args[7],XtNlabel,"Tar-Archive");
  832.                     break;
  833.                 case FILE_CTAR:
  834.                     XtSetArg(args[7],XtNlabel,"Compressed Tar-Archive");
  835.                     break;
  836.                 case FILE_DIR:
  837.                     XtSetArg(args[7],XtNlabel,"Directory");
  838.                     break;
  839.                 case FILE_GHOST:
  840.                     XtSetArg(args[7],XtNlabel,"Empty File");
  841.                     break;
  842.                 case FILE_ROOT:
  843.                     XtSetArg(args[7],XtNlabel,"Parent Directory");
  844.                     break;
  845.                 default:
  846.                     XtSetArg(args[7],XtNlabel,"Unknown File");
  847.                 }
  848.             }
  849.         }
  850.         else
  851.             XtSetArg(args[7],XtNlabel,"Unknown File");
  852.         label = XtCreateManagedWidget ("info_name", labelWidgetClass, form,
  853.                         args, 9);
  854.     }
  855.     w = label;
  856.  
  857.     /*
  858.      * Die Box fuer den Filepath
  859.      */
  860.     XtSetArg(args[2],XtNright, XtChainLeft);
  861.     XtSetArg(args[3],XtNleft, XtChainLeft);
  862.     XtSetArg(args[4],XtNborderWidth,0);
  863.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  864.     XtSetArg(args[5],XtNwidth, 150);
  865.     XtSetArg(args[7],XtNlabel,"Location :");
  866.     XtSetArg(args[8],XtNfromVert, w);
  867.     label = XtCreateManagedWidget ("info_name", labelWidgetClass, form,
  868.                     args, 9);
  869.  
  870.     if (selc_g) {
  871.         if (selc_g->parent)
  872.             file = getPath(selc_g->parent);
  873.         else
  874.             file = NULL;
  875.     }
  876.     else
  877.         file = getPath(selc_fo->dir);
  878.  
  879.     XtSetArg(args[6],XtNfromHoriz, label);
  880.     XtSetArg(args[5],XtNfromVert, w);
  881.     XtSetArg(args[7],XtNlabel, file);
  882.     w = XtCreateManagedWidget("location_text", labelWidgetClass,
  883.                     form, args,8);
  884.     if (file)
  885.         free(file);
  886.  
  887.     /*
  888.      * Die Box fuer den Filegroesse
  889.      */
  890.     XtSetArg(args[2],XtNright, XtChainLeft);
  891.     XtSetArg(args[4],XtNborderWidth, 0);
  892.     XtSetArg(args[5],XtNwidth, 150);
  893.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  894.     XtSetArg(args[7],XtNlabel,"Size :");
  895.     XtSetArg(args[8],XtNfromVert, w);
  896.     label = XtCreateManagedWidget ("info_name", labelWidgetClass, form,
  897.                     args, 9);
  898.  
  899.     sprintf(dummy,"%d Bytes",buf.st_size);
  900.     XtSetArg(args[6],XtNfromHoriz, label);
  901.     XtSetArg(args[5],XtNfromVert, w);
  902.     XtSetArg(args[7],XtNlabel, dummy);
  903.     w = XtCreateManagedWidget("location_text", labelWidgetClass,
  904.                     form, args,8);
  905.  
  906.     /*
  907.      * Die Box fuer den Owner
  908.      */
  909.     XtSetArg(args[2],XtNright, XtChainLeft);
  910.     XtSetArg(args[4],XtNborderWidth, 0);
  911.     XtSetArg(args[5],XtNwidth, 150);
  912.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  913.     XtSetArg(args[7],XtNlabel,"Owner :");
  914.     XtSetArg(args[8],XtNfromVert, w);
  915.     label = XtCreateManagedWidget ("info_owner", labelWidgetClass, form,
  916.                     args, 9);
  917.  
  918.     /*
  919.      * Username holen
  920.      */
  921.     pw = getpwuid(buf.st_uid);
  922.     if (pw)
  923.         sprintf(dummy,"%s",pw->pw_name);
  924.     else
  925.         sprintf(dummy,"Unknown User");
  926.  
  927.     XtSetArg(args[4],XtNfromVert, w);
  928.     XtSetArg(args[5],XtNfromHoriz, label);
  929.     if (uid == buf.st_uid || uid == 0) {    /* Filename veraenderbar fuer Owner
  930.                            und Root */
  931.         XtSetArg(args[2],XtNright, XtChainRight);
  932.         XtSetArg(args[6],XtNeditType, XawtextEdit);
  933.         XtSetArg(args[7],XtNstring,  dummy);
  934.         XtSetArg(args[8],XtNwidth, 13*strlen(dummy));
  935.         XtSetArg(args[9],XtNresize, XawtextResizeWidth);
  936.         XtSetArg(args[10],XtNresizable, TRUE);
  937.         text_6 = XtCreateManagedWidget("name_text", asciiTextWidgetClass,
  938.                         form, args,11);
  939.         XtOverrideTranslations(text_6, XtParseTranslationTable(
  940.                         "<Key>Return: no-op()"));
  941.     }
  942.     else {
  943.         XtSetArg(args[6],XtNlabel, dummy);
  944.         XtSetArg(args[7],XtNborderWidth, 0);
  945.         XtSetArg(args[8],XtNjustify, XtJustifyLeft);
  946.         text_6 = XtCreateManagedWidget("name_text", labelWidgetClass,
  947.                         form, args,9);
  948.     }
  949.     w = label;
  950.  
  951.     /*
  952.      * Die Box fuer den Groups
  953.      */
  954.     XtSetArg(args[2],XtNright, XtChainLeft);
  955.     XtSetArg(args[4],XtNborderWidth, 0);
  956.     XtSetArg(args[5],XtNwidth, 150);
  957.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  958.     XtSetArg(args[7],XtNlabel,"Group :");
  959.     XtSetArg(args[8],XtNfromVert, w);
  960.     label = XtCreateManagedWidget ("info_group", labelWidgetClass, form,
  961.                     args, 9);
  962.  
  963.     /*
  964.      * Groupname holen
  965.      */
  966.     gr = getgrgid(buf.st_gid);
  967.     if (gr)
  968.         sprintf(dummy,"%s",gr->gr_name);
  969.     else
  970.         sprintf(dummy,"Unknown Group");
  971.     XtSetArg(args[4],XtNfromVert, w);
  972.     XtSetArg(args[5],XtNfromHoriz, label);
  973.     if (uid == buf.st_uid || uid == 0) {    /* Filename veraenderbar fuer Owner
  974.                            und Root */
  975.         XtSetArg(args[2],XtNright, XtChainRight);
  976.         XtSetArg(args[6],XtNeditType, XawtextEdit);
  977.         XtSetArg(args[7],XtNstring,  dummy);
  978.         XtSetArg(args[8],XtNwidth, 13*strlen(dummy));
  979.         XtSetArg(args[9],XtNresize, XawtextResizeWidth);
  980.         XtSetArg(args[10],XtNresizable, TRUE);
  981.         text_3 = XtCreateManagedWidget("name_text", asciiTextWidgetClass,
  982.                         form, args,11);
  983.         XtOverrideTranslations(text_3, XtParseTranslationTable(
  984.                         "<Key>Return: no-op()"));
  985.     }
  986.     else {
  987.         XtSetArg(args[6],XtNlabel, dummy);
  988.         XtSetArg(args[7],XtNborderWidth, 0);
  989.         XtSetArg(args[8],XtNjustify, XtJustifyLeft);
  990.         text_3 = XtCreateManagedWidget("name_text", labelWidgetClass,
  991.                         form, args,9);
  992.     }
  993.     w = label;
  994.  
  995.     /*
  996.      * Die Box fuer die Createion Time
  997.      */
  998.     XtSetArg(args[2],XtNright, XtChainLeft);
  999.     XtSetArg(args[4],XtNborderWidth, 0);
  1000.     XtSetArg(args[5],XtNwidth, 150);
  1001.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  1002.     XtSetArg(args[7],XtNlabel,"Creation Time :");
  1003.     XtSetArg(args[8],XtNfromVert, w);
  1004. /*    label = XtCreateManagedWidget ("info_group", labelWidgetClass, form,
  1005.                     args, 9);
  1006.  
  1007.     {
  1008.         struct    tm    *tt;
  1009.  
  1010.         tt = localtime (&buf.st_ctime);
  1011.         sprintf(dummy,"%d.%d.%d",tt->tm_mday,tt->tm_mon+1,1900+tt->tm_year);
  1012.     }
  1013.     XtSetArg(args[8],XtNfromVert,w);
  1014.     XtSetArg(args[7],XtNlabel,dummy);
  1015.     XtSetArg(args[5],XtNfromHoriz,label);
  1016.     label = XtCreateManagedWidget ("creat_time", labelWidgetClass, form,
  1017.                     args,9);
  1018.     w = label;
  1019. */
  1020.     /*
  1021.      * Die Box fuer die Modification Time
  1022.      */
  1023.     XtSetArg(args[5],XtNwidth, 150);
  1024.     XtSetArg(args[7],XtNlabel,"Last Modification :");
  1025.     XtSetArg(args[8],XtNfromVert, w);
  1026.     label = XtCreateManagedWidget ("info_group", labelWidgetClass, form,
  1027.                     args, 9);
  1028.  
  1029.     {
  1030.         struct    tm    *tt;
  1031.  
  1032.         tt = localtime (&buf.st_mtime);
  1033.         if (tt)
  1034.             sprintf(dummy,"%d.%d.%d",tt->tm_mday,tt->tm_mon+1,1900+tt->tm_year);
  1035.         else
  1036.             sprintf(dummy,"No Time");
  1037.     }
  1038.     XtSetArg(args[8],XtNfromVert,w);
  1039.     XtSetArg(args[7],XtNlabel,dummy);
  1040.     XtSetArg(args[5],XtNfromHoriz,label);
  1041.     label = XtCreateManagedWidget ("creat_time", labelWidgetClass, form,
  1042.                     args,9);
  1043.     w = label;
  1044.  
  1045.     /*
  1046.      * Nun die Dialogbox fuer die Rechte
  1047.      */
  1048.     XtSetArg(args[2],XtNright, XtChainLeft);
  1049.     XtSetArg(args[4],XtNborderWidth, 0);
  1050.     XtSetArg(args[5],XtNwidth, 80);
  1051.     XtSetArg(args[6],XtNjustify, XtJustifyLeft);
  1052.     XtSetArg(args[7],XtNlabel,"");
  1053.     XtSetArg(args[8],XtNfromVert, w);
  1054.     label = XtCreateManagedWidget ("info_empty", labelWidgetClass, form,
  1055.                     args, 9);    
  1056.     XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1057.     XtSetArg(args[5],XtNwidth, 70);
  1058.     XtSetArg(args[7],XtNlabel,"Read");
  1059.     XtSetArg(args[9],XtNfromHoriz,label);
  1060.     bw[1] = XtCreateManagedWidget ("info_ruser", labelWidgetClass, form,
  1061.                     args, 10);    
  1062.     XtSetArg(args[7],XtNlabel,"Write");
  1063.     XtSetArg(args[9],XtNfromHoriz,bw[1]);
  1064.     bw[2] = XtCreateManagedWidget ("info_wuser", labelWidgetClass, form,
  1065.                     args, 10);    
  1066.     XtSetArg(args[7],XtNlabel,"Execute");
  1067.     XtSetArg(args[9],XtNfromHoriz,bw[2]);
  1068.     bw[3] = XtCreateManagedWidget ("info_xuser", labelWidgetClass, form,
  1069.                     args, 10);
  1070.  
  1071.     /*
  1072.      * Rechte des Owners darstellen
  1073.      */
  1074.     w = label;
  1075.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  1076.     XtSetArg(args[5],XtNwidth, 80);
  1077.     XtSetArg(args[8],XtNfromVert, w);
  1078.     XtSetArg(args[7],XtNlabel,"Owner :");        
  1079.     label = XtCreateManagedWidget ("info_empty", labelWidgetClass, form,
  1080.                     args, 9);
  1081.  
  1082.     if (uid == buf.st_uid || uid == 0) {
  1083.         class = toggleWidgetClass;
  1084.         XtSetArg(args[4],XtNborderWidth, 1);
  1085.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1086.         XtSetArg(args[5],XtNwidth, 70);
  1087.         XtSetArg(args[9],XtNfromHoriz,label);
  1088.         XtSetArg(args[7],XtNlabel,"  ");
  1089.         XtSetArg(args[10],XtNstate, (S_IRUSR&buf.st_mode ? TRUE : FALSE));
  1090.         tog[0] = XtCreateManagedWidget ("toggle", class, form,
  1091.                     args, 11);
  1092.         XtSetArg(args[7],XtNlabel,"  ");
  1093.         XtSetArg(args[9],XtNfromHoriz,tog[0]);
  1094.         XtSetArg(args[10],XtNstate, (S_IWUSR&buf.st_mode ? TRUE : FALSE));
  1095.         tog[1] = XtCreateManagedWidget ("toggle", class, form,
  1096.                         args, 11);
  1097.         XtSetArg(args[7],XtNlabel,"  ");
  1098.         XtSetArg(args[9],XtNfromHoriz,tog[1]);
  1099.         XtSetArg(args[10],XtNstate, (S_IXUSR&buf.st_mode ? TRUE : FALSE));
  1100.         tog[2] = XtCreateManagedWidget ("toggle", class, form,
  1101.                         args, 11);
  1102.     }
  1103.     else {
  1104.         class = labelWidgetClass;
  1105.         XtSetArg(args[7],XtNlabel, (S_IRUSR&buf.st_mode ? "Yes" : "No"));
  1106.         XtSetArg(args[4],XtNborderWidth, 1);
  1107.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1108.         XtSetArg(args[5],XtNwidth, 70);
  1109.         XtSetArg(args[9],XtNfromHoriz,label);
  1110.         tog[0] = XtCreateManagedWidget ("toggler", class, form,
  1111.                         args, 10);    
  1112.         XtSetArg(args[7],XtNlabel, (S_IWUSR&buf.st_mode ? "Yes" : "No"));
  1113.         XtSetArg(args[9],XtNfromHoriz,tog[0]);
  1114.         tog[1] = XtCreateManagedWidget ("toggler", class, form,
  1115.                         args, 10);
  1116.         XtSetArg(args[7],XtNlabel, (S_IXUSR&buf.st_mode ? "Yes" : "No"));
  1117.         XtSetArg(args[9],XtNfromHoriz,tog[1]);
  1118.         tog[2] = XtCreateManagedWidget ("toggler", class, form,
  1119.                         args, 10);
  1120.     }
  1121.  
  1122.     /*
  1123.      * Rechte der Group darstellen
  1124.      */
  1125.     w = label;
  1126.     XtSetArg(args[4],XtNborderWidth, 0);
  1127.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  1128.     XtSetArg(args[5],XtNwidth, 80);
  1129.     XtSetArg(args[8],XtNfromVert, w);
  1130.     XtSetArg(args[7],XtNlabel,"Group :");        
  1131.     label = XtCreateManagedWidget ("info_empty", labelWidgetClass, form,
  1132.                     args, 9);
  1133.  
  1134.     if (uid == buf.st_uid || uid == 0) {
  1135.         class = toggleWidgetClass;
  1136.         XtSetArg(args[4],XtNborderWidth, 1);
  1137.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1138.         XtSetArg(args[5],XtNwidth, 70);
  1139.         XtSetArg(args[9],XtNfromHoriz,label);
  1140.         XtSetArg(args[7],XtNlabel,"  ");
  1141.         XtSetArg(args[10],XtNstate, (S_IRGRP&buf.st_mode ? TRUE : FALSE));
  1142.         tog[3] = XtCreateManagedWidget ("toggle", class, form,
  1143.                     args, 11);
  1144.         XtSetArg(args[7],XtNlabel,"  ");
  1145.         XtSetArg(args[9],XtNfromHoriz,tog[3]);
  1146.         XtSetArg(args[10],XtNstate, (S_IWGRP&buf.st_mode ? TRUE : FALSE));
  1147.         tog[4] = XtCreateManagedWidget ("toggle", class, form,
  1148.                         args, 11);
  1149.         XtSetArg(args[7],XtNlabel,"  ");
  1150.         XtSetArg(args[9],XtNfromHoriz,tog[4]);
  1151.         XtSetArg(args[10],XtNstate, (S_IXGRP&buf.st_mode ? TRUE : FALSE));
  1152.         tog[5] = XtCreateManagedWidget ("toggle", class, form,
  1153.                         args, 11);
  1154.     }
  1155.     else {
  1156.         class = labelWidgetClass;
  1157.         XtSetArg(args[7],XtNlabel, (S_IRGRP&buf.st_mode ? "Yes" : "No"));
  1158.         XtSetArg(args[4],XtNborderWidth, 1);
  1159.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1160.         XtSetArg(args[5],XtNwidth, 70);
  1161.         XtSetArg(args[9],XtNfromHoriz,label);
  1162.         tog[3] = XtCreateManagedWidget ("tog_ruser", class, form,
  1163.                         args, 10);    
  1164.         XtSetArg(args[7],XtNlabel, (S_IWGRP&buf.st_mode ? "Yes" : "No"));
  1165.         XtSetArg(args[9],XtNfromHoriz,tog[3]);
  1166.         tog[4] = XtCreateManagedWidget ("tog_wuser", class, form,
  1167.                         args, 10);
  1168.         XtSetArg(args[7],XtNlabel, (S_IXGRP&buf.st_mode ? "Yes" : "No"));
  1169.         XtSetArg(args[9],XtNfromHoriz,tog[4]);
  1170.         tog[5] = XtCreateManagedWidget ("tog_xuser", class, form,
  1171.                         args, 10);
  1172.     }
  1173.  
  1174.     /*
  1175.      * Rechte der Others darstellen
  1176.      */
  1177.     w = label;
  1178.     XtSetArg(args[4],XtNborderWidth, 0);
  1179.     XtSetArg(args[6],XtNjustify, XtJustifyRight);
  1180.     XtSetArg(args[5],XtNwidth, 80);
  1181.     XtSetArg(args[8],XtNfromVert, w);
  1182.     XtSetArg(args[7],XtNlabel,"Other :");        
  1183.     label = XtCreateManagedWidget ("info_empty", labelWidgetClass, form,
  1184.                     args, 9);
  1185.  
  1186.     if (uid == buf.st_uid || uid == 0) {
  1187.         class = toggleWidgetClass;
  1188.         XtSetArg(args[4],XtNborderWidth, 1);
  1189.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1190.         XtSetArg(args[5],XtNwidth, 70);
  1191.         XtSetArg(args[9],XtNfromHoriz,label);
  1192.         XtSetArg(args[7],XtNlabel,"  ");
  1193.         XtSetArg(args[10],XtNstate, (S_IROTH&buf.st_mode ? TRUE : FALSE));
  1194.         tog[6] = XtCreateManagedWidget ("toggle", class, form,
  1195.                     args, 11);
  1196.         XtSetArg(args[7],XtNlabel,"  ");
  1197.         XtSetArg(args[9],XtNfromHoriz,tog[6]);
  1198.         XtSetArg(args[10],XtNstate, (S_IWOTH&buf.st_mode ? TRUE : FALSE));
  1199.         tog[7] = XtCreateManagedWidget ("toggle", class, form,
  1200.                         args, 11);
  1201.         XtSetArg(args[7],XtNlabel,"  ");
  1202.         XtSetArg(args[9],XtNfromHoriz,tog[7]);
  1203.         XtSetArg(args[10],XtNstate, (S_IXOTH&buf.st_mode ? TRUE : FALSE));
  1204.         tog[8] = XtCreateManagedWidget ("toggle", class, form,
  1205.                         args, 11);
  1206.     }
  1207.     else {
  1208.         class = labelWidgetClass;
  1209.         XtSetArg(args[7],XtNlabel, (S_IROTH&buf.st_mode ? "Yes" : "No"));
  1210.         XtSetArg(args[4],XtNborderWidth, 1);
  1211.         XtSetArg(args[6],XtNjustify, XtJustifyCenter);
  1212.         XtSetArg(args[5],XtNwidth, 70);
  1213.         XtSetArg(args[9],XtNfromHoriz,label);
  1214.         tog[6] = XtCreateManagedWidget ("tog_ruser", class, form,
  1215.                         args, 10);    
  1216.         XtSetArg(args[7],XtNlabel, (S_IWOTH&buf.st_mode ? "Yes" : "No"));
  1217.         XtSetArg(args[9],XtNfromHoriz,tog[6]);
  1218.         tog[7] = XtCreateManagedWidget ("tog_wuser", class, form,
  1219.                         args, 10);
  1220.         XtSetArg(args[7],XtNlabel, (S_IXOTH&buf.st_mode ? "Yes" : "No"));
  1221.         XtSetArg(args[9],XtNfromHoriz,tog[7]);
  1222.         tog[8] = XtCreateManagedWidget ("tog_xuser", class, form,
  1223.                         args, 10);
  1224.     }
  1225.  
  1226.     /*
  1227.      * Zum Schluss noch eine Form fuer die Buttons erzeugen
  1228.      */
  1229.     XtSetArg(args[0],XtNtop, XawChainBottom);
  1230.     XtSetArg(args[1],XtNbottom, XawChainBottom);
  1231.     XtSetArg(args[2],XtNleft, XawChainLeft);
  1232.     XtSetArg(args[3],XtNright, XawChainRight);
  1233.     XtSetArg(args[4],XtNborderWidth,0);
  1234.     XtSetArg(args[5],XtNfromVert, label);
  1235.     XtSetArg(args[6],XtNvertDistance, 20);
  1236.     f = XtCreateManagedWidget("info_cform",formWidgetClass,form,args,7);
  1237.  
  1238.     /*
  1239.      * In der neuen Form die Commandbuttons erzeugen
  1240.      */
  1241.     XtSetArg(args[0],XtNleft, XawChainLeft);
  1242.     XtSetArg(args[1],XtNright, XawChainLeft);
  1243.     XtSetArg(args[2],XtNlabel, "  Hide  ");
  1244.     w = XtCreateManagedWidget("hide_info",commandWidgetClass,f,args,3);
  1245.     XtAddCallback(w,XtNcallback,(XtCallbackProc) hide_idialog,NULL);
  1246.  
  1247.     {
  1248.         int    a = (uid == buf.st_uid || uid == 0 ? 0 : 1);
  1249.  
  1250.         XtSetArg(args[0],XtNleft, XawChainLeft);
  1251.         XtSetArg(args[1],XtNright, XawChainLeft);
  1252.         XtSetArg(args[2],XtNlabel, " Reset ");
  1253.         XtSetArg(args[3],XtNhorizDistance,160);
  1254.         XtSetArg(args[4],XtNfromHoriz, w);
  1255.         XtSetArg(args[5],XtNsensitive,FALSE);
  1256.         w = XtCreateManagedWidget("hide_info",commandWidgetClass,f,args,5+a);
  1257.         XtAddCallback(w,XtNcallback,(XtCallbackProc) reset_cb,NULL);
  1258.  
  1259.         XtSetArg(args[0],XtNleft, XawChainLeft);
  1260.         XtSetArg(args[1],XtNright, XawChainLeft);
  1261.         XtSetArg(args[2],XtNlabel, " Apply ");
  1262.         XtSetArg(args[3],XtNfromHoriz, w);
  1263.         XtSetArg(args[4],XtNsensitive,FALSE);
  1264.         w = XtCreateManagedWidget("apply_info",commandWidgetClass,f,args,4+a);
  1265.         XtAddCallback(w,XtNcallback,(XtCallbackProc) apply_cb,NULL);
  1266.     }
  1267.  
  1268.     XtManageChild(info_shell);
  1269. }
  1270.  
  1271.  
  1272.  
  1273. /*********************************************************
  1274.  * name:    apply_cb
  1275.  * description:    change modes, owners and names of files
  1276.  * input:    none
  1277.  * output:    none
  1278.  * author:    Ove Kalkan
  1279.  * date:    1.7.93
  1280.  *********************************************************/
  1281. void    apply_cb(void)
  1282. {
  1283.     Boolean        b;
  1284.     Arg        args[1];
  1285.     mode_t        mode = 0;
  1286.     struct    stat    buf;
  1287.     char        *of, *nf;
  1288.  
  1289.     /*
  1290.      * Bisherige Rechte des Files holen und nur die Benutzerrechte,
  1291.      * keine speziellen flags loeschen
  1292.      */
  1293.     lstat(oldfile,&buf);
  1294.     mode = buf.st_mode & ~(S_IRUSR | S_IWUSR | S_IXUSR |
  1295.                    S_IRGRP | S_IWGRP | S_IXGRP |
  1296.                    S_IROTH | S_IWOTH | S_IXOTH);
  1297.  
  1298.     /*
  1299.      * Benutzerrechte holen und setzen
  1300.      */
  1301.     XtSetArg(args[0],XtNstate,&b);
  1302.     XtGetValues(tog[0],args,1);
  1303.     mode |= (b ? S_IRUSR : 0);
  1304.     XtGetValues(tog[1],args,1);
  1305.     mode |= (b ? S_IWUSR : 0);
  1306.     XtGetValues(tog[2],args,1);
  1307.     mode |= (b ? S_IXUSR : 0);
  1308.     XtGetValues(tog[3],args,1);
  1309.     mode |= (b ? S_IRGRP : 0);
  1310.     XtGetValues(tog[4],args,1);
  1311.     mode |= (b ? S_IWGRP : 0);
  1312.     XtGetValues(tog[5],args,1);
  1313.     mode |= (b ? S_IXGRP : 0);
  1314.     XtGetValues(tog[6],args,1);
  1315.     mode |= (b ? S_IROTH : 0);
  1316.     XtGetValues(tog[7],args,1);
  1317.     mode |= (b ? S_IWOTH : 0);
  1318.     XtGetValues(tog[8],args,1);
  1319.     mode |= (b ? S_IXOTH : 0);
  1320.  
  1321.     if (mode != buf.st_mode)
  1322.         chmod (oldfile,mode);
  1323.  
  1324.     /*
  1325.      * File umbenennen falls erforderlich
  1326.      */
  1327.     XtSetArg(args[0],XtNstring,&nf);
  1328.     XtGetValues(text_5,args,1);
  1329.  
  1330.     of = strrchr(oldfile,'/') + 1;
  1331.     if (strcmp(of,nf)) {
  1332.         char     *p;
  1333.  
  1334.         p = strrchr(oldfile,'/');
  1335.         if (p) {
  1336.             int    i;
  1337.             char    sa[1024];
  1338.  
  1339.             *p = '\0';
  1340.             sprintf(sa,"mv %s/%s %s/%s",oldfile,of,oldfile,nf);
  1341.             SYSTEM(sa);
  1342.  
  1343.             i = strlen(oldfile);
  1344.             *p = '/';
  1345.             /* Oldfile wird fuer das chown auf newfile gesetzt */
  1346.             if (!(oldfile = (char *) realloc((void *) oldfile,
  1347.                              i + strlen(nf) + 2)))
  1348.                 FATAL_ERROR("apply_cb: realloc failed");
  1349.             strncpy(&oldfile[i+1],nf,strlen(nf));
  1350.             oldfile[i+1+strlen(nf)] = '\0';
  1351.         }
  1352.     }
  1353.     /*
  1354.      * Group und Owner setzen - Owner zuletzt
  1355.      */
  1356.     {
  1357.         char    *grp, *own;
  1358.         uid_t    uid;
  1359.         gid_t    gid;
  1360.  
  1361.         struct    passwd    *pws;
  1362.         struct    group    *grs;
  1363.  
  1364.         /*
  1365.          * Namen der Group oder des Owners holen
  1366.          */
  1367.         XtSetArg(args[0],XtNstring, &grp);
  1368.         XtGetValues(text_3,args,1);
  1369.         XtSetArg(args[0],XtNstring, &own);
  1370.         XtGetValues(text_6,args,1);
  1371.         /*
  1372.          * Zu den Namen die UserId und die GroupId holen, falls moeglich
  1373.          */
  1374.  
  1375.         pws = getpwnam (own);
  1376.         if (pws) {
  1377.             uid = pws->pw_uid;
  1378.         }
  1379.         else {
  1380.             WARNING("Change Owner: Not a valid user");
  1381.             return;
  1382.         }
  1383.         grs = getgrnam (grp);
  1384.         if (grs) {
  1385.             gid = grs->gr_gid;
  1386.         }
  1387.         else {
  1388.             WARNING("Change Group: Not a valid group");
  1389.             return;
  1390.         }
  1391.         chown(oldfile,uid,gid);
  1392.     }
  1393. }
  1394.  
  1395.  
  1396. /*********************************************************
  1397.  * name:    reset_cb
  1398.  * description:    reset modes, owners and names of files
  1399.  * input:    none
  1400.  * output:    none
  1401.  * author:    Ove Kalkan
  1402.  * date:    1.7.93
  1403.  *********************************************************/
  1404. void    reset_cb(void)
  1405. {
  1406.     struct    stat    buf;
  1407.     Arg        args[1];
  1408.     struct    passwd    *pw;
  1409.     struct    group    *gr;
  1410.     char        *b;
  1411.  
  1412.     /*
  1413.      * Status des urspruenglich angewaehlten Files wieder herstellen
  1414.      */
  1415.     lstat(oldfile,&buf);
  1416.  
  1417.     /*
  1418.      * Filenamen ruecksetzen
  1419.      */
  1420.     b = strrchr(oldfile,'/');
  1421.     XtSetArg(args[0],XtNstring,b+1);
  1422.     XtSetValues(text_5,args,1);
  1423.  
  1424.     /*
  1425.      * Owner und Groups ruecksetzen
  1426.      */
  1427.     pw = getpwuid(buf.st_uid);
  1428.     XtSetArg(args[0],XtNstring,pw->pw_name);
  1429.     XtSetValues(text_6,args,1);
  1430.  
  1431.     gr = getgrgid(buf.st_gid);
  1432.     XtSetArg(args[0],XtNstring,gr->gr_name);
  1433.     XtSetValues(text_3,args,1);
  1434.  
  1435.     /*
  1436.      * Rightflags ruecksetzen
  1437.      */
  1438.     XtSetArg(args[0],XtNstate, (S_IRUSR&buf.st_mode ? TRUE : FALSE));
  1439.     XtSetValues(tog[0],args,1);
  1440.     XtSetArg(args[0],XtNstate, (S_IWUSR&buf.st_mode ? TRUE : FALSE));
  1441.     XtSetValues(tog[1],args,1);
  1442.     XtSetArg(args[0],XtNstate, (S_IXUSR&buf.st_mode ? TRUE : FALSE));
  1443.     XtSetValues(tog[2],args,1);
  1444.     XtSetArg(args[0],XtNstate, (S_IRGRP&buf.st_mode ? TRUE : FALSE));
  1445.     XtSetValues(tog[3],args,1);
  1446.     XtSetArg(args[0],XtNstate, (S_IWGRP&buf.st_mode ? TRUE : FALSE));
  1447.     XtSetValues(tog[4],args,1);
  1448.     XtSetArg(args[0],XtNstate, (S_IXGRP&buf.st_mode ? TRUE : FALSE));
  1449.     XtSetValues(tog[5],args,1);
  1450.     XtSetArg(args[0],XtNstate, (S_IROTH&buf.st_mode ? TRUE : FALSE));
  1451.     XtSetValues(tog[6],args,1);
  1452.     XtSetArg(args[0],XtNstate, (S_IWOTH&buf.st_mode ? TRUE : FALSE));
  1453.     XtSetValues(tog[7],args,1);
  1454.     XtSetArg(args[0],XtNstate, (S_IXOTH&buf.st_mode ? TRUE : FALSE));
  1455.     XtSetValues(tog[8],args,1);
  1456.  
  1457. }
  1458.  
  1459.  
  1460.  
  1461. /*********************************************************
  1462.  * name:    getFilter
  1463.  * description:    Den Filterstring fuer einen Folder berechnen
  1464.  * input:    Folder_Glyph *folder;
  1465.  * output:    none
  1466.  * author:    Ove Kalkan
  1467.  * date:    2.7.1993
  1468.  *********************************************************/
  1469. void    getFilter (Folder_Glyph *folder)
  1470. {
  1471.     Widget    but;
  1472.  
  1473.     /*
  1474.      * Das Dialogfenster erzeugen
  1475.      */
  1476.     NO_MULTI = TRUE;
  1477.     but = makeDialog(1,"Filter :",folder->filter,NULL,NULL,"Filefilter",TRUE,FALSE,Icon_Filter_PM);
  1478.     XtAddCallback(but,XtNcallback,(XtCallbackProc) apply_filter,(XtPointer) folder);
  1479.  
  1480.     /*
  1481.      * Zum Schluss die Dialogshell managen
  1482.      */
  1483.     XtManageChild (dialog);
  1484.  
  1485.     /*
  1486.      * Max und Minsize setzen
  1487.      */
  1488.     setSize();
  1489. }
  1490.  
  1491.  
  1492.  
  1493. /*********************************************************
  1494.  * name:    apply_filter
  1495.  * description:    Den Filterstring fuer einen Folder setzen
  1496.  *        und refreshen
  1497.  * input:    none
  1498.  * output:    none
  1499.  * author:    Ove Kalkan
  1500.  * date:    2.7.1993
  1501.  *********************************************************/
  1502. void    apply_filter (Widget w, XtPointer c, XtPointer s)
  1503. {
  1504.     char        *a;
  1505.     Folder_Glyph    *f = (Folder_Glyph *) c;
  1506.     Arg        args[1];
  1507.  
  1508.     XtSetArg(args[0],XtNstring,&a);
  1509.     XtGetValues(text_1,args,1);
  1510.     if (f->filter)
  1511.         free(f->filter);
  1512.     if (strlen(a))
  1513.         f->filter = a;
  1514.     else
  1515.         f->filter = NULL;
  1516.     XtDestroyWidget(dialog);
  1517.     dialog = NULL;
  1518.     if (selc_fo == f) {
  1519.         selc_fo = f;
  1520.         selc_f = 16000;
  1521.     }
  1522.     fillFolder(f);
  1523.     FILE_CHANGED = TRUE;
  1524.     refresh_files(f->window,NULL,NULL,NULL);
  1525. }
  1526.  
  1527.  
  1528. #ifndef COHERENT
  1529. /*********************************************************
  1530.  * name:    call_link_cb
  1531.  * description:    aufrufen von init_link
  1532.  * input:    none
  1533.  * output:    none
  1534.  * author:    Ove Kalkan
  1535.  * date:    Friday, 13th.Aug.1993
  1536.  *********************************************************/
  1537. void    call_link_cb(void)
  1538. {
  1539.     init_link(oldfile,link_target);
  1540. }
  1541. #endif
  1542.