xmore.c revision ed89697e
116910e25Smrg/*
216910e25Smrg * $Xorg: xmore.c,v 1.1 2004/04/30 02:05:54 gisburn Exp $
316910e25Smrg *
416910e25SmrgCopyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
516910e25Smrg
616910e25SmrgPermission to use, copy, modify, distribute, and sell this software and its
716910e25Smrgdocumentation for any purpose is hereby granted without fee, provided that
816910e25Smrgthe above copyright notice appear in all copies and that both that
916910e25Smrgcopyright notice and this permission notice appear in supporting
1016910e25Smrgdocumentation.
1116910e25Smrg
1216910e25SmrgThe above copyright notice and this permission notice shall be included in
1316910e25Smrgall copies or substantial portions of the Software.
1416910e25Smrg
1516910e25SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1616910e25SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1716910e25SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1816910e25SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
1916910e25SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2016910e25SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2116910e25Smrg
2216910e25SmrgExcept as contained in this notice, the name of The Open Group shall not be
2316910e25Smrgused in advertising or otherwise to promote the sale, use or other dealings
2416910e25Smrgin this Software without prior written authorization from The Open Group.
2516910e25Smrg *
2616910e25Smrg */
2716910e25Smrg
28ed89697eSmrg#ifdef HAVE_CONFIG_H
29ed89697eSmrg# include "config.h"
30ed89697eSmrg#endif
31ed89697eSmrg
3216910e25Smrg/* Force ANSI C prototypes from X11 headers */
3316910e25Smrg#ifndef FUNCPROTO
3416910e25Smrg#define FUNCPROTO 15
3516910e25Smrg#endif /* !FUNCPROTO */
3616910e25Smrg
3716910e25Smrg#include <X11/StringDefs.h>
3816910e25Smrg#include <X11/Intrinsic.h>
3916910e25Smrg#include <X11/Shell.h>
4016910e25Smrg#include <X11/Xaw/Form.h>
4116910e25Smrg#include <X11/Xaw/List.h>
4216910e25Smrg#include <X11/Xaw/Command.h>
4316910e25Smrg#include <X11/Xaw/AsciiText.h>
4416910e25Smrg#include <X11/Xaw/Cardinals.h>
4516910e25Smrg
4616910e25Smrg#include "xmore.h"
4716910e25Smrg
4816910e25Smrg#include <stdlib.h>
4916910e25Smrg#include <stdio.h>
5016910e25Smrg#include <limits.h>
5116910e25Smrg
5216910e25Smrg/* Global vars */
5316910e25Smrgstatic Widget        toplevel          = NULL;
5416910e25Smrgstatic Widget        text              = NULL;
5516910e25Smrgstatic const char   *ProgramName;  /* program name   (from argv[0]) */
5616910e25Smrgstatic const char   *viewFileName; /* file to browse (from argv[1]) */
5716910e25Smrg
5816910e25Smrg/* prototypes */
5916910e25Smrgstatic void quitAction(Widget w,  XEvent *event, String *params, Cardinal *num_params);
6016910e25Smrgstatic void quitXtProc(Widget w, XtPointer client_data, XtPointer callData);
6116910e25Smrg
6216910e25Smrgstatic XrmOptionDescRec options[] = {
6316910e25Smrg{
6416910e25Smrg  "-v", "*verbose", XrmoptionNoArg, (XPointer) "on" },
6516910e25Smrg};
6616910e25Smrg
6716910e25Smrg
6816910e25Smrgstatic XtActionsRec actions[] = {
6916910e25Smrg    { "quit",          quitAction      },
7016910e25Smrg};
7116910e25Smrg
7216910e25Smrg/* See xmore.h */
739c125d91Smrgstatic XMoreResourceData userOptions;
7416910e25Smrg
7516910e25Smrg#define Offset(field) XtOffsetOf(XMoreResourceData, field)
7616910e25Smrg
779c125d91Smrgstatic XtResource resources[] = {
7816910e25Smrg  {"verbose", "Verbose", XtRBoolean, sizeof(Boolean),  Offset(verbose),  XtRImmediate, (XtPointer)False},
7916910e25Smrg  {"textfont", XtCFont,  XtRFontSet, sizeof(XFontSet), Offset(textfont), XtRString,    STANDARDFONT},
8016910e25Smrg};
8116910e25Smrg
8216910e25Smrg
839c125d91Smrgstatic String fallback_resources[] = {
8416910e25Smrg#ifdef NOTYET
8516910e25Smrg    "*iconPixmap:    xmore32",
8616910e25Smrg    "*iconMask:      xmore32",
8716910e25Smrg#endif /* NOTYET */
8816910e25Smrg    "*textfont: " STANDARDFONT,
89ed89697eSmrg    "*international: True", /* set this globally for ALL widgets to avoid wierd crashes */
9016910e25Smrg    "*text.Translations: #override \\n\\"
9116910e25Smrg        "\tCtrl<Key>S:     no-op(RingBell)\\n\\"
9216910e25Smrg        "\tCtrl<Key>R:     no-op(RingBell)\\n\\"
9316910e25Smrg        "\t<Key>space:     next-page()\\n\\"
9416910e25Smrg        "\t<Key>F:         next-page()\\n\\"
9516910e25Smrg        "\tCtrl<Key>B:     previous-page()\\n\\"
9616910e25Smrg        "\t<Key>B:         previous-page()\\n\\"
9716910e25Smrg        "\t<Key>K:         scroll-one-line-down()\\n\\"
9816910e25Smrg        "\t<Key>Y:         scroll-one-line-down()\\n\\"
9916910e25Smrg        "\t<Key>Return:    scroll-one-line-up()\\n\\"
10016910e25Smrg        "\t<Key>J:         scroll-one-line-up()\\n\\"
10116910e25Smrg        "\t<Key>E:         scroll-one-line-up()\\n\\"
10216910e25Smrg        "\t<Key>q:         quit()\\n",
10316910e25Smrg    "*text.baseTranslations: #override \\n\\"
10416910e25Smrg        "\t<Key>space:     next-page()\\n\\"
10516910e25Smrg        "\t<Key>F:         next-page()\\n\\"
10616910e25Smrg        "\tCtrl<Key>B:     previous-page()\\n\\"
10716910e25Smrg        "\t<Key>K:         scroll-one-line-down()\\n\\"
10816910e25Smrg        "\t<Key>Y:         scroll-one-line-down()\\n\\"
10916910e25Smrg        "\t<Key>Return:    scroll-one-line-up()\\n\\"
11016910e25Smrg        "\t<Key>J:         scroll-one-line-up()\\n\\"
11116910e25Smrg        "\t<Key>E:         scroll-one-line-up()\\n\\"
11216910e25Smrg        "\t<Key>q:         quit()\\n",
11316910e25Smrg    NULL,
11416910e25Smrg};
11516910e25Smrg
11616910e25Smrgstatic void
117ed89697eSmrgquitAction(Widget w, _X_UNUSED XEvent *event,
118ed89697eSmrg           _X_UNUSED String *params, _X_UNUSED Cardinal *num_params)
11916910e25Smrg{
12016910e25Smrg    XtAppSetExitFlag(XtWidgetToApplicationContext(w));
12116910e25Smrg}
12216910e25Smrg
12316910e25Smrgstatic void
124ed89697eSmrgquitXtProc(Widget w, _X_UNUSED XtPointer client_data,
125ed89697eSmrg           _X_UNUSED XtPointer callData)
12616910e25Smrg{
12716910e25Smrg    XtCallActionProc(w, "quit", NULL, NULL, 0);
12816910e25Smrg}
12916910e25Smrg
130ed89697eSmrg_X_NORETURN _X_COLD
131ed89697eSmrgstatic void
132ed89697eSmrgusage(FILE *out, int exitval)
133ed89697eSmrg{
134ed89697eSmrg  fprintf(out,
135ed89697eSmrg          "usage: %s [ x options ] [-help|-version] filename\n",
136ed89697eSmrg          ProgramName);
137ed89697eSmrg  exit(exitval);
138ed89697eSmrg}
139ed89697eSmrg
14016910e25Smrgint main( int argc, char *argv[] )
14116910e25Smrg{
14216910e25Smrg  XtAppContext app;
14316910e25Smrg  Widget       form;
14416910e25Smrg  Widget       quitbutton;
14516910e25Smrg  int          n;
14616910e25Smrg  Arg          args[8];
14716910e25Smrg
14816910e25Smrg  ProgramName = argv[0];
14916910e25Smrg
150ed89697eSmrg  /* Handle args that don't require opening a display */
151ed89697eSmrg  for (int i = 1; i < argc; i++) {
152ed89697eSmrg    const char *argn = argv[i];
153ed89697eSmrg    /* accept single or double dash for -help & -version */
154ed89697eSmrg    if (argn[0] == '-' && argn[1] == '-') {
155ed89697eSmrg      argn++;
156ed89697eSmrg    }
157ed89697eSmrg    if (strcmp (argn, "-help") == 0) {
158ed89697eSmrg      usage(stdout, EXIT_SUCCESS);
159ed89697eSmrg    }
160ed89697eSmrg    if (strcmp (argn, "-version") == 0) {
161ed89697eSmrg      puts(PACKAGE_STRING);
162ed89697eSmrg      exit(EXIT_SUCCESS);
163ed89697eSmrg    }
164ed89697eSmrg  }
165ed89697eSmrg
16616910e25Smrg  XtSetLanguageProc(NULL, NULL, NULL);
16716910e25Smrg  toplevel = XtOpenApplication(&app, "XMore",
16816910e25Smrg                               options, XtNumber(options),
16916910e25Smrg                               &argc, argv, fallback_resources,
17016910e25Smrg                               sessionShellWidgetClass, NULL, ZERO);
17116910e25Smrg
17216910e25Smrg  if (argc != 2)
17316910e25Smrg  {
174ed89697eSmrg    fputs("Unknown argument(s):", stderr);
175ed89697eSmrg    for (int i = 1; i < argc; i++) {
176ed89697eSmrg      fprintf(stderr, " %s", argv[i]);
177ed89697eSmrg    }
178ed89697eSmrg    fputs("\n\n", stderr);
179ed89697eSmrg    usage(stderr, EXIT_FAILURE);
18016910e25Smrg  }
18116910e25Smrg
18216910e25Smrg  XtGetApplicationResources(toplevel, (XtPointer)&userOptions, resources,
18316910e25Smrg                            XtNumber(resources), NULL, 0);
18416910e25Smrg
18516910e25Smrg  XtAppAddActions(app, actions, XtNumber(actions));
18616910e25Smrg
18716910e25Smrg  viewFileName = argv[1];
18816910e25Smrg
18916910e25Smrg  form = XtCreateManagedWidget("form", formWidgetClass, toplevel, NULL, 0);
19016910e25Smrg
19116910e25Smrg  n = 0;
19216910e25Smrg  XtSetArg(args[n], XtNtype,             XawAsciiFile);            n++;
19316910e25Smrg  XtSetArg(args[n], XtNstring,           viewFileName);            n++;
19416910e25Smrg  XtSetArg(args[n], XtNwidth,            700);                     n++;
19516910e25Smrg  XtSetArg(args[n], XtNheight,           300);                     n++;
19616910e25Smrg  XtSetArg(args[n], XtNscrollHorizontal, XawtextScrollAlways);     n++;
19716910e25Smrg  XtSetArg(args[n], XtNscrollVertical,   XawtextScrollAlways);     n++;
19816910e25Smrg  XtSetArg(args[n], XtNfontSet,          userOptions.textfont);    n++;
19916910e25Smrg  text = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, n);
20016910e25Smrg
20116910e25Smrg  n = 0;
2029c125d91Smrg  XtSetArg(args[n], XtNfromHoriz,       NULL);                   n++;
20316910e25Smrg  XtSetArg(args[n], XtNfromVert,        text);                   n++;
20416910e25Smrg  XtSetArg(args[n], XtNlabel,           "Quit");      n++;
20516910e25Smrg  quitbutton = XtCreateManagedWidget("quit", commandWidgetClass, form, args, n);
2069c125d91Smrg  XtAddCallback(quitbutton, XtNcallback, quitXtProc, NULL);
20716910e25Smrg
20816910e25Smrg  XtRealizeWidget(toplevel);
20916910e25Smrg
21016910e25Smrg  XtAppMainLoop(app);
21116910e25Smrg
21216910e25Smrg  return EXIT_SUCCESS;
21316910e25Smrg}
21416910e25Smrg
215