#include "globals.h"
#include "vendor.h"
#include "icon_open.h"
#include "icon_help.h"
#include "iconclosed.h"
static void CreateOptionMenu(ManpageGlobals * man_globals, Widget parent);
static void CreateSectionMenu(ManpageGlobals * man_globals, Widget parent);
static void StartManpage(ManpageGlobals * man_globals, Boolean help, Boolean page);
static Widget * ConvertNamesToWidgets(Widget parent, char ** names);
#define TOPARGS 5
extern Atom wm_delete_window;
Widget top;
void
MakeTopBox(void)
{
Widget form, command, label;
Arg arglist[TOPARGS];
Cardinal num_args = 0;
ManpageGlobals * man_globals;
static char * full_size[] = {
"topLabel", MANPAGE_BUTTON, NULL
};
static char * half_size[] = {
HELP_BUTTON, QUIT_BUTTON, NULL
};
num_args = 0;
XtSetArg(arglist[num_args], XtNiconPixmap,
XCreateBitmapFromData( XtDisplay(initial_widget),
XtScreen(initial_widget)->root,
(char *)iconclosed_bits, iconclosed_width,
iconclosed_height));
num_args++;
XtSetArg(arglist[num_args], XtNtitle, resources.title);
num_args++;
XtSetArg(arglist[num_args], XtNiconic, resources.iconic);
num_args++;
top = XtCreatePopupShell(TOPBOXNAME, topLevelShellWidgetClass,
initial_widget, arglist, num_args);
form = XtCreateManagedWidget("form", formWidgetClass, top,
NULL, (Cardinal) 0);
label = XtCreateManagedWidget("topLabel", labelWidgetClass, form,
NULL, (Cardinal) 0);
num_args = 0;
XtSetArg(arglist[num_args], XtNfromVert, label); num_args++;
command = XtCreateManagedWidget(HELP_BUTTON, commandWidgetClass, form,
arglist, num_args);
XtSetArg(arglist[num_args], XtNfromHoriz, command); num_args++;
command = XtCreateManagedWidget(QUIT_BUTTON, commandWidgetClass, form,
arglist, num_args);
num_args = 0;
XtSetArg(arglist[num_args], XtNfromVert, command); num_args++;
command = XtCreateManagedWidget(MANPAGE_BUTTON, commandWidgetClass, form,
arglist, num_args);
help_widget = NULL;
FormUpWidgets(form, full_size, half_size);
XtRealizeWidget(top);
XSetCommand(XtDisplay(top), XtWindow(top), saved_argv, saved_argc);
man_globals = (ManpageGlobals*) XtCalloc(ONE, (Cardinal) sizeof(ManpageGlobals));
MakeSearchWidget(man_globals, top);
MakeSaveWidgets(man_globals, top);
SaveGlobals( (man_globals->This_Manpage = top), man_globals);
XtMapWidget(top);
AddCursor(top, resources.cursors.top);
XtOverrideTranslations
(top, XtParseTranslationTable ("<Message>WM_PROTOCOLS: Quit()"));
(void) XSetWMProtocols (XtDisplay(top), XtWindow(top),
&wm_delete_window, 1);
}
Widget
CreateManpage(FILE * file)
{
ManpageGlobals * man_globals;
man_globals = InitPsuedoGlobals();
CreateManpageWidget(man_globals, MANNAME, TRUE);
if (file == NULL)
StartManpage( man_globals, OpenHelpfile(man_globals), FALSE );
else {
OpenFile(man_globals, file);
StartManpage( man_globals, FALSE, TRUE);
}
return(man_globals->This_Manpage);
}
ManpageGlobals *
InitPsuedoGlobals(void)
{
ManpageGlobals * man_globals;
man_globals = (ManpageGlobals *)XtCalloc(ONE, (Cardinal) sizeof(ManpageGlobals));
if(!man_globals)
return NULL;
man_globals->search_widget = NULL;
man_globals->section_name = (char **) XtMalloc( (Cardinal) (sections *
sizeof(char *)));
man_globals->manpagewidgets.box = (Widget *) XtCalloc( (Cardinal) sections,
(Cardinal) sizeof(Widget));
man_globals->both_shown = resources.both_shown_initial;
return(man_globals);
}
#define MANPAGEARGS 10
void
CreateManpageWidget(
ManpageGlobals * man_globals,
char * name,
Boolean full_instance)
{
Arg arglist[MANPAGEARGS];
Cardinal num_args;
Widget mytop, pane, hpane, mysections;
ManPageWidgets * mpw = &(man_globals->manpagewidgets);
num_args = (Cardinal) 0;
XtSetArg(arglist[num_args], XtNwidth, default_width);
num_args++;
XtSetArg(arglist[num_args], XtNheight, default_height);
num_args++;
mytop = XtCreatePopupShell(name, topLevelShellWidgetClass, initial_widget,
arglist, num_args);
man_globals->This_Manpage = mytop;
num_args = 0;
if (full_instance)
XtSetArg(arglist[num_args], XtNiconPixmap,
XCreateBitmapFromData( XtDisplay(mytop), XtScreen(mytop)->root,
(char *)icon_open_bits, icon_open_width,
icon_open_height));
else
XtSetArg(arglist[num_args], XtNiconPixmap,
XCreateBitmapFromData( XtDisplay(mytop), XtScreen(mytop)->root,
(char *)icon_help_bits, icon_help_width,
icon_help_height));
num_args++;
XtSetValues(mytop, arglist, num_args);
pane = XtCreateManagedWidget("vertPane", panedWidgetClass, mytop, NULL,
(Cardinal) 0);
hpane = XtCreateManagedWidget("horizPane", panedWidgetClass,
pane, NULL, (Cardinal) 0);
num_args = 0;
XtSetArg(arglist[num_args], XtNmenuName, OPTION_MENU); num_args++;
(void) XtCreateManagedWidget("options", menuButtonWidgetClass,
hpane, arglist, num_args);
CreateOptionMenu(man_globals, mytop);
num_args = 0;
XtSetArg(arglist[num_args], XtNmenuName, SECTION_MENU); num_args++;
mysections = XtCreateManagedWidget("sections", menuButtonWidgetClass,
hpane, arglist, num_args);
XtSetArg(arglist[0], XtNlabel, SHOW_BOTH);
XtSetValues(man_globals->both_screens_entry, arglist, (Cardinal) 1);
if (full_instance) {
MakeSearchWidget(man_globals, mytop);
CreateSectionMenu(man_globals, mytop);
MakeSaveWidgets(man_globals, mytop);
} else {
XtSetSensitive(mysections, FALSE);
XtSetArg(arglist[0], XtNsensitive, FALSE);
XtSetValues(man_globals->dir_entry, arglist, ONE);
XtSetValues(man_globals->manpage_entry, arglist, ONE);
XtSetValues(man_globals->help_entry, arglist, ONE);
XtSetValues(man_globals->search_entry, arglist, ONE);
XtSetValues(man_globals->both_screens_entry, arglist, ONE);
}
#ifdef INCLUDE_XPRINT_SUPPORT
XtSetArg(arglist[0], XtNsensitive, True);
XtSetValues(man_globals->print_entry, arglist, ONE);
#endif
man_globals->label = XtCreateManagedWidget("manualTitle", labelWidgetClass,
hpane, NULL, (Cardinal) 0);
if (full_instance) {
num_args = 0;
XtSetArg(arglist[num_args], XtNallowVert, TRUE);
num_args++;
mpw->directory = XtCreateWidget(DIRECTORY_NAME, viewportWidgetClass,
pane, arglist, num_args);
man_globals->current_directory = INITIAL_DIR;
MakeDirectoryBox(man_globals, mpw->directory,
mpw->box + man_globals->current_directory,
man_globals->current_directory );
XtManageChild(mpw->box[man_globals->current_directory]);
}
mpw->manpage = XtCreateWidget(MANUALPAGE, scrollByLineWidgetClass,
pane, NULL, (Cardinal) 0);
}
static void
StartManpage(ManpageGlobals * man_globals, Boolean help, Boolean page)
{
Widget dir = man_globals->manpagewidgets.directory;
Widget manpage = man_globals->manpagewidgets.manpage;
Widget label = man_globals->label;
Arg arglist[1];
if (page || help) {
if (help)
strcpy(man_globals->manpage_title, "Xman Help");
if (man_globals->both_shown) {
XtManageChild(dir);
man_globals->dir_shown = TRUE;
XtSetArg(arglist[0], XtNpreferredPaneSize, resources.directory_height);
XtSetValues(dir, arglist, (Cardinal) 1);
XtSetArg(arglist[0], XtNsensitive, FALSE);
XtSetValues(man_globals->manpage_entry, arglist, ONE);
XtSetValues(man_globals->dir_entry, arglist, ONE);
XtSetArg(arglist[0], XtNlabel, SHOW_ONE);
XtSetValues(man_globals->both_screens_entry, arglist, ONE);
ChangeLabel(label,
man_globals->section_name[man_globals->current_directory]);
}
else {
ChangeLabel(label,man_globals->manpage_title);
}
XtManageChild(manpage);
man_globals->dir_shown = FALSE;
}
else {
XtManageChild(dir);
man_globals->dir_shown = TRUE;
XtSetArg(arglist[0], XtNsensitive, FALSE);
XtSetValues(man_globals->manpage_entry, arglist, ONE);
XtSetValues(man_globals->help_entry, arglist, ONE);
XtSetValues(man_globals->both_screens_entry, arglist, ONE);
man_globals->both_shown = FALSE;
ChangeLabel(label,
man_globals->section_name[man_globals->current_directory]);
}
XtRealizeWidget( man_globals->This_Manpage );
SaveGlobals( man_globals->This_Manpage, man_globals);
XtMapWidget( man_globals->This_Manpage );
AddCursor( man_globals->This_Manpage, resources.cursors.manpage);
XtSetArg(arglist[0], XtNtransientFor, man_globals->This_Manpage);
XtSetValues(XtParent(man_globals->standby), arglist, (Cardinal)1);
XtSetValues(XtParent(man_globals->save), arglist, (Cardinal) 1);
XtRealizeWidget(XtParent(man_globals->standby));
XtRealizeWidget(XtParent(man_globals->save));
AddCursor( XtParent(man_globals->standby), resources.cursors.top);
AddCursor( XtParent(man_globals->save), resources.cursors.top);
XtOverrideTranslations
(man_globals->This_Manpage,
XtParseTranslationTable ("<Message>WM_PROTOCOLS: RemoveThisManpage()"));
(void) XSetWMProtocols (XtDisplay(man_globals->This_Manpage),
XtWindow(man_globals->This_Manpage),
&wm_delete_window, 1);
}
static void
MenuDestroy(Widget w, XtPointer free_me, XtPointer junk)
{
XtFree( (char *) free_me);
}
static void
CreateOptionMenu(ManpageGlobals * man_globals, Widget parent)
{
Widget menu, entry;
int i;
static char * option_names[] = {
DIRECTORY,
MANPAGE,
HELP,
SEARCH,
BOTH_SCREENS,
REMOVE_MANPAGE,
OPEN_MANPAGE,
#ifdef INCLUDE_XPRINT_SUPPORT
PRINT_MANPAGE,
#endif
SHOW_VERSION,
QUIT
};
menu = XtCreatePopupShell(OPTION_MENU, simpleMenuWidgetClass, parent,
NULL, (Cardinal) 0);
man_globals->option_menu = menu;
for (i = 0 ; i < NUM_OPTIONS ; i++) {
entry = XtCreateManagedWidget(option_names[i], smeBSBObjectClass,
menu, NULL, ZERO);
XtAddCallback(entry, XtNcallback, OptionCallback, (caddr_t) man_globals);
switch (i) {
case 0:
man_globals->dir_entry = entry;
break;
case 1:
man_globals->manpage_entry = entry;
break;
case 2:
man_globals->help_entry = entry;
break;
case 3:
man_globals->search_entry = entry;
break;
case 4:
man_globals->both_screens_entry = entry;
break;
case 5:
man_globals->remove_entry = entry;
break;
case 6:
man_globals->open_entry = entry;
break;
#ifdef INCLUDE_XPRINT_SUPPORT
case 7:
man_globals->print_entry = entry;
break;
case 8:
man_globals->version_entry = entry;
break;
case 9:
man_globals->quit_entry = entry;
break;
#else
case 7:
man_globals->version_entry = entry;
break;
case 8:
man_globals->quit_entry = entry;
break;
#endif
default:
Error(("CreateOptionMenu: Unknown id=%d\n", i));
break;
}
}
#ifdef INCLUDE_XPRINT_SUPPORT
XtVaSetValues(man_globals->print_entry, XtNsensitive, FALSE, NULL);
#endif
}
static void
CreateSectionMenu(ManpageGlobals * man_globals, Widget parent)
{
Widget menu, entry;
int i;
MenuStruct * menu_struct;
Arg args[1];
Cardinal num_args;
char entry_name[BUFSIZ];
menu = XtCreatePopupShell(SECTION_MENU, simpleMenuWidgetClass, parent,
NULL, (Cardinal) 0);
for (i = 0 ; i < sections ; i ++) {
num_args = 0;
XtSetArg(args[num_args], XtNlabel, manual[i].blabel); num_args++;
sprintf(entry_name, "section%d", i);
entry = XtCreateManagedWidget(entry_name, smeBSBObjectClass,
menu, args, num_args);
menu_struct = (MenuStruct *) XtMalloc(sizeof(MenuStruct));
menu_struct->data = (caddr_t) man_globals;
menu_struct->number = i;
XtAddCallback(entry, XtNcallback, DirPopupCallback, (caddr_t) menu_struct);
XtAddCallback(entry, XtNdestroyCallback,MenuDestroy, (caddr_t)menu_struct);
}
}
static char **
CreateList(int section)
{
char ** ret_list, **current;
int count;
ret_list = (char **) XtMalloc( (manual[section].nentries + 1) *
sizeof (char *));
for (current = ret_list, count = 0 ; count < manual[section].nentries ;
count++, current++)
*current = CreateManpageName(manual[section].entries[count], section,
manual[section].flags);
*current = NULL;
return(ret_list);
}
void
MakeDirectoryBox(ManpageGlobals *man_globals, Widget parent, Widget *dir_disp, int section)
{
Arg arglist[10];
Cardinal num_args;
char * name, label_name[BUFSIZ];
if (*dir_disp != NULL)
return;
name = manual[section].blabel;
sprintf(label_name,"Directory of: %s",name);
man_globals->section_name[section] = StrAlloc(label_name);
num_args = 0;
XtSetArg(arglist[num_args], XtNlist, CreateList(section));
num_args++;
XtSetArg(arglist[num_args], XtNfont, resources.fonts.directory);
num_args++;
*dir_disp = XtCreateWidget(DIRECTORY_NAME, listWidgetClass, parent,
arglist, num_args);
XtAddCallback(*dir_disp, XtNcallback,
DirectoryHandler, (caddr_t) man_globals);
}
void
MakeSaveWidgets(ManpageGlobals *man_globals, Widget parent)
{
Widget shell, dialog;
Arg warg[1];
Cardinal n = 0;
if (XtIsRealized(parent)) {
XtSetArg(warg[0], XtNtransientFor, parent); n++;
}
shell = XtCreatePopupShell( "pleaseStandBy", transientShellWidgetClass,
parent, warg, (Cardinal) n);
man_globals->standby = XtCreateManagedWidget("label", labelWidgetClass,
shell, NULL, (Cardinal) 0);
man_globals->save = XtCreatePopupShell("likeToSave",
transientShellWidgetClass,
parent, warg, n);
dialog = XtCreateManagedWidget("dialog", dialogWidgetClass,
man_globals->save, NULL, (Cardinal) 0);
XawDialogAddButton(dialog, FILE_SAVE, NULL, NULL);
XawDialogAddButton(dialog, CANCEL_FILE_SAVE, NULL, NULL);
if (XtIsRealized(parent)) {
XtRealizeWidget(shell);
AddCursor(shell,resources.cursors.top);
XtRealizeWidget(man_globals->save);
AddCursor(man_globals->save, resources.cursors.top);
}
}
void
FormUpWidgets(Widget parent, char ** full_size, char ** half_size)
{
Widget * full_widgets, * half_widgets, *temp, long_widget;
Dimension longest, length, b_width;
int interior_dist;
Arg arglist[2];
full_widgets = ConvertNamesToWidgets(parent, full_size);
half_widgets = ConvertNamesToWidgets(parent, half_size);
long_widget = NULL;
longest = 0;
XtSetArg(arglist[0], XtNwidth, &length);
XtSetArg(arglist[1], XtNborderWidth, &b_width);
for ( temp = full_widgets ; *temp != (Widget) NULL ; temp++) {
XtGetValues(*temp, arglist, (Cardinal) 2);
length += 2 * b_width;
if (length > longest) {
longest = length;
long_widget = *temp;
}
}
if (long_widget == (Widget) NULL) {
PopupWarning(GetGlobals(parent),
"Could not find longest widget, aborting...");
XtFree((char *)full_widgets);
XtFree((char *)half_widgets);
return;
}
for ( temp = full_widgets ; *temp != (Widget) NULL ; temp++ )
if ( long_widget != *temp) {
Dimension width, border_width;
XtSetArg(arglist[0], XtNborderWidth, &border_width);
XtGetValues(*temp, arglist, (Cardinal) 1);
width = longest - 2 * border_width;
XtSetArg(arglist[0], XtNwidth, width);
XtSetValues(*temp, arglist, (Cardinal) 1);
}
XtSetArg(arglist[0], XtNdefaultDistance, &interior_dist);
XtGetValues(parent, arglist, (Cardinal) 1);
for ( temp = half_widgets ; *temp != (Widget) NULL ; temp++) {
Dimension width, border_width;
XtSetArg(arglist[0], XtNborderWidth, &border_width);
XtGetValues(*temp, arglist, (Cardinal) 1);
width = (int)(longest - interior_dist)/2 - 2 * border_width;
XtSetArg(arglist[0], XtNwidth, width);
XtSetValues(*temp, arglist, (Cardinal) 1);
}
XtFree((char *)full_widgets);
XtFree((char *)half_widgets);
}
static Widget *
ConvertNamesToWidgets(Widget parent, char ** names)
{
char ** temp;
Widget * ids, * temp_ids;
int count;
for (count = 0, temp = names; *temp != NULL ; count++, temp++);
ids = (Widget *) XtMalloc( (count + 1) * sizeof(Widget));
for ( temp_ids = ids; *names != NULL ; names++, temp_ids++) {
*temp_ids = XtNameToWidget(parent, *names);
if (*temp_ids == NULL) {
char error_buf[BUFSIZ];
sprintf(error_buf, "Could not find widget named '%s'", *names);
PrintError(error_buf);
XtFree((char *)ids);
return(NULL);
}
}
*temp_ids = (Widget) NULL;
return(ids);
}