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