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