v13i010: xdtm - X Desktop Manager for the X Window System, Part05/11

EdwardJ. Groenendaal eddyg at cogs.sussex.ac.uk
Sun May 19 10:03:04 AEST 1991


Submitted-by: Edward "J." Groenendaal <eddyg at cogs.sussex.ac.uk>
Posting-number: Volume 13, Issue 10
Archive-name: xdtm/part05

Submitted-by: eddyg at cste
Archive-name: xdtm/part05

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 05 of xdtm
# ============= xdtm/bitmaps/file.icon ==============
if test ! -d 'xdtm'; then
    echo 'x - creating directory xdtm'
    mkdir 'xdtm'
fi
if test ! -d 'xdtm/bitmaps'; then
    echo 'x - creating directory xdtm/bitmaps'
    mkdir 'xdtm/bitmaps'
fi
if test -f 'xdtm/bitmaps/file.icon' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/bitmaps/file.icon (File already exists)'
else
echo 'x - extracting xdtm/bitmaps/file.icon (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/bitmaps/file.icon' &&
X#define file_width 32
X#define file_height 32
Xstatic char file_bits[] = {
X   0xf0, 0xff, 0x7f, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x10, 0x00, 0x40, 0x01,
X   0x10, 0x00, 0x40, 0x02, 0x10, 0x00, 0x40, 0x04, 0x10, 0x00, 0xc0, 0x0f,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
X   0x10, 0x00, 0x00, 0x08, 0xf0, 0xff, 0xff, 0x0f};
SHAR_EOF
chmod 0644 xdtm/bitmaps/file.icon ||
echo 'restore of xdtm/bitmaps/file.icon failed'
Wc_c="`wc -c < 'xdtm/bitmaps/file.icon'`"
test 875 -eq "$Wc_c" ||
	echo 'xdtm/bitmaps/file.icon: original size 875, current size' "$Wc_c"
fi
# ============= xdtm/bitmaps/folder.icon ==============
if test -f 'xdtm/bitmaps/folder.icon' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/bitmaps/folder.icon (File already exists)'
else
echo 'x - extracting xdtm/bitmaps/folder.icon (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/bitmaps/folder.icon' &&
X#define folder_width 32
X#define folder_height 32
Xstatic char folder_bits[] = {
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x08,
X   0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
X   0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00};
SHAR_EOF
chmod 0644 xdtm/bitmaps/folder.icon ||
echo 'restore of xdtm/bitmaps/folder.icon failed'
Wc_c="`wc -c < 'xdtm/bitmaps/folder.icon'`"
test 881 -eq "$Wc_c" ||
	echo 'xdtm/bitmaps/folder.icon: original size 881, current size' "$Wc_c"
fi
# ============= xdtm/bitmaps/xdtm.xbm ==============
if test -f 'xdtm/bitmaps/xdtm.xbm' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/bitmaps/xdtm.xbm (File already exists)'
else
echo 'x - extracting xdtm/bitmaps/xdtm.xbm (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/bitmaps/xdtm.xbm' &&
X/* This X bitmap is designed for use with the X Desktop Manager.
X * it was designed by Edward Groenendaal, April 1991.
X */
X#define xdtm_width 32
X#define xdtm_height 32
Xstatic char xdtm_bits[] = {
X   0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x4a, 0x06, 0x00, 0x58,
X   0xfe, 0xff, 0xff, 0x7f, 0x02, 0x08, 0x10, 0x40, 0x02, 0x88, 0xff, 0x43,
X   0x02, 0x88, 0x10, 0x42, 0xfe, 0xcf, 0x39, 0x47, 0x02, 0x48, 0x29, 0x45,
X   0xe2, 0xc8, 0x39, 0x47, 0xa2, 0x88, 0x00, 0x42, 0xa2, 0xf8, 0x07, 0x42,
X   0xe2, 0x88, 0x04, 0x42, 0x02, 0xf8, 0xff, 0x7f, 0xfa, 0x0b, 0x00, 0x40,
X   0x02, 0xe8, 0x9c, 0x43, 0xe2, 0xa8, 0x94, 0x42, 0xa2, 0xa8, 0x94, 0x42,
X   0xa2, 0xe8, 0x9c, 0x43, 0xe2, 0x08, 0x00, 0x40, 0x02, 0xe8, 0xb6, 0x43,
X   0x7a, 0x0b, 0x00, 0x40, 0x02, 0xe8, 0x9c, 0x43, 0x02, 0xa8, 0x94, 0x42,
X   0x02, 0xa8, 0x94, 0x42, 0x02, 0xe8, 0x9c, 0x43, 0xfe, 0x0f, 0x00, 0x40,
X   0x92, 0xec, 0x9c, 0x43, 0x92, 0x0c, 0x00, 0x40, 0x92, 0x0c, 0x00, 0x40,
X   0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00};
SHAR_EOF
chmod 0644 xdtm/bitmaps/xdtm.xbm ||
echo 'restore of xdtm/bitmaps/xdtm.xbm failed'
Wc_c="`wc -c < 'xdtm/bitmaps/xdtm.xbm'`"
test 998 -eq "$Wc_c" ||
	echo 'xdtm/bitmaps/xdtm.xbm: original size 998, current size' "$Wc_c"
