#include <sys/types.h>
#include <sys/stat.h>
#include "globals.h"
#include "vendor.h"
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);
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);
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)
{
XCloseDisplay(XtDisplay(w));
exit(0);
}
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)
fclose(file);
}
void
ShowVersion(Widget w, XEvent * event, String * params, Cardinal * num_params)
{
ManpageGlobals * man_globals = GetGlobals(w);
ChangeLabel(man_globals->label, XMAN_VERSION);
}