#include <sys/types.h>
#include <sys/stat.h>
#include "globals.h"
#include "vendor.h"
#ifdef INCLUDE_XPRINT_SUPPORT
#include "printdialog.h"
#include "print.h"
#endif
static void PutUpManpage(ManpageGlobals * man_globals, FILE * file);
static void ToggleBothShownState(ManpageGlobals * man_globals);
void
OptionCallback(Widget w, XtPointer pointer, XtPointer junk)
{
ManpageGlobals * man_globals = (ManpageGlobals *) pointer;
String params;
Cardinal num_params = 1;
if ( w == man_globals->search_entry )
PopupSearch(XtParent(w), NULL, NULL, NULL);
else if (w == man_globals->dir_entry) {
params = "Directory";
GotoPage(XtParent(w), NULL, ¶ms, &num_params);
}
else if (w == man_globals->manpage_entry ) {
params = "ManualPage";
GotoPage(XtParent(w), NULL, ¶ms, &num_params);
}
else if ( w == man_globals->help_entry )
PopupHelp(XtParent(w), NULL, NULL, NULL);
else if ( w == man_globals->both_screens_entry )
ToggleBothShownState(man_globals);
else if ( w == man_globals->remove_entry)
RemoveThisManpage(XtParent(w), NULL, NULL, NULL);
else if ( w == man_globals->open_entry)
CreateNewManpage(XtParent(w), NULL, NULL, NULL);
#ifdef INCLUDE_XPRINT_SUPPORT
else if ( w == man_globals->print_entry)
PrintThisManpage(XtParent(w), NULL, NULL, NULL);
#endif
else if ( w == man_globals->version_entry)
ShowVersion(XtParent(w), NULL, NULL, NULL);
else if ( w == man_globals->quit_entry)
Quit(XtParent(w), NULL, NULL, NULL);
}
static void
ToggleBothShownState(ManpageGlobals * man_globals)
{
char * label_str;
Arg arglist[1];
if (man_globals->both_shown == TRUE) {
label_str = SHOW_BOTH;
if (man_globals->dir_shown)
XtUnmanageChild(man_globals->manpagewidgets.manpage);
else
XtUnmanageChild(man_globals->manpagewidgets.directory);
}
else {
Widget manpage = man_globals->manpagewidgets.manpage;
Widget dir = man_globals->manpagewidgets.directory;
label_str = SHOW_ONE;
XtSetArg(arglist[0], XtNpreferredPaneSize, resources.directory_height);
XtSetValues(dir, arglist, (Cardinal) 1);
if (!man_globals->dir_shown) {
XtUnmanageChild(manpage);
XtManageChild(dir);
}
XtManageChild(manpage);
}
man_globals->both_shown = !man_globals->both_shown;
if (man_globals->dir_shown)
ChangeLabel(man_globals->label,
man_globals->section_name[man_globals->current_directory]);
else
ChangeLabel(man_globals->label, man_globals->manpage_title);
XtSetArg(arglist[0], XtNlabel, label_str);
XtSetValues(man_globals->both_screens_entry, arglist, ONE);
XtSetArg(arglist[0], XtNsensitive, !man_globals->both_shown);
XtSetValues(man_globals->manpage_entry, arglist, ONE);
XtSetValues(man_globals->dir_entry, arglist, ONE);
}
#define OFF_OF_TOP 25
void
Popup(Widget w, XtGrabKind grab_kind)
{
int x_root,y_root,y_pos,garbage;
unsigned int mask;
Window junk_window;
XQueryPointer(XtDisplay(w), XtWindow(w), &junk_window, &junk_window,
&x_root, &y_root, &garbage, &garbage, &mask);
y_pos = OFF_OF_TOP - Height(w)/2 - BorderWidth(w);
PositionCenter(w, x_root, y_root, y_pos, 0, 2, 2);
XtPopup(w, grab_kind);
}
static void
PutUpManpage(ManpageGlobals * man_globals, FILE * file)
{
String params = "ManualPage";
Cardinal num_params = 1;
if (file == NULL)
return;
OpenFile(man_globals, file);
if (!man_globals->both_shown) {
Arg arglist[1];
XtSetArg(arglist[0], XtNsensitive, TRUE);
XtSetValues(man_globals->manpage_entry, arglist, ONE);
XtSetValues(man_globals->both_screens_entry, arglist, ONE);
}
GotoPage(man_globals->manpagewidgets.manpage, NULL, ¶ms, &num_params);
}
void
DirectoryHandler(Widget w, XtPointer global_pointer, XtPointer ret_val)
{
FILE * file;
ManpageGlobals * man_globals = (ManpageGlobals *) global_pointer;
XawListReturnStruct * ret_struct = (XawListReturnStruct *) ret_val;
file = FindManualFile(man_globals, man_globals->current_directory,
ret_struct->list_index);
PutUpManpage(man_globals, file);
if ((file != NULL) && (file != man_globals->curr_file)) {
fclose(file);
}
}
void
DirPopupCallback(Widget w, XtPointer pointer, XtPointer junk)
{
ManpageGlobals * man_globals;
MenuStruct * menu_struct;
Widget parent;
int number;
int current_box;
menu_struct = (MenuStruct *) pointer;
man_globals = (ManpageGlobals *) menu_struct->data;
number = menu_struct->number;
current_box = man_globals->current_directory;
if (number != current_box) {
parent = XtParent(man_globals->manpagewidgets.box[INITIAL_DIR]);
MakeDirectoryBox(man_globals, parent,
man_globals->manpagewidgets.box + number, number);
XtUnmanageChild(man_globals->manpagewidgets.box[current_box]);
XtManageChild(man_globals->manpagewidgets.box[number]);
XawListUnhighlight(man_globals->manpagewidgets.box[current_box]);
ChangeLabel(man_globals->label, man_globals->section_name[number]);
man_globals->current_directory = number;
}
if (!man_globals->both_shown) {
XtUnmanageChild(man_globals->manpagewidgets.manpage);
XtManageChild(man_globals->manpagewidgets.directory);
}
}
void
SaveFormattedPage(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals;
char cmdbuf[BUFSIZ], error_buf[BUFSIZ];
if (*num_params != 1) {
XtAppWarning(XtWidgetToApplicationContext(w),
"Xman - SaveFormattedPage: This action routine requires one argument.");
return;
}
man_globals = GetGlobals(w);
if (man_globals->tempfile == '\0') return;
switch (params[0][0]) {
case 'S':
case 's':
#ifndef NO_COMPRESS
if (!man_globals->compress)
#endif
sprintf(cmdbuf, "%s %s %s", COPY, man_globals->tempfile,
man_globals->save_file);
#ifndef NO_COMPRESS
else
if (man_globals->gzip)
sprintf(cmdbuf, "%s < %s > %s", GZIP_COMPRESS, man_globals->tempfile,
man_globals->save_file);
else
sprintf(cmdbuf, "%s < %s > %s", COMPRESS, man_globals->tempfile,
man_globals->save_file);
#endif
if(! system(cmdbuf)) {
if (chmod(man_globals->save_file, CHMOD_MODE) != 0) {
sprintf(error_buf,
"Couldn't set permissions on formatted man page '%s'.\n",
man_globals->save_file);
PopupWarning( man_globals, error_buf);
}
} else {
sprintf(error_buf, "Error while executing the command '%s'.\n",
cmdbuf);
PopupWarning( man_globals, error_buf);
}
break;
case 'C':
case 'c':
break;
default:
sprintf(error_buf,"%s %s", "Xman - SaveFormattedPagee:",
"Unknown argument must be either 'Save' or 'Cancel'.");
PopupWarning(man_globals, error_buf);
return;
}
unlink(man_globals->tempfile);
XtPopdown( XtParent(XtParent(w)) );
}
void
GotoPage(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals;
char error_buf[BUFSIZ];
Arg arglist[1];
Boolean sensitive;
if (*num_params != 1) {
XtAppWarning(XtWidgetToApplicationContext(w),
"Xman - GotoPage: This action routine requires one argument.");
return;
}
man_globals = GetGlobals(w);
if (man_globals->both_shown) {
ChangeLabel(man_globals->label,
man_globals->section_name[man_globals->current_directory]);
return;
}
switch (params[0][0]) {
case 'M':
case 'm':
XtSetArg(arglist[0], XtNsensitive, &sensitive);
XtGetValues(man_globals->manpage_entry, arglist, ONE);
if (sensitive) {
ChangeLabel(man_globals->label,man_globals->manpage_title);
XtUnmanageChild(man_globals->manpagewidgets.directory);
XtManageChild(man_globals->manpagewidgets.manpage);
man_globals->dir_shown = FALSE;
}
break;
case 'D':
case 'd':
ChangeLabel(man_globals->label,
man_globals->section_name[man_globals->current_directory]);
XtUnmanageChild(man_globals->manpagewidgets.manpage);
XtManageChild(man_globals->manpagewidgets.directory);
man_globals->dir_shown = TRUE;
break;
default:
sprintf(error_buf,"%s %s", "Xman - GotoPage: Unknown argument must be",
"either Manpage or Directory.");
XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
return;
}
}
void
Quit(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
XtAppSetExitFlag(XtWidgetToApplicationContext(w));
}
void
PopupHelp(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
if (MakeHelpWidget())
XtPopup(help_widget,XtGrabNone);
}
void
PopupSearch(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals = GetGlobals(w);
if (man_globals->search_widget) {
if (!XtIsRealized(man_globals->search_widget)) {
XtRealizeWidget(man_globals->search_widget);
AddCursor(man_globals->search_widget, resources.cursors.search_entry);
}
Popup(man_globals->search_widget, XtGrabNone);
}
}
void
CreateNewManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
(void) CreateManpage(NULL);
man_pages_shown++;
}
void
RemoveThisManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals = GetGlobals(w);
if (man_globals->This_Manpage != help_widget) {
RemoveGlobals(man_globals->This_Manpage);
XtDestroyWidget(man_globals->This_Manpage);
XtFree( (char *) man_globals->section_name);
XtFree( (char *) man_globals->manpagewidgets.box);
XtFree( (char *) man_globals);
if ( (--man_pages_shown) == 0)
Quit(w, NULL, NULL, NULL);
}
else
XtPopdown(help_widget);
}
void
Search(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals = GetGlobals(w);
FILE * file = NULL;
XtPopdown( XtParent(XtParent(w)) );
if ( (*num_params < 1) || (*num_params > 2) ) {
XtAppWarning(XtWidgetToApplicationContext(w),
"Xman - Search: This action routine requires one or two arguments.");
return;
}
switch(params[0][0]) {
case 'a':
case 'A':
file = DoSearch(man_globals,APROPOS);
break;
case 'm':
case 'M':
file = DoSearch(man_globals,MANUAL);
break;
case 'c':
case 'C':
file = NULL;
break;
default:
XtAppWarning(XtWidgetToApplicationContext(w),
"Xman - Search: First parameter unknown.");
file = NULL;
break;
}
if ( *num_params == 2 )
switch (params[1][0]) {
case 'O':
case 'o':
if (file != NULL) {
Widget w;
char * label;
w = CreateManpage(file);
man_pages_shown++;
label = man_globals->manpage_title;
man_globals = GetGlobals(w);
strcpy(man_globals->manpage_title, label);
ChangeLabel(man_globals->label, label);
}
break;
default:
XtAppWarning(XtWidgetToApplicationContext(w),
"Xman - Search: Second parameter unknown.");
break;
}
else {
PutUpManpage(man_globals, file);
}
if ((file != NULL) && (file != man_globals->curr_file)) {
fclose(file);
}
}
#ifdef INCLUDE_XPRINT_SUPPORT
static void
printshellDestroyXtProc(Widget w, XtPointer client_data, XtPointer callData)
{
ManpageGlobals *mg = GetGlobals(w);
XawPrintDialogClosePrinterConnection(mg->printdialog, False);
}
static void
printOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
{
XawPrintDialogCallbackStruct *pdcs = (XawPrintDialogCallbackStruct *)callData;
Cardinal n;
Arg args[2];
ManpageGlobals *mg = GetGlobals(w);
Widget topwindow = mg->This_Manpage;
FILE *file;
Log(("printOKXtProc: OK.\n"));
n = 0;
XtSetArg(args[n], XtNfile, &file); n++;
XtGetValues(mg->manpagewidgets.manpage, args, n);
Assertion(file != NULL, (("printOKXtProc: file == NULL.\n")));
DoPrintManpage("Xman",
file, topwindow,
pdcs->pdpy, pdcs->pcontext, pdcs->colorspace,
printshellDestroyXtProc,
mg->manpage_title,
pdcs->printToFile?pdcs->printToFileName:NULL);
XtPopdown(mg->printdialog_shell);
}
static void
printCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
{
ManpageGlobals * mg = GetGlobals(w);
Log(("printCancelXtProc: cancel.\n"));
XtPopdown(mg->printdialog_shell);
Log(("destroying print dialog shell...\n"));
XtDestroyWidget(mg->printdialog_shell);
mg->printdialog_shell = NULL;
mg->printdialog = NULL;
Log(("... done\n"));
}
void
PrintThisManpage(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals *mg = GetGlobals(w);
Dimension width, height;
Position x, y;
Widget parent = mg->This_Manpage;
Widget topwindow = mg->This_Manpage;
Log(("print!\n"));
if (!mg->printdialog) {
int n;
Arg args[20];
n = 0;
XtSetArg(args[n], XtNallowShellResize, True); n++;
mg->printdialog_shell = XtCreatePopupShell("printdialogshell",
transientShellWidgetClass,
topwindow, args, n);
n = 0;
mg->printdialog = XtCreateManagedWidget("printdialog", printDialogWidgetClass,
mg->printdialog_shell, args, n);
XtAddCallback(mg->printdialog, XawNOkCallback, printOKXtProc, NULL);
XtAddCallback(mg->printdialog, XawNCancelCallback, printCancelXtProc, NULL);
XtRealizeWidget(mg->printdialog_shell);
}
XtVaGetValues(mg->printdialog_shell,
XtNwidth, &width,
XtNheight, &height,
NULL);
x = (Position)(XWidthOfScreen( XtScreen(parent)) - width) / 2;
y = (Position)(XHeightOfScreen(XtScreen(parent)) - height) / 3;
XtVaSetValues(mg->printdialog_shell,
XtNx, x,
XtNy, y,
NULL);
XtPopup(mg->printdialog_shell, XtGrabNonexclusive);
}
#endif
void
ShowVersion(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals = GetGlobals(w);
ChangeLabel(man_globals->label, XMAN_VERSION);
}