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, ¢er_width); 565f80a6dcdSmrg XtSetArg (centerArgs[1], XtNheight, ¢er_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