xditview.c revision f80a6dcd
1f80a6dcdSmrg/* $XConsortium: xditview.c,v 1.32 94/04/17 20:43:36 eswu Exp $ */
2f80a6dcdSmrg/*
3f80a6dcdSmrg
4f80a6dcdSmrgCopyright (c) 1991  X Consortium
5f80a6dcdSmrg
6f80a6dcdSmrgPermission is hereby granted, free of charge, to any person obtaining
7f80a6dcdSmrga copy of this software and associated documentation files (the
8f80a6dcdSmrg"Software"), to deal in the Software without restriction, including
9f80a6dcdSmrgwithout limitation the rights to use, copy, modify, merge, publish,
10f80a6dcdSmrgdistribute, sublicense, and/or sell copies of the Software, and to
11f80a6dcdSmrgpermit persons to whom the Software is furnished to do so, subject to
12f80a6dcdSmrgthe following conditions:
13f80a6dcdSmrg
14f80a6dcdSmrgThe above copyright notice and this permission notice shall be included
15f80a6dcdSmrgin all copies or substantial portions of the Software.
16f80a6dcdSmrg
17f80a6dcdSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f80a6dcdSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f80a6dcdSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20f80a6dcdSmrgIN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
21f80a6dcdSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22f80a6dcdSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23f80a6dcdSmrgOTHER DEALINGS IN THE SOFTWARE.
24f80a6dcdSmrg
25f80a6dcdSmrgExcept as contained in this notice, the name of the X Consortium shall
26f80a6dcdSmrgnot be used in advertising or otherwise to promote the sale, use or
27f80a6dcdSmrgother dealings in this Software without prior written authorization
28f80a6dcdSmrgfrom the X Consortium.
29f80a6dcdSmrg
30f80a6dcdSmrg*/
31f80a6dcdSmrg/* $XFree86: xc/programs/xditview/xditview.c,v 1.4tsi Exp $ */
32f80a6dcdSmrg/*
33f80a6dcdSmrg * xditview --
34f80a6dcdSmrg *
35f80a6dcdSmrg *   Display ditroff output in an X window
36f80a6dcdSmrg */
37f80a6dcdSmrg
38f80a6dcdSmrg#include <X11/Intrinsic.h>
39f80a6dcdSmrg#include <X11/StringDefs.h>
40f80a6dcdSmrg#include <X11/Xatom.h>
41f80a6dcdSmrg#include <X11/Shell.h>
42f80a6dcdSmrg#include <X11/Xos.h>		/* rindex declaration */
43f80a6dcdSmrg#include <X11/Xaw/Paned.h>
44f80a6dcdSmrg#include <X11/Xaw/Panner.h>
45f80a6dcdSmrg#include <X11/Xaw/Porthole.h>
46f80a6dcdSmrg#include <X11/Xaw/Viewport.h>
47f80a6dcdSmrg#include <X11/Xaw/Box.h>
48f80a6dcdSmrg#include <X11/Xaw/Command.h>
49f80a6dcdSmrg#include <X11/Xaw/Dialog.h>
50f80a6dcdSmrg#include <X11/Xaw/Label.h>
51f80a6dcdSmrg#include <X11/Xaw/MenuButton.h>
52f80a6dcdSmrg#include <X11/Xaw/SimpleMenu.h>
53f80a6dcdSmrg#include <X11/Xaw/SmeBSB.h>
54f80a6dcdSmrg#include <X11/Xaw/AsciiText.h>
55f80a6dcdSmrg
56f80a6dcdSmrg#include "Dvi.h"
57f80a6dcdSmrg
58f80a6dcdSmrg#include "xdit.bm"
59f80a6dcdSmrg#include "xdit_mask.bm"
60f80a6dcdSmrg#include <stdio.h>
61f80a6dcdSmrg#include <stdlib.h>
62f80a6dcdSmrg
63f80a6dcdSmrg/* Command line options table.  Only resources are entered here...there is a
64f80a6dcdSmrg   pass over the remaining options after XtParseCommand is let loose. */
65f80a6dcdSmrg
66f80a6dcdSmrgstatic XrmOptionDescRec options[] = {
67f80a6dcdSmrg{"-page",	    "*dvi.pageNumber",	    XrmoptionSepArg,	NULL},
68f80a6dcdSmrg{"-backingStore",   "*dvi.backingStore",    XrmoptionSepArg,	NULL},
69f80a6dcdSmrg{"-noPolyText",	    "*dvi.noPolyText",	    XrmoptionNoArg,	"TRUE"},
70f80a6dcdSmrg{"-resolution",	    "*dvi.screenResolution",XrmoptionSepArg,    NULL},
71f80a6dcdSmrg};
72f80a6dcdSmrg
73f80a6dcdSmrgstatic char	current_file_name[1024];
74f80a6dcdSmrgstatic FILE	*current_file;
75f80a6dcdSmrg
76f80a6dcdSmrgstatic void MakePrompt(Widget, char *, void (*)(char *), char *);
77f80a6dcdSmrg
78f80a6dcdSmrg/*
79f80a6dcdSmrg * Report the syntax for calling xditview.
80f80a6dcdSmrg */
81f80a6dcdSmrg
82f80a6dcdSmrgstatic void
83f80a6dcdSmrgSyntax(char *call)
84f80a6dcdSmrg{
85f80a6dcdSmrg	(void) printf ("Usage: %s [-fg <color>] [-bg <color>]\n", call);
86f80a6dcdSmrg	(void) printf ("       [-bd <color>] [-bw <pixels>] [-help]\n");
87f80a6dcdSmrg	(void) printf ("       [-display displayname] [-geometry geom]\n");
88f80a6dcdSmrg	(void) printf ("       [-page <page-number>] [-backing <backing-store>]\n");
89f80a6dcdSmrg	(void) printf ("       [-resolution <screen-resolution>]\n\n");
90f80a6dcdSmrg	exit(1);
91f80a6dcdSmrg}
92f80a6dcdSmrg
93f80a6dcdSmrgstatic void	NewResolution (char *resString);
94f80a6dcdSmrgstatic void	NewFile (char *name);
95f80a6dcdSmrgstatic void	DisplayPageNumber (void);
96f80a6dcdSmrgstatic void	VisitFile (char *name, Boolean resetPage);
97f80a6dcdSmrgstatic Widget	toplevel, paned, porthole, dvi;
98f80a6dcdSmrg#ifdef NOTDEF
99f80a6dcdSmrgstatic Widget	form, panner;
100f80a6dcdSmrg#endif
101f80a6dcdSmrgstatic Widget	popupMenu;
102f80a6dcdSmrgstatic Widget	menuBar;
103f80a6dcdSmrgstatic Widget	fileMenuButton, fileMenu;
104f80a6dcdSmrgstatic Widget	pageNumber;
105f80a6dcdSmrg
106f80a6dcdSmrgstatic void	NextPage(Widget entry, XtPointer name, XtPointer data);
107f80a6dcdSmrgstatic void	PreviousPage(Widget entry, XtPointer name, XtPointer data);
108f80a6dcdSmrgstatic void	SetResolution(Widget entry, XtPointer name, XtPointer data);
109f80a6dcdSmrgstatic void	OpenFile(Widget entry, XtPointer name, XtPointer data);
110f80a6dcdSmrgstatic void	RevisitFile(Widget entry, XtPointer name, XtPointer data);
111f80a6dcdSmrgstatic void	Quit(Widget entry, XtPointer closure, XtPointer data);
112f80a6dcdSmrg
113f80a6dcdSmrgstruct menuEntry {
114f80a6dcdSmrg    char    *name;
115f80a6dcdSmrg    void    (*function)(Widget entry, XtPointer name, XtPointer data);
116f80a6dcdSmrg};
117f80a6dcdSmrg
118f80a6dcdSmrgstatic struct menuEntry popupMenuEntries[] = {
119f80a6dcdSmrg    { "nextPage",	    NextPage },
120f80a6dcdSmrg    { "previousPage",	    PreviousPage },
121f80a6dcdSmrg    { "setResolution",	    SetResolution },
122f80a6dcdSmrg    { "openFile",	    OpenFile },
123f80a6dcdSmrg    { "revisitFile",	    RevisitFile },
124f80a6dcdSmrg    { "quit",		    Quit }
125f80a6dcdSmrg};
126f80a6dcdSmrg
127f80a6dcdSmrgstatic struct menuEntry fileMenuEntries[] = {
128f80a6dcdSmrg    { "openFile",	    OpenFile },
129f80a6dcdSmrg    { "revisitFile",	    RevisitFile },
130f80a6dcdSmrg    { "setResolution",	    SetResolution },
131f80a6dcdSmrg    { "quit",		    Quit }
132f80a6dcdSmrg};
133f80a6dcdSmrg
134f80a6dcdSmrgstatic void	NextPageAction(Widget, XEvent *, String *, Cardinal *);
135f80a6dcdSmrgstatic void	PreviousPageAction(Widget, XEvent *, String *, Cardinal *);
136f80a6dcdSmrgstatic void	SetResolutionAction(Widget, XEvent *, String *, Cardinal *);
137f80a6dcdSmrgstatic void	OpenFileAction(Widget, XEvent *, String *, Cardinal *);
138f80a6dcdSmrgstatic void	RevisitFileAction(Widget, XEvent *, String *, Cardinal *);
139f80a6dcdSmrgstatic void	QuitAction(Widget, XEvent *, String *, Cardinal *);
140f80a6dcdSmrgstatic void	AcceptAction(Widget, XEvent *, String *, Cardinal *);
141f80a6dcdSmrgstatic void	CancelAction(Widget, XEvent *, String *, Cardinal *);
142f80a6dcdSmrgstatic void	UpdatePageNumber(Widget, XEvent *, String *, Cardinal *);
143f80a6dcdSmrgstatic void	Noop(Widget, XEvent *, String *, Cardinal *);
144f80a6dcdSmrg
145f80a6dcdSmrgXtActionsRec xditview_actions[] = {
146f80a6dcdSmrg    { "NextPage",	    NextPageAction },
147f80a6dcdSmrg    { "PreviousPage",	    PreviousPageAction },
148f80a6dcdSmrg    { "SetResolution",	    SetResolutionAction },
149f80a6dcdSmrg    { "OpenFile",	    OpenFileAction },
150f80a6dcdSmrg    { "Quit",		    QuitAction },
151f80a6dcdSmrg    { "Accept",		    AcceptAction },
152f80a6dcdSmrg    { "Cancel",		    CancelAction },
153f80a6dcdSmrg    { "SetPageNumber",	    UpdatePageNumber },
154f80a6dcdSmrg    { "Noop",		    Noop }
155f80a6dcdSmrg};
156f80a6dcdSmrg
157f80a6dcdSmrgstatic Atom wm_delete_window;
158f80a6dcdSmrg
159f80a6dcdSmrg#ifdef NOTDEF
160f80a6dcdSmrg/*	Function Name: PannerCallback
161f80a6dcdSmrg *	Description: called when the panner has moved.
162f80a6dcdSmrg *	Arguments: panner - the panner widget.
163f80a6dcdSmrg *                 closure - *** NOT USED ***.
164f80a6dcdSmrg *                 report_ptr - the panner record.
165f80a6dcdSmrg *	Returns: none.
166f80a6dcdSmrg */
167f80a6dcdSmrg
168f80a6dcdSmrg/* ARGSUSED */
169f80a6dcdSmrgstatic void
170f80a6dcdSmrgPannerCallback(Widget w, XtPointer closure, XtPointer report_ptr)
171f80a6dcdSmrg{
172f80a6dcdSmrg    Arg args[2];
173f80a6dcdSmrg    XawPannerReport *report = (XawPannerReport *) report_ptr;
174f80a6dcdSmrg
175f80a6dcdSmrg    if (!dvi)
176f80a6dcdSmrg	return;
177f80a6dcdSmrg    XtSetArg (args[0], XtNx, -report->slider_x);
178f80a6dcdSmrg    XtSetArg (args[1], XtNy, -report->slider_y);
179f80a6dcdSmrg
180f80a6dcdSmrg    XtSetValues(dvi, args, 2);
181f80a6dcdSmrg}
182f80a6dcdSmrg
183f80a6dcdSmrg/*	Function Name: PortholeCallback
184f80a6dcdSmrg *	Description: called when the porthole or its child has
185f80a6dcdSmrg *                   changed
186f80a6dcdSmrg *	Arguments: porthole - the porthole widget.
187f80a6dcdSmrg *                 panner_ptr - the panner widget.
188f80a6dcdSmrg *                 report_ptr - the porthole record.
189f80a6dcdSmrg *	Returns: none.
190f80a6dcdSmrg */
191f80a6dcdSmrg
192f80a6dcdSmrg/* ARGSUSED */
193f80a6dcdSmrgstatic void
194f80a6dcdSmrgPortholeCallback(Widget w, XtPointer panner_ptr, XtPointer report_ptr)
195f80a6dcdSmrg{
196f80a6dcdSmrg    Arg args[10];
197f80a6dcdSmrg    Cardinal n = 0;
198f80a6dcdSmrg    XawPannerReport *report = (XawPannerReport *) report_ptr;
199f80a6dcdSmrg    Widget panner = (Widget) panner_ptr;
200f80a6dcdSmrg
201f80a6dcdSmrg    XtSetArg (args[n], XtNsliderX, report->slider_x); n++;
202f80a6dcdSmrg    XtSetArg (args[n], XtNsliderY, report->slider_y); n++;
203f80a6dcdSmrg    if (report->changed != (XawPRSliderX | XawPRSliderY)) {
204f80a6dcdSmrg	XtSetArg (args[n], XtNsliderWidth, report->slider_width); n++;
205f80a6dcdSmrg	XtSetArg (args[n], XtNsliderHeight, report->slider_height); n++;
206f80a6dcdSmrg	XtSetArg (args[n], XtNcanvasWidth, report->canvas_width); n++;
207f80a6dcdSmrg	XtSetArg (args[n], XtNcanvasHeight, report->canvas_height); n++;
208f80a6dcdSmrg    }
209f80a6dcdSmrg    XtSetValues (panner, args, n);
210f80a6dcdSmrg}
211f80a6dcdSmrg#endif
212f80a6dcdSmrg
213f80a6dcdSmrgint
214f80a6dcdSmrgmain(int argc, char **argv)
215f80a6dcdSmrg{
216f80a6dcdSmrg    char	    *file_name = 0;
217f80a6dcdSmrg    int		    i;
218f80a6dcdSmrg    XtAppContext    xtcontext;
219f80a6dcdSmrg    Arg		    topLevelArgs[2];
220f80a6dcdSmrg    Widget          entry;
221f80a6dcdSmrg
222f80a6dcdSmrg    XtSetLanguageProc(NULL, (XtLanguageProc) NULL, NULL);
223f80a6dcdSmrg
224f80a6dcdSmrg    toplevel = XtAppInitialize(&xtcontext, "Xditview",
225f80a6dcdSmrg			       options, XtNumber (options),
226f80a6dcdSmrg			       &argc, argv, NULL, NULL, 0);
227f80a6dcdSmrg    if (argc > 2)
228f80a6dcdSmrg	Syntax(argv[0]);
229f80a6dcdSmrg
230f80a6dcdSmrg    XtAppAddActions(xtcontext, xditview_actions, XtNumber (xditview_actions));
231f80a6dcdSmrg    XtOverrideTranslations
232f80a6dcdSmrg	(toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: Quit()"));
233f80a6dcdSmrg
234f80a6dcdSmrg    XtSetArg (topLevelArgs[0], XtNiconPixmap,
235f80a6dcdSmrg	      XCreateBitmapFromData (XtDisplay (toplevel),
236f80a6dcdSmrg				     XtScreen(toplevel)->root,
237f80a6dcdSmrg				     (char *) xdit_bits,
238f80a6dcdSmrg				     xdit_width, xdit_height));
239f80a6dcdSmrg
240f80a6dcdSmrg    XtSetArg (topLevelArgs[1], XtNiconMask,
241f80a6dcdSmrg	      XCreateBitmapFromData (XtDisplay (toplevel),
242f80a6dcdSmrg				     XtScreen(toplevel)->root,
243f80a6dcdSmrg				     (char *) xdit_mask_bits,
244f80a6dcdSmrg				     xdit_mask_width, xdit_mask_height));
245f80a6dcdSmrg    XtSetValues (toplevel, topLevelArgs, 2);
246f80a6dcdSmrg    if (argc > 1)
247f80a6dcdSmrg	file_name = argv[1];
248f80a6dcdSmrg
249f80a6dcdSmrg    /*
250f80a6dcdSmrg     * create the popup menu and insert the entries
251f80a6dcdSmrg     */
252f80a6dcdSmrg    popupMenu = XtCreatePopupShell ("popupMenu", simpleMenuWidgetClass, toplevel,
253f80a6dcdSmrg				    NULL, 0);
254f80a6dcdSmrg    for (i = 0; i < XtNumber (popupMenuEntries); i++) {
255f80a6dcdSmrg	entry = XtCreateManagedWidget(popupMenuEntries[i].name,
256f80a6dcdSmrg				      smeBSBObjectClass, popupMenu,
257f80a6dcdSmrg				      NULL, (Cardinal) 0);
258f80a6dcdSmrg	XtAddCallback(entry, XtNcallback, popupMenuEntries[i].function, NULL);
259f80a6dcdSmrg    }
260f80a6dcdSmrg
261f80a6dcdSmrg    paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel,
262f80a6dcdSmrg				    NULL, (Cardinal) 0);
263f80a6dcdSmrg    menuBar = XtCreateManagedWidget ("menuBar", boxWidgetClass, paned, 0, 0);
264f80a6dcdSmrg
265f80a6dcdSmrg    fileMenuButton = XtCreateManagedWidget ("fileMenuButton", menuButtonWidgetClass,
266f80a6dcdSmrg				    menuBar, NULL, (Cardinal) 0);
267f80a6dcdSmrg    fileMenu = XtCreatePopupShell ("fileMenu", simpleMenuWidgetClass,
268f80a6dcdSmrg				    fileMenuButton, NULL, (Cardinal) 0);
269f80a6dcdSmrg    for (i = 0; i < XtNumber (fileMenuEntries); i++) {
270f80a6dcdSmrg	entry = XtCreateManagedWidget(fileMenuEntries[i].name,
271f80a6dcdSmrg				      smeBSBObjectClass, fileMenu,
272f80a6dcdSmrg				      NULL, (Cardinal) 0);
273f80a6dcdSmrg	XtAddCallback (entry, XtNcallback, fileMenuEntries[i].function, NULL);
274f80a6dcdSmrg    }
275f80a6dcdSmrg
276f80a6dcdSmrg    (void) XtCreateManagedWidget ("prevButton", commandWidgetClass,
277f80a6dcdSmrg				  menuBar, NULL, (Cardinal) 0);
278f80a6dcdSmrg
279f80a6dcdSmrg    pageNumber = XtCreateManagedWidget("pageNumber", asciiTextWidgetClass,
280f80a6dcdSmrg					menuBar, NULL, (Cardinal) 0);
281f80a6dcdSmrg
282f80a6dcdSmrg    (void) XtCreateManagedWidget ("nextButton", commandWidgetClass,
283f80a6dcdSmrg				  menuBar, NULL, (Cardinal) 0);
284f80a6dcdSmrg
285f80a6dcdSmrg#ifdef NOTDEF
286f80a6dcdSmrg    form = XtCreateManagedWidget ("form", formWidgetClass, paned,
287f80a6dcdSmrg				    NULL, (Cardinal) 0);
288f80a6dcdSmrg    panner = XtCreateManagedWidget ("panner", pannerWidgetClass,
289f80a6dcdSmrg				    form, NULL, 0);
290f80a6dcdSmrg    porthole = XtCreateManagedWidget ("porthole", portholeWidgetClass,
291f80a6dcdSmrg				      form, NULL, 0);
292f80a6dcdSmrg    XtAddCallback(porthole,
293f80a6dcdSmrg		  XtNreportCallback, PortholeCallback, (XtPointer) panner);
294f80a6dcdSmrg    XtAddCallback(panner,
295f80a6dcdSmrg		  XtNreportCallback, PannerCallback, (XtPointer) porthole);
296f80a6dcdSmrg#else
297f80a6dcdSmrg    porthole = XtCreateManagedWidget ("viewport", viewportWidgetClass,
298f80a6dcdSmrg				      paned, NULL, 0);
299f80a6dcdSmrg#endif
300f80a6dcdSmrg    dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, porthole, NULL, 0);
301f80a6dcdSmrg    if (file_name)
302f80a6dcdSmrg	VisitFile (file_name, FALSE);
303f80a6dcdSmrg    XtRealizeWidget (toplevel);
304f80a6dcdSmrg    wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
305f80a6dcdSmrg				   False);
306f80a6dcdSmrg    (void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
307f80a6dcdSmrg                            &wm_delete_window, 1);
308f80a6dcdSmrg    XtAppMainLoop(xtcontext);
309f80a6dcdSmrg
310f80a6dcdSmrg    return 0;
311f80a6dcdSmrg}
312f80a6dcdSmrg
313f80a6dcdSmrgstatic void
314f80a6dcdSmrgDisplayPageNumber ()
315f80a6dcdSmrg{
316f80a6dcdSmrg    Arg	arg[2];
317f80a6dcdSmrg    int	actual_number, last_page;
318f80a6dcdSmrg    XawTextBlock    text;
319f80a6dcdSmrg    int		    length;
320f80a6dcdSmrg    char	    value[128];
321f80a6dcdSmrg    char	    *cur;
322f80a6dcdSmrg
323f80a6dcdSmrg    XtSetArg (arg[0], XtNpageNumber, &actual_number);
324f80a6dcdSmrg    XtSetArg (arg[1], XtNlastPageNumber, &last_page);
325f80a6dcdSmrg    XtGetValues (dvi, arg, 2);
326f80a6dcdSmrg    if (actual_number == 0)
327f80a6dcdSmrg	sprintf (value, "<none>");
328f80a6dcdSmrg    else if (last_page > 0)
329f80a6dcdSmrg	sprintf (value, "%d of %d", actual_number, last_page);
330f80a6dcdSmrg    else
331f80a6dcdSmrg	sprintf (value, "%d", actual_number);
332f80a6dcdSmrg    text.firstPos = 0;
333f80a6dcdSmrg    text.length = strlen (value);
334f80a6dcdSmrg    text.ptr = value;
335f80a6dcdSmrg    text.format = FMT8BIT;
336f80a6dcdSmrg    XtSetArg (arg[0], XtNstring, &cur);
337f80a6dcdSmrg    XtGetValues (XawTextGetSource (pageNumber), arg, 1);
338f80a6dcdSmrg    length = strlen (cur);
339f80a6dcdSmrg    XawTextReplace (pageNumber, 0, length, &text);
340f80a6dcdSmrg}
341f80a6dcdSmrg
342f80a6dcdSmrgstatic void
343f80a6dcdSmrgSetPageNumber (int number)
344f80a6dcdSmrg{
345f80a6dcdSmrg    Arg	arg[1];
346f80a6dcdSmrg
347f80a6dcdSmrg    XtSetArg (arg[0], XtNpageNumber, number);
348f80a6dcdSmrg    XtSetValues (dvi, arg, 1);
349f80a6dcdSmrg    DisplayPageNumber ();
350f80a6dcdSmrg}
351f80a6dcdSmrg
352f80a6dcdSmrgstatic void
353f80a6dcdSmrgUpdatePageNumber (Widget w, XEvent *xev, String *s, Cardinal *c)
354f80a6dcdSmrg{
355f80a6dcdSmrg    char    *string;
356f80a6dcdSmrg    Arg	    arg[1];
357f80a6dcdSmrg
358f80a6dcdSmrg    XtSetArg (arg[0], XtNstring, &string);
359f80a6dcdSmrg    XtGetValues (XawTextGetSource(pageNumber), arg, 1);
360f80a6dcdSmrg    SetPageNumber (atoi(string));
361f80a6dcdSmrg}
362f80a6dcdSmrg
363f80a6dcdSmrgstatic void
364f80a6dcdSmrgNewResolution(resString)
365f80a6dcdSmrgchar	*resString;
366f80a6dcdSmrg{
367f80a6dcdSmrg    int	res;
368f80a6dcdSmrg    Arg	arg[1];
369f80a6dcdSmrg
370f80a6dcdSmrg    res = atoi (resString);
371f80a6dcdSmrg    if (res <= 0)
372f80a6dcdSmrg	return;
373f80a6dcdSmrg    XtSetArg (arg[0], XtNscreenResolution, res);
374f80a6dcdSmrg    XtSetValues (dvi, arg, 1);
375f80a6dcdSmrg}
376f80a6dcdSmrg
377f80a6dcdSmrgstatic void
378f80a6dcdSmrgVisitFile (char *name, Boolean resetPage)
379f80a6dcdSmrg{
380f80a6dcdSmrg    Arg	    arg[3];
381f80a6dcdSmrg    char    *n;
382f80a6dcdSmrg    FILE    *new_file;
383f80a6dcdSmrg    Boolean seek = 0;
384f80a6dcdSmrg    int	    i;
385f80a6dcdSmrg
386f80a6dcdSmrg    if (current_file) {
387f80a6dcdSmrg	if (!strcmp (current_file_name, "-"))
388f80a6dcdSmrg	    ;
389f80a6dcdSmrg	else if (current_file_name[0] == '|')
390f80a6dcdSmrg	    pclose (current_file);
391f80a6dcdSmrg	else
392f80a6dcdSmrg	    fclose (current_file);
393f80a6dcdSmrg    }
394f80a6dcdSmrg    if (!strcmp (name, "-"))
395f80a6dcdSmrg	new_file = stdin;
396f80a6dcdSmrg    else if (name[0] == '|')
397f80a6dcdSmrg	new_file = popen (name+1, "r");
398f80a6dcdSmrg    else {
399f80a6dcdSmrg	new_file = fopen (name, "r");
400f80a6dcdSmrg	seek = 1;
401f80a6dcdSmrg    }
402f80a6dcdSmrg    if (!new_file) {
403f80a6dcdSmrg	/* XXX display error message */
404f80a6dcdSmrg	return;
405f80a6dcdSmrg    }
406f80a6dcdSmrg    i = 0;
407f80a6dcdSmrg    XtSetArg (arg[i], XtNfile, new_file); i++;
408f80a6dcdSmrg    XtSetArg (arg[i], XtNseek, seek); i++;
409f80a6dcdSmrg    if (resetPage) {
410f80a6dcdSmrg	XtSetArg (arg[i], XtNpageNumber, 1); i++;
411f80a6dcdSmrg    }
412f80a6dcdSmrg    XtSetValues (dvi, arg, i);
413f80a6dcdSmrg    XtSetArg (arg[0], XtNtitle, name);
414f80a6dcdSmrg    if (name[0] != '/' && (n = rindex (name, '/')))
415f80a6dcdSmrg	n = n + 1;
416f80a6dcdSmrg    else
417f80a6dcdSmrg	n = name;
418f80a6dcdSmrg    XtSetArg (arg[1], XtNiconName, n);
419f80a6dcdSmrg    XtSetValues (toplevel, arg, 2);
420f80a6dcdSmrg    strcpy (current_file_name, name);
421f80a6dcdSmrg    current_file = new_file;
422f80a6dcdSmrg    DisplayPageNumber ();
423f80a6dcdSmrg}
424f80a6dcdSmrg
425f80a6dcdSmrgstatic void
426f80a6dcdSmrgNewFile (name)
427f80a6dcdSmrgchar	*name;
428f80a6dcdSmrg{
429f80a6dcdSmrg    VisitFile (name, TRUE);
430f80a6dcdSmrg}
431f80a6dcdSmrg
432f80a6dcdSmrgstatic char fileBuf[1024];
433f80a6dcdSmrgstatic char resolutionBuf[1024];
434f80a6dcdSmrg
435f80a6dcdSmrgstatic void
436f80a6dcdSmrgResetMenuEntry (Widget entry)
437f80a6dcdSmrg{
438f80a6dcdSmrg    Arg	arg[1];
439f80a6dcdSmrg
440f80a6dcdSmrg    XtSetArg (arg[0], XtNpopupOnEntry, entry);
441f80a6dcdSmrg    XtSetValues (XtParent(entry) , arg, (Cardinal) 1);
442f80a6dcdSmrg}
443f80a6dcdSmrg
444f80a6dcdSmrg/*ARGSUSED*/
445f80a6dcdSmrgstatic void
446f80a6dcdSmrgNextPage (entry, name, data)
447f80a6dcdSmrg    Widget  entry;
448f80a6dcdSmrg    XtPointer name, data;
449f80a6dcdSmrg{
450f80a6dcdSmrg    NextPageAction(entry, NULL, NULL, NULL);
451f80a6dcdSmrg    ResetMenuEntry (entry);
452f80a6dcdSmrg}
453f80a6dcdSmrg
454f80a6dcdSmrgstatic void
455f80a6dcdSmrgNextPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
456f80a6dcdSmrg{
457f80a6dcdSmrg    Arg	args[1];
458f80a6dcdSmrg    int	number;
459f80a6dcdSmrg
460f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
461f80a6dcdSmrg    XtGetValues (dvi, args, 1);
462f80a6dcdSmrg    SetPageNumber (number+1);
463f80a6dcdSmrg}
464f80a6dcdSmrg
465f80a6dcdSmrg/*ARGSUSED*/
466f80a6dcdSmrgstatic void
467f80a6dcdSmrgPreviousPage (entry, name, data)
468f80a6dcdSmrg    Widget  entry;
469f80a6dcdSmrg    XtPointer name, data;
470f80a6dcdSmrg{
471f80a6dcdSmrg    PreviousPageAction (entry, NULL, NULL, NULL);
472f80a6dcdSmrg    ResetMenuEntry (entry);
473f80a6dcdSmrg}
474f80a6dcdSmrg
475f80a6dcdSmrgstatic void
476f80a6dcdSmrgPreviousPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
477f80a6dcdSmrg{
478f80a6dcdSmrg    Arg	args[1];
479f80a6dcdSmrg    int	number;
480f80a6dcdSmrg
481f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
482f80a6dcdSmrg    XtGetValues (dvi, args, 1);
483f80a6dcdSmrg    SetPageNumber (number-1);
484f80a6dcdSmrg}
485f80a6dcdSmrg
486f80a6dcdSmrg/*ARGSUSED*/
487f80a6dcdSmrgstatic void
488f80a6dcdSmrgSetResolution (entry, name, data)
489f80a6dcdSmrg    Widget  entry;
490f80a6dcdSmrg    XtPointer name, data;
491f80a6dcdSmrg{
492f80a6dcdSmrg    SetResolutionAction (entry, NULL, NULL, NULL);
493f80a6dcdSmrg    ResetMenuEntry (entry);
494f80a6dcdSmrg}
495f80a6dcdSmrg
496f80a6dcdSmrgstatic void
497f80a6dcdSmrgSetResolutionAction (Widget w, XEvent *xev, String *s, Cardinal *c)
498f80a6dcdSmrg{
499f80a6dcdSmrg    Arg	    args[1];
500f80a6dcdSmrg    int	    cur;
501f80a6dcdSmrg
502f80a6dcdSmrg    XtSetArg (args[0], XtNscreenResolution, &cur);
503f80a6dcdSmrg    XtGetValues (dvi, args, 1);
504f80a6dcdSmrg    sprintf (resolutionBuf, "%d", cur);
505f80a6dcdSmrg    MakePrompt (toplevel, "Screen resolution:", NewResolution, resolutionBuf);
506f80a6dcdSmrg}
507f80a6dcdSmrg
508f80a6dcdSmrg/*ARGSUSED*/
509f80a6dcdSmrgstatic void
510f80a6dcdSmrgOpenFile (entry, name, data)
511f80a6dcdSmrg    Widget  entry;
512f80a6dcdSmrg    XtPointer name, data;
513f80a6dcdSmrg{
514f80a6dcdSmrg    OpenFileAction (entry, NULL, NULL, NULL);
515f80a6dcdSmrg    ResetMenuEntry (entry);
516f80a6dcdSmrg}
517f80a6dcdSmrg
518f80a6dcdSmrgstatic void
519f80a6dcdSmrgOpenFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
520f80a6dcdSmrg{
521f80a6dcdSmrg    if (current_file_name[0])
522f80a6dcdSmrg	strcpy (fileBuf, current_file_name);
523f80a6dcdSmrg    else
524f80a6dcdSmrg	fileBuf[0] = '\0';
525f80a6dcdSmrg    MakePrompt (toplevel, "File to open:", NewFile, fileBuf);
526f80a6dcdSmrg}
527f80a6dcdSmrg
528f80a6dcdSmrg/*ARGSUSED*/
529f80a6dcdSmrgstatic void
530f80a6dcdSmrgRevisitFile (entry, name, data)
531f80a6dcdSmrg    Widget  entry;
532f80a6dcdSmrg    XtPointer name, data;
533f80a6dcdSmrg{
534f80a6dcdSmrg    RevisitFileAction (entry, NULL, NULL, NULL);
535f80a6dcdSmrg    ResetMenuEntry (entry);
536f80a6dcdSmrg}
537f80a6dcdSmrg
538f80a6dcdSmrgstatic void
539f80a6dcdSmrgRevisitFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
540f80a6dcdSmrg{
541f80a6dcdSmrg    if (current_file_name[0])
542f80a6dcdSmrg	VisitFile (current_file_name, FALSE);
543f80a6dcdSmrg}
544f80a6dcdSmrg
545f80a6dcdSmrg/*ARGSUSED*/
546f80a6dcdSmrgstatic void
547f80a6dcdSmrgQuit (entry, closure, data)
548f80a6dcdSmrg    Widget  entry;
549f80a6dcdSmrg    XtPointer closure, data;
550f80a6dcdSmrg{
551f80a6dcdSmrg    QuitAction (entry, NULL, NULL, NULL);
552f80a6dcdSmrg}
553f80a6dcdSmrg
554f80a6dcdSmrgstatic void
555f80a6dcdSmrgQuitAction (Widget w, XEvent *xev, String *s, Cardinal *c)
556f80a6dcdSmrg{
557f80a6dcdSmrg    exit (0);
558f80a6dcdSmrg}
559f80a6dcdSmrg
560f80a6dcdSmrgWidget	promptShell, promptDialog;
561f80a6dcdSmrgvoid	(*promptfunction)(char *);
562f80a6dcdSmrg
563f80a6dcdSmrg/* ARGSUSED */
564f80a6dcdSmrgstatic
565f80a6dcdSmrgvoid CancelAction (widget, event, params, num_params)
566f80a6dcdSmrg    Widget	widget;
567f80a6dcdSmrg    XEvent	*event;
568f80a6dcdSmrg    String	*params;
569f80a6dcdSmrg    Cardinal	*num_params;
570f80a6dcdSmrg{
571f80a6dcdSmrg    if (promptShell) {
572f80a6dcdSmrg	XtSetKeyboardFocus(toplevel, (Widget) None);
573f80a6dcdSmrg	XtDestroyWidget(promptShell);
574f80a6dcdSmrg	promptShell = (Widget) 0;
575f80a6dcdSmrg    }
576f80a6dcdSmrg}
577f80a6dcdSmrg
578f80a6dcdSmrg
579f80a6dcdSmrg/* ARGSUSED */
580f80a6dcdSmrgstatic
581f80a6dcdSmrgvoid AcceptAction (widget, event, params, num_params)
582f80a6dcdSmrg    Widget	widget;
583f80a6dcdSmrg    XEvent	*event;
584f80a6dcdSmrg    String	*params;
585f80a6dcdSmrg    Cardinal	*num_params;
586f80a6dcdSmrg{
587f80a6dcdSmrg    (*promptfunction)(XawDialogGetValueString(promptDialog));
588f80a6dcdSmrg    CancelAction (widget, event, params, num_params);
589f80a6dcdSmrg}
590f80a6dcdSmrg
591f80a6dcdSmrgstatic
592f80a6dcdSmrgvoid Noop (Widget w, XEvent *xev, String *s, Cardinal *c)
593f80a6dcdSmrg{
594f80a6dcdSmrg}
595f80a6dcdSmrg
596f80a6dcdSmrgstatic void
597f80a6dcdSmrgMakePrompt(centerw, prompt, func, def)
598f80a6dcdSmrgWidget	centerw;
599f80a6dcdSmrgchar *prompt;
600f80a6dcdSmrgvoid (*func)(char *);
601f80a6dcdSmrgchar	*def;
602f80a6dcdSmrg{
603f80a6dcdSmrg    static Arg dialogArgs[] = {
604f80a6dcdSmrg	{XtNlabel, (XtArgVal) 0},
605f80a6dcdSmrg	{XtNvalue, (XtArgVal) 0},
606f80a6dcdSmrg    };
607f80a6dcdSmrg    Arg valueArgs[1];
608f80a6dcdSmrg    Arg centerArgs[2];
609f80a6dcdSmrg    Position	source_x, source_y;
610f80a6dcdSmrg    Position	dest_x, dest_y;
611f80a6dcdSmrg    Dimension center_width, center_height;
612f80a6dcdSmrg    Dimension prompt_width, prompt_height;
613f80a6dcdSmrg    Widget  valueWidget;
614f80a6dcdSmrg
615f80a6dcdSmrg    CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
616f80a6dcdSmrg    promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass,
617f80a6dcdSmrg				      toplevel, NULL, (Cardinal) 0);
618f80a6dcdSmrg    dialogArgs[0].value = (XtArgVal)prompt;
619f80a6dcdSmrg    dialogArgs[1].value = (XtArgVal)def;
620f80a6dcdSmrg    promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass,
621f80a6dcdSmrg		    promptShell, dialogArgs, XtNumber (dialogArgs));
622f80a6dcdSmrg    XawDialogAddButton(promptDialog, "accept", NULL, NULL);
623f80a6dcdSmrg    XawDialogAddButton(promptDialog, "cancel", NULL, NULL);
624f80a6dcdSmrg    valueWidget = XtNameToWidget (promptDialog, "value");
625f80a6dcdSmrg    if (valueWidget) {
626f80a6dcdSmrg    	XtSetArg (valueArgs[0], XtNresizable, TRUE);
627f80a6dcdSmrg    	XtSetValues (valueWidget, valueArgs, 1);
628f80a6dcdSmrg	/*
629f80a6dcdSmrg	 * as resizable isn't set until just above, the
630f80a6dcdSmrg	 * default value will be displayed incorrectly.
631f80a6dcdSmrg	 * rectify the situation by resetting the values
632f80a6dcdSmrg	 */
633f80a6dcdSmrg        XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs));
634f80a6dcdSmrg    }
635f80a6dcdSmrg    XtSetKeyboardFocus (promptDialog, valueWidget);
636f80a6dcdSmrg    XtSetKeyboardFocus (toplevel, valueWidget);
637f80a6dcdSmrg    XtRealizeWidget (promptShell);
638f80a6dcdSmrg    /*
639f80a6dcdSmrg     * place the widget in the center of the "parent"
640f80a6dcdSmrg     */
641f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &center_width);
642f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &center_height);
643f80a6dcdSmrg    XtGetValues (centerw, centerArgs, 2);
644f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &prompt_width);
645f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &prompt_height);
646f80a6dcdSmrg    XtGetValues (promptShell, centerArgs, 2);
647f80a6dcdSmrg    source_x = (int)(center_width - prompt_width) / 2;
648f80a6dcdSmrg    source_y = (int)(center_height - prompt_height) / 3;
649f80a6dcdSmrg    XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y);
650f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNx, dest_x);
651f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNy, dest_y);
652f80a6dcdSmrg    XtSetValues (promptShell, centerArgs, 2);
653f80a6dcdSmrg    XtMapWidget(promptShell);
654f80a6dcdSmrg    promptfunction = func;
655f80a6dcdSmrg}
656