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