fi
# ============= xdtm/buttons.c ==============
if test -f 'xdtm/buttons.c' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/buttons.c (File already exists)'
else
echo 'x - extracting xdtm/buttons.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/buttons.c' &&
X/*****************************************************************************
X ** File          : buttons.c                                               **
X ** Purpose       : Initialise and Realise button dialogs                   **
X ** Author        : Edward Groenendaal                                      **
X ** Date          : April 1991                                              **
X ** Documentation : Xdtm Design Folder                                      **
X ** Related Files :                                                         **
X *****************************************************************************/
X
X#include "xdtm.h"
X#include "menus.h"
X
X#include <X11/Shell.h>
X#include <X11/Xaw/Label.h>
X#include <X11/Xaw/Command.h>
X#include <X11/Xaw/Viewport.h>
X#include "Xedw/XedwForm.h"
X#include "Xedw/XedwList.h"
X
Xextern void realize_dialog(Widget);
X
X/* Widgets */
X
Xprivate Widget buttonpopup; 	/* For confermation of move/copy/trash buttons */
Xprivate Widget buttonform;
Xprivate Widget buttonlabel1;
Xprivate Widget buttonlabel2;
Xprivate Widget buttonyes;
Xprivate Widget buttonno;
Xprivate Widget fileview;
Xprivate Widget filelist;
X
X/*****************************************************************************
X *                             init_button                                   *
X *****************************************************************************/
Xpublic void init_button(Widget top)
X{
X  /* initialise the widget which display's a list of filenames with a message
X   * and a couple of buttons.
X   */
X
X  Arg arglist[5];
X  Cardinal i;
X  XtTranslations translations;
X  Dimension height, space;
X  XFontStruct *font;
X
X  buttonpopup  =   XtCreatePopupShell("buttonpopup",
X				      transientShellWidgetClass,
X				      top,
X				      NULL, 0);
X
X
X  buttonform    =   XtCreateManagedWidget("buttonform",
X				      xedwFormWidgetClass,
X				      buttonpopup,
X				      NULL, 0);
X
X  i = 0;
X  XtSetArg(arglist[i], XtNjustify, XtJustifyCenter);  i++;
X  XtSetArg(arglist[i], XtNfullWidth,          True);  i++;
X  XtSetArg(arglist[i], XtNborderWidth,           0); i++;
X  buttonlabel1  =   XtCreateManagedWidget("buttonlabel1",
X					  labelWidgetClass,
X					  buttonform,
X					  arglist, i);
X
X  i = 3;
X  XtSetArg(arglist[i], XtNfromVert,   buttonlabel1);  i++; 
X  buttonlabel2  =   XtCreateManagedWidget("buttonlabel2",
X					  labelWidgetClass,
X					  buttonform,
X					  arglist, i);
X
X  i = 0;
X  XtSetArg(arglist[i], XtNfromVert, buttonlabel2);  i++; 
X  XtSetArg(arglist[i], XtNfullWidth,        True);  i++;
X  XtSetArg(arglist[i], XtNforceBars,        True);  i++;
X  XtSetArg(arglist[i], XtNallowVert,        True);  i++;
X  fileview = XtCreateManagedWidget("fileview",
X				   viewportWidgetClass,
X				   buttonform,
X				   arglist, i);
X
X  translations = XtParseTranslationTable("");
X  i = 0;
X  XtSetArg(arglist[i], XtNdefaultColumns,  1); i++;
X  XtSetArg(arglist[i], XtNforceColumns, True); i++;
X  XtSetArg(arglist[i], XtNrowSpacing,      4); i++;
X  XtSetArg(arglist[i], XtNtranslations, translations); i++;
X  filelist = XtCreateManagedWidget("filelist",
X				   xedwListWidgetClass,
X				   fileview,
X				   arglist, i);
X
X
X  /* Get font height from filelist, then set fileview to be 5 times that
X   * size.
X   */
X
X  i = 0;
X  XtSetArg(arglist[i], XtNfont, &font); i++;
X  XtSetArg(arglist[i], XtNrowSpacing, &space); i++;
X  XtGetValues(filelist, arglist, i);
X
X  height = (font->max_bounds.ascent +
X           font->max_bounds.descent +
X	   space) * 5;
X
X  i = 0;
X  XtSetArg(arglist[i], XtNheight, height); i++;
X  XtSetValues(fileview, arglist, i);
X
X
X  i = 0;
X  XtSetArg(arglist[i], XtNfromVert,       fileview);  i++; 
X  XtSetArg(arglist[i], XtNjustify, XtJustifyCenter);  i++;
X  buttonno   =   XtCreateManagedWidget("buttonyes",
X				       commandWidgetClass,
X				       buttonform,
X				       arglist, i);
X 
X  i = 2;
X  XtSetArg(arglist[i], XtNfromHoriz,   buttonno);  i++;
X  XtSetArg(arglist[i], XtNwidthLinked, buttonno);  i++;
X  buttonyes  =   XtCreateManagedWidget("buttonyes",
X				       commandWidgetClass,
X				       buttonform,
X				       arglist, i);
X
X}
X
X/*****************************************************************************
X *                                button_dialog                              *
X *****************************************************************************/
Xpublic void button_dialog(Cardinal type, XedwListReturnStruct *list)
X{
X  /* Set the resources of the dialog to the type of dialog required, 
X   * the type is either Trash, Copy or Move then popup the dialog.
X   *
X   * - Takes the type of dialog, and the list of files to display.
X   */
X
X  private int buttoniconcmp(XedwList **, XedwList **);
X  extern String getfilename(String);
X  extern void setscroll(Widget, float);
X
X  XedwListReturnStruct *tmp;
X  XedwList **buttonlist;
X  Arg arglist[5];
X  Cardinal i, n;
X  private String CancelButtonLabel = "Cancel";
X
X  /* Count items in linked list */
X  n = 0;
X  tmp = list;
X  while (tmp != NULL) {
X    tmp = tmp->next;
X    n++;
X  }
X
X  /* Allocate an array of XedwList* of that size */
X  buttonlist = (XedwList**) XtMalloc (sizeof(XedwList*) * (n+1));
X
X  /* Put Strings from linked list into array, using NULL icons */
X  for (i = 0; i < n; i++) {
X    buttonlist[i] = XtNew(XedwList);
X    buttonlist[i]->string = list->string;
X    list = list->next;
X  }
X  buttonlist[i] = NULL;
X
X  /* Sort the list */
X  qsort((char*)buttonlist, n, sizeof(buttonlist[0]), buttoniconcmp);
X
X  /* Reset view to top */
X
X  setscroll(fileview, 0.0);
X
X  switch (type) {
X  case Trash:
X    {
X      extern void trashQueryResult(Widget, Boolean, caddr_t);
X      private String TrashLabel1       = "Delete these files";
X      private String TrashLabel2       = "from current directory?";
X      private String TrashButtonLabel  = "Delete";
X
X      /* label */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, TrashLabel1);  i++;
X      XtSetValues(buttonlabel1, arglist, i);
X    
X      /* label2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel,       TrashLabel2);  i++; 
X      XtSetValues(buttonlabel2, arglist, i);
X      
X      /* file list */
X      i = 0;
X      XtSetArg(arglist[i], XtNlongest,           0); i++;
X      XtSetArg(arglist[i], XtNnumberStrings,     0); i++;
X      XtSetArg(arglist[i], XtNxedwList, buttonlist); i++;
X      XtSetValues(filelist, arglist, i);
X
X      /* button1 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CancelButtonLabel);  i++;
X      XtSetValues(buttonno, arglist, i);
X      
X      /* button2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel,   TrashButtonLabel);  i++;
X      XtSetValues(buttonyes, arglist, i);
X      
X      XtAddCallback(buttonno, XtNcallback, trashQueryResult, False);
X      XtAddCallback(buttonyes, XtNcallback, trashQueryResult, True);
X      realize_dialog(buttonpopup);
X      break;
X    }
X  case Copy:
X    {
X      extern void copyQueryResult(Widget, Boolean, caddr_t);
X      private String CopyLabel1       = "Copy these files";
X      private String CopyLabel2       = "to current directory?";
X      private String CopyButtonLabel  = "Copy";
X
X      /* label */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CopyLabel1);  i++;
X      XtSetValues(buttonlabel1, arglist, i);
X    
X      /* label2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CopyLabel2);  i++; 
X      XtSetValues(buttonlabel2, arglist, i);
X      
X      /* file list */
X      i = 0;
X      XtSetArg(arglist[i], XtNlongest,           0); i++;
X      XtSetArg(arglist[i], XtNnumberStrings,     0); i++;
X      XtSetArg(arglist[i], XtNxedwList, buttonlist); i++;
X      XtSetValues(filelist, arglist, i);
X
X      /* button1 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CancelButtonLabel);  i++;
X      XtSetValues(buttonno, arglist, i);
X      
X      /* button2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CopyButtonLabel);  i++;
X      XtSetValues(buttonyes, arglist, i);
X      
X      XtAddCallback(buttonno, XtNcallback,  copyQueryResult, False);
X      XtAddCallback(buttonyes, XtNcallback, copyQueryResult, True);
X      realize_dialog(buttonpopup);
X      break;
X    }
X  case Move:
X    {
X      extern void moveQueryResult(Widget, Boolean, caddr_t);
X      private String MoveLabel1       = "Move these files";
X      private String MoveLabel2       = "to current directory?";
X      private String MoveButtonLabel  = "Move";
X
X      /* label */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, MoveLabel1);  i++;
X      XtSetValues(buttonlabel1, arglist, i);
X    
X      /* label2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, MoveLabel2);  i++; 
X      XtSetValues(buttonlabel2, arglist, i);
X      
X      /* file list */
X      i = 0;
X      XtSetArg(arglist[i], XtNlongest,           0); i++;
X      XtSetArg(arglist[i], XtNnumberStrings,     0); i++;
X      XtSetArg(arglist[i], XtNxedwList, buttonlist); i++;
X      XtSetValues(filelist, arglist, i);
X
X      /* button1 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, CancelButtonLabel);  i++;
X      XtSetValues(buttonno, arglist, i);
X      
X      /* button2 */
X      i = 0;
X      XtSetArg(arglist[i], XtNlabel, MoveButtonLabel);  i++;
X      XtSetValues(buttonyes, arglist, i);
X      
X      XtAddCallback(buttonno, XtNcallback,  moveQueryResult, False);
X      XtAddCallback(buttonyes, XtNcallback, moveQueryResult, True);
X      realize_dialog(buttonpopup);
X      break;
X    }
X
X  default:
X    fprintf(stderr, "Unrecognised button dialog request\n");
X    break;
X  }
X
X}
X
X/*****************************************************************************
X *                             destroy_button_dialog                         *
X *****************************************************************************/
Xpublic void destroy_button_dialog(void)
X{
X  /* Popdown and destroy the callback lists of the dialog */
X
X  XtPopdown(buttonpopup);
X  
X  XtRemoveAllCallbacks(buttonyes, XtNcallback);
X  XtRemoveAllCallbacks(buttonno, XtNcallback);
X
X}
X
X/*****************************************************************************
X *                               buttoniconcmp                               *
X *****************************************************************************/
Xprivate int buttoniconcmp(XedwList **ip1, XedwList **ip2)
X{
X  /* compare the strings of 2 XedwList's */
X
X  return (strcmp((*ip1)->string, 
X		 (*ip2)->string));
X}
SHAR_EOF
chmod 0644 xdtm/buttons.c ||
echo 'restore of xdtm/buttons.c failed'
Wc_c="`wc -c < 'xdtm/buttons.c'`"
test 10282 -eq "$Wc_c" ||
	echo 'xdtm/buttons.c: original size 10282, current size' "$Wc_c"
