xmore.c revision 16910e25
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
2816910e25Smrg/* Force ANSI C prototypes from X11 headers */
2916910e25Smrg#ifndef FUNCPROTO
3016910e25Smrg#define FUNCPROTO 15
3116910e25Smrg#endif /* !FUNCPROTO */
3216910e25Smrg
3316910e25Smrg#include <X11/StringDefs.h>
3416910e25Smrg#include <X11/Intrinsic.h>
3516910e25Smrg#include <X11/Shell.h>
3616910e25Smrg#include <X11/Xaw/Form.h>
3716910e25Smrg#include <X11/Xaw/List.h>
3816910e25Smrg#include <X11/Xaw/Command.h>
3916910e25Smrg#include <X11/Xaw/AsciiText.h>
4016910e25Smrg#include <X11/Xaw/Cardinals.h>
4116910e25Smrg
4216910e25Smrg#include "xmore.h"
4316910e25Smrg
4416910e25Smrg#ifdef USE_XPRINT
4516910e25Smrg
4616910e25Smrg#include "printdialog.h"
4716910e25Smrg#include "print.h"
4816910e25Smrg
4916910e25Smrg#endif
5016910e25Smrg
5116910e25Smrg#include <stdlib.h>
5216910e25Smrg#include <stdio.h>
5316910e25Smrg#include <limits.h>
5416910e25Smrg
5516910e25Smrg/* Turn a NULL pointer string into an empty string */
5616910e25Smrg#define NULLSTR(x) (((x)!=NULL)?(x):(""))
5716910e25Smrg
5816910e25Smrg#define Error(x) { printf x ; exit(EXIT_FAILURE); }
5916910e25Smrg#define Assertion(expr, msg) { if (!(expr)) { Error msg } }
6016910e25Smrg#define Log(x)   { if (userOptions.verbose) printf x; }
6116910e25Smrg
6216910e25Smrg/* Global vars */
6316910e25Smrgstatic Widget        printdialog_shell = NULL;
6416910e25Smrgstatic Widget        printdialog       = NULL;
6516910e25Smrgstatic Widget        toplevel          = NULL;
6616910e25Smrgstatic Widget        text              = NULL;
6716910e25Smrgstatic char          printJobNameBuffer[PATH_MAX+256];
6816910e25Smrgstatic const char   *ProgramName;  /* program name   (from argv[0]) */
6916910e25Smrgstatic const char   *viewFileName; /* file to browse (from argv[1]) */
7016910e25Smrg
7116910e25Smrg/* prototypes */
7216910e25Smrgstatic void quitAction(Widget w,  XEvent *event, String *params, Cardinal *num_params);
7316910e25Smrgstatic void quitXtProc(Widget w, XtPointer client_data, XtPointer callData);
7416910e25Smrg#ifdef USE_XPRINT
7516910e25Smrgstatic void printAction(Widget w, XEvent *event, String *params, Cardinal *num_params);
7616910e25Smrgstatic void printXtProc(Widget w, XtPointer client_data, XtPointer callData);
7716910e25Smrg#endif
7816910e25Smrg
7916910e25Smrgstatic XrmOptionDescRec options[] = {
8016910e25Smrg{
8116910e25Smrg  "-v", "*verbose", XrmoptionNoArg, (XPointer) "on" },
8216910e25Smrg};
8316910e25Smrg
8416910e25Smrg
8516910e25Smrgstatic XtActionsRec actions[] = {
8616910e25Smrg    { "quit",          quitAction      },
8716910e25Smrg#ifdef USE_XPRINT
8816910e25Smrg    { "print",         printAction     }
8916910e25Smrg#endif
9016910e25Smrg};
9116910e25Smrg
9216910e25Smrg/* See xmore.h */
9316910e25SmrgXMoreResourceData userOptions;
9416910e25Smrg
9516910e25Smrg#define Offset(field) XtOffsetOf(XMoreResourceData, field)
9616910e25Smrg
9716910e25SmrgXtResource resources[] = {
9816910e25Smrg  {"verbose", "Verbose", XtRBoolean, sizeof(Boolean),  Offset(verbose),  XtRImmediate, (XtPointer)False},
9916910e25Smrg  {"textfont", XtCFont,  XtRFontSet, sizeof(XFontSet), Offset(textfont), XtRString,    STANDARDFONT},
10016910e25Smrg};
10116910e25Smrg
10216910e25Smrg
10316910e25SmrgString fallback_resources[] = {
10416910e25Smrg#ifdef NOTYET
10516910e25Smrg    "*iconPixmap:    xmore32",
10616910e25Smrg    "*iconMask:      xmore32",
10716910e25Smrg#endif /* NOTYET */
10816910e25Smrg    "*textfont: " STANDARDFONT,
10916910e25Smrg    "*international: True", /* set this globally for ALL widgets to avoid wiered crashes */
11016910e25Smrg    "*text.Translations: #override \\n\\"
11116910e25Smrg        "\tCtrl<Key>S:     no-op(RingBell)\\n\\"
11216910e25Smrg        "\tCtrl<Key>R:     no-op(RingBell)\\n\\"
11316910e25Smrg        "\t<Key>space:     next-page()\\n\\"
11416910e25Smrg        "\t<Key>F:         next-page()\\n\\"
11516910e25Smrg        "\tCtrl<Key>B:     previous-page()\\n\\"
11616910e25Smrg        "\t<Key>B:         previous-page()\\n\\"
11716910e25Smrg        "\t<Key>K:         scroll-one-line-down()\\n\\"
11816910e25Smrg        "\t<Key>Y:         scroll-one-line-down()\\n\\"
11916910e25Smrg        "\t<Key>Return:    scroll-one-line-up()\\n\\"
12016910e25Smrg        "\t<Key>J:         scroll-one-line-up()\\n\\"
12116910e25Smrg        "\t<Key>E:         scroll-one-line-up()\\n\\"
12216910e25Smrg        "\t<Key>p:         print()\\n\\"
12316910e25Smrg        "\t<Key>q:         quit()\\n",
12416910e25Smrg    "*text.baseTranslations: #override \\n\\"
12516910e25Smrg        "\t<Key>space:     next-page()\\n\\"
12616910e25Smrg        "\t<Key>F:         next-page()\\n\\"
12716910e25Smrg        "\tCtrl<Key>B:     previous-page()\\n\\"
12816910e25Smrg        "\t<Key>K:         scroll-one-line-down()\\n\\"
12916910e25Smrg        "\t<Key>Y:         scroll-one-line-down()\\n\\"
13016910e25Smrg        "\t<Key>Return:    scroll-one-line-up()\\n\\"
13116910e25Smrg        "\t<Key>J:         scroll-one-line-up()\\n\\"
13216910e25Smrg        "\t<Key>E:         scroll-one-line-up()\\n\\"
13316910e25Smrg        "\t<Key>p:         print()\\n\\"
13416910e25Smrg        "\t<Key>q:         quit()\\n",
13516910e25Smrg    NULL,
13616910e25Smrg};
13716910e25Smrg
13816910e25Smrgstatic void
13916910e25SmrgquitAction(Widget w,  XEvent *event, String *params, Cardinal *num_params)
14016910e25Smrg{
14116910e25Smrg    XtAppSetExitFlag(XtWidgetToApplicationContext(w));
14216910e25Smrg}
14316910e25Smrg
14416910e25Smrgstatic void
14516910e25SmrgquitXtProc(Widget w, XtPointer client_data, XtPointer callData)
14616910e25Smrg{
14716910e25Smrg    XtCallActionProc(w, "quit", NULL, NULL, 0);
14816910e25Smrg}
14916910e25Smrg
15016910e25Smrgstatic void
15116910e25SmrgprintshellDestroyXtProc(Widget w, XtPointer client_data, XtPointer callData)
15216910e25Smrg{
15316910e25Smrg    XawPrintDialogClosePrinterConnection(printdialog, False);
15416910e25Smrg}
15516910e25Smrg
15616910e25Smrg#ifdef USE_XPRINT
15716910e25Smrg
15816910e25Smrgstatic void
15916910e25SmrgprintOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
16016910e25Smrg{
16116910e25Smrg    XawPrintDialogCallbackStruct *pdcs = (XawPrintDialogCallbackStruct *)callData;
16216910e25Smrg    Cardinal                      n;
16316910e25Smrg    Arg                           args[2];
16416910e25Smrg    Widget                        textsource;
16516910e25Smrg
16616910e25Smrg    Log(("printOKXtProc: OK.\n"));
16716910e25Smrg
16816910e25Smrg    /* Get TextSource object */
16916910e25Smrg    n = 0;
17016910e25Smrg    XtSetArg(args[n], XtNtextSource, &textsource); n++;
17116910e25Smrg    XtGetValues(text, args, n);
17216910e25Smrg
17316910e25Smrg    Assertion(textsource != NULL, (("printOKXtProc: textsource == NULL.\n")));
17416910e25Smrg
17516910e25Smrg    /* ||printJobNameBuffer| must live as long the print job prints
17616910e25Smrg     * because it is used for the job title AND the page headers... */
17716910e25Smrg    sprintf(printJobNameBuffer, "XMore print job %s", viewFileName);
17816910e25Smrg
17916910e25Smrg    DoPrintTextSource(ProgramName,
18016910e25Smrg                      textsource, toplevel,
18116910e25Smrg                      pdcs->pdpy, pdcs->pcontext, pdcs->colorspace,
18216910e25Smrg                      printshellDestroyXtProc,
18316910e25Smrg                      printJobNameBuffer,
18416910e25Smrg                      pdcs->printToFile?pdcs->printToFileName:NULL);
18516910e25Smrg
18616910e25Smrg    XtPopdown(printdialog_shell);
18716910e25Smrg}
18816910e25Smrg
18916910e25Smrgstatic void
19016910e25SmrgprintCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
19116910e25Smrg{
19216910e25Smrg    Log(("printCancelXtProc: cancel.\n"));
19316910e25Smrg    XtPopdown(printdialog_shell);
19416910e25Smrg
19516910e25Smrg    Log(("destroying print dialog shell...\n"));
19616910e25Smrg    XtDestroyWidget(printdialog_shell);
19716910e25Smrg    printdialog_shell = NULL;
19816910e25Smrg    printdialog       = NULL;
19916910e25Smrg    Log(("... done\n"));
20016910e25Smrg}
20116910e25Smrg
20216910e25Smrgstatic void
20316910e25SmrgprintXtProc(Widget w, XtPointer client_data, XtPointer callData)
20416910e25Smrg{
20516910e25Smrg    XtCallActionProc(toplevel, "print", NULL, NULL, 0);
20616910e25Smrg}
20716910e25Smrg
20816910e25Smrgstatic void
20916910e25SmrgprintAction(Widget w,  XEvent *event, String *params, Cardinal *num_params)
21016910e25Smrg{
21116910e25Smrg  Dimension   width, height;
21216910e25Smrg  Position    x, y;
21316910e25Smrg  Widget      parent = toplevel;
21416910e25Smrg  Log(("print!\n"));
21516910e25Smrg
21616910e25Smrg  if (!printdialog) {
21716910e25Smrg    int n;
21816910e25Smrg    Arg args[20];
21916910e25Smrg
22016910e25Smrg    n = 0;
22116910e25Smrg    XtSetArg(args[n], XtNallowShellResize, True); n++;
22216910e25Smrg    printdialog_shell = XtCreatePopupShell("printdialogshell",
22316910e25Smrg                                           transientShellWidgetClass,
22416910e25Smrg                                           toplevel, args, n);
22516910e25Smrg    n = 0;
22616910e25Smrg    printdialog = XtCreateManagedWidget("printdialog", printDialogWidgetClass,
22716910e25Smrg                                        printdialog_shell, args, n);
22816910e25Smrg    XtAddCallback(printdialog, XawNOkCallback,     printOKXtProc,     NULL);
22916910e25Smrg    XtAddCallback(printdialog, XawNCancelCallback, printCancelXtProc, NULL);
23016910e25Smrg
23116910e25Smrg    XtRealizeWidget(printdialog_shell);
23216910e25Smrg  }
23316910e25Smrg
23416910e25Smrg  /* Center dialog */
23516910e25Smrg  XtVaGetValues(printdialog_shell,
23616910e25Smrg      XtNwidth,  &width,
23716910e25Smrg      XtNheight, &height,
23816910e25Smrg      NULL);
23916910e25Smrg
24016910e25Smrg  x = (Position)(XWidthOfScreen( XtScreen(parent)) - width)  / 2;
24116910e25Smrg  y = (Position)(XHeightOfScreen(XtScreen(parent)) - height) / 3;
24216910e25Smrg
24316910e25Smrg  XtVaSetValues(printdialog_shell,
24416910e25Smrg      XtNx, x,
24516910e25Smrg      XtNy, y,
24616910e25Smrg      NULL);
24716910e25Smrg
24816910e25Smrg  XtPopup(printdialog_shell, XtGrabNonexclusive);
24916910e25Smrg}
25016910e25Smrg
25116910e25Smrg#endif
25216910e25Smrg
25316910e25Smrgint main( int argc, char *argv[] )
25416910e25Smrg{
25516910e25Smrg  XtAppContext app;
25616910e25Smrg  Widget       form;
25716910e25Smrg  Widget       printbutton;
25816910e25Smrg  Widget       quitbutton;
25916910e25Smrg  int          n;
26016910e25Smrg  Arg          args[8];
26116910e25Smrg
26216910e25Smrg  ProgramName = argv[0];
26316910e25Smrg
26416910e25Smrg  XtSetLanguageProc(NULL, NULL, NULL);
26516910e25Smrg  toplevel = XtOpenApplication(&app, "XMore",
26616910e25Smrg                               options, XtNumber(options),
26716910e25Smrg                               &argc, argv, fallback_resources,
26816910e25Smrg                               sessionShellWidgetClass, NULL, ZERO);
26916910e25Smrg
27016910e25Smrg  if (argc != 2)
27116910e25Smrg  {
27216910e25Smrg    printf("usage: %s [ x options ] filename\n", argv[0]);
27316910e25Smrg    exit(EXIT_FAILURE);
27416910e25Smrg  }
27516910e25Smrg
27616910e25Smrg  XtGetApplicationResources(toplevel, (XtPointer)&userOptions, resources,
27716910e25Smrg                            XtNumber(resources), NULL, 0);
27816910e25Smrg
27916910e25Smrg  XtAppAddActions(app, actions, XtNumber(actions));
28016910e25Smrg
28116910e25Smrg  viewFileName = argv[1];
28216910e25Smrg
28316910e25Smrg  form = XtCreateManagedWidget("form", formWidgetClass, toplevel, NULL, 0);
28416910e25Smrg
28516910e25Smrg  n = 0;
28616910e25Smrg  XtSetArg(args[n], XtNtype,             XawAsciiFile);            n++;
28716910e25Smrg  XtSetArg(args[n], XtNstring,           viewFileName);            n++;
28816910e25Smrg  XtSetArg(args[n], XtNwidth,            700);                     n++;
28916910e25Smrg  XtSetArg(args[n], XtNheight,           300);                     n++;
29016910e25Smrg  XtSetArg(args[n], XtNscrollHorizontal, XawtextScrollAlways);     n++;
29116910e25Smrg  XtSetArg(args[n], XtNscrollVertical,   XawtextScrollAlways);     n++;
29216910e25Smrg  XtSetArg(args[n], XtNfontSet,          userOptions.textfont);    n++;
29316910e25Smrg  text = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, n);
29416910e25Smrg
29516910e25Smrg#ifdef USE_XPRINT
29616910e25Smrg  n = 0;
29716910e25Smrg  XtSetArg(args[n], XtNfromHoriz,       NULL);            n++;
29816910e25Smrg  XtSetArg(args[n], XtNfromVert,        text);            n++;
29916910e25Smrg  XtSetArg(args[n], XtNlabel,           "Print...");      n++;
30016910e25Smrg  printbutton = XtCreateManagedWidget("print", commandWidgetClass, form, args, n);
30116910e25Smrg  XtAddCallback(printbutton, XtNcallback, printXtProc, 0);
30216910e25Smrg#endif
30316910e25Smrg
30416910e25Smrg  n = 0;
30516910e25Smrg  XtSetArg(args[n], XtNfromHoriz,       printbutton);            n++;
30616910e25Smrg  XtSetArg(args[n], XtNfromVert,        text);                   n++;
30716910e25Smrg  XtSetArg(args[n], XtNlabel,           "Quit");      n++;
30816910e25Smrg  quitbutton = XtCreateManagedWidget("quit", commandWidgetClass, form, args, n);
30916910e25Smrg  XtAddCallback(quitbutton, XtNcallback, quitXtProc, 0);
31016910e25Smrg
31116910e25Smrg  printdialog_shell = NULL;
31216910e25Smrg  printdialog       = NULL;
31316910e25Smrg
31416910e25Smrg  XtRealizeWidget(toplevel);
31516910e25Smrg
31616910e25Smrg  XtAppMainLoop(app);
31716910e25Smrg
31816910e25Smrg  return EXIT_SUCCESS;
31916910e25Smrg}
32016910e25Smrg
321