#ifndef FUNCPROTO
#define FUNCPROTO 15
#endif
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/List.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Cardinals.h>
#include "xmore.h"
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#define NULLSTR(x) (((x)!=NULL)?(x):(""))
#define Error(x) { printf x ; exit(EXIT_FAILURE); }
#define Assertion(expr, msg) { if (!(expr)) { Error msg } }
#define Log(x) { if (userOptions.verbose) printf x; }
static Widget toplevel = NULL;
static Widget text = NULL;
static const char *ProgramName;
static const char *viewFileName;
static void quitAction(Widget w, XEvent *event, String *params, Cardinal *num_params);
static void quitXtProc(Widget w, XtPointer client_data, XtPointer callData);
static XrmOptionDescRec options[] = {
{
"-v", "*verbose", XrmoptionNoArg, (XPointer) "on" },
};
static XtActionsRec actions[] = {
{ "quit", quitAction },
};
XMoreResourceData userOptions;
#define Offset(field) XtOffsetOf(XMoreResourceData, field)
XtResource resources[] = {
{"verbose", "Verbose", XtRBoolean, sizeof(Boolean), Offset(verbose), XtRImmediate, (XtPointer)False},
{"textfont", XtCFont, XtRFontSet, sizeof(XFontSet), Offset(textfont), XtRString, STANDARDFONT},
};
String fallback_resources[] = {
#ifdef NOTYET
"*iconPixmap: xmore32",
"*iconMask: xmore32",
#endif
"*textfont: " STANDARDFONT,
"*international: True",
"*text.Translations: #override \\n\\"
"\tCtrl<Key>S: no-op(RingBell)\\n\\"
"\tCtrl<Key>R: no-op(RingBell)\\n\\"
"\t<Key>space: next-page()\\n\\"
"\t<Key>F: next-page()\\n\\"
"\tCtrl<Key>B: previous-page()\\n\\"
"\t<Key>B: previous-page()\\n\\"
"\t<Key>K: scroll-one-line-down()\\n\\"
"\t<Key>Y: scroll-one-line-down()\\n\\"
"\t<Key>Return: scroll-one-line-up()\\n\\"
"\t<Key>J: scroll-one-line-up()\\n\\"
"\t<Key>E: scroll-one-line-up()\\n\\"
"\t<Key>q: quit()\\n",
"*text.baseTranslations: #override \\n\\"
"\t<Key>space: next-page()\\n\\"
"\t<Key>F: next-page()\\n\\"
"\tCtrl<Key>B: previous-page()\\n\\"
"\t<Key>K: scroll-one-line-down()\\n\\"
"\t<Key>Y: scroll-one-line-down()\\n\\"
"\t<Key>Return: scroll-one-line-up()\\n\\"
"\t<Key>J: scroll-one-line-up()\\n\\"
"\t<Key>E: scroll-one-line-up()\\n\\"
"\t<Key>q: quit()\\n",
NULL,
};
static void
quitAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
XtAppSetExitFlag(XtWidgetToApplicationContext(w));
}
static void
quitXtProc(Widget w, XtPointer client_data, XtPointer callData)
{
XtCallActionProc(w, "quit", NULL, NULL, 0);
}
int main( int argc, char *argv[] )
{
XtAppContext app;
Widget form;
Widget quitbutton;
int n;
Arg args[8];
ProgramName = argv[0];
XtSetLanguageProc(NULL, NULL, NULL);
toplevel = XtOpenApplication(&app, "XMore",
options, XtNumber(options),
&argc, argv, fallback_resources,
sessionShellWidgetClass, NULL, ZERO);
if (argc != 2)
{
printf("usage: %s [ x options ] filename\n", argv[0]);
exit(EXIT_FAILURE);
}
XtGetApplicationResources(toplevel, (XtPointer)&userOptions, resources,
XtNumber(resources), NULL, 0);
XtAppAddActions(app, actions, XtNumber(actions));
viewFileName = argv[1];
form = XtCreateManagedWidget("form", formWidgetClass, toplevel, NULL, 0);
n = 0;
XtSetArg(args[n], XtNtype, XawAsciiFile); n++;
XtSetArg(args[n], XtNstring, viewFileName); n++;
XtSetArg(args[n], XtNwidth, 700); n++;
XtSetArg(args[n], XtNheight, 300); n++;
XtSetArg(args[n], XtNscrollHorizontal, XawtextScrollAlways); n++;
XtSetArg(args[n], XtNscrollVertical, XawtextScrollAlways); n++;
XtSetArg(args[n], XtNfontSet, userOptions.textfont); n++;
text = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, n);
n = 0;
XtSetArg(args[n], XtNfromHoriz, NULL); n++;
XtSetArg(args[n], XtNfromVert, text); n++;
XtSetArg(args[n], XtNlabel, "Quit"); n++;
quitbutton = XtCreateManagedWidget("quit", commandWidgetClass, form, args, n);
XtAddCallback(quitbutton, XtNcallback, quitXtProc, 0);
XtRealizeWidget(toplevel);
XtAppMainLoop(app);
return EXIT_SUCCESS;
}