fi
# ============= xdtm/dialogs.c ==============
if test -f 'xdtm/dialogs.c' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/dialogs.c (File already exists)'
else
echo 'x - extracting xdtm/dialogs.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/dialogs.c' &&
X/*****************************************************************************
X ** File          : dialogs.c                                               **
X ** Purpose       : Initialise and Realise dialogs                          **
X ** Author        : Edward Groenendaal                                      **
X ** Date          : 18th Feb 1991                                           **
X ** Documentation : Xdtm Design Folder                                      **
X ** Related Files : quit.c buttons.c listoption.c map.c select.c display.c  **
X **                 newfile.c						    **
X *****************************************************************************/
X
X/* dialog box's provided: Quit    - Quit (yes/no)
X *			  Button  - Do action to these files (yes/no)
X *                        Longl   - Select options on Long Listing
X *                        Map     - Map program x over selected files OR
X *                        Select  - Select files using RE x.
X *			  Query   - Display file?
X * 			  Display - Display a file.
X *           		  Newfile - Ask for filename, create empty file. 
X *
X */
X
X#include "xdtm.h"
X
X/*****************************************************************************
X *                         createDialogWidgets                               *
X *****************************************************************************/
Xpublic void createDialogWidgets(Widget top)
X{
X  /* Call the initialise procedures of all the xdtm dialogs */
X
X  extern void init_quit(Widget);
X  extern void init_button(Widget);
X  extern void init_listoption(Widget);
X  extern void init_map(Widget);
X  extern void init_query(Widget);
X  extern void init_display(Widget);
X  extern void init_newfile(Widget);
X
X  init_quit(top);
X  init_button(top);
X  init_listoption(top);
X  init_map(top);
X  init_query(top);
X  init_display(top);
X  init_newfile(top);
X 				 
X}
X
X/*****************************************************************************
X *                               realize_dialog                              *
X *****************************************************************************/
Xpublic void realize_dialog(Widget popup)
X{
X  /* Given a popup widget this procedure, modified from one in the X Toolkit
X   * Intrinsics Programmers Manual, O'Reilly & Associates, pops it up with
X   * the center of the popup over the center of the application.
X   */
X
X  extern Widget topLevel;
X  Position x,y;
X  Dimension appWidth, appHeight, qWidth, qHeight;
X  XtGeometryResult result;
X  XtWidgetGeometry answer, question;
X  Arg arglist[2];
X  Cardinal i;
X  
X  /* You dont know the dimensions of a widget for certain until it is
X   * realized, therefore realize the dialog.
X   * NOTE: XtRealizeWidget returns without an error if widget is already
X   *       realized, hence no check via XtIsRealized.
X   */
X
X  XtRealizeWidget(popup);
X
X  /* Get dimensions of application */
X  i = 0;
X  XtSetArg(arglist[i], XtNwidth,  &appWidth);    i++;
X  XtSetArg(arglist[i], XtNheight, &appHeight);   i++;
X  XtGetValues(topLevel, arglist, i);
X
X  /* Get dimensions of quit popup */
X  i = 0;
X  XtSetArg(arglist[i], XtNwidth,  &qWidth);    i++;
X  XtSetArg(arglist[i], XtNheight, &qHeight);   i++;
X  XtGetValues(popup, arglist, i);
X
X  /* Translate application coordinates to screen coordinates */
X  XtTranslateCoords(topLevel,
X		    (Position) ((appWidth/2)-(qWidth/2)),
X		    (Position) ((appHeight/2)-(qHeight/2)),
X		    &x, &y);
X
X  /* move popup shell to that position */
X  i = 0;
X  XtSetArg(arglist[i], XtNx, x);  i++;
X  XtSetArg(arglist[i], XtNy, y);  i++;
X  XtSetValues(popup, arglist, i);
X
X  XtPopup(popup, XtGrabNonexclusive);
X  
X}
SHAR_EOF
chmod 0644 xdtm/dialogs.c ||
echo 'restore of xdtm/dialogs.c failed'
Wc_c="`wc -c < 'xdtm/dialogs.c'`"
test 3636 -eq "$Wc_c" ||
	echo 'xdtm/dialogs.c: original size 3636, current size' "$Wc_c"
