xditview.c revision c166fba9
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>
60f80a6dcdSmrg
61f80a6dcdSmrg/* Command line options table.  Only resources are entered here...there is a
62f80a6dcdSmrg   pass over the remaining options after XtParseCommand is let loose. */
63f80a6dcdSmrg
64f80a6dcdSmrgstatic XrmOptionDescRec options[] = {
65f80a6dcdSmrg{"-page",	    "*dvi.pageNumber",	    XrmoptionSepArg,	NULL},
66f80a6dcdSmrg{"-backingStore",   "*dvi.backingStore",    XrmoptionSepArg,	NULL},
67f80a6dcdSmrg{"-noPolyText",	    "*dvi.noPolyText",	    XrmoptionNoArg,	"TRUE"},
68f80a6dcdSmrg{"-resolution",	    "*dvi.screenResolution",XrmoptionSepArg,    NULL},
69f80a6dcdSmrg};
70f80a6dcdSmrg
71f80a6dcdSmrgstatic char	current_file_name[1024];
72f80a6dcdSmrgstatic FILE	*current_file;
73f80a6dcdSmrg
74c166fba9Smrgstatic void MakePrompt(Widget, const char *, void (*)(char *), char *);
75f80a6dcdSmrg
76f80a6dcdSmrg/*
77f80a6dcdSmrg * Report the syntax for calling xditview.
78f80a6dcdSmrg */
79f80a6dcdSmrg
80f80a6dcdSmrgstatic void
81c166fba9SmrgSyntax(const char *call)
82f80a6dcdSmrg{
83c166fba9Smrg    (void) printf ("Usage: %s [-fg <color>] [-bg <color>]\n%s\n", call,
84c166fba9Smrg                   "       [-bd <color>] [-bw <pixels>] [-help]\n"
85c166fba9Smrg                   "       [-display displayname] [-geometry geom]\n"
86c166fba9Smrg                   "       [-page <page-number>] [-backing <backing-store>]\n"
87c166fba9Smrg                   "       [-resolution <screen-resolution>]\n");
88c166fba9Smrg    exit(1);
89f80a6dcdSmrg}
90f80a6dcdSmrg
91f80a6dcdSmrgstatic void	NewResolution (char *resString);
92f80a6dcdSmrgstatic void	NewFile (char *name);
93f80a6dcdSmrgstatic void	DisplayPageNumber (void);
94f80a6dcdSmrgstatic void	VisitFile (char *name, Boolean resetPage);
95f80a6dcdSmrgstatic Widget	toplevel, paned, porthole, dvi;
96f80a6dcdSmrgstatic Widget	popupMenu;
97f80a6dcdSmrgstatic Widget	menuBar;
98f80a6dcdSmrgstatic Widget	fileMenuButton, fileMenu;
99f80a6dcdSmrgstatic Widget	pageNumber;
100f80a6dcdSmrg
101f80a6dcdSmrgstatic void	NextPage(Widget entry, XtPointer name, XtPointer data);
102f80a6dcdSmrgstatic void	PreviousPage(Widget entry, XtPointer name, XtPointer data);
103f80a6dcdSmrgstatic void	SetResolution(Widget entry, XtPointer name, XtPointer data);
104f80a6dcdSmrgstatic void	OpenFile(Widget entry, XtPointer name, XtPointer data);
105f80a6dcdSmrgstatic void	RevisitFile(Widget entry, XtPointer name, XtPointer data);
106f80a6dcdSmrgstatic void	Quit(Widget entry, XtPointer closure, XtPointer data);
107f80a6dcdSmrg
108f80a6dcdSmrgstruct menuEntry {
109f80a6dcdSmrg    char    *name;
110f80a6dcdSmrg    void    (*function)(Widget entry, XtPointer name, XtPointer data);
111f80a6dcdSmrg};
112f80a6dcdSmrg
113f80a6dcdSmrgstatic struct menuEntry popupMenuEntries[] = {
114f80a6dcdSmrg    { "nextPage",	    NextPage },
115f80a6dcdSmrg    { "previousPage",	    PreviousPage },
116f80a6dcdSmrg    { "setResolution",	    SetResolution },
117f80a6dcdSmrg    { "openFile",	    OpenFile },
118f80a6dcdSmrg    { "revisitFile",	    RevisitFile },
119f80a6dcdSmrg    { "quit",		    Quit }
120f80a6dcdSmrg};
121f80a6dcdSmrg
122f80a6dcdSmrgstatic struct menuEntry fileMenuEntries[] = {
123f80a6dcdSmrg    { "openFile",	    OpenFile },
124f80a6dcdSmrg    { "revisitFile",	    RevisitFile },
125f80a6dcdSmrg    { "setResolution",	    SetResolution },
126f80a6dcdSmrg    { "quit",		    Quit }
127f80a6dcdSmrg};
128f80a6dcdSmrg
129f80a6dcdSmrgstatic void	NextPageAction(Widget, XEvent *, String *, Cardinal *);
130f80a6dcdSmrgstatic void	PreviousPageAction(Widget, XEvent *, String *, Cardinal *);
131f80a6dcdSmrgstatic void	SetResolutionAction(Widget, XEvent *, String *, Cardinal *);
132f80a6dcdSmrgstatic void	OpenFileAction(Widget, XEvent *, String *, Cardinal *);
133f80a6dcdSmrgstatic void	RevisitFileAction(Widget, XEvent *, String *, Cardinal *);
134f80a6dcdSmrgstatic void	QuitAction(Widget, XEvent *, String *, Cardinal *);
135f80a6dcdSmrgstatic void	AcceptAction(Widget, XEvent *, String *, Cardinal *);
136f80a6dcdSmrgstatic void	CancelAction(Widget, XEvent *, String *, Cardinal *);
137f80a6dcdSmrgstatic void	UpdatePageNumber(Widget, XEvent *, String *, Cardinal *);
138f80a6dcdSmrgstatic void	Noop(Widget, XEvent *, String *, Cardinal *);
139f80a6dcdSmrg
14065912f00Smrgstatic XtActionsRec xditview_actions[] = {
141f80a6dcdSmrg    { "NextPage",	    NextPageAction },
142f80a6dcdSmrg    { "PreviousPage",	    PreviousPageAction },
143f80a6dcdSmrg    { "SetResolution",	    SetResolutionAction },
144f80a6dcdSmrg    { "OpenFile",	    OpenFileAction },
145f80a6dcdSmrg    { "Quit",		    QuitAction },
146f80a6dcdSmrg    { "Accept",		    AcceptAction },
147f80a6dcdSmrg    { "Cancel",		    CancelAction },
148f80a6dcdSmrg    { "SetPageNumber",	    UpdatePageNumber },
149f80a6dcdSmrg    { "Noop",		    Noop }
150f80a6dcdSmrg};
151f80a6dcdSmrg
152f80a6dcdSmrgstatic Atom wm_delete_window;
153f80a6dcdSmrg
154f80a6dcdSmrg
155f80a6dcdSmrgint
156f80a6dcdSmrgmain(int argc, char **argv)
157f80a6dcdSmrg{
15865912f00Smrg    char	    *file_name = NULL;
159f80a6dcdSmrg    int		    i;
160f80a6dcdSmrg    XtAppContext    xtcontext;
161f80a6dcdSmrg    Arg		    topLevelArgs[2];
162f80a6dcdSmrg    Widget          entry;
163f80a6dcdSmrg
164f80a6dcdSmrg    XtSetLanguageProc(NULL, (XtLanguageProc) NULL, NULL);
165f80a6dcdSmrg
166f80a6dcdSmrg    toplevel = XtAppInitialize(&xtcontext, "Xditview",
167f80a6dcdSmrg			       options, XtNumber (options),
168f80a6dcdSmrg			       &argc, argv, NULL, NULL, 0);
169f80a6dcdSmrg    if (argc > 2)
170f80a6dcdSmrg	Syntax(argv[0]);
171f80a6dcdSmrg
172f80a6dcdSmrg    XtAppAddActions(xtcontext, xditview_actions, XtNumber (xditview_actions));
173f80a6dcdSmrg    XtOverrideTranslations
174f80a6dcdSmrg	(toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: Quit()"));
175f80a6dcdSmrg
176f80a6dcdSmrg    XtSetArg (topLevelArgs[0], XtNiconPixmap,
177f80a6dcdSmrg	      XCreateBitmapFromData (XtDisplay (toplevel),
178f80a6dcdSmrg				     XtScreen(toplevel)->root,
179f80a6dcdSmrg				     (char *) xdit_bits,
180f80a6dcdSmrg				     xdit_width, xdit_height));
181f80a6dcdSmrg
182f80a6dcdSmrg    XtSetArg (topLevelArgs[1], XtNiconMask,
183f80a6dcdSmrg	      XCreateBitmapFromData (XtDisplay (toplevel),
184f80a6dcdSmrg				     XtScreen(toplevel)->root,
185f80a6dcdSmrg				     (char *) xdit_mask_bits,
186f80a6dcdSmrg				     xdit_mask_width, xdit_mask_height));
187f80a6dcdSmrg    XtSetValues (toplevel, topLevelArgs, 2);
188f80a6dcdSmrg    if (argc > 1)
189f80a6dcdSmrg	file_name = argv[1];
190f80a6dcdSmrg
191f80a6dcdSmrg    /*
192f80a6dcdSmrg     * create the popup menu and insert the entries
193f80a6dcdSmrg     */
194f80a6dcdSmrg    popupMenu = XtCreatePopupShell ("popupMenu", simpleMenuWidgetClass, toplevel,
195f80a6dcdSmrg				    NULL, 0);
196f80a6dcdSmrg    for (i = 0; i < XtNumber (popupMenuEntries); i++) {
197f80a6dcdSmrg	entry = XtCreateManagedWidget(popupMenuEntries[i].name,
198f80a6dcdSmrg				      smeBSBObjectClass, popupMenu,
199f80a6dcdSmrg				      NULL, (Cardinal) 0);
200f80a6dcdSmrg	XtAddCallback(entry, XtNcallback, popupMenuEntries[i].function, NULL);
201f80a6dcdSmrg    }
202f80a6dcdSmrg
203f80a6dcdSmrg    paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel,
204f80a6dcdSmrg				    NULL, (Cardinal) 0);
20565912f00Smrg    menuBar = XtCreateManagedWidget ("menuBar", boxWidgetClass, paned, NULL, 0);
206f80a6dcdSmrg
207f80a6dcdSmrg    fileMenuButton = XtCreateManagedWidget ("fileMenuButton", menuButtonWidgetClass,
208f80a6dcdSmrg				    menuBar, NULL, (Cardinal) 0);
209f80a6dcdSmrg    fileMenu = XtCreatePopupShell ("fileMenu", simpleMenuWidgetClass,
210f80a6dcdSmrg				    fileMenuButton, NULL, (Cardinal) 0);
211f80a6dcdSmrg    for (i = 0; i < XtNumber (fileMenuEntries); i++) {
212f80a6dcdSmrg	entry = XtCreateManagedWidget(fileMenuEntries[i].name,
213f80a6dcdSmrg				      smeBSBObjectClass, fileMenu,
214f80a6dcdSmrg				      NULL, (Cardinal) 0);
215f80a6dcdSmrg	XtAddCallback (entry, XtNcallback, fileMenuEntries[i].function, NULL);
216f80a6dcdSmrg    }
217f80a6dcdSmrg
218f80a6dcdSmrg    (void) XtCreateManagedWidget ("prevButton", commandWidgetClass,
219f80a6dcdSmrg				  menuBar, NULL, (Cardinal) 0);
220f80a6dcdSmrg
221f80a6dcdSmrg    pageNumber = XtCreateManagedWidget("pageNumber", asciiTextWidgetClass,
222f80a6dcdSmrg					menuBar, NULL, (Cardinal) 0);
223f80a6dcdSmrg
224f80a6dcdSmrg    (void) XtCreateManagedWidget ("nextButton", commandWidgetClass,
225f80a6dcdSmrg				  menuBar, NULL, (Cardinal) 0);
226f80a6dcdSmrg
227f80a6dcdSmrg    porthole = XtCreateManagedWidget ("viewport", viewportWidgetClass,
228f80a6dcdSmrg				      paned, NULL, 0);
229f80a6dcdSmrg    dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, porthole, NULL, 0);
230f80a6dcdSmrg    if (file_name)
231f80a6dcdSmrg	VisitFile (file_name, FALSE);
232f80a6dcdSmrg    XtRealizeWidget (toplevel);
233f80a6dcdSmrg    wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
234f80a6dcdSmrg				   False);
235f80a6dcdSmrg    (void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
236f80a6dcdSmrg                            &wm_delete_window, 1);
237f80a6dcdSmrg    XtAppMainLoop(xtcontext);
238f80a6dcdSmrg
239f80a6dcdSmrg    return 0;
240f80a6dcdSmrg}
241f80a6dcdSmrg
242f80a6dcdSmrgstatic void
24365912f00SmrgDisplayPageNumber (void)
244f80a6dcdSmrg{
245f80a6dcdSmrg    Arg	arg[2];
246f80a6dcdSmrg    int	actual_number, last_page;
247f80a6dcdSmrg    XawTextBlock    text;
248f80a6dcdSmrg    int		    length;
249f80a6dcdSmrg    char	    value[128];
250f80a6dcdSmrg    char	    *cur;
251f80a6dcdSmrg
252f80a6dcdSmrg    XtSetArg (arg[0], XtNpageNumber, &actual_number);
253f80a6dcdSmrg    XtSetArg (arg[1], XtNlastPageNumber, &last_page);
254f80a6dcdSmrg    XtGetValues (dvi, arg, 2);
255f80a6dcdSmrg    if (actual_number == 0)
256c166fba9Smrg	snprintf (value, sizeof(value), "<none>");
257f80a6dcdSmrg    else if (last_page > 0)
258c166fba9Smrg	snprintf (value, sizeof(value), "%d of %d", actual_number, last_page);
259f80a6dcdSmrg    else
260c166fba9Smrg	snprintf (value, sizeof(value), "%d", actual_number);
261f80a6dcdSmrg    text.firstPos = 0;
262f80a6dcdSmrg    text.length = strlen (value);
263f80a6dcdSmrg    text.ptr = value;
264f80a6dcdSmrg    text.format = FMT8BIT;
265f80a6dcdSmrg    XtSetArg (arg[0], XtNstring, &cur);
266f80a6dcdSmrg    XtGetValues (XawTextGetSource (pageNumber), arg, 1);
267f80a6dcdSmrg    length = strlen (cur);
268f80a6dcdSmrg    XawTextReplace (pageNumber, 0, length, &text);
269f80a6dcdSmrg}
270f80a6dcdSmrg
271f80a6dcdSmrgstatic void
272f80a6dcdSmrgSetPageNumber (int number)
273f80a6dcdSmrg{
274f80a6dcdSmrg    Arg	arg[1];
275f80a6dcdSmrg
276f80a6dcdSmrg    XtSetArg (arg[0], XtNpageNumber, number);
277f80a6dcdSmrg    XtSetValues (dvi, arg, 1);
278f80a6dcdSmrg    DisplayPageNumber ();
279f80a6dcdSmrg}
280f80a6dcdSmrg
281f80a6dcdSmrgstatic void
282f80a6dcdSmrgUpdatePageNumber (Widget w, XEvent *xev, String *s, Cardinal *c)
283f80a6dcdSmrg{
284f80a6dcdSmrg    char    *string;
285f80a6dcdSmrg    Arg	    arg[1];
286f80a6dcdSmrg
287f80a6dcdSmrg    XtSetArg (arg[0], XtNstring, &string);
288f80a6dcdSmrg    XtGetValues (XawTextGetSource(pageNumber), arg, 1);
289f80a6dcdSmrg    SetPageNumber (atoi(string));
290f80a6dcdSmrg}
291f80a6dcdSmrg
292f80a6dcdSmrgstatic void
29365912f00SmrgNewResolution(char *resString)
294f80a6dcdSmrg{
295f80a6dcdSmrg    int	res;
296f80a6dcdSmrg    Arg	arg[1];
297f80a6dcdSmrg
298f80a6dcdSmrg    res = atoi (resString);
299f80a6dcdSmrg    if (res <= 0)
300f80a6dcdSmrg	return;
301f80a6dcdSmrg    XtSetArg (arg[0], XtNscreenResolution, res);
302f80a6dcdSmrg    XtSetValues (dvi, arg, 1);
303f80a6dcdSmrg}
304f80a6dcdSmrg
305f80a6dcdSmrgstatic void
306f80a6dcdSmrgVisitFile (char *name, Boolean resetPage)
307f80a6dcdSmrg{
308f80a6dcdSmrg    Arg	    arg[3];
309f80a6dcdSmrg    char    *n;
310f80a6dcdSmrg    FILE    *new_file;
311f80a6dcdSmrg    Boolean seek = 0;
312f80a6dcdSmrg    int	    i;
313f80a6dcdSmrg
314f80a6dcdSmrg    if (current_file) {
315f80a6dcdSmrg	if (!strcmp (current_file_name, "-"))
316f80a6dcdSmrg	    ;
317f80a6dcdSmrg	else if (current_file_name[0] == '|')
318f80a6dcdSmrg	    pclose (current_file);
319f80a6dcdSmrg	else
320f80a6dcdSmrg	    fclose (current_file);
321f80a6dcdSmrg    }
322f80a6dcdSmrg    if (!strcmp (name, "-"))
323f80a6dcdSmrg	new_file = stdin;
324f80a6dcdSmrg    else if (name[0] == '|')
325f80a6dcdSmrg	new_file = popen (name+1, "r");
326f80a6dcdSmrg    else {
327f80a6dcdSmrg	new_file = fopen (name, "r");
328f80a6dcdSmrg	seek = 1;
329f80a6dcdSmrg    }
330f80a6dcdSmrg    if (!new_file) {
331f80a6dcdSmrg	/* XXX display error message */
332f80a6dcdSmrg	return;
333f80a6dcdSmrg    }
334f80a6dcdSmrg    i = 0;
335f80a6dcdSmrg    XtSetArg (arg[i], XtNfile, new_file); i++;
336f80a6dcdSmrg    XtSetArg (arg[i], XtNseek, seek); i++;
337f80a6dcdSmrg    if (resetPage) {
338f80a6dcdSmrg	XtSetArg (arg[i], XtNpageNumber, 1); i++;
339f80a6dcdSmrg    }
340f80a6dcdSmrg    XtSetValues (dvi, arg, i);
341f80a6dcdSmrg    XtSetArg (arg[0], XtNtitle, name);
342f80a6dcdSmrg    if (name[0] != '/' && (n = rindex (name, '/')))
343f80a6dcdSmrg	n = n + 1;
344f80a6dcdSmrg    else
345f80a6dcdSmrg	n = name;
346f80a6dcdSmrg    XtSetArg (arg[1], XtNiconName, n);
347f80a6dcdSmrg    XtSetValues (toplevel, arg, 2);
348f80a6dcdSmrg    strcpy (current_file_name, name);
349f80a6dcdSmrg    current_file = new_file;
350f80a6dcdSmrg    DisplayPageNumber ();
351f80a6dcdSmrg}
352f80a6dcdSmrg
353f80a6dcdSmrgstatic void
35465912f00SmrgNewFile (char *name)
355f80a6dcdSmrg{
356f80a6dcdSmrg    VisitFile (name, TRUE);
357f80a6dcdSmrg}
358f80a6dcdSmrg
359f80a6dcdSmrgstatic char fileBuf[1024];
360f80a6dcdSmrgstatic char resolutionBuf[1024];
361f80a6dcdSmrg
362f80a6dcdSmrgstatic void
363f80a6dcdSmrgResetMenuEntry (Widget entry)
364f80a6dcdSmrg{
365f80a6dcdSmrg    Arg	arg[1];
366f80a6dcdSmrg
367f80a6dcdSmrg    XtSetArg (arg[0], XtNpopupOnEntry, entry);
368f80a6dcdSmrg    XtSetValues (XtParent(entry) , arg, (Cardinal) 1);
369f80a6dcdSmrg}
370f80a6dcdSmrg
371f80a6dcdSmrg/*ARGSUSED*/
372f80a6dcdSmrgstatic void
37365912f00SmrgNextPage (Widget entry, XtPointer name, XtPointer data)
374f80a6dcdSmrg{
375f80a6dcdSmrg    NextPageAction(entry, NULL, NULL, NULL);
376f80a6dcdSmrg    ResetMenuEntry (entry);
377f80a6dcdSmrg}
378f80a6dcdSmrg
379f80a6dcdSmrgstatic void
380f80a6dcdSmrgNextPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
381f80a6dcdSmrg{
382f80a6dcdSmrg    Arg	args[1];
383f80a6dcdSmrg    int	number;
384f80a6dcdSmrg
385f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
386f80a6dcdSmrg    XtGetValues (dvi, args, 1);
387f80a6dcdSmrg    SetPageNumber (number+1);
388f80a6dcdSmrg}
389f80a6dcdSmrg
390f80a6dcdSmrg/*ARGSUSED*/
391f80a6dcdSmrgstatic void
39265912f00SmrgPreviousPage (Widget entry, XtPointer name, XtPointer data)
393f80a6dcdSmrg{
394f80a6dcdSmrg    PreviousPageAction (entry, NULL, NULL, NULL);
395f80a6dcdSmrg    ResetMenuEntry (entry);
396f80a6dcdSmrg}
397f80a6dcdSmrg
398f80a6dcdSmrgstatic void
399f80a6dcdSmrgPreviousPageAction (Widget w, XEvent *xev, String *s, Cardinal *c)
400f80a6dcdSmrg{
401f80a6dcdSmrg    Arg	args[1];
402f80a6dcdSmrg    int	number;
403f80a6dcdSmrg
404f80a6dcdSmrg    XtSetArg (args[0], XtNpageNumber, &number);
405f80a6dcdSmrg    XtGetValues (dvi, args, 1);
406f80a6dcdSmrg    SetPageNumber (number-1);
407f80a6dcdSmrg}
408f80a6dcdSmrg
409f80a6dcdSmrg/*ARGSUSED*/
410f80a6dcdSmrgstatic void
41165912f00SmrgSetResolution (Widget entry, XtPointer name, XtPointer data)
412f80a6dcdSmrg{
413f80a6dcdSmrg    SetResolutionAction (entry, NULL, NULL, NULL);
414f80a6dcdSmrg    ResetMenuEntry (entry);
415f80a6dcdSmrg}
416f80a6dcdSmrg
417f80a6dcdSmrgstatic void
418f80a6dcdSmrgSetResolutionAction (Widget w, XEvent *xev, String *s, Cardinal *c)
419f80a6dcdSmrg{
420f80a6dcdSmrg    Arg	    args[1];
421f80a6dcdSmrg    int	    cur;
422f80a6dcdSmrg
423f80a6dcdSmrg    XtSetArg (args[0], XtNscreenResolution, &cur);
424f80a6dcdSmrg    XtGetValues (dvi, args, 1);
425c166fba9Smrg    snprintf (resolutionBuf, sizeof(resolutionBuf), "%d", cur);
426f80a6dcdSmrg    MakePrompt (toplevel, "Screen resolution:", NewResolution, resolutionBuf);
427f80a6dcdSmrg}
428f80a6dcdSmrg
429f80a6dcdSmrg/*ARGSUSED*/
430f80a6dcdSmrgstatic void
43165912f00SmrgOpenFile (Widget entry, XtPointer name, XtPointer data)
432f80a6dcdSmrg{
433f80a6dcdSmrg    OpenFileAction (entry, NULL, NULL, NULL);
434f80a6dcdSmrg    ResetMenuEntry (entry);
435f80a6dcdSmrg}
436f80a6dcdSmrg
437f80a6dcdSmrgstatic void
438f80a6dcdSmrgOpenFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
439f80a6dcdSmrg{
440f80a6dcdSmrg    if (current_file_name[0])
441f80a6dcdSmrg	strcpy (fileBuf, current_file_name);
442f80a6dcdSmrg    else
443f80a6dcdSmrg	fileBuf[0] = '\0';
444f80a6dcdSmrg    MakePrompt (toplevel, "File to open:", NewFile, fileBuf);
445f80a6dcdSmrg}
446f80a6dcdSmrg
447f80a6dcdSmrg/*ARGSUSED*/
448f80a6dcdSmrgstatic void
44965912f00SmrgRevisitFile (Widget entry, XtPointer name, XtPointer data)
450f80a6dcdSmrg{
451f80a6dcdSmrg    RevisitFileAction (entry, NULL, NULL, NULL);
452f80a6dcdSmrg    ResetMenuEntry (entry);
453f80a6dcdSmrg}
454f80a6dcdSmrg
455f80a6dcdSmrgstatic void
456f80a6dcdSmrgRevisitFileAction (Widget w, XEvent *xev, String *s, Cardinal *c)
457f80a6dcdSmrg{
458f80a6dcdSmrg    if (current_file_name[0])
459f80a6dcdSmrg	VisitFile (current_file_name, FALSE);
460f80a6dcdSmrg}
461f80a6dcdSmrg
462f80a6dcdSmrg/*ARGSUSED*/
463f80a6dcdSmrgstatic void
46465912f00SmrgQuit (Widget entry, XtPointer closure, XtPointer data)
465f80a6dcdSmrg{
466f80a6dcdSmrg    QuitAction (entry, NULL, NULL, NULL);
467f80a6dcdSmrg}
468f80a6dcdSmrg
469f80a6dcdSmrgstatic void
470f80a6dcdSmrgQuitAction (Widget w, XEvent *xev, String *s, Cardinal *c)
471f80a6dcdSmrg{
472f80a6dcdSmrg    exit (0);
473f80a6dcdSmrg}
474f80a6dcdSmrg
47565912f00Smrgstatic Widget promptShell, promptDialog;
47665912f00Smrgstatic void (*promptfunction)(char *);
477f80a6dcdSmrg
478f80a6dcdSmrg/* ARGSUSED */
479f80a6dcdSmrgstatic
48065912f00Smrgvoid CancelAction (Widget widget, XEvent *event,
48165912f00Smrg		   String *params, Cardinal *num_params)
482f80a6dcdSmrg{
483f80a6dcdSmrg    if (promptShell) {
484f80a6dcdSmrg	XtSetKeyboardFocus(toplevel, (Widget) None);
485f80a6dcdSmrg	XtDestroyWidget(promptShell);
486f80a6dcdSmrg	promptShell = (Widget) 0;
487f80a6dcdSmrg    }
488f80a6dcdSmrg}
489f80a6dcdSmrg
490f80a6dcdSmrg
491f80a6dcdSmrg/* ARGSUSED */
492f80a6dcdSmrgstatic
49365912f00Smrgvoid AcceptAction (Widget widget, XEvent *event,
49465912f00Smrg		   String *params, Cardinal *num_params)
495f80a6dcdSmrg{
496f80a6dcdSmrg    (*promptfunction)(XawDialogGetValueString(promptDialog));
497f80a6dcdSmrg    CancelAction (widget, event, params, num_params);
498f80a6dcdSmrg}
499f80a6dcdSmrg
500f80a6dcdSmrgstatic
501f80a6dcdSmrgvoid Noop (Widget w, XEvent *xev, String *s, Cardinal *c)
502f80a6dcdSmrg{
503f80a6dcdSmrg}
504f80a6dcdSmrg
505f80a6dcdSmrgstatic void
506c166fba9SmrgMakePrompt(Widget centerw, const char *prompt, void (*func)(char *), char *def)
507f80a6dcdSmrg{
508f80a6dcdSmrg    static Arg dialogArgs[] = {
509f80a6dcdSmrg	{XtNlabel, (XtArgVal) 0},
510f80a6dcdSmrg	{XtNvalue, (XtArgVal) 0},
511f80a6dcdSmrg    };
512f80a6dcdSmrg    Arg valueArgs[1];
513f80a6dcdSmrg    Arg centerArgs[2];
514f80a6dcdSmrg    Position	source_x, source_y;
515f80a6dcdSmrg    Position	dest_x, dest_y;
516f80a6dcdSmrg    Dimension center_width, center_height;
517f80a6dcdSmrg    Dimension prompt_width, prompt_height;
518f80a6dcdSmrg    Widget  valueWidget;
519f80a6dcdSmrg
520f80a6dcdSmrg    CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
521f80a6dcdSmrg    promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass,
522f80a6dcdSmrg				      toplevel, NULL, (Cardinal) 0);
523f80a6dcdSmrg    dialogArgs[0].value = (XtArgVal)prompt;
524f80a6dcdSmrg    dialogArgs[1].value = (XtArgVal)def;
525f80a6dcdSmrg    promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass,
526f80a6dcdSmrg		    promptShell, dialogArgs, XtNumber (dialogArgs));
527f80a6dcdSmrg    XawDialogAddButton(promptDialog, "accept", NULL, NULL);
528f80a6dcdSmrg    XawDialogAddButton(promptDialog, "cancel", NULL, NULL);
529f80a6dcdSmrg    valueWidget = XtNameToWidget (promptDialog, "value");
530f80a6dcdSmrg    if (valueWidget) {
531f80a6dcdSmrg    	XtSetArg (valueArgs[0], XtNresizable, TRUE);
532f80a6dcdSmrg    	XtSetValues (valueWidget, valueArgs, 1);
533f80a6dcdSmrg	/*
534f80a6dcdSmrg	 * as resizable isn't set until just above, the
535f80a6dcdSmrg	 * default value will be displayed incorrectly.
536f80a6dcdSmrg	 * rectify the situation by resetting the values
537f80a6dcdSmrg	 */
538f80a6dcdSmrg        XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs));
539f80a6dcdSmrg    }
540f80a6dcdSmrg    XtSetKeyboardFocus (promptDialog, valueWidget);
541f80a6dcdSmrg    XtSetKeyboardFocus (toplevel, valueWidget);
542f80a6dcdSmrg    XtRealizeWidget (promptShell);
543f80a6dcdSmrg    /*
544f80a6dcdSmrg     * place the widget in the center of the "parent"
545f80a6dcdSmrg     */
546f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &center_width);
547f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &center_height);
548f80a6dcdSmrg    XtGetValues (centerw, centerArgs, 2);
549f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNwidth, &prompt_width);
550f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNheight, &prompt_height);
551f80a6dcdSmrg    XtGetValues (promptShell, centerArgs, 2);
552f80a6dcdSmrg    source_x = (int)(center_width - prompt_width) / 2;
553f80a6dcdSmrg    source_y = (int)(center_height - prompt_height) / 3;
554f80a6dcdSmrg    XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y);
555f80a6dcdSmrg    XtSetArg (centerArgs[0], XtNx, dest_x);
556f80a6dcdSmrg    XtSetArg (centerArgs[1], XtNy, dest_y);
557f80a6dcdSmrg    XtSetValues (promptShell, centerArgs, 2);
558f80a6dcdSmrg    XtMapWidget(promptShell);
559f80a6dcdSmrg    promptfunction = func;
560f80a6dcdSmrg}
561