home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
x
/
volume13
/
xdtm
/
part09
< prev
next >
Wrap
Text File
|
1991-05-18
|
48KB
|
1,464 lines
Path: uunet!olivea!apple!sun-barr!newstop!exodus!cogs.sussex.ac.uk
From: eddyg@cogs.sussex.ac.uk (EdwardJ. Groenendaal)
Newsgroups: comp.sources.x
Subject: v13i014: xdtm - X Desktop Manager for the X Window System, Part09/11
Message-ID: <13578@exodus.Eng.Sun.COM>
Date: 19 May 91 00:03:55 GMT
References: <csx-13i006:xdtm@uunet.UU.NET>
Sender: news@exodus.Eng.Sun.COM
Lines: 1452
Approved: argv@sun.com
Submitted-by: Edward "J." Groenendaal <eddyg@cogs.sussex.ac.uk>
Posting-number: Volume 13, Issue 14
Archive-name: xdtm/part09
Submitted-by: eddyg@cste
Archive-name: xdtm/part09
---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 09 of xdtm
# ============= xdtm/main.c ==============
if test ! -d 'xdtm'; then
echo 'x - creating directory xdtm'
mkdir 'xdtm'
fi
if test -f 'xdtm/main.c' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/main.c (File already exists)'
else
echo 'x - extracting xdtm/main.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/main.c' &&
X/*****************************************************************************
X ** File : main.c **
X ** Purpose : Initialise and Realise xdtm **
X ** Author : Edward Groenendaal **
X ** Date : 18th Feb 1991 **
X ** Documentation : Xdtm Design Folder **
X ** Related Files : All other xdtm files **
X *****************************************************************************/
X
X#include "xdtm.h"
X#include "menus.h"
X
X/* local headers */
X
X#include <X11/Shell.h>
X#include "Xedw/XedwForm.h"
X
X#include "bitmaps/xdtm.xbm"
X
Xpublic Widget topLevel;
Xpublic String home;
Xpublic AppData app_data;
X
Xstatic XtResource resources[] = {
X {
X XtNviewWidth,
X XtCViewWidth,
X XtRInt,
X sizeof(int),
X XtOffset(AppDataPtr, view_width),
X XtRImmediate,
X (caddr_t) 85,
X },
X {
X XtNviewHeight,
X XtCViewHeight,
X XtRInt,
X sizeof(int),
X XtOffset(AppDataPtr, view_height),
X XtRImmediate,
X (caddr_t) 25,
X },
X {
X XtNmode,
X XtCMode,
X XtRString,
X sizeof(String),
X XtOffset(AppDataPtr, mode),
X XtRImmediate,
X (caddr_t) "icons",
X },
X {
X XtNdelay,
X XtCDelay,
X XtRInt,
X sizeof(int),
X XtOffset(AppDataPtr, delay),
X XtRImmediate,
X (caddr_t) 0,
X },
X {
X XtNdirOnExit,
X XtCDirOnExit,
X XtRBoolean,
X sizeof(Boolean),
X XtOffset(AppDataPtr, dironexit),
X XtRImmediate,
X (caddr_t) False,
X },
X {
X XtNconfigFile,
X XtCConfigFile,
X XtRString,
X sizeof(String),
X XtOffset(AppDataPtr, cffile),
X XtRImmediate,
X (caddr_t) NULL,
X },
X {
X XtNviewFont,
X XtCFont,
X XtRFontStruct,
X sizeof(XFontStruct*),
X XtOffset(AppDataPtr, view_font),
X XtRString,
X (caddr_t) "6x10",
X },
X {
X XtNdmFont,
X XtCFont,
X XtRFontStruct,
X sizeof(XFontStruct*),
X XtOffset(AppDataPtr, dm_font),
X XtRString,
X (caddr_t) "*-courier-bold-r-*-120-*",
X },
X};
X
X/*****************************************************************************
X * main *
X *****************************************************************************/
Xpublic void main(int argc, char *argv[])
X{
X /* Parse the command line arguments, initialise the toplevel form, call
X * other initialising procedures, enter the X Main Loop.
X */
X
X private void initialiseXdtm(void);
X extern void createMenuWidgets(Widget); /* menus.c */
X extern void createAppManagerWidgets(Widget); /* appman.c */
X extern void createFileManagerWidgets(Widget); /* fileman.c */
X extern void createDialogWidgets(Widget); /* dialogs.c */
X
X extern Icon_mode current_mode;
X Widget topForm;
X Arg arglist[6];
X Cardinal i;
X static String Title = "X DeskTop Manager";
X
X /* Command Line Arguments */
X
X static XrmOptionDescRec options[] = {
X {"-dmfont", "*directoryManager.font", XrmoptionSepArg, NULL},
X {"-cf", ".configFile", XrmoptionSepArg, NULL},
X {"-delay", ".delay", XrmoptionSepArg, NULL}
X };
X
X /* Initialise Program */
X if ((home = (String) getenv("HOME")) == NULL) {
X fprintf(stderr, "Warning: can't get environment variable HOME\n");
X home = XtNewString("/");
X } else
X home = XtNewString(home);
X
X /* Initialise the user interface */
X
X topLevel = XtInitialize(argv[0],
X "Xdtm",
X options,
X XtNumber(options),
X &argc, argv);
X
X /* Check left over command line arguments */
X if (argc > 1) {
X /* incorrect command line arguments */
X int i;
X static int errs = False;
X
X for (i = 1; i < argc; i++) {
X if (!errs++)
X fprintf(stderr, "%s: command line option unknown:\n", argv[0]);
X fprintf(stderr, "option: %s\n\n", argv[i]);
X }
X fprintf(stderr, "%s understands all standard Xt "
X "command-line options.\n", argv[0]);
X fprintf(stderr, "Additional options are as follows:\n");
X fprintf(stderr, "Option Valid Range\n");
X fprintf(stderr, "-dmfont Any font, should be fixed width\n");
X fprintf(stderr, "-cf config filename\n");
X fprintf(stderr, "-delay delay after copying, for NFS\n");
X exit(2);
X }
X
X /* get application resources */
X XtGetApplicationResources(topLevel,
X &app_data,
X resources,
X XtNumber(resources),
X NULL, 0);
X
X /* check values of application resources */
X if (app_data.view_width < 1 || app_data.view_height < 1) {
X fprintf(stderr, "%s: error in resource settings:\n"
X "view window must be greater than 1x1 characters\n",
X argv[0]);
X exit(2);
X }
X
X if (strcmp(app_data.mode, "icons") == 0)
X current_mode.mode = Icons;
X else if (strcmp(app_data.mode, "short") == 0)
X current_mode.mode = Short;
X else if (strcmp(app_data.mode, "long") == 0)
X current_mode.mode = Long;
X else {
X fprintf(stderr, "%s: error in resource settings:\n"
X "mode must be one of either:\n"
X "'icons' Show icons\n"
X "'short' Just display file names\n"
X "'long' Display file names with additional data.\n",
X argv[0]);
X exit(2);
X }
X
X if (app_data.delay < 0 || app_data.delay > 5) {
X fprintf(stderr, "%s: error in resource settings:\n"
X "delay must be between 0 and 5\n", argv[0]);
X exit(2);
X }
X
X i = 0;
X XtSetArg(arglist[i], XtNbottom, XtChainBottom); i++;
X XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
X XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
X XtSetArg(arglist[i], XtNright, XtChainRight); i++;
X XtSetArg(arglist[i], XtNhorizDistance, 5); i++;
X XtSetArg(arglist[i], XtNvertDistance, 5); i++;
X topForm = XtCreateManagedWidget("topForm",
X xedwFormWidgetClass,
X topLevel,
X arglist, i);
X
X /* Create Widgets in rest of program.
X * These must be called in this order, top left -> bottom right
X */
X createMenuWidgets (topForm);
X createAppManagerWidgets (topForm);
X createFileManagerWidgets (topForm);
X createDialogWidgets (topForm);
X
X i = 0;
X XtSetArg(arglist[i], XtNiconPixmap,
X XCreateBitmapFromData(XtDisplay(topLevel), /* jcc */
X XtScreen(topLevel)->root,
X xdtm_bits, xdtm_width,
X xdtm_height)); i++;
X XtSetArg(arglist[i], XtNtitle, Title); i++;
X XtSetArg(arglist[i], XtNminWidth, 400); i++;
X XtSetArg(arglist[i], XtNminHeight, 200); i++;
X XtSetValues(topLevel, arglist, i);
X
X tzset(); /* Make sure we have the time zone info so that the date
X * functions work, probably don't *need* this.. */
X
X /* Realize the widgets, (display program) then loop waiting for events */
X
X XtRealizeWidget(topLevel);
X
X initialiseXdtm();
X
X XtMainLoop();
X
X}
X
X/*****************************************************************************
X * quitQueryResult *
X *****************************************************************************/
Xpublic void quitQueryResult(Widget w, Boolean quit, caddr_t call_data)
X{
X /* Action procedure called when a button is pressed in a quit dialog,
X *
X * - Takes a widget, quit - whether to quit, call_data - ignored.
X */
X
X extern void destroy_quit_dialog(void);
X
X /* Quit selected */
X if (quit == True)
X exit(0);
X
X /* Cancel selected */
X destroy_quit_dialog();
X}
X
X/*****************************************************************************
X * initialiseXdtm *
X *****************************************************************************/
Xprivate void initialiseXdtm(void)
X{
X /* initialise the program */
X
X extern void initAppManager(Widget); /* appman.c */
X extern void initFileManager(Widget); /* fileman.c */
X extern void parsePreferences(Widget); /* parse.c */
X
X parsePreferences(topLevel);
X initAppManager(topLevel);
X initFileManager(topLevel);
X}
SHAR_EOF
chmod 0644 xdtm/main.c ||
echo 'restore of xdtm/main.c failed'
Wc_c="`wc -c < 'xdtm/main.c'`"
test 8048 -eq "$Wc_c" ||
echo 'xdtm/main.c: original size 8048, current size' "$Wc_c"
fi
# ============= xdtm/map.c ==============
if test -f 'xdtm/map.c' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/map.c (File already exists)'
else
echo 'x - extracting xdtm/map.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/map.c' &&
X/*****************************************************************************
X ** File : map.c **
X ** Purpose : Initialise and Realise map dialog **
X ** Author : Edward Groenendaal **
X ** Date : April 1991 **
X ** Documentation : Xdtm Design Folder **
X ** Related Files : **
X *****************************************************************************/
X
X#include "xdtm.h"
X#include "parse.h" /* For SelOptions, ESIZE */
X#include <X11/Shell.h>
X#include <X11/Xaw/Label.h>
X#include <X11/Xaw/Command.h>
X#include <X11/Xaw/AsciiText.h>
X#include "Xedw/XedwForm.h"
X#include "Xedw/XedwList.h"
X
Xextern void realize_dialog(Widget);
X
X/* Widgets */
X
Xprivate Widget mappopup; /* For mapping prog over files */
Xprivate Widget mapform;
Xprivate Widget maplabel;
Xprivate Widget mappromptlabel;
Xprivate Widget maptext;
Xprivate Widget mapCancel;
Xprivate Widget mapOK;
X
X/*****************************************************************************
X * init_map *
X *****************************************************************************/
Xpublic void init_map(Widget top)
X{
X /* Initialise the map and select dialog Widgets, they actually shar the
X * same ones.
X */
X
X Arg arglist[7];
X Cardinal i;
X XtTranslations mapTranslations;
X
X /* Translations for the text widget */
X static char defaultTranslations[] =
X "Ctrl<Key>A: beginning-of-line() \n\
X Ctrl<Key>E: end-of-line() \n\
X <Key>Escape: beginning-of-line() kill-to-end-of-line() \n\
X <Key>Right: forward-character() \n\
X <Key>Left: backward-character() \n\
X <Key>Delete: delete-previous-character() \n\
X <Key>BackSpace: delete-previous-character() \n\
X <Key>: insert-char() \n\
X <FocusIn>: focus-in() \n\
X <FocusOut>: focus-out() \n\
X <BtnDown>: select-start()";
X
X
X mappopup = XtCreatePopupShell("mappopup",
X transientShellWidgetClass,
X top,
X NULL, 0);
X
X mapform = XtCreateManagedWidget("mapform",
X xedwFormWidgetClass,
X mappopup,
X NULL, 0);
X
X i = 0;
X XtSetArg(arglist[i], XtNborderWidth, 0); i++;
X XtSetArg(arglist[i], XtNfullWidth, True); i++;
X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++;
X maplabel = XtCreateManagedWidget("maplabel",
X labelWidgetClass,
X mapform,
X arglist, i);
X
X i = 1;
X XtSetArg(arglist[i], XtNfromVert, maplabel); i++;
X mappromptlabel = XtCreateManagedWidget("mappromptlabel",
X labelWidgetClass,
X mapform,
X arglist, i);
X
X i = 2;
X XtSetArg(arglist[i], XtNfromHoriz, mappromptlabel); i++;
X XtSetArg(arglist[i], XtNfullWidth, True); i++;
X XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++;
X maptext = XtCreateManagedWidget("maptext",
X asciiTextWidgetClass,
X mapform,
X arglist, i);
X
X i = 0;
X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++;
X XtSetArg(arglist[i], XtNfromVert, maptext); i++;
X XtSetArg(arglist[i], XtNlabel, "Cancel"); i++;
X mapCancel = XtCreateManagedWidget("mapCancel",
X commandWidgetClass,
X mapform,
X arglist, i);
X
X i = 2;
X XtSetArg(arglist[i], XtNfromHoriz, mapCancel); i++;
X XtSetArg(arglist[i], XtNwidthLinked, mapCancel); i++;
X XtSetArg(arglist[i], XtNlabel, "OK"); i++;
X mapOK = XtCreateManagedWidget("mapOK",
X commandWidgetClass,
X mapform,
X arglist, i);
X
X
X XtUninstallTranslations(maptext);
X mapTranslations = XtParseTranslationTable(defaultTranslations);
X XtOverrideTranslations(maptext, mapTranslations);
X
X}
X
X/*****************************************************************************
X * map_dialog *
X *****************************************************************************/
Xpublic void map_dialog(Boolean map)
X{
X /* if map is true then put map dialog up, otherwise use the
X * select dialog.
X */
X
X private void mapQueryResult(Widget, Boolean, caddr_t);
X private void selectQueryResult(Widget, Boolean, caddr_t);
X Arg arglist[1];
X
X XtSetArg(arglist[0], XtNstring, "");
X XtSetValues(maptext, arglist, 1);
X
X if (map == True) {
X XtSetArg(arglist[0], XtNlabel, " Map Program over Selected Files ");
X XtSetValues(maplabel, arglist, 1);
X
X XtSetArg(arglist[0], XtNlabel, "Program:");
X XtSetValues(mappromptlabel, arglist, 1);
X
X XtAddCallback(mapCancel, XtNcallback, mapQueryResult, False);
X XtAddCallback(mapOK, XtNcallback, mapQueryResult, True);
X } else {
X XtSetArg(arglist[0], XtNlabel, "Select Files by Regular Expression");
X XtSetValues(maplabel, arglist, 1);
X
X XtSetArg(arglist[0], XtNlabel, "RegExp: ");
X XtSetValues(mappromptlabel, arglist, 1);
X
X XtAddCallback(mapCancel, XtNcallback, selectQueryResult, False);
X XtAddCallback(mapOK, XtNcallback, selectQueryResult, True);
X }
X
X realize_dialog(mappopup);
X}
X
X/*****************************************************************************
X * destroy_map_dialog *
X *****************************************************************************/
Xprivate void destroy_map_dialog(void)
X{
X /* Popdown the map dialog, remove the callbacks on the buttons so that
X * they can be reset next time map_dialog is called, in case the select
X * dialog is required.
X */
X
X Arg arglist[1];
X
X XtPopdown(mappopup);
X
X XtRemoveAllCallbacks(mapCancel, XtNcallback);
X XtRemoveAllCallbacks(mapOK, XtNcallback);
X}
X
X/*****************************************************************************
X * mapQueryResult *
X *****************************************************************************/
Xprivate void mapQueryResult(Widget w, Boolean ok, caddr_t call_data)
X{
X /* Either map a program over the selected files if OK was pressed,
X * otherwise do nothing.
X */
X
X extern String build_arguments(String, SelOptions);
X extern int execute(String, String, String, Boolean);
X extern void setCursor(Cursor);
X extern Cursor busy;
X String mapprogram, program, filename;
X Arg arglist[1];
X
X destroy_map_dialog();
X
X if (ok == True) {
X setCursor(busy);
X /* get program name from text widget */
X XtSetArg(arglist[0], XtNstring, &mapprogram);
X XtGetValues(maptext, arglist, 1);
X
X program = XtNewString(mapprogram);
X
X /* extract filename from program */
X filename = XtNewString(program);
X filename = strtok(filename, " ");
X
X /* Get list of files */
X if ((program = build_arguments(program, M_SEL)) == NULL)
X fprintf(stderr, "Programmer Error: map was selected without files\n");
X else
X execute(NULL, filename, program, False);
X
X setCursor(NULL);
X }
X}
X
X/*****************************************************************************
X * selectQueryResult *
X *****************************************************************************/
Xprivate void selectQueryResult(Widget w, Boolean ok, caddr_t call_data)
X{
X /* If Ok was pressed then select files using the regular expression
X * contained within the text widget.
X */
X
X extern void highlight_by_re(String);
X extern void setCursor(Cursor);
X extern Cursor busy;
X String re;
X Arg arglist[1];
X
X destroy_map_dialog();
X
X if (ok == True) {
X /* Get regular expression */
X setCursor(busy);
X XtSetArg(arglist[0], XtNstring, &re);
X XtGetValues(maptext, arglist, 1);
X
X highlight_by_re(re);
X
X setCursor(NULL);
X }
X}
SHAR_EOF
chmod 0644 xdtm/map.c ||
echo 'restore of xdtm/map.c failed'
Wc_c="`wc -c < 'xdtm/map.c'`"
test 7904 -eq "$Wc_c" ||
echo 'xdtm/map.c: original size 7904, current size' "$Wc_c"
fi
# ============= xdtm/menus.c ==============
if test -f 'xdtm/menus.c' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/menus.c (File already exists)'
else
echo 'x - extracting xdtm/menus.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/menus.c' &&
X/*****************************************************************************
X ** File : menus.c **
X ** Purpose : Create, and handle the pull down menus **
X ** Author : Edward Groenendaal **
X ** Date : 18th Feb 1991 **
X ** Documentation : Xdtm Design Folder **
X ** Related Files : **
X *****************************************************************************/
X
X#include "xdtm.h"
X#include "menus.h"
X#include <sys/stat.h>
X#include <X11/Xaw/MenuButton.h>
X#include <X11/Xaw/SimpleMenu.h>
X#include <X11/Xaw/SmeBSB.h>
X#include <X11/Xaw/SmeLine.h>
X
X#include "Xedw/XedwList.h"
X#include "Xedw/XedwForm.h"
X#include "bitmaps/Tick"
X#include "bitmaps/EmptyTick"
X
Xstatic MenuContents fileMenuStrings[] = {
X { "about", "About Xdtm...", About, noflag },
X { "help", "Help", Help, noflag },
X { LINE, NULL, 0, noflag },
X { "new", "New File", New, noflag },
X { "duplicate", "Duplicate File", Duplicate, noflag },
X { LINE, NULL, 0, noflag },
X { "copy", "Copy files", Copy, noflag },
X { "move", "Move files", Move, noflag },
X { "trash", "Delete files", Trash, noflag },
X { LINE, NULL, 0, noflag },
X { "quit", "Quit Program", Quit, noflag },
X};
X
Xstatic MenuContents optionMenuStrings[] = {
X { "map", "Map Program over Files", Map, noflag },
X { "select", "Select Files by Template", Select, noflag },
X};
X
Xstatic MenuContents viewMenuStrings[] = {
X { "icons", "Show Icons", Icons, flagged },
X { "short", "No Icons", Short, flagged },
X { LINE, NULL, 0, flagged },
X { "long", "Long Listing", Long, flagged },
X { "options", "Options", Options, flagged },
X};
X
XCardinal fileMenuSize = sizeof(fileMenuStrings) /
X sizeof(fileMenuStrings[0]);
XCardinal optionMenuSize = sizeof(optionMenuStrings) /
X sizeof(optionMenuStrings[0]);
XCardinal viewMenuSize = sizeof(viewMenuStrings) /
X sizeof(viewMenuStrings[0]);
X
Xpublic Arg chain_position[] = { XtNtop, XtChainTop,
X XtNbottom, XtChainBottom,
X XtNleft, XtChainLeft,
X XtNright, XtChainRight,
X NULL, NULL
X };
X
XCardinal chain_size = sizeof(chain_position)/sizeof(chain_position[0]);
X
Xpublic Pixmap tick, emptytick;
Xpublic Widget menuBar;
X
Xpublic Icon_mode current_mode;
X
X/*****************************************************************************
X * createManuWidgets *
X *****************************************************************************/
Xpublic void createMenuWidgets(Widget w)
X{
X /* This procedure creates the widgets for the menu bar.
X * It's 4:41 in the morning, I'm tired, but the work must go on..
X * so it's time to smile :-) Always look on the bright side of life...
X */
X
X private void menuSelect(Widget, Cardinal, caddr_t);
X public void createMenu(Widget, MenuContents[], Cardinal,
X void (*)(Widget, Cardinal, caddr_t) );
X
X Widget fileMenuButton, optionMenuButton, viewMenuButton, selectionMenuButton;
X Widget fileMenu, optionMenu, viewMenu;
X Arg arglist[7], *newlist;
X Cardinal i;
X
X i = 0;
X XtSetArg(arglist[i], XtNrubberWidth, False); i++;
X XtSetArg(arglist[i], XtNrubberHeight, False); i++;
X XtSetArg(arglist[i], XtNborderWidth, 0); i++;
X newlist = XtMergeArgLists(arglist, i, chain_position, chain_size);
X menuBar = XtCreateManagedWidget("menuBar",
X xedwFormWidgetClass,
X w,
X newlist, i + chain_size);
X XtFree(newlist);
X
X i = 0;
X XtSetArg(arglist[i], XtNhighlightThickness, 0); i++;
X XtSetArg(arglist[i], XtNborderWidth, 0); i++;
X XtSetArg(arglist[i], XtNmenuName, "fileMenu"); i++;
X XtSetArg(arglist[i], XtNlabel, "File"); i++;
X XtSetArg(arglist[i], XtNvertDistance, 0); i++;
X fileMenuButton = XtCreateManagedWidget("fileMenuButton",
X menuButtonWidgetClass,
X menuBar,
X arglist, i);
X
X i = 2;
X XtSetArg(arglist[i], XtNmenuName, "optionMenu"); i++;
X XtSetArg(arglist[i], XtNlabel, "Options"); i++;
X XtSetArg(arglist[i], XtNfromHoriz, fileMenuButton); i++;
X XtSetArg(arglist[i], XtNvertDistance, 0); i++;
X optionMenuButton = XtCreateManagedWidget("optionMenuButton",
X menuButtonWidgetClass,
X menuBar,
X arglist, i);
X
X i = 2;
X XtSetArg(arglist[i], XtNmenuName, "viewMenu"); i++;
X XtSetArg(arglist[i], XtNlabel, "View"); i++;
X XtSetArg(arglist[i], XtNfromHoriz, optionMenuButton); i++;
X XtSetArg(arglist[i], XtNvertDistance, 0); i++;
X viewMenuButton = XtCreateManagedWidget("viewMenuButton",
X menuButtonWidgetClass,
X menuBar,
X arglist, i);
X
X fileMenu = XtCreatePopupShell("fileMenu",
X simpleMenuWidgetClass,
X fileMenuButton,
X NULL, 0);
X
X optionMenu = XtCreatePopupShell("optionMenu",
X simpleMenuWidgetClass,
X optionMenuButton,
X NULL, 0);
X
X viewMenu = XtCreatePopupShell("viewMenu",
X simpleMenuWidgetClass,
X viewMenuButton,
X NULL, 0);
X
X tick = XCreateBitmapFromData(XtDisplay(w),
X RootWindowOfScreen(XtScreen(w)),
X tick_bits, tick_width,
X tick_height);
X
X emptytick = XCreateBitmapFromData(XtDisplay(w),
X RootWindowOfScreen(XtScreen(w)),
X EmptyTick_bits,
X EmptyTick_width,
X EmptyTick_height);
X
X /* create the menu panes from the arrays defined at the top of this
X * file.
X */
X createMenu(fileMenu, fileMenuStrings, fileMenuSize, menuSelect);
X
X createMenu(optionMenu, optionMenuStrings, optionMenuSize, menuSelect);
X
X createMenu(viewMenu, viewMenuStrings, viewMenuSize, menuSelect);
X
X /* Default long listing options */
X current_mode.options = (PERMS | NLINKS | OWNER | GROUP | SIZE);
X
X}
X
X
X/*****************************************************************************
X * createMenu *
X *****************************************************************************/
Xpublic void createMenu(Widget menu, MenuContents menuStrings[],
X Cardinal menuSize, void (*function)())
X{
X /* Given a MenuContents stucture, the number of entries and a function
X * that should be called when that pane is pressed, this procedure
X * creates the menu panes for the menu widget 'menu'
X */
X
X Widget menuEntry;
X Cardinal i, n;
X Arg arglist[3];
X
X for(n=0; n < menuSize; n++) {
X MenuContents entry = menuStrings[n];
X String widgetname = entry.paneName;
X if (!strcmp(LINE, widgetname))
X menuEntry = XtCreateManagedWidget(widgetname, smeLineObjectClass,
X menu, NULL, 0);
X else {
X i = 0;
X XtSetArg(arglist[i], XtNlabel, entry.paneLabel); i++;
X if (entry.set == flagged) {
X XtSetArg(arglist[i], XtNleftMargin, (tick_width*1.5)); i++;
X if (entry.paneNumber == current_mode.mode) {
X XtSetArg(arglist[i], XtNleftBitmap, tick); i++;
X } else {
X XtSetArg(arglist[i], XtNleftBitmap, None); i++;
X }
X }
X
X menuEntry = XtCreateManagedWidget(widgetname, smeBSBObjectClass,
X menu, arglist, i);
X if (entry.paneNumber == current_mode.mode && entry.set == flagged)
X current_mode.w = menuEntry;
X
X XtAddCallback(menuEntry, XtNcallback, function,
X (caddr_t) entry.paneNumber);
X }
X }
X}
X
X/*****************************************************************************
X * menuSelect *
X *****************************************************************************/
Xprivate void menuSelect(Widget w, Cardinal paneNumber, caddr_t rubbish)
X{
X /* This procedure is called when a pane is pressed in any of the main
X * three pull down menus.
X *
X * - Takes the paneNumber of the pane selected. Rest is discarded.
X */
X
X extern void map_dialog(Boolean);
X extern void quit_dialog(void);
X extern void query_dialog(String, Boolean);
X extern void displayfile(String);
X extern void newfile_dialog(Boolean, String, Boolean);
X extern void button_selected(Widget, Cardinal, caddr_t);
X extern void listoption_dialog(void);
X extern Boolean directoryManagerNewDirectory(String);
X extern String getfilename(String);
X extern void setCursor(Cursor);
X extern Cursor busy;
X extern String cwd;
X extern Widget directoryManager;
X XedwListReturnStruct *highlighted;
X String filename, fullname, level;
X struct stat filestatus;
X Arg arglist[6];
X Cardinal i;
X
X /* Which pane was selected */
X switch (paneNumber) {
X case About:
X /* display about dialog */
X
X level = XtMalloc (sizeof(char) * 25);
X sprintf(level, " Xdtm v%d.%d ", RELEASE, PATCHLEVEL);
X query_dialog(level, False);
X break;
X case Help:
X /* If help file is readable show it */
X
X if (access(SYSTEM_HELP, R_OK) == 0)
X displayfile(SYSTEM_HELP);
X else
X query_dialog("Help not found!", False); /* Error dialog */
X break;
X
X case New:
X /* Create a newfile */
X
X newfile_dialog(False, NULL, False);
X break;
X
X case Duplicate:
X /* Find out whether highlighted file is a regular file or a directory */
X
X highlighted = XedwListShowCurrent(directoryManager);
X if (highlighted->xedwList_index != XDTM_LIST_NONE) {
X if (highlighted->next != NULL)
X query_dialog("Only one file!", False);
X else {
X filename = getfilename(highlighted->string);
X fullname=(String) XtMalloc((strlen(filename)+strlen(cwd)+3) *
X sizeof(char));
X strcpy(fullname, cwd);
X if (strcmp(cwd, "/") != 0)
X strcat(fullname, "/");
X strcat(fullname, filename);
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 /* Is a directory */
X newfile_dialog(True, filename, True);
X else if ((filestatus.st_mode & S_IFMT) == S_IFREG)
X newfile_dialog(True, filename, False);
X else
X query_dialog("Wrong file type!", False);
X }
X XtFree(fullname);
X }
X } else
X fprintf(stderr, "Error: Duplicate selected when should have been"
X " disabled\n");
X break;
X
X case Getinfo:
X /* Maybe I'll get round to doing this one sometime, it should display
X * a popup with the filename and permissions in, then allow you to
X * change them.
X */
X query_dialog("Not implemented!", False);
X break;
X
X case Copy:
X case Move:
X case Trash:
X /* Call button press with it */
X button_selected(w, paneNumber, 0);
X break;
X
X case Quit:
X /* Quit the program.. maybe */
X quit_dialog();
X break;
X
X case Map:
X /* Map program over files */
X map_dialog(True);
X break;
X
X case Select:
X /* Select files via RE template, uses same dilaog as map, except
X * with different resources.
X */
X map_dialog(False);
X break;
X
X case Icons:
X /* Change to icon mode */
X if (current_mode.mode != Icons) {
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, None); i++;
X XtSetValues(current_mode.w, arglist, i);
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, tick); i++;
X XtSetValues(w, arglist, i);
X current_mode.w = w;
X current_mode.mode = Icons;
X XtSetArg(arglist[i], XtNshowIcons, True); i++;
X XtSetArg(arglist[i], XtNrowSpacing, 10); i++;
X XtSetArg(arglist[i], XtNforceColumns, False); i++;
X XtSetArg(arglist[i], XtNdefaultColumns, 2); i++;
X XtSetValues(directoryManager, arglist, i);
X directoryManagerNewDirectory(cwd);
X }
X break;
X
X case Short:
X /* Change to short listing mode */
X if (current_mode.mode != Short) {
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, None); i++;
X XtSetValues(current_mode.w, arglist, i);
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, tick); i++;
X XtSetValues(w, arglist, i);
X current_mode.w = w;
X current_mode.mode = Short;
X i = 0;
X XtSetArg(arglist[i], XtNshowIcons, False); i++;
X XtSetArg(arglist[i], XtNrowSpacing, 5); i++;
X XtSetArg(arglist[i], XtNforceColumns, False); i++;
X XtSetArg(arglist[i], XtNdefaultColumns, 2); i++;
X XtSetValues(directoryManager, arglist, i);
X directoryManagerNewDirectory(cwd); /* To be consistent */
X }
X break;
X
X case Long:
X /* change to long listing mode */
X if (current_mode.mode != Long) {
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, None); i++;
X XtSetValues(current_mode.w, arglist, i);
X i = 0;
X XtSetArg(arglist[i], XtNleftBitmap, tick); i++;
X XtSetValues(w, arglist, i);
X current_mode.w = w;
X current_mode.mode = Long;
X i = 0;
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 XtSetValues(directoryManager, arglist, i);
X directoryManagerNewDirectory(cwd); /* To be consistent */
X }
X break;
X
X case Options:
X /* allow changes to long listing format. */
X listoption_dialog();
X break;
X
X default:
X fprintf(stderr, "Menu option number %d not supported\n", paneNumber);
X break;
X }
X
X
X}
X
SHAR_EOF
chmod 0644 xdtm/menus.c ||
echo 'restore of xdtm/menus.c failed'
Wc_c="`wc -c < 'xdtm/menus.c'`"
test 13682 -eq "$Wc_c" ||
echo 'xdtm/menus.c: original size 13682, current size' "$Wc_c"
fi
# ============= xdtm/menus.h ==============
if test -f 'xdtm/menus.h' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/menus.h (File already exists)'
else
echo 'x - extracting xdtm/menus.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/menus.h' &&
X/***********************************************************************************
X ** File : menus.h **
X ** Purpose : **
X ** Author : Edward Groenendaal **
X ** Date : 18th Feb 1990 **
X ** Documentation : Xedw Design Folder **
X ** Related Files : menus.c **
X ***********************************************************************************/
X
X#ifndef _EG_menus_h
X#define _EG_menus_h
X
X#include <X11/Intrinsic.h>
X
X#define LINE "line"
X
X#define PERMS (1 << 1)
X#define NLINKS (1 << 2)
X#define OWNER (1 << 3)
X#define GROUP (1 << 4)
X#define SIZE (1 << 5)
X#define MODTM (1 << 6)
X#define ACCTM (1 << 7)
X
Xtypedef enum {flagged, noflag} Flags;
X
Xtypedef enum {
X About,
X Help,
X New,
X Duplicate,
X Getinfo,
X Copy,
X Move,
X Trash,
X Quit,
X Map,
X Select,
X Icons,
X Short,
X Long,
X Options
X} MenuValue;
X
Xtypedef struct {
X String paneName;
X String paneLabel;
X MenuValue paneNumber;
X Flags set;
X} MenuContents;
X
Xtypedef struct {
X Widget w;
X MenuValue mode;
X /* long listing options */
X Cardinal length;
X char options;
X} Icon_mode;
X
Xextern Widget menuBar;
Xextern Icon_mode current_mode;
Xextern Pixmap tick;
Xextern Pixmap emptytick;
X
X#endif /* _EG_menus_h */
SHAR_EOF
chmod 0644 xdtm/menus.h ||
echo 'restore of xdtm/menus.h failed'
Wc_c="`wc -c < 'xdtm/menus.h'`"
test 1513 -eq "$Wc_c" ||
echo 'xdtm/menus.h: original size 1513, current size' "$Wc_c"
fi
# ============= xdtm/mystrstr.c ==============
if test -f 'xdtm/mystrstr.c' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/mystrstr.c (File already exists)'
else
echo 'x - extracting xdtm/mystrstr.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/mystrstr.c' &&
X/*****************************************************************************
X ** File : mystrstr.c **
X ** Purpose : Return pointer to first occurence of second string in **
X ** first string, else NULL **
X ** Author : Edward Groenendaal **
X ** Date : 11th April 1991 **
X ** Documentation : Xdtm Design Folder **
X ** Related Files : appman.c **
X *****************************************************************************/
X
X#ifndef HAS_STRSTR
X
X#include <stdio.h> /* For NULL */
X
Xchar *mystrstr(char *cs, char *ct)
X{
X char *csi, *cti, *result;
X
X result = NULL;
X cti = ct;
X csi = cs;
X
X /* search for first letter, on finding it set result to that point */
X
X while (*csi != '\0' && *cti != '\0') {
X if (result == NULL) {
X /* searching for start of substring */
X if (*csi == *cti) {
X result = csi;
X cti++;
X }
X } else
X /* trying to match rest */
X if (*csi == *cti)
X cti++;
X else {
X cti = ct;
X csi = result;
X result = NULL;
X }
X csi++;
X }
X
X if (*cti == '\0')
X return(result);
X else
X return((char*) NULL);
X}
X
X#endif /* HAS_STRSTR */
X
X
X
X
SHAR_EOF
chmod 0644 xdtm/mystrstr.c ||
echo 'restore of xdtm/mystrstr.c failed'
Wc_c="`wc -c < 'xdtm/mystrstr.c'`"
test 1385 -eq "$Wc_c" ||
echo 'xdtm/mystrstr.c: original size 1385, current size' "$Wc_c"
fi
# ============= xdtm/newfile.c ==============
if test -f 'xdtm/newfile.c' -a X"$1" != X"-c"; then
echo 'x - skipping xdtm/newfile.c (File already exists)'
else
echo 'x - extracting xdtm/newfile.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xdtm/newfile.c' &&
X/*****************************************************************************
X ** File : newfile.c **
X ** Purpose : Initialise and Realise newfile dialog **
X ** Author : Edward Groenendaal **
X ** Date : April 1991 **
X ** Documentation : Xdtm Design Folder **
X ** Related Files : **
X *****************************************************************************/
X
X#include "xdtm.h"
X
X#include <X11/Shell.h>
X#include <X11/Xaw/Label.h>
X#include <X11/Xaw/Command.h>
X#include <X11/Xaw/AsciiText.h>
X#include "Xedw/XedwForm.h"
X
Xextern void realize_dialog(Widget);
X
X/* Widgets */
X
Xprivate Widget newfilepopup;
Xprivate Widget newfileform;
Xprivate Widget newfilelabel;
Xprivate Widget newfiletext;
Xprivate Widget newfilefile;
Xprivate Widget newfiledir;
Xprivate Widget newfilecancel;
X
Xtypedef struct {
X String filename;
X Boolean isdir;
X} Filetype;
X
X/*****************************************************************************
X * init_newfile *
X *****************************************************************************/
Xpublic void init_newfile(Widget top)
X{
X /* Create Widgets for newfile dialog */
X
X private void destroy_newfile_dialog(Widget, caddr_t, caddr_t);
X
X Arg arglist[5];
X Cardinal i;
X XtTranslations newfileTranslations;
X
X /* Translations for text widget */
X static char defaultTranslations[] =
X "Ctrl<Key>A: beginning-of-line() \n\
X Ctrl<Key>E: end-of-line() \n\
X <Key>Escape: beginning-of-line() kill-to-end-of-line() \n\
X <Key>Right: forward-character() \n\
X <Key>Left: backward-character() \n\
X <Key>Delete: delete-previous-character() \n\
X <Key>BackSpace: delete-previous-character() \n\
X <Key>: insert-char() \n\
X <FocusIn>: focus-in() \n\
X <FocusOut>: focus-out() \n\
X <BtnDown>: select-start()";
X
X
X newfilepopup = XtCreatePopupShell("newfilepopup",
X transientShellWidgetClass,
X top,
X NULL, 0);
X
X newfileform = XtCreateManagedWidget("newfileform",
X xedwFormWidgetClass,
X newfilepopup,
X NULL, 0);
X
X /* label widget to prompt for new filename */
X
X i = 0;
X XtSetArg(arglist[i], XtNfullWidth, True); i++;
X XtSetArg(arglist[i], XtNborderWidth, 0); i++;
X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++;
X newfilelabel = XtCreateManagedWidget("newfilelabel",
X labelWidgetClass,
X newfileform,
X arglist, i);
X
X /* new filename text input widget */
X
X i = 1;
X XtSetArg(arglist[i], XtNfromVert, newfilelabel); i++;
X XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++;
X newfiletext = XtCreateManagedWidget("newfiletext",
X asciiTextWidgetClass,
X newfileform,
X arglist, i);
X
X i = 0;
X XtSetArg(arglist[i], XtNfromVert, newfiletext); i++;
X XtSetArg(arglist[i], XtNlabel, "Directory"); i++;
X newfiledir = XtCreateManagedWidget("newfiledir",
X commandWidgetClass,
X newfileform,
X arglist, i);
X i = 1;
X XtSetArg(arglist[i], XtNfromHoriz, newfiledir); i++;
X XtSetArg(arglist[i], XtNwidthLinked, newfiledir); i++;
X XtSetArg(arglist[i], XtNlabel, "File"); i++;
X newfilefile = XtCreateManagedWidget("newfilefile",
X commandWidgetClass,
X newfileform,
X arglist, i);
X
X i = 1;
X XtSetArg(arglist[i], XtNfromHoriz, newfilefile); i++;
X XtSetArg(arglist[i], XtNwidthLinked, newfilefile); i++;
X XtSetArg(arglist[i], XtNlabel, "Cancel"); i++;
X newfilecancel = XtCreateManagedWidget("newfilecancel",
X commandWidgetClass,
X newfileform,
X arglist, i);
X
X /* Add callbacks for buttons */
X XtAddCallback(newfilecancel, XtNcallback, destroy_newfile_dialog, 0);
X
X /* Do the translations on the text widget */
X XtUninstallTranslations(newfiletext);
X newfileTranslations = XtParseTranslationTable(defaultTranslations);
X XtOverrideTranslations(newfiletext, newfileTranslations);
X}
X
X/*****************************************************************************
X * newfile_dialog *
X *****************************************************************************/
Xpublic void newfile_dialog(Boolean rename, String newname, Boolean isdir)
X{
X /* Popup the newfile dialog on screen with the correct data
X *
X * - Takes a flag saying whether this is a duplication of a file, or the
X * creation of a new file or directory.
X * newname - The name of the file to be duplicated.
X * isdir - Whether the file is a directory
X */
X
X private void newfileQueryReturn(Widget, Boolean, caddr_t);
X private void duplicateQueryReturn(Widget, Filetype*, caddr_t);
X Arg arglist[1];
X String filename;
X Filetype *filetype;
X
X static String defaultfilename = "untitled";
X
X filetype = (Filetype*) XtMalloc (sizeof(Filetype));
X
X if (newname == NULL)
X filename = defaultfilename;
X else
X filename = newname;
X
X if (rename == False) {
X /* Create a new file */
X
X XtSetArg(arglist[0], XtNlabel, "Create a new file");
X XtSetValues(newfilelabel, arglist, 1);
X
X XtSetArg(arglist[0], XtNstring, filename);
X XtSetValues(newfiletext, arglist, 1);
X
X /* Add callbacks for buttons */
X XtAddCallback(newfiledir, XtNcallback, newfileQueryReturn, True);
X XtAddCallback(newfilefile, XtNcallback, newfileQueryReturn, False);
X } else {
X /* rename an existing file */
X filetype->filename = filename;
X filetype->isdir = isdir;
X
X XtSetArg(arglist[0], XtNlabel, "Duplicate file");
X XtSetValues(newfilelabel, arglist, 1);
X
X XtSetArg(arglist[0], XtNstring, filename);
X XtSetValues(newfiletext, arglist, 1);
X
X if (isdir == True)
X XtSetSensitive(newfilefile, False);
X else
X XtSetSensitive(newfiledir, False);
X XtAddCallback(newfiledir, XtNcallback, duplicateQueryReturn, filetype);
X XtAddCallback(newfilefile, XtNcallback, duplicateQueryReturn, filetype);
X }
X
X realize_dialog(newfilepopup);
X
X}
X
X/*****************************************************************************
X * destroy_newfile_dialog *
X *****************************************************************************/
Xprivate void destroy_newfile_dialog(Widget w, caddr_t dummy1, caddr_t dummy2)
X{
X /* Popdown and destroy callbacks for the newfile dialog. Also back sure
X * that both buttons are sensitive.
X */
X
X XtPopdown(newfilepopup);
X
X XtSetSensitive(newfilefile, True);
X XtSetSensitive(newfiledir, True);
X XtRemoveAllCallbacks(newfilefile, XtNcallback);
X XtRemoveAllCallbacks(newfiledir, XtNcallback);
X}
X
X/*****************************************************************************
X * newfileQueryReturn *
X *****************************************************************************/
Xprivate void newfileQueryReturn(Widget w, Boolean isdir, caddr_t dummy)
X{
X /* This procedure creates a new empty directory or file with the filename
X * in the text widget newfiletext.
X *
X * - Takes a flag isdir, is the new file a directory?
X */
X
X extern void query_dialog(String, Boolean);
X extern String cwd;
X String filename, fullname;
X Arg arglist[1];
X int fd;
X
X destroy_newfile_dialog(w, 0, 0);
X
X XtSetArg(arglist[0], XtNstring, &filename);
X XtGetValues(newfiletext, arglist, 1);
X
X fullname = (String) XtMalloc (sizeof(char) * (strlen(cwd) +
X strlen(filename) + 4));
X sprintf(fullname, "%s/%s", cwd, filename);
X
X if (isdir == True) {
X /* Create a directory with the name 'filename' */
X if ((fd = mkdir(fullname, 0777)) == -1)
X query_dialog("Can't create dir", False);
X else
X directoryManagerNewDirectory(cwd);
X } else {
X /* Create a file with the name 'filename' */
X if ((fd = creat(fullname, 0666)) == -1) {
X /* Can't create fullname, maybe should look in errno to see why? */
X query_dialog("Can't create file", False);
X } else {
X close(fd);
X directoryManagerNewDirectory(cwd);
X }
X }
X
X XtFree(fullname);
X}
X
X/*****************************************************************************
X * duplicateQueryReturn *
X *****************************************************************************/
Xprivate void duplicateQueryReturn(Widget w, Filetype *filetype, caddr_t dummy)
X{
X /* This procedure copies a file in the current directory to a file with
X * the name as specified within the text widget newfiletext. The orignal
X * filename and type are passed as arguments to this procedure in the
X * structure filetype.
X */
X
X extern void query_dialog(String, Boolean);
X extern String cwd;
X String filename, command;
X Arg arglist[1];
X int fd;
X
X destroy_newfile_dialog(w, 0, 0);
X
X XtSetArg(arglist[0], XtNstring, &filename);
X XtGetValues(newfiletext, arglist, 1);
X
X command = XtMalloc (sizeof(char) * (strlen(filetype->filename) +
X strlen(filename) + 24));
X
X if (filetype->isdir == True) {
X /* make new directory, copy contents of old one into it */
X if ((fd = mkdir(filename, 0777)) == -1)
X query_dialog("Can't create dir", False);
X sprintf(command, "sh -c 'cp -r \"%s\"/ \"%s\"'", filetype->filename,
X filename);
X
X if (execute(NULL, "sh", command, True) != 0)
X query_dialog("Can't copy files!", False);
X else
X directoryManagerNewDirectory(cwd);
X } else {
X sprintf(command, "cp '%s' '%s'", filetype->filename, filename);
X
X if (execute(NULL, "cp", command, True) != 0)
X query_dialog("Can't create file!", False);
X else
X directoryManagerNewDirectory(cwd);
X }
X
X XtFree(command);
X}
SHAR_EOF
chmod 0644 xdtm/newfile.c ||
echo 'restore of xdtm/newfile.c failed'
Wc_c="`wc -c < 'xdtm/newfile.c'`"
test 9922 -eq "$Wc_c" ||
echo 'xdtm/newfile.c: original size 9922, current size' "$Wc_c"
fi
true || echo 'restore of xdtm/parse.c failed'
echo End of part 9, continue with part 10
exit 0
--
Dan Heller
O'Reilly && Associates Z-Code Software Comp-sources-x:
Senior Writer President comp-sources-x@uunet.uu.net
argv@ora.com argv@zipcode.com