fi
# ============= xdtm/dirman.c ==============
if test -f 'xdtm/dirman.c' -a X"$1" != X"-c"; then
	echo 'x - skipping xdtm/dirman.c (File already exists)'
else
echo 'x - extracting xdtm/dirman.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/dirman.c' &&
X/*****************************************************************************
X ** File          : dirman.c                                                **
X ** Purpose       : Directory Manager                                       **
X ** Author        : Edward Groenendaal                                      **
X ** Date          : 18th Feb 1991                                           **
X ** Documentation : Xdtm Design Folder                                      **
X *****************************************************************************/
X
X/* Include the application header file */
X#include "xdtm.h"
X
X/* Include the local header files */
X#include <sys/types.h>
X#include <dirent.h>
X#include <sys/stat.h>
X#include <sys/param.h>
X#include <limits.h>
X#include <X11/Xaw/AsciiText.h>
X
X#include "menus.h"
X#include "Xedw/XedwList.h"
X#include "Xedw/XedwForm.h"
X
X#define LISTSIZE    128		/* The initial size of the icon_list   */
X#define LISTINCR    64		/* The steps by which it will increase */
X
X#ifdef TRUE_SYSV
X#ifndef MAXPATHLEN
X#define MAXPATHLEN 512  /* jcc */
X#endif
X#endif
X
Xpublic void   changestate(Boolean);        /* Change sensitivity */
Xpublic String getfilename(String);	   /* extract filename */
X
Xpublic Widget directoryManager;
Xpublic String cwd;			/* current working directory */
Xpublic Cardinal icon_list_size = 0;
Xpublic Cardinal icon_list_max_size = LISTSIZE;
Xpublic XedwList **icon_list;		/* List with icons and/or filenames */
X
X/* local copies of the menu panes which are to be made insensitive when
X * no there is no current selection.
X */
Xprivate Widget duplicatemenu, trashmenu, 
X               copymenu, movemenu, mapmenu;
X
X
X/*****************************************************************************
X *                       createDirectoryManagerWidgets                       *
X *****************************************************************************/
Xpublic void createDirectoryManagerWidgets(Widget view)
X{
X  /* Create the directory manager widget 
X   *
X   * - Takes the directoryManager's parent widget
X   */
X
X  public  void selection_made(Widget, caddr_t, caddr_t);
X  private void DoubleClick(Widget, XButtonEvent*);
X  private void GoUp(Widget, XButtonEvent*);
X  private void SelectAll(Widget, XButtonEvent*);
X  private void Refresh(Widget, XButtonEvent*);
X
X  extern Icon_mode current_mode;
X  Cardinal i;
X  Arg arglist[6];
X  XtTranslations dirManTranslations;
X
X  /* New actions for directoryManager */
X  static XtActionsRec actions[] = {
X    {"DoubleClick", DoubleClick},
X    {"GoUp",        GoUp},
X    {"SelectAll",   SelectAll},
X    {"Refresh",     Refresh},
X    {NULL, NULL}
X  };
X
X  /* New translations for directoryManager */
X  static char defaultTranslations[] =
X             "<Btn1Up>(2):     DoubleClick()\n\
X              <Key>u:          GoUp()\n\
X              <Key>a:          SelectAll()\n\
X	      Ctrl<Key>L:      Refresh()";
X  
X  /* Set the initial mode depending on the value set in the application
X   * defaults. (current_mode.mode set previously to this value when 
X   * creating widgets.
X   */
X  i = 0;
X  switch (current_mode.mode) {
X  case Icons:
X    XtSetArg(arglist[i], XtNshowIcons, True); i++;
X    break;
X  case Short:
X    XtSetArg(arglist[i], XtNshowIcons,   False); i++;
X    XtSetArg(arglist[i], XtNrowSpacing, 5); i++;
X    break;
X  case Long:
X    XtSetArg(arglist[i], XtNshowIcons,   False); i++;
X    XtSetArg(arglist[i], XtNrowSpacing,      5); i++;
X    XtSetArg(arglist[i], XtNforceColumns, True); i++;
X    XtSetArg(arglist[i], XtNdefaultColumns,  1); i++;    
X  }
X  XtSetArg(arglist[i], XtNfont, app_data.dm_font); i++;    
X  XtSetArg(arglist[i], XtNmSelections,      True); i++;
X  directoryManager    =   XtCreateManagedWidget("directoryManager",
X						xedwListWidgetClass,
X						view,
X						arglist, i);
X
X  /* Add callbacks and translations */
X  XtAddCallback(directoryManager, XtNcallback, selection_made, 0);
X  XtAddActions(actions, XtNumber(actions));
X  dirManTranslations = XtParseTranslationTable(defaultTranslations);
X  XtAugmentTranslations(directoryManager, dirManTranslations);
X}
X
X/*****************************************************************************
X *                     directoryManagerNewDirectory                          *
X *****************************************************************************/
Xpublic Boolean directoryManagerNewDirectory(String newpath)
X{
X  /* Change the contents of the directoryManager to that of the directory
X   * contained in the string newpath.
X   */
X
X  extern Boolean getIconType(String, String, XedwList*);
X  extern void setCursor(Cursor);
X  extern void setscroll(Widget, float);
X  private int iconcmp(XedwList*, XedwList*);
X
X  extern Icon_mode current_mode;
X  extern Cursor busy;
X  extern Widget dirSelector;
X  extern Widget directoryManagerView;
X  Arg args[1];
X  XedwList temp;
X  DIR *dirp;
X  struct dirent *dp;
X  Cardinal i = 0, n;
X  Boolean result = False; /* Whether the change of directories succeeded */
X
X  /* create a new one */
X  if ((dirp = opendir(newpath)) != NULL && chdir(newpath) == 0) {
X
X    /* set cursor to busy */
X    setCursor(busy);
X
X    /* Trash old list */
X    for(i=0; i < icon_list_size; i++) {
X      XtFree(icon_list[i]->string);
X      XtFree(icon_list[i]);
X    }
X
X    /* Get icon type for each file */
X    i = 0;
X    while ((dp = readdir(dirp)) != NULL) {
X      if (i == icon_list_max_size) {
X	icon_list_max_size += LISTINCR;
X	icon_list = (XedwList**) XtRealloc(icon_list,
X					   sizeof(XedwList*) * 
X					   icon_list_max_size);
X      } else 
X	if (getIconType(dp->d_name, newpath, &temp)) {
X	  icon_list[i] = XtNew(XedwList);
X	  icon_list[i]->string = temp.string;
X	  icon_list[i]->icon   = temp.icon;
X	  i++;
X	}
X    }
X    icon_list[i] = NULL;	/* NULL terminated */
X    icon_list_size = i;
X
X    /* Sort the list */
X    qsort((char*)icon_list, icon_list_size, sizeof(icon_list[0]), iconcmp);
X
X    /* Change the contents of the directory Manager */
X    XedwListChange(directoryManager, icon_list, icon_list_size, 0, True);
X
X    /* Set the scrollbar of the viewport to the top */
X    setscroll(directoryManagerView, 0.0);
X    
X    closedir(dirp);
X    result = True;
X
X    /* Change entry in the directory selector */
X    XtSetArg(args[0], XtNstring, newpath); 
X    XtSetValues(dirSelector, args, 1);
X    /* reset cursor */
X    setCursor(NULL);
X  } else 
X    XBell(XtDisplay(directoryManager), 100);
X  return(result);
X}
X
X/*****************************************************************************
X *                                iconcmp                                    *
X *****************************************************************************/
Xprivate int iconcmp(XedwList **ip1, XedwList **ip2)
X{
X  /* compare the strings of 2 XedwList's */
X
X  return (strcmp(getfilename((*ip1)->string), 
X		 getfilename((*ip2)->string)));
X}
X
X/*****************************************************************************
X *                              initDirectoryManager                         *
X *****************************************************************************/
Xpublic void initDirectoryManager(void)
X{
X  /* Get the menubar pane widgets, create the initial icon_list, find 
X   * out what the current directory is.
X   */
X
X  extern Boolean buttonSensitive;
X  extern Widget menuBar;
X  char tmpcwd[MAXPATHLEN];
X
X  /* Initialise the icon list */
X  icon_list = (XedwList**) XtMalloc(sizeof(XedwList*) * LISTSIZE);
X
X  /* Set the starting directory */
X#ifdef USE_CWD
X  if (getcwd(tmpcwd, MAXPATHLEN) != NULL)
X#else
X  if (getwd(tmpcwd) != NULL) 
X#endif
X    cwd = XtNewString(tmpcwd);
X  else
X    if ((cwd = (char*) getenv("HOME")) == NULL) 
X      cwd = XtNewString("/");
X    else
X      cwd = XtNewString(cwd);
X
X  /* Get the id's of the menu widgets which are to be toggled with the
X   * buttons. Note: This relies on the menus being created first, which
X   * they are.
X   */
X  if ((duplicatemenu = 
X       XtNameToWidget(menuBar, "fileMenuButton.fileMenu.duplicate")) == NULL) {
X    fprintf(stderr, "Directorymanager: Can't find duplicate menu widget\n");
X    exit(2);
X  }
X  if ((trashmenu   = 
X       XtNameToWidget(menuBar, "fileMenuButton.fileMenu.trash")) == NULL) {
X    fprintf(stderr, "Directorymanager: Can't find trash menu widget\n");
X    exit(2);
X  }
X  if ((copymenu    = 
X       XtNameToWidget(menuBar, "fileMenuButton.fileMenu.copy")) == NULL) {
X    fprintf(stderr, "Directorymanager: Can't find copy menu widget\n");
X    exit(2);
X  }
X  if ((movemenu    = 
X       XtNameToWidget(menuBar, "fileMenuButton.fileMenu.move")) == NULL) {
X    fprintf(stderr, "Directorymanager: Can't find move menu widget\n");
X    exit(2);
X  }
X  if ((mapmenu     = 
X       XtNameToWidget(menuBar, "optionMenuButton.optionMenu.map")) == NULL) {
X    fprintf(stderr, "Directorymanager: Can't find map menu widget\n");
X    exit(2);
X  }
X  (void) directoryManagerNewDirectory(cwd);
X  buttonSensitive = True;
X  changestate(False); 	   /* Insure that menus are insensitive */
X}
X
X/*****************************************************************************
X *                              selection_made                               *
X *****************************************************************************/
Xpublic void selection_made(Widget w, caddr_t client_data, caddr_t call_data)
X{
X  /* Someone has either selected or deselected an item.
X   * If there's nothing selected then buttons are changed to 
X   * not sensitive.
X   */
X
X  extern Boolean buttonSensitive;
X  extern Widget trashButton, copyButton, moveButton;
X  Arg arglist[1];
X  Cardinal i;
X
X
X  if (XedwListSelection(w) != buttonSensitive)
X    if (buttonSensitive == False) {
X      changestate(True);
X    } else {
X      changestate(False);
X    }
X}
X
X/*****************************************************************************
X *                              DoubleClick                                  *
X *****************************************************************************/
Xprivate void DoubleClick(Widget w, XButtonEvent *event)
X{
X  /* Either Start a program, View a file or change directory.
X   * executable = try to exec it.
X   * directory  = try to enter it.
X   * otherwise offer to view it.
X   *
X   * Maybe add stuff here to start a predefined application with this
X   * file as an argument if the filename matches a particular pattern,
X   * (James Beal, Henry Thomas)
X   *
X   * e.g. "\.ps$"  -> "xps !@"
X   *      "\.man$" -> "xterm -T 'Manual Page' -e sh -c 'nroff -man !@ | less'"
X   *      "\.gif$" -> "xview !@"
X   */
X
X  extern void query_dialog(String, Boolean);
X  extern int execute(String, String, String, Boolean);
X
X  extern Boolean buttonSensitive;
X  extern Widget trashButton, moveButton, copyButton;
X
X  struct stat filestatus;
X  String fullname, filename, temp;
X  XedwListReturnStruct *highlighted;
X  Arg arglist[1];
X  Cardinal i;
X
X  selection_made(w, (caddr_t)0, (caddr_t)0);
X  highlighted = XedwListShowCurrent(w);
X
X  if (highlighted->xedwList_index != XDTM_LIST_NONE) {
X    filename = getfilename(highlighted->string);
X    fullname=(String) XtMalloc((strlen(filename)+strlen(cwd)+2) * sizeof(char));
X    strcpy(fullname, cwd);
X    if (strcmp(cwd, "/") != 0)
X      strcat(fullname, "/");
X    strcat(fullname, filename);
X
X    /* Use normal stat.. follows symbolic links */
X    if (stat(fullname, &filestatus) == -1) {
X      fprintf(stderr,"xdtm: ARRRGGHHH stat error\n");
X    } else {
X      if ((filestatus.st_mode & S_IFMT) == S_IFDIR) {
X	if (strcmp(filename, "..") == 0) {
X	  strcpy(fullname, cwd);
X	  if ((temp = (char*) strrchr(fullname, '/')) == NULL) 
X	    fprintf(stderr, "xdtm: impossible error\n");
X	  if (temp == fullname)
X	    *(temp+1) = '\0';
X	  else
X	    *temp = '\0';
X	}  
X	if (strcmp(filename, ".") == 0) {
X	  XtFree(fullname);
X	  fullname=XtNewString(cwd);
X	}
X	if (directoryManagerNewDirectory(fullname) == True) {
X	  XtFree(cwd);
X	  cwd=fullname;
X	  changestate(False);
X	} else XBell(XtDisplay(w), 100);
X      } else {
X	/* Not a directory, is it executable? */
X	if ((filestatus.st_mode & S_IXUSR) != 0 ||
X	    (filestatus.st_mode & S_IXGRP) != 0 ||
X	    (filestatus.st_mode & S_IXOTH) != 0) {
X	  extern void setCursor(Cursor);
X	  extern Cursor busy;
X
X	  setCursor(busy);
X	  execute(fullname, filename, filename, False);
X	  setCursor(NULL);
X	} else
X	  if ((filestatus.st_mode & S_IFMT) == S_IFREG) {
X	    /* Display dialog box to ask whether to display file */
X	    query_dialog(fullname, True);
X	  } else XBell(XtDisplay(w), 100);
X	XtFree(fullname);
X      }
X    }
X    XtFree(highlighted);
X  }
X}
X
X/*****************************************************************************
X *                                     GoUp                                  *
X *****************************************************************************/
Xprivate void GoUp(Widget w, XButtonEvent *event)
X{
X  /* Change to the directory immeditaly above the current one,
X   * does this by highlighting the .. directory, then calling 
X   * DoubleClick to change to the highlighted directory. 
X   * I used this longwinded approach because it showed on screen
X   * what was actually happening.
X   */
X
X  Cardinal i;
X  /* Find entry with .. */
X  for (i=0; i < icon_list_size && 
X       (strcmp(getfilename(icon_list[i]->string), "..") != 0); i++); 
X
X  XedwListUnhighlight(w, XedwAll);
X  /* Call XedwListHighlight with item number */
X  XedwListHighlight(w, i);
X
X  /* Call double click */
X
X  DoubleClick(w, (XButtonEvent*) NULL);
X
X}
X
X/*****************************************************************************
X *                                 SelectAll                                 *
X *****************************************************************************/
Xprivate void SelectAll(Widget w, XButtonEvent *event)
X{
X  /* Select All the files in the current directory except for . and .. */
X
X  extern Boolean buttonSensitive;
X  extern Widget trashButton, moveButton, copyButton;
X  public void changestate(Boolean);
X  extern void setCursor(Cursor);
X  extern Mode mode;
X  extern Cursor busy;
X
X  Arg arglist[1];
X  Cardinal i;
X
X  /* Don't do it if in copy or move mode */
X  if (mode == NormalMode) {
X    setCursor(busy);
X    XedwListHighlight(w, XedwAll);
X    
X    /* unhighlight . and .. */
X    for (i=0; i < icon_list_size && 
X	 (strcmp(getfilename(icon_list[i]->string), ".") != 0); i++); 
X    XedwListUnhighlight(w, i);
X    for (i=i; i < icon_list_size && 
X	 (strcmp(getfilename(icon_list[i]->string), "..") != 0); i++); 
X    XedwListUnhighlight(w, i);
X    setCursor(NULL);
X  } else
X    XBell(XtDisplay(w), 100);
X  
X  /* do buttons */
X  if (icon_list_size > 2) {
X    changestate(True);
X  }
X}
X
X/*****************************************************************************
X *                                Refresh                                    *
X *****************************************************************************/
Xprivate void Refresh(Widget w, XButtonEvent *event)
X{
X  /* Refresh the current directory contents to the actual contents.
X   */
X
X  directoryManagerNewDirectory(cwd);
X}
X
X/*****************************************************************************
X *                               changestate                                 *
X *****************************************************************************/
Xpublic void changestate(Boolean new)
X{
X  /* Toggle the sensitivity of all the widgets which may not be used
X   * when no files are highlighted.
X   *
X   * - Takes the new state for widgets.
X   */
X
X  extern Boolean buttonSensitive;
X  extern Widget trashButton, copyButton, moveButton;
X  extern Mode mode;
X
X  if (buttonSensitive == True) {
X    if (mode == MoveMode) {
X      /* Turn off Trash and Copy */
X      XtSetSensitive(copyButton,    False);
X      XtSetSensitive(trashButton,   False);
X      XtSetSensitive(copymenu,      False);
X      XtSetSensitive(trashmenu,     False);
X      XtSetSensitive(mapmenu,       False);
X      XtSetSensitive(duplicatemenu, False);
X      buttonSensitive = False;
X    } else if (mode == CopyMode) {
X      /* Turn off Trash and Move */
X      XtSetSensitive(moveButton,    False);
X      XtSetSensitive(trashButton,   False);
X      XtSetSensitive(movemenu,      False);
X      XtSetSensitive(trashmenu,     False);
X      XtSetSensitive(mapmenu,       False);
X      XtSetSensitive(duplicatemenu, False);
X      buttonSensitive = False;
X    } else if (new == False) {
X      /* Turn off All */
X      XtSetSensitive(moveButton,    False);
X      XtSetSensitive(copyButton,    False);
X      XtSetSensitive(trashButton,   False);
X      XtSetSensitive(copymenu,      False);
X      XtSetSensitive(movemenu,      False);
X      XtSetSensitive(trashmenu,     False);
X      XtSetSensitive(mapmenu,       False);
X      XtSetSensitive(duplicatemenu, False);
X      buttonSensitive = False;
X    }
X  } else {
X    /* buttonSensitive == False */
X
X    /* If in MoveMode or CopyMode, then everything is set anyway */
X    if (mode == NormalMode && new == True) {
X      /* Set all to True */
X      XtSetSensitive(trashButton,   True);
X      XtSetSensitive(moveButton,    True);
X      XtSetSensitive(copyButton,    True);
X      XtSetSensitive(trashmenu,     True);
X      XtSetSensitive(movemenu,      True);
X      XtSetSensitive(copymenu,      True);
X      XtSetSensitive(duplicatemenu, True);
X      XtSetSensitive(mapmenu,       True);
X      buttonSensitive = True;
X    }
X  }
X}
X
X/*****************************************************************************
X *                              getfilename                                  *
X *****************************************************************************/
Xpublic String getfilename(String s)
X{
X  /* If in Long Listing mode this function returns the filename part
X   * of the string used in the directory list. If not in Long Listing
X   * then return the string unmolested.
X   */
X  extern Icon_mode current_mode;
X
X  if (current_mode.mode == Long && (strlen(s) > current_mode.length))
X    return (s+current_mode.length);
X  else
X    return (s);
X}
SHAR_EOF
chmod 0644 xdtm/dirman.c ||
echo 'restore of xdtm/dirman.c failed'
Wc_c="`wc -c < 'xdtm/dirman.c'`"
test 17893 -eq "$Wc_c" ||
	echo 'xdtm/dirman.c: original size 17893, current size' "$Wc_c"
fi
true || echo 'restore of xdtm/display.c failed'
echo End of part 5, continue with part 6
exit 0

--
Dan Heller
O'Reilly && Associates       Z-Code Software    Comp-sources-x:
Senior Writer                President          comp-sources-x at uunet.uu.net
argv at ora.com                 argv at zipcode.com



More information about the Comp.sources.x mailing list