xditview.c revision 65912f00
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
14565912f00Smrgstatic XtActionsRec 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{
21665912f00Smrg    char	    *file_name = NULL;
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);
26365912f00Smrg    menuBar = XtCreateManagedWidget ("menuBar", boxWidgetClass, paned, NULL, 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
31465912f00SmrgDisplayPageNumber (void)
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
36465912f00SmrgNewResolution(char *resString)
365f80a6dcdSmrg{
366f80a6dcdSmrg    int	res;
367f80a6dcdSmrg    Arg	arg[1];
368f80a6dcdSmrg
369f80a6dcdSmrg    res = atoi (resString);
370f80a6dcdSmrg    if (res <= 0)
371f80a6dcdSmrg	return;
372f80a6dcdSmrg    XtSetArg (arg[0], XtNscreenResolution, res);
373f80a6dcdSmrg    XtSetValues (dvi, arg, 1);
374f80a6dcdSmrg}
375f80a6dcdSmrg
376f80a6dcdSmrgstatic void
377f80a6dcdSmrgVisitFile (char *name, Boolean resetPage)
378f80a6dcdSmrg{
379f80a6dcdSmrg    Arg	    arg[3];
380f80a6dcdSmrg    char    *n;
381f80a6dcdSmrg    FILE    *new_file;
382f80a6dcdSmrg    Boolean seek = 0;
383f80a6dcdSmrg    int	    i;
384f80a6dcdSmrg
385f80a6dcdSmrg    if (current_file) {
386f80a6dcdSmrg	if (!strcmp (current_file_name, "-"))
387f80a6dcdSmrg	    ;
388f80a6dcdSmrg	else if (current_file_name[0] == '|')
389f80a6dcdSmrg	    pclose (current_file);
390f80a6dcdSmrg	else
391f80a6dcdSmrg	    fclose (current_file);
392f80a6dcdSmrg    }
393f80a6dcdSmrg    if (!strcmp (name, "-"))
394f80a6dcdSmrg	new_file = stdin;
395f80a6dcdSmrg    else if (name[0] == '|')
396f80a6dcdSmrg	new_file = popen (name+1, "r");
397f80a6dcdSmrg    else {
398f80a6dcdSmrg	new_file = fopen (name, "r");
399f80a6dcdSmrg	seek = 1;
400f80a6dcdSmrg    }
401f80a6dcdSmrg    if (!new_file) {
402f80a6dcdSmrg	/* XXX display error message */
403f80a6dcdSmrg	return;
404f80a6dcdSmrg    }
405f80a6dcdSmrg    i = 0;
406f80a6dcdSmrg    XtSetArg (arg[i], XtNfile, new_file); i++;
407f80a6dcdSmrg    XtSetArg (arg[i], XtNseek, seek); i++;
408f80a6dcdSmrg    if (resetPage) {
409f80a6dcdSmrg	XtSetArg (arg[i], XtNpageNumber, 1); i++;
410f80a6dcdSmrg    }
411f80a6dcdSmrg    XtSetValues (dvi, arg, i);
412f80a6dcdSmrg    XtSetArg (arg[0], XtNtitle, name);
413f80a6dcdSmrg    if (name[0] != '/' && (n = rindex (name, '/')))
414f80a6dcdSmrg	n = n + 1;
415f80a6dcdSmrg    else
416f80a6dcdSmrg	n = name;
417f80a6dcdSmrg    XtSetArg (arg[1], XtNiconName, n);
418f80a6dcdSmrg    XtSetValues (toplevel, arg, 2);
419f80a6dcdSmrg    strcpy (current_file_name, name);
420f80a6dcdSmrg    current_file = new_file;
421f80a6dcdSmrg    DisplayPageNumber ();
422f80a6dcdSmrg}
423f80a6dcdSmrg
424f80a6dcdSmrgstatic void
42565912f00SmrgNewFile (char *name)
426f80a6dcdSmrg{
427f80a6dcdSmrg    VisitFile (name, TRUE);
428f80a6dcdSmrg}
429f80a6dcdSmrg
430f80a6dcdSmrgstatic char fileBuf[1024];
431f80a6dcdSmrgstatic char resolutionBuf[1024];
432f80a6dcdSmrg
433f80a6dcdSmrgstatic void
434f80a6dcdSmrgResetMenuEntry (Widget entry)
435f80a6dcdSmrg{
436f80a6dcdSmrg    Arg	arg[1];
437f80a6dcdSmrg
438f80a6dcdSmrg    XtSetArg (arg[0], XtNpopupOnEntry, entry);
439f80a6dcdSmrg    XtSetValues (XtParent(entry) , arg, (Cardinal) 1);
440f80a6dcdSmrg}
441f80a6dcdSmrg
442f80a6dcdSmrg/*ARGSUSED*/
443f80a6dcdSmrgstatic void
44465912f00SmrgNextPage (Widget entry, XtPointer name, XtPointer data)
445f80a6dcdSmrg{
446f80a6dcdSmrg    NextPageAction(entry, NULL, NULL, NULL);
447f80a6dcdSmrg    ResetMenuEntry (entry);
448f80a6dcdSmrg}
449f80a6dcdSmrg
450f80a6dcdSmrgstatic void
451f80a6dcdSmrgNextPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
452f80a6dcdSmrg{
453f80a6dcdSmrg    Arg	args[1];
454f80a6dcdSmrg    int	number;
455f80a6dcdSmrg
456f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
457f80a6dcdSmrg    XtGetValues (dvi, args, 1);
458f80a6dcdSmrg    SetPageNumber (number+1);
459f80a6dcdSmrg}
460f80a6dcdSmrg
461f80a6dcdSmrg/*ARGSUSED*/
462f80a6dcdSmrgstatic void
46365912f00SmrgPreviousPage (Widget entry, XtPointer name, XtPointer data)
464f80a6dcdSmrg{
465f80a6dcdSmrg    PreviousPageAction (entry, NULL, NULL, NULL);
466f80a6dcdSmrg    ResetMenuEntry (entry);
467f80a6dcdSmrg}
468f80a6dcdSmrg
469f80a6dcdSmrgstatic void
470f80a6dcdSmrgPreviousPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
471f80a6dcdSmrg{
472f80a6dcdSmrg    Arg	args[1];
473f80a6dcdSmrg    int	number;
474f80a6dcdSmrg
475f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
476f80a6dcdSmrg    XtGetValues (dvi, args, 1);
477f80a6dcdSmrg    SetPageNumber (number-1);
478f80a6dcdSmrg}
479f80a6dcdSmrg
480f80a6dcdSmrg/*ARGSUSED*/
481f80a6dcdSmrgstatic void
48265912f00SmrgSetResolution (Widget entry, XtPointer name, XtPointer data)
483f80a6dcdSmrg{
484f80a6dcdSmrg    SetResolutionAction (entry, NULL, NULL, NULL);
485f80a6dcdSmrg    ResetMenuEntry (entry);
486f80a6dcdSmrg}
487f80a6dcdSmrg
488f80a6dcdSmrgstatic void
489f80a6dcdSmrgSetResolutionAction (Widget w, XEvent *xev, String *s, Cardinal *c)
490f80a6dcdSmrg{
491f80a6dcdSmrg    Arg	    args[1];
492f80a6dcdSmrg    int	    cur;
493f80a6dcdSmrg
494f80a6dcdSmrg    XtSetArg (args[0], XtNscreenResolution, &cur);
495f80a6dcdSmrg    XtGetValues (dvi, args, 1);
496f80a6dcdSmrg    sprintf (resolutionBuf, "%d", cur);
497f80a6dcdSmrg    MakePrompt (toplevel, "Screen resolution:", NewResolution, resolutionBuf);
498f80a6dcdSmrg}
499f80a6dcdSmrg
500f80a6dcdSmrg/*ARGSUSED*/
501f80a6dcdSmrgstatic void
50265912f00SmrgOpenFile (Widget entry, XtPointer name, XtPointer data)
503f80a6dcdSmrg{
504f80a6dcdSmrg    OpenFileAction (entry, NULL, NULL, NULL);
505f80a6dcdSmrg    ResetMenuEntry (entry);
506f80a6dcdSmrg}
507f80a6dcdSmrg
508f80a6dcdSmrgstatic void
509f80a6dcdSmrgOpenFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
510f80a6dcdSmrg{
511f80a6dcdSmrg    if (current_file_name[0])
512f80a6dcdSmrg	strcpy (fileBuf, current_file_name);
513f80a6dcdSmrg    else
514f80a6dcdSmrg	fileBuf[0] = '\0';
515f80a6dcdSmrg    MakePrompt (toplevel, "File to open:", NewFile, fileBuf);
516f80a6dcdSmrg}
517f80a6dcdSmrg
518f80a6dcdSmrg/*ARGSUSED*/
519f80a6dcdSmrgstatic void
52065912f00SmrgRevisitFile (Widget entry, XtPointer name, XtPointer data)
521f80a6dcdSmrg{
522f80a6dcdSmrg    RevisitFileAction (entry, NULL, NULL, NULL);
523f80a6dcdSmrg    ResetMenuEntry (entry);
524f80a6dcdSmrg}
525f80a6dcdSmrg
526f80a6dcdSmrgstatic void
527f80a6dcdSmrgRevisitFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
528f80a6dcdSmrg{
529f80a6dcdSmrg    if (current_file_name[0])
530f80a6dcdSmrg	VisitFile (current_file_name, FALSE);
531f80a6dcdSmrg}
532f80a6dcdSmrg
533f80a6dcdSmrg/*ARGSUSED*/
534f80a6dcdSmrgstatic void
53565912f00SmrgQuit (Widget entry, XtPointer closure, XtPointer data)
536f80a6dcdSmrg{
537f80a6dcdSmrg    QuitAction (entry, NULL, NULL, NULL);
538f80a6dcdSmrg}
539f80a6dcdSmrg
540f80a6dcdSmrgstatic void
541f80a6dcdSmrgQuitAction (Widget w, XEvent *xev, String *s, Cardinal *c)
542f80a6dcdSmrg{
543f80a6dcdSmrg    exit (0);
544f80a6dcdSmrg}
545f80a6dcdSmrg
54665912f00Smrgstatic Widget promptShell, promptDialog;
54765912f00Smrgstatic void (*promptfunction)(char *);
548f80a6dcdSmrg
549f80a6dcdSmrg/* ARGSUSED */
550f80a6dcdSmrgstatic
55165912f00Smrgvoid CancelAction (Widget widget, XEvent *event,
55265912f00Smrg		   String *params, Cardinal *num_params)
553f80a6dcdSmrg{
554f80a6dcdSmrg    if (promptShell) {
555f80a6dcdSmrg	XtSetKeyboardFocus(toplevel, (Widget) None);
556f80a6dcdSmrg	XtDestroyWidget(promptShell);
557f80a6dcdSmrg	promptShell = (Widget) 0;
558f80a6dcdSmrg    }
559f80a6dcdSmrg}
560f80a6dcdSmrg
561f80a6dcdSmrg
562f80a6dcdSmrg/* ARGSUSED */
563f80a6dcdSmrgstatic
56465912f00Smrgvoid AcceptAction (Widget widget, XEvent *event,
56565912f00Smrg		   String *params, Cardinal *num_params)
566f80a6dcdSmrg{
567f80a6dcdSmrg    (*promptfunction)(XawDialogGetValueString(promptDialog));
568f80a6dcdSmrg    CancelAction (widget, event, params, num_params);
569f80a6dcdSmrg}
570f80a6dcdSmrg
571f80a6dcdSmrgstatic
572f80a6dcdSmrgvoid Noop (Widget w, XEvent *xev, String *s, Cardinal *c)
573f80a6dcdSmrg{
574f80a6dcdSmrg}
575f80a6dcdSmrg
576f80a6dcdSmrgstatic void
57765912f00SmrgMakePrompt(Widget centerw, char *prompt, void (*func)(char *), char *def)
578f80a6dcdSmrg{
579f80a6dcdSmrg    static Arg dialogArgs[] = {
580f80a6dcdSmrg	{XtNlabel, (XtArgVal) 0},
581f80a6dcdSmrg	{XtNvalue, (XtArgVal) 0},
582f80a6dcdSmrg    };
583f80a6dcdSmrg    Arg valueArgs[1];
584f80a6dcdSmrg    Arg centerArgs[2];
585f80a6dcdSmrg    Position	source_x, source_y;
586f80a6dcdSmrg    Position	dest_x, dest_y;
587f80a6dcdSmrg    Dimension center_width, center_height;
588f80a6dcdSmrg    Dimension prompt_width, prompt_height;
589f80a6dcdSmrg    Widget  valueWidget;
590f80a6dcdSmrg
591f80a6dcdSmrg    CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
592f80a6dcdSmrg    promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass,
593f80a6dcdSmrg				      toplevel, NULL, (Cardinal) 0);
594f80a6dcdSmrg    dialogArgs[0].value = (XtArgVal)prompt;
595f80a6dcdSmrg    dialogArgs[1].value = (XtArgVal)def;
596f80a6dcdSmrg    promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass,
597f80a6dcdSmrg		    promptShell, dialogArgs, XtNumber (dialogArgs));
598f80a6dcdSmrg    XawDialogAddButton(promptDialog, "accept", NULL, NULL);
599f80a6dcdSmrg    XawDialogAddButton(promptDialog, "cancel", NULL, NULL);
600f80a6dcdSmrg    valueWidget = XtNameToWidget (promptDialog, "value");
601f80a6dcdSmrg    if (valueWidget) {
602f80a6dcdSmrg    	XtSetArg (valueArgs[0], XtNresizable, TRUE);
603f80a6dcdSmrg    	XtSetValues (valueWidget, valueArgs, 1);
604f80a6dcdSmrg	/*
605f80a6dcdSmrg	 * as resizable isn't set until just above, the
606f80a6dcdSmrg	 * default value will be displayed incorrectly.
607f80a6dcdSmrg	 * rectify the situation by resetting the values
608f80a6dcdSmrg	 */
609f80a6dcdSmrg        XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs));
610f80a6dcdSmrg    }
611f80a6dcdSmrg    XtSetKeyboardFocus (promptDialog, valueWidget);
612f80a6dcdSmrg    XtSetKeyboardFocus (toplevel, valueWidget);
613f80a6dcdSmrg    XtRealizeWidget (promptShell);
614f80a6dcdSmrg    /*
615f80a6dcdSmrg     * place the widget in the center of the "parent"
616f80a6dcdSmrg     */
617f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &center_width);
618f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &center_height);
619f80a6dcdSmrg    XtGetValues (centerw, centerArgs, 2);
620f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &prompt_width);
621f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &prompt_height);
622f80a6dcdSmrg    XtGetValues (promptShell, centerArgs, 2);
623f80a6dcdSmrg    source_x = (int)(center_width - prompt_width) / 2;
624f80a6dcdSmrg    source_y = (int)(center_height - prompt_height) / 3;
625f80a6dcdSmrg    XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y);
626f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNx, dest_x);
627f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNy, dest_y);
628f80a6dcdSmrg    XtSetValues (promptShell, centerArgs, 2);
629f80a6dcdSmrg    XtMapWidget(promptShell);
630f80a6dcdSmrg    promptfunction = func;
631f80a6dcdSmrg}
632