handler.c revision 23a8d56d
11abf7346Smrg/* $XConsortium: handler.c,v 1.22 94/12/16 21:36:53 gildea Exp $ */
21abf7346Smrg/*
31abf7346Smrg
41abf7346SmrgCopyright (c) 1987, 1988  X Consortium
51abf7346Smrg
61abf7346SmrgPermission is hereby granted, free of charge, to any person obtaining
71abf7346Smrga copy of this software and associated documentation files (the
81abf7346Smrg"Software"), to deal in the Software without restriction, including
91abf7346Smrgwithout limitation the rights to use, copy, modify, merge, publish,
101abf7346Smrgdistribute, sublicense, and/or sell copies of the Software, and to
111abf7346Smrgpermit persons to whom the Software is furnished to do so, subject to
121abf7346Smrgthe following conditions:
131abf7346Smrg
141abf7346SmrgThe above copyright notice and this permission notice shall be included
151abf7346Smrgin all copies or substantial portions of the Software.
161abf7346Smrg
171abf7346SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
181abf7346SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
191abf7346SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
201abf7346SmrgIN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
211abf7346SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
221abf7346SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
231abf7346SmrgOTHER DEALINGS IN THE SOFTWARE.
241abf7346Smrg
251abf7346SmrgExcept as contained in this notice, the name of the X Consortium shall
261abf7346Smrgnot be used in advertising or otherwise to promote the sale, use or
271abf7346Smrgother dealings in this Software without prior written authorization
281abf7346Smrgfrom the X Consortium.
291abf7346Smrg
301abf7346Smrg*/
311abf7346Smrg/* $XFree86: xc/programs/xman/handler.c,v 1.6 2003/01/19 04:44:45 paulo Exp $ */
321abf7346Smrg
331abf7346Smrg/*
341abf7346Smrg * xman - X window system manual page display program.
351abf7346Smrg * Author:    Chris D. Peterson, MIT Project Athena
361abf7346Smrg * Created:   October 29, 1987
371abf7346Smrg */
3823a8d56dSmrg#ifdef HAVE_CONFIG_H
3923a8d56dSmrg# include "config.h"
4023a8d56dSmrg#endif
411abf7346Smrg
421abf7346Smrg#include <sys/types.h>
431abf7346Smrg#include <sys/stat.h>
441abf7346Smrg#include "globals.h"
451abf7346Smrg#include "vendor.h"
461abf7346Smrg#ifdef INCLUDE_XPRINT_SUPPORT
471abf7346Smrg#include "printdialog.h"
481abf7346Smrg#include "print.h"
491abf7346Smrg#endif /* INCLUDE_XPRINT_SUPPORT */
501abf7346Smrg
5123a8d56dSmrg#ifdef RELEASE_VERSION
5223a8d56dSmrg#define XMAN_VERSION "Xman Version " PACKAGE_VERSION " - X11R" RELEASE_VERSION
5323a8d56dSmrg#else
5423a8d56dSmrg#define XMAN_VERSION "Xman Version " PACKAGE_VERSION
5523a8d56dSmrg#endif
5623a8d56dSmrg
571abf7346Smrgstatic void PutUpManpage(ManpageGlobals * man_globals, FILE * file);
581abf7346Smrgstatic void ToggleBothShownState(ManpageGlobals * man_globals);
591abf7346Smrg
601abf7346Smrg/*	Function Name: OptionCallback
611abf7346Smrg *	Description: This is the callback function for the callback menu.
621abf7346Smrg *	Arguments: w - the widget we are calling back from.
631abf7346Smrg *                 globals_pointer - a pointer to the psuedo globals structure
641abf7346Smrg *                                  for this manpage.
651abf7346Smrg *                 junk - (call data) not used.
661abf7346Smrg *	Returns: none.
671abf7346Smrg */
681abf7346Smrg
691abf7346Smrg/*ARGSUSED*/
701abf7346Smrgvoid
711abf7346SmrgOptionCallback(Widget w, XtPointer pointer, XtPointer junk)
721abf7346Smrg{
731abf7346Smrg  ManpageGlobals * man_globals = (ManpageGlobals *) pointer;
741abf7346Smrg  String params;
751abf7346Smrg  Cardinal num_params = 1;
761abf7346Smrg
771abf7346Smrg  if ( w == man_globals->search_entry )
781abf7346Smrg    PopupSearch(XtParent(w), NULL, NULL, NULL);
791abf7346Smrg  else if (w == man_globals->dir_entry) {       /* Put Up Directory */
801abf7346Smrg    params = "Directory";
811abf7346Smrg    GotoPage(XtParent(w), NULL, &params, &num_params);
821abf7346Smrg  }
831abf7346Smrg  else if (w == man_globals->manpage_entry ) {  /* Put Up Man Page */
841abf7346Smrg    params = "ManualPage";
851abf7346Smrg    GotoPage(XtParent(w), NULL, &params, &num_params);
861abf7346Smrg  }
871abf7346Smrg  else if ( w == man_globals->help_entry )      /* Help */
881abf7346Smrg    PopupHelp(XtParent(w), NULL, NULL, NULL);
891abf7346Smrg  else if ( w == man_globals->both_screens_entry ) /*Toggle Both_Shown State.*/
901abf7346Smrg    ToggleBothShownState(man_globals);
911abf7346Smrg  else if ( w == man_globals->remove_entry)     /* Kill the manpage */
921abf7346Smrg    RemoveThisManpage(XtParent(w), NULL, NULL, NULL);
931abf7346Smrg  else if ( w == man_globals->open_entry)       /* Open new manpage */
941abf7346Smrg    CreateNewManpage(XtParent(w), NULL, NULL, NULL);
951abf7346Smrg#ifdef INCLUDE_XPRINT_SUPPORT
961abf7346Smrg  else if ( w == man_globals->print_entry)    /* Print current manpage */
971abf7346Smrg    PrintThisManpage(XtParent(w), NULL, NULL, NULL);
981abf7346Smrg#endif /* INCLUDE_XPRINT_SUPPORT */
991abf7346Smrg  else if ( w == man_globals->version_entry)    /* Get version */
1001abf7346Smrg    ShowVersion(XtParent(w), NULL, NULL, NULL);
1011abf7346Smrg  else if ( w == man_globals->quit_entry)      /* Quit. */
1021abf7346Smrg    Quit(XtParent(w), NULL, NULL, NULL);
1031abf7346Smrg}
1041abf7346Smrg
1051abf7346Smrg/*      Function Name: ToggleBothShownState;
1061abf7346Smrg *      Description: toggles the state of the both shown feature.
1071abf7346Smrg *      Arguments: man_globals - the man globals structure.
1081abf7346Smrg *      Returns: none.
1091abf7346Smrg */
1101abf7346Smrg
1111abf7346Smrg/*
1121abf7346Smrg * I did not have a two state widget, which is the way this
1131abf7346Smrg * should really be done.  1/22/88 - CDP.
1141abf7346Smrg */
1151abf7346Smrg
1161abf7346Smrgstatic void
1171abf7346SmrgToggleBothShownState(ManpageGlobals * man_globals)
1181abf7346Smrg{
1191abf7346Smrg  char * label_str;
1201abf7346Smrg  Arg arglist[1];
1211abf7346Smrg
1221abf7346Smrg  if (man_globals->both_shown == TRUE) {
1231abf7346Smrg    label_str = SHOW_BOTH;
1241abf7346Smrg    if (man_globals->dir_shown)
1251abf7346Smrg      XtUnmanageChild(man_globals->manpagewidgets.manpage);
1261abf7346Smrg    else
1271abf7346Smrg      XtUnmanageChild(man_globals->manpagewidgets.directory);
1281abf7346Smrg  }
1291abf7346Smrg  else {
1301abf7346Smrg    Widget manpage = man_globals->manpagewidgets.manpage;
1311abf7346Smrg    Widget dir = man_globals->manpagewidgets.directory;
1321abf7346Smrg
1331abf7346Smrg    label_str = SHOW_ONE;
1341abf7346Smrg
1351abf7346Smrg    XtSetArg(arglist[0], XtNpreferredPaneSize, resources.directory_height);
1361abf7346Smrg    XtSetValues(dir, arglist, (Cardinal) 1);
1371abf7346Smrg
1381abf7346Smrg    if (!man_globals->dir_shown) {
1391abf7346Smrg      XtUnmanageChild(manpage);
1401abf7346Smrg      XtManageChild(dir);
1411abf7346Smrg    }
1421abf7346Smrg    XtManageChild(manpage);
1431abf7346Smrg  }
1441abf7346Smrg  man_globals->both_shown = !man_globals->both_shown;
1451abf7346Smrg
1461abf7346Smrg  if (man_globals->dir_shown)
1471abf7346Smrg    ChangeLabel(man_globals->label,
1481abf7346Smrg		man_globals->section_name[man_globals->current_directory]);
1491abf7346Smrg  else
1501abf7346Smrg    ChangeLabel(man_globals->label, man_globals->manpage_title);
1511abf7346Smrg
1521abf7346Smrg  XtSetArg(arglist[0], XtNlabel, label_str);
1531abf7346Smrg  XtSetValues(man_globals->both_screens_entry, arglist, ONE);
1541abf7346Smrg
1551abf7346Smrg  /* if both are shown there is no need to switch between the two. */
1561abf7346Smrg
1571abf7346Smrg  XtSetArg(arglist[0], XtNsensitive, !man_globals->both_shown);
1581abf7346Smrg  XtSetValues(man_globals->manpage_entry, arglist, ONE);
1591abf7346Smrg  XtSetValues(man_globals->dir_entry, arglist, ONE);
1601abf7346Smrg}
1611abf7346Smrg
1621abf7346Smrg/*	Function Name: Popup
1631abf7346Smrg *	Description: This function pops up the given widget under the cursor.
1641abf7346Smrg *	Arguments: w - the widget to popup.
1651abf7346Smrg *                 grab_kind - the kind of grab to register.
1661abf7346Smrg *	Returns: none
1671abf7346Smrg */
1681abf7346Smrg
1691abf7346Smrg/* How far off the top of the widget to have the initial cursor postion. */
1701abf7346Smrg
1711abf7346Smrg#define OFF_OF_TOP 25
1721abf7346Smrg
1731abf7346Smrgvoid
1741abf7346SmrgPopup(Widget w, XtGrabKind grab_kind)
1751abf7346Smrg{
1761abf7346Smrg  int x_root,y_root,y_pos,garbage;
1771abf7346Smrg  unsigned int mask;
1781abf7346Smrg  Window junk_window;
1791abf7346Smrg
1801abf7346Smrg  XQueryPointer(XtDisplay(w), XtWindow(w), &junk_window, &junk_window,
1811abf7346Smrg		&x_root, &y_root, &garbage, &garbage, &mask);
1821abf7346Smrg
1831abf7346Smrg  y_pos = OFF_OF_TOP - Height(w)/2 - BorderWidth(w);
1841abf7346Smrg  PositionCenter(w, x_root, y_root, y_pos, 0, 2, 2);
1851abf7346Smrg  XtPopup(w, grab_kind);
1861abf7346Smrg}
1871abf7346Smrg
1881abf7346Smrg/*	Function Name: PutUpManpage
1891abf7346Smrg *	Description: Puts the manpage on the display.
1901abf7346Smrg *	Arguments: man_globals - a pointer to the psuedo globals structure
1911abf7346Smrg *                                  for this manpage.
1921abf7346Smrg *                 file - the file to display.
1931abf7346Smrg *	Returns: none.
1941abf7346Smrg */
1951abf7346Smrg
1961abf7346Smrgstatic void
1971abf7346SmrgPutUpManpage(ManpageGlobals * man_globals, FILE * file)
1981abf7346Smrg{
1991abf7346Smrg  String params = "ManualPage";
2001abf7346Smrg  Cardinal num_params = 1;
2011abf7346Smrg
2021abf7346Smrg  if (file == NULL)
2031abf7346Smrg    return;
2041abf7346Smrg
2051abf7346Smrg  OpenFile(man_globals, file);
2061abf7346Smrg
2071abf7346Smrg  if (!man_globals->both_shown) {
2081abf7346Smrg    Arg arglist[1];
2091abf7346Smrg    XtSetArg(arglist[0], XtNsensitive, TRUE);
2101abf7346Smrg    XtSetValues(man_globals->manpage_entry, arglist, ONE);
2111abf7346Smrg    XtSetValues(man_globals->both_screens_entry, arglist, ONE);
2121abf7346Smrg  }
2131abf7346Smrg  GotoPage(man_globals->manpagewidgets.manpage, NULL, &params, &num_params);
2141abf7346Smrg}
2151abf7346Smrg
2161abf7346Smrg/*	Function Name: DirectoryHandler
2171abf7346Smrg *	Description: This is the callback function for the directory listings.
2181abf7346Smrg *	Arguments: w - the widget we are calling back from.
2191abf7346Smrg *                 global_pointer - the pointer to the psuedo global structure
2201abf7346Smrg *                                  associated with this manpage.
2211abf7346Smrg *                 ret_val - return value from the list widget.
2221abf7346Smrg *	Returns: none.
2231abf7346Smrg */
2241abf7346Smrg
2251abf7346Smrgvoid
2261abf7346SmrgDirectoryHandler(Widget w, XtPointer global_pointer, XtPointer ret_val)
2271abf7346Smrg{
2281abf7346Smrg  FILE * file;			/* The manpage file. */
2291abf7346Smrg  ManpageGlobals * man_globals = (ManpageGlobals *) global_pointer;
2301abf7346Smrg  XawListReturnStruct * ret_struct = (XawListReturnStruct *) ret_val;
2311abf7346Smrg
2321abf7346Smrg  file = FindManualFile(man_globals, man_globals->current_directory,
2331abf7346Smrg			ret_struct->list_index);
2341abf7346Smrg  PutUpManpage(man_globals, file);
2351abf7346Smrg  if ((file != NULL) && (file != man_globals->curr_file)) {
2361abf7346Smrg    fclose(file);
2371abf7346Smrg  }
2381abf7346Smrg}
2391abf7346Smrg
2401abf7346Smrg/*	Function Name: DirPopupCallback
2411abf7346Smrg *	Description: This is the callback function for the callback menu.
2421abf7346Smrg *	Arguments: w - the widget we are calling back from.
2431abf7346Smrg *                 pointer - a pointer to the psuedo globals structure
2441abf7346Smrg *                                  for this manpage.
2451abf7346Smrg *                 junk - (call data) not used.
2461abf7346Smrg *	Returns: none.
2471abf7346Smrg */
2481abf7346Smrg
2491abf7346Smrg/*ARGSUSED*/
2501abf7346Smrgvoid
2511abf7346SmrgDirPopupCallback(Widget w, XtPointer pointer, XtPointer junk)
2521abf7346Smrg{
2531abf7346Smrg  ManpageGlobals * man_globals;
2541abf7346Smrg  MenuStruct * menu_struct;
2551abf7346Smrg  Widget parent;
2561abf7346Smrg  int number;
2571abf7346Smrg  int current_box;
2581abf7346Smrg
2591abf7346Smrg  menu_struct = (MenuStruct *) pointer;
2601abf7346Smrg  man_globals = (ManpageGlobals *) menu_struct->data;
2611abf7346Smrg
2621abf7346Smrg  number = menu_struct->number;
2631abf7346Smrg  current_box = man_globals->current_directory;
2641abf7346Smrg
2651abf7346Smrg  /* We have used this guy, pop down the menu. */
2661abf7346Smrg
2671abf7346Smrg  if (number != current_box) {
2681abf7346Smrg    /* This is the only one that we know has a parent. */
2691abf7346Smrg    parent = XtParent(man_globals->manpagewidgets.box[INITIAL_DIR]);
2701abf7346Smrg
2711abf7346Smrg    MakeDirectoryBox(man_globals, parent,
2721abf7346Smrg		     man_globals->manpagewidgets.box + number, number);
2731abf7346Smrg    XtUnmanageChild(man_globals->manpagewidgets.box[current_box]);
2741abf7346Smrg    XtManageChild(man_globals->manpagewidgets.box[number]);
2751abf7346Smrg
2761abf7346Smrg    XawListUnhighlight(man_globals->manpagewidgets.box[current_box]);
2771abf7346Smrg    ChangeLabel(man_globals->label, man_globals->section_name[number]);
2781abf7346Smrg    man_globals->current_directory = number;
2791abf7346Smrg  }
2801abf7346Smrg
2811abf7346Smrg  /* put up directory. */
2821abf7346Smrg  if (!man_globals->both_shown) {
2831abf7346Smrg    XtUnmanageChild(man_globals->manpagewidgets.manpage);
2841abf7346Smrg    XtManageChild(man_globals->manpagewidgets.directory);
2851abf7346Smrg  }
2861abf7346Smrg}
2871abf7346Smrg
2881abf7346Smrg/************************************************************
2891abf7346Smrg *
2901abf7346Smrg * Action Routines.
2911abf7346Smrg *
2921abf7346Smrg ************************************************************/
2931abf7346Smrg
2941abf7346Smrg/*	Function Name: SaveFormattedPage
2951abf7346Smrg *	Description: This is the action routine may save the manpage.
2961abf7346Smrg *      Arguments: w - any widget in the widget tree.
2971abf7346Smrg *                 event - NOT USED.
2981abf7346Smrg *                 params, num_params - the parameters paseed to the action
2991abf7346Smrg *                                      routine, can be either Manpage or
3001abf7346Smrg *                                      Directory.
3011abf7346Smrg *      Returns: none.
3021abf7346Smrg */
3031abf7346Smrg
3041abf7346Smrg/*ARGSUSED*/
3051abf7346Smrgvoid
3061abf7346SmrgSaveFormattedPage(Widget w, XEvent * event, String * params, Cardinal * num_params)
3071abf7346Smrg{
3081abf7346Smrg  ManpageGlobals * man_globals;
3091abf7346Smrg  char cmdbuf[BUFSIZ], error_buf[BUFSIZ];
3101abf7346Smrg
3111abf7346Smrg  if (*num_params != 1) {
3121abf7346Smrg    XtAppWarning(XtWidgetToApplicationContext(w),
3131abf7346Smrg       "Xman - SaveFormattedPage: This action routine requires one argument.");
3141abf7346Smrg    return;
3151abf7346Smrg  }
3161abf7346Smrg
3171abf7346Smrg  man_globals = GetGlobals(w);
3181abf7346Smrg
3191abf7346Smrg/*
3201abf7346Smrg * If we are not active then take no action.
3211abf7346Smrg */
3221abf7346Smrg
3238b6d6341Smrg  if (man_globals->tempfile == NULL) return;
3241abf7346Smrg
3251abf7346Smrg  switch (params[0][0]) {
3261abf7346Smrg  case 'S':
3271abf7346Smrg  case 's':
3281abf7346Smrg
3291abf7346Smrg#ifndef NO_COMPRESS
3301abf7346Smrg    if (!man_globals->compress)
3311abf7346Smrg#endif
3321abf7346Smrg
3331abf7346Smrg      sprintf(cmdbuf, "%s %s %s", COPY, man_globals->tempfile,
3341abf7346Smrg	      man_globals->save_file);
3351abf7346Smrg
3361abf7346Smrg#ifndef NO_COMPRESS
3371abf7346Smrg    else
3381abf7346Smrg      if (man_globals->gzip)
3391abf7346Smrg	sprintf(cmdbuf, "%s < %s > %s", GZIP_COMPRESS, man_globals->tempfile,
3401abf7346Smrg		man_globals->save_file);
3411abf7346Smrg      else
3421abf7346Smrg	sprintf(cmdbuf, "%s < %s > %s", COMPRESS, man_globals->tempfile,
3431abf7346Smrg		man_globals->save_file);
3441abf7346Smrg#endif
3451abf7346Smrg
3461abf7346Smrg    if(! system(cmdbuf)) {
3471abf7346Smrg	/* make sure the formatted man page is fully accessible by the world */
3481abf7346Smrg	if (chmod(man_globals->save_file, CHMOD_MODE) != 0) {
3491abf7346Smrg	    sprintf(error_buf,
3501abf7346Smrg		    "Couldn't set permissions on formatted man page '%s'.\n",
3511abf7346Smrg		    man_globals->save_file);
3521abf7346Smrg	    PopupWarning( man_globals, error_buf);
3531abf7346Smrg	}
3541abf7346Smrg    } else {
3551abf7346Smrg	sprintf(error_buf, "Error while executing the command '%s'.\n",
3561abf7346Smrg		cmdbuf);
3571abf7346Smrg	PopupWarning( man_globals, error_buf);
3581abf7346Smrg    }
3591abf7346Smrg    break;
3601abf7346Smrg  case 'C':
3611abf7346Smrg  case 'c':
3621abf7346Smrg    break;
3631abf7346Smrg  default:
3641abf7346Smrg    sprintf(error_buf,"%s %s", "Xman - SaveFormattedPagee:",
3651abf7346Smrg	    "Unknown argument must be either 'Save' or 'Cancel'.");
3661abf7346Smrg    PopupWarning(man_globals, error_buf);
3671abf7346Smrg    return;
3681abf7346Smrg  }
3691abf7346Smrg
3701abf7346Smrg/*
3711abf7346Smrg * We do not need the filename anymore, and have the fd open.
3721abf7346Smrg * We will unlink it.
3731abf7346Smrg */
3741abf7346Smrg
3751abf7346Smrg  unlink(man_globals->tempfile);
3761abf7346Smrg  XtPopdown( XtParent(XtParent(w)) );
3771abf7346Smrg}
3781abf7346Smrg
3791abf7346Smrg/*      Function Name: GotoPage
3801abf7346Smrg *      Description: The Action routine that switches over to the manpage
3811abf7346Smrg *                   or directory.
3821abf7346Smrg *      Arguments: w - any widget in the widget tree.
3831abf7346Smrg *                 event - NOT USED.
3841abf7346Smrg *                 params, num_params - the parameters paseed to the action
3851abf7346Smrg *                                      routine, can be either Manpage or
3861abf7346Smrg *                                      Directory.
3871abf7346Smrg *      Returns: none.
3881abf7346Smrg */
3891abf7346Smrg
3901abf7346Smrg/*ARGSUSED*/
3911abf7346Smrgvoid
3921abf7346SmrgGotoPage(Widget w, XEvent * event, String * params, Cardinal * num_params)
3931abf7346Smrg{
3941abf7346Smrg  ManpageGlobals * man_globals;
3951abf7346Smrg  char error_buf[BUFSIZ];
3961abf7346Smrg  Arg arglist[1];
3971abf7346Smrg  Boolean sensitive;
3981abf7346Smrg
3991abf7346Smrg  if (*num_params != 1) {
4001abf7346Smrg    XtAppWarning(XtWidgetToApplicationContext(w),
4011abf7346Smrg		"Xman - GotoPage: This action routine requires one argument.");
4021abf7346Smrg    return;
4031abf7346Smrg  }
4041abf7346Smrg
4051abf7346Smrg  man_globals = GetGlobals(w);
4061abf7346Smrg
4071abf7346Smrg  if (man_globals->both_shown) {
4081abf7346Smrg    ChangeLabel(man_globals->label,
4091abf7346Smrg		man_globals->section_name[man_globals->current_directory]);
4101abf7346Smrg    return;
4111abf7346Smrg  }
4121abf7346Smrg
4131abf7346Smrg  switch (params[0][0]) {
4141abf7346Smrg  case 'M':
4151abf7346Smrg  case 'm':
4161abf7346Smrg    XtSetArg(arglist[0], XtNsensitive, &sensitive);
4171abf7346Smrg    XtGetValues(man_globals->manpage_entry, arglist, ONE);
4181abf7346Smrg    if (sensitive) {
4191abf7346Smrg      ChangeLabel(man_globals->label,man_globals->manpage_title);
4201abf7346Smrg      XtUnmanageChild(man_globals->manpagewidgets.directory);
4211abf7346Smrg      XtManageChild(man_globals->manpagewidgets.manpage);
4221abf7346Smrg      man_globals->dir_shown = FALSE;
4231abf7346Smrg    }
4241abf7346Smrg    break;
4251abf7346Smrg  case 'D':
4261abf7346Smrg  case 'd':
4271abf7346Smrg    ChangeLabel(man_globals->label,
4281abf7346Smrg		man_globals->section_name[man_globals->current_directory]);
4291abf7346Smrg    XtUnmanageChild(man_globals->manpagewidgets.manpage);
4301abf7346Smrg    XtManageChild(man_globals->manpagewidgets.directory);
4311abf7346Smrg    man_globals->dir_shown = TRUE;
4321abf7346Smrg    break;
4331abf7346Smrg  default:
4341abf7346Smrg    sprintf(error_buf,"%s %s", "Xman - GotoPage: Unknown argument must be",
4351abf7346Smrg	    "either Manpage or Directory.");
4361abf7346Smrg    XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
4371abf7346Smrg    return;
4381abf7346Smrg  }
4391abf7346Smrg}
4401abf7346Smrg
4411abf7346Smrg/*      Function Name: Quit.
4421abf7346Smrg *      Description: Quits Xman.
4431abf7346Smrg *      Arguments: w - any widget.
4441abf7346Smrg *                 event - NOT USED.
4451abf7346Smrg *                 params, num_params - NOT USED.
4461abf7346Smrg *      Returns: none.
4471abf7346Smrg */
4481abf7346Smrg
4491abf7346Smrg/*ARGSUSED*/
4501abf7346Smrgvoid
4511abf7346SmrgQuit(Widget w, XEvent * event, String * params, Cardinal * num_params)
4521abf7346Smrg{
4531abf7346Smrg  XtAppSetExitFlag(XtWidgetToApplicationContext(w));
4541abf7346Smrg}
4551abf7346Smrg
4561abf7346Smrg/*      Function Name: PopupHelp
4571abf7346Smrg *      Description: Pops up xman's help.
4581abf7346Smrg *      Arguments: w - NOT USED.
4591abf7346Smrg *                 event - NOT USED.
4601abf7346Smrg *                 params, num_params - NOT USED.
4611abf7346Smrg *      Returns: none.
4621abf7346Smrg */
4631abf7346Smrg
4641abf7346Smrg/*ARGSUSED*/
4651abf7346Smrgvoid
4661abf7346SmrgPopupHelp(Widget w, XEvent * event, String * params, Cardinal * num_params)
4671abf7346Smrg{
4681abf7346Smrg  if (MakeHelpWidget())
4691abf7346Smrg    XtPopup(help_widget,XtGrabNone);
4701abf7346Smrg}
4711abf7346Smrg
4721abf7346Smrg/*      Function Name: PopupSearch
4731abf7346Smrg *      Description: Pops up this manual pages search widget.
4741abf7346Smrg *      Arguments: w - any widget in this manpage.
4751abf7346Smrg *                 event - NOT USED.
4761abf7346Smrg *                 params, num_params - NOT USED.
4771abf7346Smrg *      Returns: none.
4781abf7346Smrg */
4791abf7346Smrg
4801abf7346Smrg/*ARGSUSED*/
4811abf7346Smrgvoid
4821abf7346SmrgPopupSearch(Widget w, XEvent * event, String * params, Cardinal * num_params)
4831abf7346Smrg{
4841abf7346Smrg  ManpageGlobals * man_globals = GetGlobals(w);
4851abf7346Smrg
4861abf7346Smrg  if (man_globals->search_widget) {
4871abf7346Smrg    if (!XtIsRealized(man_globals->search_widget)) {
4881abf7346Smrg      XtRealizeWidget(man_globals->search_widget);
4891abf7346Smrg      AddCursor(man_globals->search_widget, resources.cursors.search_entry);
4901abf7346Smrg    }
4911abf7346Smrg    Popup(man_globals->search_widget, XtGrabNone);
4921abf7346Smrg  }
4931abf7346Smrg}
4941abf7346Smrg
4951abf7346Smrg/*      Function Name: CreateNewManpage
4961abf7346Smrg *      Description: Creates A New Manual Page.
4971abf7346Smrg *      Arguments: w - NOT USED.
4981abf7346Smrg *                 event - NOT USED.
4991abf7346Smrg *                 params, num_params - NOT USED.
5001abf7346Smrg *      Returns: none.
5011abf7346Smrg */
5021abf7346Smrg
5031abf7346Smrg/*ARGSUSED*/
5041abf7346Smrgvoid
5051abf7346SmrgCreateNewManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
5061abf7346Smrg{
5071abf7346Smrg  (void) CreateManpage(NULL);
5081abf7346Smrg  man_pages_shown++;
5091abf7346Smrg}
5101abf7346Smrg
5111abf7346Smrg/*      Function Name: RemoveThisManpage
5121abf7346Smrg *      Description: Removes a manual page.
5131abf7346Smrg *      Arguments: w - any widget in the manpage.
5141abf7346Smrg *                 event - NOT USED.
5151abf7346Smrg *                 params, num_params - NOT USED.
5161abf7346Smrg *      Returns: none.
5171abf7346Smrg */
5181abf7346Smrg
5191abf7346Smrg/*ARGSUSED*/
5201abf7346Smrgvoid
5211abf7346SmrgRemoveThisManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
5221abf7346Smrg{
5231abf7346Smrg  ManpageGlobals * man_globals = GetGlobals(w);
5241abf7346Smrg
5251abf7346Smrg  if (man_globals->This_Manpage != help_widget) {
5261abf7346Smrg    RemoveGlobals(man_globals->This_Manpage);
5271abf7346Smrg    XtDestroyWidget(man_globals->This_Manpage);
5281abf7346Smrg
5291abf7346Smrg    XtFree( (char *) man_globals->section_name);
5301abf7346Smrg    XtFree( (char *) man_globals->manpagewidgets.box);
5311abf7346Smrg    XtFree( (char *) man_globals);
5321abf7346Smrg
5331abf7346Smrg    if ( (--man_pages_shown) == 0)
5341abf7346Smrg      Quit(w, NULL, NULL, NULL);
5351abf7346Smrg  }
5361abf7346Smrg  else
5371abf7346Smrg    XtPopdown(help_widget);
5381abf7346Smrg}
5391abf7346Smrg
5401abf7346Smrg/*      Function Name: Search
5411abf7346Smrg *      Description: Actually performs a search.
5421abf7346Smrg *      Arguments: w - any widget in the manpage.
5431abf7346Smrg *                 event - NOT USED.
5441abf7346Smrg *                 params, num_params - NOT USED.
5451abf7346Smrg *      Returns: none.
5461abf7346Smrg */
5471abf7346Smrg
5481abf7346Smrg/*ARGSUSED*/
5491abf7346Smrgvoid
5501abf7346SmrgSearch(Widget w, XEvent * event, String * params, Cardinal * num_params)
5511abf7346Smrg{
5521abf7346Smrg  ManpageGlobals * man_globals = GetGlobals(w);
5531abf7346Smrg  FILE * file = NULL;
5541abf7346Smrg
5551abf7346Smrg  XtPopdown(  XtParent(XtParent(w)) );       /* popdown the search widget */
5561abf7346Smrg
5571abf7346Smrg  if ( (*num_params < 1) || (*num_params > 2) ) {
5581abf7346Smrg    XtAppWarning(XtWidgetToApplicationContext(w),
5591abf7346Smrg      "Xman - Search: This action routine requires one or two arguments.");
5601abf7346Smrg    return;
5611abf7346Smrg  }
5621abf7346Smrg
5631abf7346Smrg  switch(params[0][0]) {
5641abf7346Smrg  case 'a':
5651abf7346Smrg  case 'A':
5661abf7346Smrg    file = DoSearch(man_globals,APROPOS);
5671abf7346Smrg    break;
5681abf7346Smrg  case 'm':
5691abf7346Smrg  case 'M':
5701abf7346Smrg    file = DoSearch(man_globals,MANUAL);
5711abf7346Smrg    break;
5721abf7346Smrg  case 'c':
5731abf7346Smrg  case 'C':
5741abf7346Smrg    file = NULL;
5751abf7346Smrg    break;
5761abf7346Smrg  default:
5771abf7346Smrg    XtAppWarning(XtWidgetToApplicationContext(w),
5781abf7346Smrg		 "Xman - Search: First parameter unknown.");
5791abf7346Smrg    file = NULL;
5801abf7346Smrg    break;
5811abf7346Smrg  }
5821abf7346Smrg
5831abf7346Smrg  if ( *num_params == 2 )
5841abf7346Smrg    switch (params[1][0]) {
5851abf7346Smrg    case 'O':
5861abf7346Smrg    case 'o':
5871abf7346Smrg      if (file != NULL) {
5881abf7346Smrg	Widget w;
5891abf7346Smrg	char * label;
5901abf7346Smrg
5911abf7346Smrg	w = CreateManpage(file);
5921abf7346Smrg	man_pages_shown++;
5931abf7346Smrg
5941abf7346Smrg	/* Put title into new manual page. */
5951abf7346Smrg
5961abf7346Smrg	label = man_globals->manpage_title;
5971abf7346Smrg	man_globals = GetGlobals(w);
5981abf7346Smrg	strcpy(man_globals->manpage_title, label);
5991abf7346Smrg	ChangeLabel(man_globals->label, label);
6001abf7346Smrg      }
6011abf7346Smrg      break;
6021abf7346Smrg    default:
6031abf7346Smrg      XtAppWarning(XtWidgetToApplicationContext(w),
6041abf7346Smrg		   "Xman - Search: Second parameter unknown.");
6051abf7346Smrg      break;
6061abf7346Smrg    }
6071abf7346Smrg  else {
6081abf7346Smrg    PutUpManpage(man_globals, file);
6091abf7346Smrg  }
6101abf7346Smrg  if ((file != NULL) && (file != man_globals->curr_file)) {
6111abf7346Smrg    fclose(file);
6121abf7346Smrg  }
6131abf7346Smrg}
6141abf7346Smrg
6151abf7346Smrg#ifdef INCLUDE_XPRINT_SUPPORT
6161abf7346Smrgstatic void
6171abf7346SmrgprintshellDestroyXtProc(Widget w, XtPointer client_data, XtPointer callData)
6181abf7346Smrg{
6191abf7346Smrg  ManpageGlobals *mg = GetGlobals(w);
6201abf7346Smrg  XawPrintDialogClosePrinterConnection(mg->printdialog, False);
6211abf7346Smrg}
6221abf7346Smrg
6231abf7346Smrgstatic void
6241abf7346SmrgprintOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
6251abf7346Smrg{
6261abf7346Smrg  XawPrintDialogCallbackStruct *pdcs = (XawPrintDialogCallbackStruct *)callData;
6271abf7346Smrg  Cardinal                      n;
6281abf7346Smrg  Arg                           args[2];
6291abf7346Smrg  ManpageGlobals               *mg = GetGlobals(w);
6301abf7346Smrg  Widget                        topwindow = mg->This_Manpage;
6311abf7346Smrg  FILE                         *file;
6321abf7346Smrg
6331abf7346Smrg  Log(("printOKXtProc: OK.\n"));
6341abf7346Smrg
6351abf7346Smrg  /* Get file object */
6361abf7346Smrg  n = 0;
6371abf7346Smrg  XtSetArg(args[n], XtNfile, &file); n++;
6381abf7346Smrg  XtGetValues(mg->manpagewidgets.manpage, args, n);
6391abf7346Smrg  Assertion(file != NULL, (("printOKXtProc: file == NULL.\n")));
6401abf7346Smrg
6411abf7346Smrg  DoPrintManpage("Xman",
6421abf7346Smrg                 file, topwindow,
6431abf7346Smrg                 pdcs->pdpy, pdcs->pcontext, pdcs->colorspace,
6441abf7346Smrg                 printshellDestroyXtProc,
6451abf7346Smrg                 mg->manpage_title,
6461abf7346Smrg                 pdcs->printToFile?pdcs->printToFileName:NULL);
6471abf7346Smrg
6481abf7346Smrg  XtPopdown(mg->printdialog_shell);
6491abf7346Smrg}
6501abf7346Smrg
6511abf7346Smrgstatic void
6521abf7346SmrgprintCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
6531abf7346Smrg{
6541abf7346Smrg    ManpageGlobals * mg = GetGlobals(w);
6551abf7346Smrg
6561abf7346Smrg    Log(("printCancelXtProc: cancel.\n"));
6571abf7346Smrg    XtPopdown(mg->printdialog_shell);
6581abf7346Smrg
6591abf7346Smrg    Log(("destroying print dialog shell...\n"));
6601abf7346Smrg    XtDestroyWidget(mg->printdialog_shell);
6611abf7346Smrg    mg->printdialog_shell = NULL;
6621abf7346Smrg    mg->printdialog       = NULL;
6631abf7346Smrg    Log(("... done\n"));
6641abf7346Smrg}
6651abf7346Smrg
6661abf7346Smrg/*      Function Name: PrintThisManpage
6671abf7346Smrg *      Description: Print the current manual page.
6681abf7346Smrg *      Arguments: mg - manpage globals
6691abf7346Smrg *      Returns: none.
6701abf7346Smrg */
6711abf7346Smrg
6721abf7346Smrg/*ARGSUSED*/
6731abf7346Smrgvoid
6741abf7346SmrgPrintThisManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
6751abf7346Smrg{
6761abf7346Smrg  ManpageGlobals *mg = GetGlobals(w);
6771abf7346Smrg  Dimension       width, height;
6781abf7346Smrg  Position        x, y;
6791abf7346Smrg  Widget          parent    = mg->This_Manpage;
6801abf7346Smrg  Widget          topwindow = mg->This_Manpage;
6811abf7346Smrg  Log(("print!\n"));
6821abf7346Smrg
6831abf7346Smrg  if (!mg->printdialog) {
6841abf7346Smrg    int n;
6851abf7346Smrg    Arg args[20];
6861abf7346Smrg
6871abf7346Smrg    n = 0;
6881abf7346Smrg    XtSetArg(args[n], XtNallowShellResize, True); n++;
6891abf7346Smrg    mg->printdialog_shell = XtCreatePopupShell("printdialogshell",
6901abf7346Smrg                                               transientShellWidgetClass,
6911abf7346Smrg                                               topwindow, args, n);
6921abf7346Smrg    n = 0;
6931abf7346Smrg    mg->printdialog = XtCreateManagedWidget("printdialog", printDialogWidgetClass,
6941abf7346Smrg                                            mg->printdialog_shell, args, n);
6951abf7346Smrg    XtAddCallback(mg->printdialog, XawNOkCallback,     printOKXtProc,     NULL);
6961abf7346Smrg    XtAddCallback(mg->printdialog, XawNCancelCallback, printCancelXtProc, NULL);
6971abf7346Smrg
6981abf7346Smrg    XtRealizeWidget(mg->printdialog_shell);
6991abf7346Smrg  }
7001abf7346Smrg
7011abf7346Smrg  /* Center dialog */
7021abf7346Smrg  XtVaGetValues(mg->printdialog_shell,
7031abf7346Smrg      XtNwidth,  &width,
7041abf7346Smrg      XtNheight, &height,
7051abf7346Smrg      NULL);
7061abf7346Smrg
7071abf7346Smrg  x = (Position)(XWidthOfScreen( XtScreen(parent)) - width)  / 2;
7081abf7346Smrg  y = (Position)(XHeightOfScreen(XtScreen(parent)) - height) / 3;
7091abf7346Smrg
7101abf7346Smrg  XtVaSetValues(mg->printdialog_shell,
7111abf7346Smrg      XtNx, x,
7121abf7346Smrg      XtNy, y,
7131abf7346Smrg      NULL);
7141abf7346Smrg
7151abf7346Smrg  XtPopup(mg->printdialog_shell, XtGrabNonexclusive);
7161abf7346Smrg}
7171abf7346Smrg#endif /* INCLUDE_XPRINT_SUPPORT */
7181abf7346Smrg
7191abf7346Smrg/*      Function Name: ShowVersion
7201abf7346Smrg *      Description: Show current version.
7211abf7346Smrg *      Arguments: w - any widget in the manpage.
7221abf7346Smrg *                 event - NOT USED.
7231abf7346Smrg *                 params, num_params - NOT USED.
7241abf7346Smrg *      Returns: none.
7251abf7346Smrg */
7261abf7346Smrg
7271abf7346Smrg/*ARGSUSED*/
7281abf7346Smrgvoid
7291abf7346SmrgShowVersion(Widget w, XEvent * event, String * params, Cardinal * num_params)
7301abf7346Smrg{
7311abf7346Smrg  ManpageGlobals * man_globals = GetGlobals(w);
7321abf7346Smrg  ChangeLabel(man_globals->label, XMAN_VERSION);
7331abf7346Smrg}
734