399 lines
12 KiB
C
399 lines
12 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
|
|
*/
|
|
/* $XConsortium: ManPage.c /main/5 1996/09/30 11:28:22 cde-hp $ */
|
|
/*************************************<+>*************************************
|
|
*****************************************************************************
|
|
**
|
|
** File: ManPage.c
|
|
**
|
|
** Project: Cache Creek
|
|
**
|
|
** Description: Contains the code for generating the man page dialog
|
|
** used in 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 <signal.h>
|
|
|
|
#include <X11/Intrinsic.h>
|
|
#include <X11/Shell.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xatom.h>
|
|
|
|
#include <Xm/Protocols.h>
|
|
#include <Xm/MwmUtil.h>
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/XmP.h>
|
|
#include <Xm/TextF.h>
|
|
#include <Xm/Text.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/LabelG.h>
|
|
#include <Xm/SeparatoG.h>
|
|
#include <Xm/PushBG.h>
|
|
#include <Xm/DialogS.h>
|
|
|
|
#include <Dt/Help.h>
|
|
#include <Dt/HelpDialog.h>
|
|
|
|
#include <DtI/HelposI.h>
|
|
#include <DtI/HourGlassI.h>
|
|
/* Local Includes */
|
|
#include "Main.h"
|
|
#include "UtilI.h"
|
|
#include "ManPageI.h"
|
|
|
|
/******** Static Function Declarations ********/
|
|
|
|
|
|
static void ManTextUpdateCB(
|
|
Widget widget,
|
|
XtPointer client_data,
|
|
XtPointer call_data);
|
|
static void ManDisplayCB(
|
|
Widget widget,
|
|
XtPointer client_data,
|
|
XtPointer callback);
|
|
static void CatchClose(
|
|
Widget widget);
|
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* Function: CatchClose( Widget w);
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value: Void.
|
|
*
|
|
* Purpose: Catches the window manager close requests and assigns our
|
|
* CloseHelpCB to handel them.
|
|
*
|
|
***************************************************************************/
|
|
static void CatchClose (
|
|
Widget widget)
|
|
{
|
|
|
|
Atom wm_delete_window;
|
|
Arg args[2];
|
|
|
|
/* Grab the window mgr close */
|
|
wm_delete_window = XmInternAtom(XtDisplay(XtParent(widget)),
|
|
"WM_DELETE_WINDOW", FALSE);
|
|
XtSetArg(args[0], XmNdeleteResponse, XmDO_NOTHING);
|
|
|
|
/* Current Help Dialog Window */
|
|
XmAddWMProtocolCallback(XtParent(widget),wm_delete_window,
|
|
(XtCallbackProc)CloseAndExitCB, (XtPointer)widget);
|
|
XtSetValues(XtParent(widget), args, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* Function: static void PostManDialog();
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value: Void.
|
|
*
|
|
* Purpose: Creates and manages a simple prompt dialog that allows a
|
|
* user to type in and display any manpage on the system.
|
|
*
|
|
****************************************************************************/
|
|
void PostManDialog(
|
|
Widget parent,
|
|
int argc,
|
|
char **argv)
|
|
|
|
{
|
|
|
|
Widget separator;
|
|
Widget manLabel;
|
|
XmString labelStr;
|
|
Arg args[20];
|
|
int n;
|
|
char * title;
|
|
Pixel foreground;
|
|
Pixel background;
|
|
|
|
Colormap colormap;
|
|
Pixel selectColor;
|
|
Pixel topShadowColor;
|
|
Pixel bottomShadowColor;
|
|
Pixel foregroundColor;
|
|
|
|
|
|
/* Create the shell and form used for the dialog. */
|
|
|
|
title = XtNewString(((char *)_DTGETMESSAGE(7, 11, "Man Page")));
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtitle, title); n++;
|
|
XtSetArg (args[n], XmNallowShellResize, False); n++;
|
|
manWidget = XmCreateDialogShell(parent, "manWidget", args, n);
|
|
XtFree(title);
|
|
|
|
/* Set the useAsyncGeo on the shell */
|
|
n = 0;
|
|
XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
|
|
XtSetValues (XtParent(manWidget), args, n);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNmarginWidth, 1); n++;
|
|
XtSetArg (args[n], XmNmarginHeight, 1); n++;
|
|
XtSetArg (args[n], XmNshadowThickness, 1); n++;
|
|
XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
|
|
XtSetArg (args[n], XmNautoUnmanage, False); n++;
|
|
manForm = XmCreateForm (manWidget, "manForm", args, n);
|
|
|
|
/* Get the select color and margin widths and heights */
|
|
n = 0;
|
|
XtSetArg(args[n], XmNforeground, &foreground); ++n;
|
|
XtSetArg(args[n], XmNbackground, &background); ++n;
|
|
XtSetArg (args[n], XmNcolormap, &colormap); ++n;
|
|
XtGetValues(manForm, args, n);
|
|
|
|
XmGetColors (XtScreen (manForm), colormap, background,
|
|
&foregroundColor, &topShadowColor,
|
|
&bottomShadowColor, &selectColor);
|
|
|
|
labelStr = XmStringCreateLocalized((char *)_DTGETMESSAGE(7, 12,"Man Page:"));
|
|
n = 0;
|
|
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
|
|
XtSetArg(args[n], XmNleftOffset,5); ++n;
|
|
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
|
|
XtSetArg(args[n], XmNtopOffset, 15); ++n;
|
|
XtSetArg(args[n], XmNlabelType, XmSTRING); ++n;
|
|
XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
|
|
XtSetArg(args[n], XmNtraversalOn, False); ++n;
|
|
XtSetArg(args[n], XmNlabelString, labelStr); ++n;
|
|
manLabel = XmCreateLabelGadget(manForm, "manLabel", args, n);
|
|
XtManageChild (manLabel);
|
|
XmStringFree(labelStr);
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
|
|
XtSetArg(args[n], XmNleftWidget, manLabel); ++n;
|
|
XtSetArg(args[n], XmNleftOffset, 5); ++n;
|
|
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
|
|
XtSetArg(args[n], XmNtopOffset, 10); ++n;
|
|
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
|
|
XtSetArg(args[n], XmNrightOffset, 5); ++n;
|
|
XtSetArg(args[n], XmNeditable, True); ++n;
|
|
XtSetArg(args[n], XmNeditMode, XmSINGLE_LINE_EDIT); ++n;
|
|
XtSetArg(args[n], XmNbackground, selectColor); ++n;
|
|
manText = XmCreateTextField(manForm, "man_text", args, n);
|
|
XtManageChild (manText);
|
|
XtAddCallback(manText, XmNvalueChangedCallback,
|
|
ManTextUpdateCB,(XtPointer) NULL);
|
|
|
|
/* Create a separator between the buttons */
|
|
n = 0;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget,manLabel);n++;
|
|
XtSetArg (args[n], XmNtopOffset, 20); n++;
|
|
separator = XmCreateSeparatorGadget (manForm, "separator", args, n);
|
|
XtManageChild (separator);
|
|
|
|
/* Create the action buttons along the bottom */
|
|
labelStr = XmStringCreateLocalized ((char *)_DTGETMESSAGE(7, 13,
|
|
"Show Man Page"));
|
|
n = 0;
|
|
XtSetArg (args[n], XmNlabelString, labelStr); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 1); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 49); n++;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, separator); n++;
|
|
XtSetArg (args[n], XmNtopOffset, 5); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNbottomOffset, 5); n++;
|
|
XtSetArg (args[n], XmNmarginHeight, 4); n++;
|
|
manBtn = XmCreatePushButtonGadget(manForm, "manBtn", args, n);
|
|
XtManageChild (manBtn);
|
|
XmStringFree(labelStr);
|
|
XtSetSensitive(manBtn, False);
|
|
|
|
XtAddCallback(manBtn, XmNactivateCallback, ManDisplayCB,
|
|
(XtPointer) manForm);
|
|
|
|
|
|
/* Build the Close button */
|
|
labelStr = XmStringCreateLocalized((char *)_DTGETMESSAGE(7, 16,"Exit"));
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNlabelString, labelStr); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 51); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 99); n++;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, separator); n++;
|
|
XtSetArg (args[n], XmNtopOffset, 5); n++;
|
|
XtSetArg (args[n], XmNmarginHeight, 4); n++;
|
|
closeBtn = XmCreatePushButtonGadget (manForm, "closeBtn", args, n);
|
|
XtManageChild (closeBtn);
|
|
|
|
XtAddCallback(closeBtn, XmNactivateCallback, CloseAndExitCB,
|
|
(XtPointer) NULL);
|
|
|
|
XmStringFree (labelStr);
|
|
|
|
XtSetArg (args[0], XmNdefaultButton, closeBtn);
|
|
XtSetValues (manForm, args, 1);
|
|
|
|
/** force tabs to go to each widget and in right order **/
|
|
XtSetArg (args[0], XmNnavigationType, XmSTICKY_TAB_GROUP);
|
|
XtSetValues (manText,args,1);
|
|
XtSetValues (manBtn,args,1);
|
|
XtSetValues (closeBtn,args,1);
|
|
|
|
/** put focus on the text field **/
|
|
XtSetArg (args[0], XmNinitialFocus, manText);
|
|
XtSetValues (manForm,args,1);
|
|
|
|
|
|
/* Adjust the decorations for the dialog shell of the dialog */
|
|
n = 0;
|
|
XtSetArg(args[n], XmNmwmFunctions,
|
|
MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE |
|
|
MWM_FUNC_CLOSE); n++;
|
|
XtSetArg (args[n], XmNmwmDecorations,
|
|
MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MENU |
|
|
MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE); n++;
|
|
XtSetValues (manWidget, args, n);
|
|
|
|
|
|
XtManageChild(manForm);
|
|
|
|
/* Add the CatchClose here so we catch the window manager close requests */
|
|
CatchClose(manForm);
|
|
|
|
/* Set the wm_command property on the help dialog window */
|
|
if (argc != 0)
|
|
XSetCommand(XtDisplay(manWidget), XtWindow(manWidget), argv, argc);
|
|
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
* Function: ManTextUpdateCB
|
|
*
|
|
* ManText is called when the string in the man text Widget changes. We
|
|
* activate or deactivate the display man page PushButton.
|
|
*
|
|
* Called by:
|
|
**************************************************************************/
|
|
|
|
static void ManTextUpdateCB(
|
|
Widget widget,
|
|
XtPointer client_data,
|
|
XtPointer call_data )
|
|
{
|
|
char *textString;
|
|
Arg args[2];
|
|
|
|
/* Get the text string to check its length, then set the search buttons' */
|
|
/* sensitivity appropriately. */
|
|
|
|
textString = XmTextFieldGetString(widget);
|
|
if (strlen(textString) == 0)
|
|
{
|
|
XtSetSensitive(manBtn, False);
|
|
XtSetArg (args[0], XmNdefaultButton, closeBtn);
|
|
XtSetValues (manForm, args, 1);
|
|
}
|
|
else
|
|
{
|
|
XtSetSensitive(manBtn, True);
|
|
XtSetArg (args[0], XmNdefaultButton, manBtn);
|
|
XtSetValues (manForm, args, 1);
|
|
|
|
}
|
|
XtFree(textString);
|
|
|
|
} /* End ManTextCB */
|
|
|
|
|
|
/*******************************************************************
|
|
* Function: ManDisplayCB
|
|
*
|
|
* ManDisplayCB is called when the user hits Return in the man text
|
|
* Widget or clicks the display man PushButton.
|
|
*******************************************************************/
|
|
static void ManDisplayCB(
|
|
Widget widget,
|
|
XtPointer client_data,
|
|
XtPointer call_data )
|
|
{
|
|
|
|
char *manPageStr;
|
|
|
|
_DtHelpTurnOnHourGlass((Widget) client_data);
|
|
manPageStr = XmTextFieldGetString(manText);
|
|
|
|
DisplayMan(topLevel, manPageStr, NO_EXIT_ON_CLOSE);
|
|
|
|
_DtHelpTurnOffHourGlass((Widget) client_data);
|
|
XtFree(manPageStr);
|
|
|
|
} /* End ManDisplayCB */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|