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