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