385 lines
9.8 KiB
C
385 lines
9.8 KiB
C
/*
|
||
* CDE - Common Desktop Environment
|
||
*
|
||
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
||
*
|
||
* These libraries and programs are free software; you can
|
||
* redistribute them and/or modify them under the terms of the GNU
|
||
* Lesser General Public License as published by the Free Software
|
||
* Foundation; either version 2 of the License, or (at your option)
|
||
* any later version.
|
||
*
|
||
* These libraries and programs are distributed in the hope that
|
||
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
* PURPOSE. See the GNU Lesser General Public License for more
|
||
* details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with these libraries and programs; if not, write
|
||
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||
* Floor, Boston, MA 02110-1301 USA
|
||
*/
|
||
/* $TOG: Main.c /main/5 1998/04/20 12:52:56 mgreess $ */
|
||
/************************************<+>*************************************
|
||
****************************************************************************
|
||
**
|
||
** File: Main.c
|
||
**
|
||
** Project: Cache Creek (Rivers) Project
|
||
**
|
||
** Description: This is the main.c file for the helpview program.
|
||
**
|
||
**
|
||
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
|
||
**
|
||
** (c) Copyright 1993, 1994 Hewlett-Packard Company
|
||
** (c) Copyright 1993, 1994 International Business Machines Corp.
|
||
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
||
** (c) Copyright 1993, 1994 Novell, Inc.
|
||
**
|
||
**
|
||
**
|
||
****************************************************************************
|
||
************************************<+>*************************************/
|
||
|
||
|
||
|
||
|
||
/* System Include Files */
|
||
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <signal.h>
|
||
#include <sys/stat.h>
|
||
#include <sys/param.h>
|
||
#include <limits.h>
|
||
#include <unistd.h> /* R_OK */
|
||
|
||
#include <X11/Intrinsic.h>
|
||
#include <X11/Shell.h>
|
||
#include <X11/Xatom.h>
|
||
|
||
#include <Xm/MwmUtil.h>
|
||
#include <Xm/Protocols.h>
|
||
#include <Xm/Xm.h>
|
||
#include <Xm/PushB.h>
|
||
|
||
#include <Dt/HelpDialog.h>
|
||
|
||
|
||
#include <Dt/DtNlUtils.h>
|
||
#include <Dt/EnvControlP.h>
|
||
|
||
/* Local Includes */
|
||
|
||
#include <DtI/HelposI.h>
|
||
#include <Dt/HelpP.h>
|
||
#include <DtI/FileUtilsI.h>
|
||
#include "Main.h"
|
||
#include "UtilI.h"
|
||
#include "ManPageI.h"
|
||
|
||
/* Global Variables Used to maintain our cache list of help dialogs */
|
||
CacheListStruct *pCacheListHead;
|
||
CacheListStruct *pCacheListTale;
|
||
int totalCacheNodes;
|
||
|
||
/* Global Variables */
|
||
Widget topLevel;
|
||
Widget viewWidget;
|
||
Widget manWidget;
|
||
Widget manBtn;
|
||
Widget manText;
|
||
Widget manForm;
|
||
Widget closeBtn;
|
||
|
||
/* General global variables */
|
||
int runMode;
|
||
char *helpClass;
|
||
Display *appDisplay;
|
||
char *startCommand;
|
||
|
||
|
||
/* Application resource list definition */
|
||
|
||
static XrmOptionDescRec option_list[] =
|
||
{
|
||
{ "-helpVolume", "helpVolume", XrmoptionSepArg, NULL },
|
||
{ "-locationId", "locationId", XrmoptionSepArg, NULL },
|
||
{ "-file", "file", XrmoptionSepArg, NULL },
|
||
{ "-manPage", "manPage", XrmoptionSepArg, NULL },
|
||
{ "-man", "man", XrmoptionNoArg, "True" },
|
||
|
||
};
|
||
|
||
|
||
/* Structure, resource definitions, for View's optional parameters. */
|
||
|
||
|
||
typedef struct
|
||
{
|
||
char * helpVolume;
|
||
char * locationId;
|
||
char * file;
|
||
char * manPage;
|
||
char * man;
|
||
|
||
} ApplicationArgs, *ApplicationArgsPtr;
|
||
|
||
static ApplicationArgs application_args;
|
||
|
||
static XtResource resources[] =
|
||
{
|
||
|
||
{
|
||
"helpVolume", "HelpVolume", XmRString, sizeof (char *),
|
||
XtOffset (ApplicationArgsPtr, helpVolume),XmRImmediate,(caddr_t) NULL,
|
||
},
|
||
|
||
{
|
||
"locationId", "LocationId", XmRString, sizeof (char *),
|
||
XtOffset (ApplicationArgsPtr, locationId), XmRImmediate, (caddr_t) NULL,
|
||
},
|
||
|
||
{
|
||
"file", "File", XmRString, sizeof (char *),
|
||
XtOffset (ApplicationArgsPtr, file), XmRImmediate, (caddr_t) NULL,
|
||
},
|
||
{
|
||
"manPage", "ManPage", XmRString, sizeof (char *),
|
||
XtOffset (ApplicationArgsPtr, manPage), XmRImmediate, (caddr_t) NULL,
|
||
},
|
||
{
|
||
"man", "Man", XmRString, sizeof (char *),
|
||
XtOffset (ApplicationArgsPtr, man), XmRImmediate, (caddr_t) NULL,
|
||
},
|
||
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/******** Static Function Declarations ********/
|
||
|
||
static void Usage(
|
||
char ** argv);
|
||
static void ExpandVolume(
|
||
char **helpVolume);
|
||
|
||
|
||
|
||
|
||
/* Global Variables */
|
||
#define MAX_ARGS 20
|
||
#define charset XmFONTLIST_DEFAULT_TAG
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/****************************************************************************
|
||
* Function: static void GlobalInit();
|
||
*
|
||
* Parameters:
|
||
*
|
||
* Return Value: Void.
|
||
*
|
||
* Purpose: Initializes our global variables to valid starting values.
|
||
*
|
||
****************************************************************************/
|
||
static void GlobalInit(void)
|
||
|
||
{
|
||
|
||
pCacheListHead = NULL;
|
||
pCacheListTale = NULL;
|
||
totalCacheNodes = 0;
|
||
|
||
helpClass = XtNewString("Dthelpview");
|
||
|
||
viewWidget = NULL;
|
||
manWidget = NULL;
|
||
manBtn = NULL;
|
||
manText = NULL;
|
||
manForm = NULL;
|
||
closeBtn = NULL;
|
||
|
||
}
|
||
|
||
/***************************************************************************
|
||
* Main Line Program:
|
||
*
|
||
***************************************************************************/
|
||
void main(
|
||
int argc,
|
||
char **argv)
|
||
{
|
||
char *appName;
|
||
Arg args[2];
|
||
int n;
|
||
int newArgc=0;
|
||
char **newArgv;
|
||
int counter=0;
|
||
|
||
XtSetLanguageProc(NULL, NULL, NULL);
|
||
startCommand = argv[0];
|
||
appName = strrchr(argv[0], '/');
|
||
if (appName != NULL)
|
||
appName++;
|
||
else
|
||
appName = argv[0];
|
||
|
||
|
||
/* Copy our argv values into a new array for use in DisplayTopic... */
|
||
newArgc = argc;
|
||
newArgv = (char **) XtMalloc (sizeof(char *) * (argc +1));
|
||
|
||
for (counter=0;counter < argc; counter++)
|
||
{
|
||
newArgv[counter] = XtMalloc (strlen(argv[counter]) +1);
|
||
strcpy (newArgv[counter], argv[counter]);
|
||
}
|
||
|
||
/* Setup our Help message catalog file name */
|
||
DtHelpSetCatalogName("DtHelp.cat");
|
||
|
||
_DtEnvControl(DT_ENV_SET);
|
||
{
|
||
/* char * foo = ((char *)GETMESSAGE(7, 1, "")); ??? */
|
||
}
|
||
|
||
|
||
/* Initialize toolkit and open the display */
|
||
topLevel = XtInitialize(appName, "Dthelpview", option_list, 5, &argc, argv);
|
||
appDisplay = XtDisplay(topLevel);
|
||
|
||
if (!appDisplay)
|
||
{
|
||
XtWarning ("Dialogs: Can't open display, exiting...");
|
||
exit (0);
|
||
}
|
||
|
||
/* Get the application resources. */
|
||
XtGetApplicationResources(topLevel, &application_args,
|
||
resources, XtNumber(resources), NULL, 0);
|
||
|
||
/* If all of the command line parameters were not processed */
|
||
/* out, print out a usage message set and exit. */
|
||
|
||
if (argc != 1)
|
||
Usage (argv);
|
||
|
||
/* Call our global init routine */
|
||
GlobalInit();
|
||
|
||
|
||
/* Setup or environment to handle multi-byte stuff */
|
||
#ifdef NLS16
|
||
Dt_nlInit();
|
||
#endif
|
||
|
||
|
||
|
||
/* Give our shell a default size greater than zero */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNheight, 10); n++;
|
||
XtSetArg (args[n], XmNwidth, 10); n++;
|
||
XtSetValues(topLevel, args, n);
|
||
|
||
|
||
/* Setup up our top level shell */
|
||
/* XtSetMappedWhenManaged(topLevel, FALSE);
|
||
* XtRealizeWidget(topLevel);
|
||
*/
|
||
|
||
|
||
if (application_args.file != NULL)
|
||
DisplayFile(topLevel, application_args.file);
|
||
else if (application_args.manPage != NULL)
|
||
DisplayMan(topLevel, application_args.manPage,
|
||
EXIT_ON_CLOSE);
|
||
else if (application_args.man != NULL)
|
||
PostManDialog(topLevel, newArgc, newArgv);
|
||
else if (application_args.helpVolume != NULL)
|
||
{
|
||
/* See if you can expand the helpVolume value */
|
||
ExpandVolume(&(application_args.helpVolume));
|
||
DisplayTopic(topLevel, application_args.helpVolume,
|
||
application_args.locationId, newArgc, newArgv);
|
||
}
|
||
else
|
||
Usage (argv);
|
||
|
||
XtMainLoop();
|
||
}
|
||
|
||
|
||
|
||
/************************************************************************
|
||
*
|
||
* Usage
|
||
* When incorrect parameters have been specified on the command
|
||
* line, print out a set of messages detailing the correct use
|
||
* and exit.
|
||
*
|
||
************************************************************************/
|
||
static void Usage(
|
||
char ** argv)
|
||
{
|
||
(void) fprintf (stderr, ((char *)_DTGETMESSAGE(7, 1,
|
||
"Usage: %s...\n")), argv[0]);
|
||
(void) fprintf (stderr, "\n");
|
||
(void) fprintf (stderr, ((char *)_DTGETMESSAGE(7, 2,
|
||
"\t-helpVolume <Help Volume File>\n")), argv[0]);
|
||
(void) fprintf (stderr, ((char *) _DTGETMESSAGE(7, 3,
|
||
"\t-locationId <ID>\n")), argv[0]);
|
||
(void) fprintf (stderr, ((char *) _DTGETMESSAGE(7, 5,
|
||
"\t-file <ASCII Text File>\n")), argv[0]);
|
||
(void) fprintf (stderr, ((char *) _DTGETMESSAGE(7, 6,
|
||
"\t-man\n")), argv[0]);
|
||
(void) fprintf (stderr, ((char *) _DTGETMESSAGE(7, 7,
|
||
"\t-manPage <Unix Man Page>\n\n\n")), argv[0]);
|
||
|
||
exit (0);
|
||
}
|
||
|
||
|
||
|
||
/****************************************************************************
|
||
* Function: ExpandVolume()
|
||
*
|
||
* Parameters:
|
||
*
|
||
* Return Value: Void.
|
||
*
|
||
* Purpose: Takes a helpVolume file name and adds the cwd path to the
|
||
* front of it, and possibly adds a suffix.
|
||
* It then stats the file; if the file is present, the
|
||
* function returns a malloc'd full path in helpVolume,
|
||
* otherwise it returns a malloc'd copy of the original value.
|
||
*
|
||
***************************************************************************/
|
||
static void ExpandVolume(
|
||
char **helpVolume)
|
||
{
|
||
|
||
char * workingPath=NULL;
|
||
|
||
/* try to locate file and its entry, if present */
|
||
/* True: search relative to current directory as well */
|
||
workingPath = _DtHelpFileLocate("volumes", *helpVolume,
|
||
_DtHelpFileSuffixList,True,R_OK);
|
||
if (workingPath) *helpVolume = workingPath;
|
||
else *helpVolume = strdup(*helpVolume);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|