xditview.c revision 65912f00
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 14565912f00Smrgstatic XtActionsRec 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{ 21665912f00Smrg char *file_name = NULL; 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); 26365912f00Smrg menuBar = XtCreateManagedWidget ("menuBar", boxWidgetClass, paned, NULL, 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 31465912f00SmrgDisplayPageNumber (void) 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 36465912f00SmrgNewResolution(char *resString) 365f80a6dcdSmrg{ 366f80a6dcdSmrg int res; 367f80a6dcdSmrg Arg arg[1]; 368f80a6dcdSmrg 369f80a6dcdSmrg res = atoi (resString); 370f80a6dcdSmrg if (res <= 0) 371f80a6dcdSmrg return; 372f80a6dcdSmrg XtSetArg (arg[0], XtNscreenResolution, res); 373f80a6dcdSmrg XtSetValues (dvi, arg, 1); 374f80a6dcdSmrg} 375f80a6dcdSmrg 376f80a6dcdSmrgstatic void 377f80a6dcdSmrgVisitFile (char *name, Boolean resetPage) 378f80a6dcdSmrg{ 379f80a6dcdSmrg Arg arg[3]; 380f80a6dcdSmrg char *n; 381f80a6dcdSmrg FILE *new_file; 382f80a6dcdSmrg Boolean seek = 0; 383f80a6dcdSmrg int i; 384f80a6dcdSmrg 385f80a6dcdSmrg if (current_file) { 386f80a6dcdSmrg if (!strcmp (current_file_name, "-")) 387f80a6dcdSmrg ; 388f80a6dcdSmrg else if (current_file_name[0] == '|') 389f80a6dcdSmrg pclose (current_file); 390f80a6dcdSmrg else 391f80a6dcdSmrg fclose (current_file); 392f80a6dcdSmrg } 393f80a6dcdSmrg if (!strcmp (name, "-")) 394f80a6dcdSmrg new_file = stdin; 395f80a6dcdSmrg else if (name[0] == '|') 396f80a6dcdSmrg new_file = popen (name+1, "r"); 397f80a6dcdSmrg else { 398f80a6dcdSmrg new_file = fopen (name, "r"); 399f80a6dcdSmrg seek = 1; 400f80a6dcdSmrg } 401f80a6dcdSmrg if (!new_file) { 402f80a6dcdSmrg /* XXX display error message */ 403f80a6dcdSmrg return; 404f80a6dcdSmrg } 405f80a6dcdSmrg i = 0; 406f80a6dcdSmrg XtSetArg (arg[i], XtNfile, new_file); i++; 407f80a6dcdSmrg XtSetArg (arg[i], XtNseek, seek); i++; 408f80a6dcdSmrg if (resetPage) { 409f80a6dcdSmrg XtSetArg (arg[i], XtNpageNumber, 1); i++; 410f80a6dcdSmrg } 411f80a6dcdSmrg XtSetValues (dvi, arg, i); 412f80a6dcdSmrg XtSetArg (arg[0], XtNtitle, name); 413f80a6dcdSmrg if (name[0] != '/' && (n = rindex (name, '/'))) 414f80a6dcdSmrg n = n + 1; 415f80a6dcdSmrg else 416f80a6dcdSmrg n = name; 417f80a6dcdSmrg XtSetArg (arg[1], XtNiconName, n); 418f80a6dcdSmrg XtSetValues (toplevel, arg, 2); 419f80a6dcdSmrg strcpy (current_file_name, name); 420f80a6dcdSmrg current_file = new_file; 421f80a6dcdSmrg DisplayPageNumber (); 422f80a6dcdSmrg} 423f80a6dcdSmrg 424f80a6dcdSmrgstatic void 42565912f00SmrgNewFile (char *name) 426f80a6dcdSmrg{ 427f80a6dcdSmrg VisitFile (name, TRUE); 428f80a6dcdSmrg} 429f80a6dcdSmrg 430f80a6dcdSmrgstatic char fileBuf[1024]; 431f80a6dcdSmrgstatic char resolutionBuf[1024]; 432f80a6dcdSmrg 433f80a6dcdSmrgstatic void 434f80a6dcdSmrgResetMenuEntry (Widget entry) 435f80a6dcdSmrg{ 436f80a6dcdSmrg Arg arg[1]; 437f80a6dcdSmrg 438f80a6dcdSmrg XtSetArg (arg[0], XtNpopupOnEntry, entry); 439f80a6dcdSmrg XtSetValues (XtParent(entry) , arg, (Cardinal) 1); 440f80a6dcdSmrg} 441f80a6dcdSmrg 442f80a6dcdSmrg/*ARGSUSED*/ 443f80a6dcdSmrgstatic void 44465912f00SmrgNextPage (Widget entry, XtPointer name, XtPointer data) 445f80a6dcdSmrg{ 446f80a6dcdSmrg NextPageAction(entry, NULL, NULL, NULL); 447f80a6dcdSmrg ResetMenuEntry (entry); 448f80a6dcdSmrg} 449f80a6dcdSmrg 450f80a6dcdSmrgstatic void 451f80a6dcdSmrgNextPageAction (Widget w, XEvent *xev, String *s, Cardinal *c) 452f80a6dcdSmrg{ 453f80a6dcdSmrg Arg args[1]; 454f80a6dcdSmrg int number; 455f80a6dcdSmrg 456f80a6dcdSmrg XtSetArg (args[0], XtNpageNumber, &number); 457f80a6dcdSmrg XtGetValues (dvi, args, 1); 458f80a6dcdSmrg SetPageNumber (number+1); 459f80a6dcdSmrg} 460f80a6dcdSmrg 461f80a6dcdSmrg/*ARGSUSED*/ 462f80a6dcdSmrgstatic void 46365912f00SmrgPreviousPage (Widget entry, XtPointer name, XtPointer data) 464f80a6dcdSmrg{ 465f80a6dcdSmrg PreviousPageAction (entry, NULL, NULL, NULL); 466f80a6dcdSmrg ResetMenuEntry (entry); 467f80a6dcdSmrg} 468f80a6dcdSmrg 469f80a6dcdSmrgstatic void 470f80a6dcdSmrgPreviousPageAction (Widget w, XEvent *xev, String *s, Cardinal *c) 471f80a6dcdSmrg{ 472f80a6dcdSmrg Arg args[1]; 473f80a6dcdSmrg int number; 474f80a6dcdSmrg 475f80a6dcdSmrg XtSetArg (args[0], XtNpageNumber, &number); 476f80a6dcdSmrg XtGetValues (dvi, args, 1); 477f80a6dcdSmrg SetPageNumber (number-1); 478f80a6dcdSmrg} 479f80a6dcdSmrg 480f80a6dcdSmrg/*ARGSUSED*/ 481f80a6dcdSmrgstatic void 48265912f00SmrgSetResolution (Widget entry, XtPointer name, XtPointer data) 483f80a6dcdSmrg{ 484f80a6dcdSmrg SetResolutionAction (entry, NULL, NULL, NULL); 485f80a6dcdSmrg ResetMenuEntry (entry); 486f80a6dcdSmrg} 487f80a6dcdSmrg 488f80a6dcdSmrgstatic void 489f80a6dcdSmrgSetResolutionAction (Widget w, XEvent *xev, String *s, Cardinal *c) 490f80a6dcdSmrg{ 491f80a6dcdSmrg Arg args[1]; 492f80a6dcdSmrg int cur; 493f80a6dcdSmrg 494f80a6dcdSmrg XtSetArg (args[0], XtNscreenResolution, &cur); 495f80a6dcdSmrg XtGetValues (dvi, args, 1); 496f80a6dcdSmrg sprintf (resolutionBuf, "%d", cur); 497f80a6dcdSmrg MakePrompt (toplevel, "Screen resolution:", NewResolution, resolutionBuf); 498f80a6dcdSmrg} 499f80a6dcdSmrg 500f80a6dcdSmrg/*ARGSUSED*/ 501f80a6dcdSmrgstatic void 50265912f00SmrgOpenFile (Widget entry, XtPointer name, XtPointer data) 503f80a6dcdSmrg{ 504f80a6dcdSmrg OpenFileAction (entry, NULL, NULL, NULL); 505f80a6dcdSmrg ResetMenuEntry (entry); 506f80a6dcdSmrg} 507f80a6dcdSmrg 508f80a6dcdSmrgstatic void 509f80a6dcdSmrgOpenFileAction (Widget w, XEvent *xev, String *s, Cardinal *c) 510f80a6dcdSmrg{ 511f80a6dcdSmrg if (current_file_name[0]) 512f80a6dcdSmrg strcpy (fileBuf, current_file_name); 513f80a6dcdSmrg else 514f80a6dcdSmrg fileBuf[0] = '\0'; 515f80a6dcdSmrg MakePrompt (toplevel, "File to open:", NewFile, fileBuf); 516f80a6dcdSmrg} 517f80a6dcdSmrg 518f80a6dcdSmrg/*ARGSUSED*/ 519f80a6dcdSmrgstatic void 52065912f00SmrgRevisitFile (Widget entry, XtPointer name, XtPointer data) 521f80a6dcdSmrg{ 522f80a6dcdSmrg RevisitFileAction (entry, NULL, NULL, NULL); 523f80a6dcdSmrg ResetMenuEntry (entry); 524f80a6dcdSmrg} 525f80a6dcdSmrg 526f80a6dcdSmrgstatic void 527f80a6dcdSmrgRevisitFileAction (Widget w, XEvent *xev, String *s, Cardinal *c) 528f80a6dcdSmrg{ 529f80a6dcdSmrg if (current_file_name[0]) 530f80a6dcdSmrg VisitFile (current_file_name, FALSE); 531f80a6dcdSmrg} 532f80a6dcdSmrg 533f80a6dcdSmrg/*ARGSUSED*/ 534f80a6dcdSmrgstatic void 53565912f00SmrgQuit (Widget entry, XtPointer closure, XtPointer data) 536f80a6dcdSmrg{ 537f80a6dcdSmrg QuitAction (entry, NULL, NULL, NULL); 538f80a6dcdSmrg} 539f80a6dcdSmrg 540f80a6dcdSmrgstatic void 541f80a6dcdSmrgQuitAction (Widget w, XEvent *xev, String *s, Cardinal *c) 542f80a6dcdSmrg{ 543f80a6dcdSmrg exit (0); 544f80a6dcdSmrg} 545f80a6dcdSmrg 54665912f00Smrgstatic Widget promptShell, promptDialog; 54765912f00Smrgstatic void (*promptfunction)(char *); 548f80a6dcdSmrg 549f80a6dcdSmrg/* ARGSUSED */ 550f80a6dcdSmrgstatic 55165912f00Smrgvoid CancelAction (Widget widget, XEvent *event, 55265912f00Smrg String *params, Cardinal *num_params) 553f80a6dcdSmrg{ 554f80a6dcdSmrg if (promptShell) { 555f80a6dcdSmrg XtSetKeyboardFocus(toplevel, (Widget) None); 556f80a6dcdSmrg XtDestroyWidget(promptShell); 557f80a6dcdSmrg promptShell = (Widget) 0; 558f80a6dcdSmrg } 559f80a6dcdSmrg} 560f80a6dcdSmrg 561f80a6dcdSmrg 562f80a6dcdSmrg/* ARGSUSED */ 563f80a6dcdSmrgstatic 56465912f00Smrgvoid AcceptAction (Widget widget, XEvent *event, 56565912f00Smrg String *params, Cardinal *num_params) 566f80a6dcdSmrg{ 567f80a6dcdSmrg (*promptfunction)(XawDialogGetValueString(promptDialog)); 568f80a6dcdSmrg CancelAction (widget, event, params, num_params); 569f80a6dcdSmrg} 570f80a6dcdSmrg 571f80a6dcdSmrgstatic 572f80a6dcdSmrgvoid Noop (Widget w, XEvent *xev, String *s, Cardinal *c) 573f80a6dcdSmrg{ 574f80a6dcdSmrg} 575f80a6dcdSmrg 576f80a6dcdSmrgstatic void 57765912f00SmrgMakePrompt(Widget centerw, char *prompt, void (*func)(char *), char *def) 578f80a6dcdSmrg{ 579f80a6dcdSmrg static Arg dialogArgs[] = { 580f80a6dcdSmrg {XtNlabel, (XtArgVal) 0}, 581f80a6dcdSmrg {XtNvalue, (XtArgVal) 0}, 582f80a6dcdSmrg }; 583f80a6dcdSmrg Arg valueArgs[1]; 584f80a6dcdSmrg Arg centerArgs[2]; 585f80a6dcdSmrg Position source_x, source_y; 586f80a6dcdSmrg Position dest_x, dest_y; 587f80a6dcdSmrg Dimension center_width, center_height; 588f80a6dcdSmrg Dimension prompt_width, prompt_height; 589f80a6dcdSmrg Widget valueWidget; 590f80a6dcdSmrg 591f80a6dcdSmrg CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); 592f80a6dcdSmrg promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass, 593f80a6dcdSmrg toplevel, NULL, (Cardinal) 0); 594f80a6dcdSmrg dialogArgs[0].value = (XtArgVal)prompt; 595f80a6dcdSmrg dialogArgs[1].value = (XtArgVal)def; 596f80a6dcdSmrg promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass, 597f80a6dcdSmrg promptShell, dialogArgs, XtNumber (dialogArgs)); 598f80a6dcdSmrg XawDialogAddButton(promptDialog, "accept", NULL, NULL); 599f80a6dcdSmrg XawDialogAddButton(promptDialog, "cancel", NULL, NULL); 600f80a6dcdSmrg valueWidget = XtNameToWidget (promptDialog, "value"); 601f80a6dcdSmrg if (valueWidget) { 602f80a6dcdSmrg XtSetArg (valueArgs[0], XtNresizable, TRUE); 603f80a6dcdSmrg XtSetValues (valueWidget, valueArgs, 1); 604f80a6dcdSmrg /* 605f80a6dcdSmrg * as resizable isn't set until just above, the 606f80a6dcdSmrg * default value will be displayed incorrectly. 607f80a6dcdSmrg * rectify the situation by resetting the values 608f80a6dcdSmrg */ 609f80a6dcdSmrg XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs)); 610f80a6dcdSmrg } 611f80a6dcdSmrg XtSetKeyboardFocus (promptDialog, valueWidget); 612f80a6dcdSmrg XtSetKeyboardFocus (toplevel, valueWidget); 613f80a6dcdSmrg XtRealizeWidget (promptShell); 614f80a6dcdSmrg /* 615f80a6dcdSmrg * place the widget in the center of the "parent" 616f80a6dcdSmrg */ 617f80a6dcdSmrg XtSetArg (centerArgs[0], XtNwidth, ¢er_width); 618f80a6dcdSmrg XtSetArg (centerArgs[1], XtNheight, ¢er_height); 619f80a6dcdSmrg XtGetValues (centerw, centerArgs, 2); 620f80a6dcdSmrg XtSetArg (centerArgs[0], XtNwidth, &prompt_width); 621f80a6dcdSmrg XtSetArg (centerArgs[1], XtNheight, &prompt_height); 622f80a6dcdSmrg XtGetValues (promptShell, centerArgs, 2); 623f80a6dcdSmrg source_x = (int)(center_width - prompt_width) / 2; 624f80a6dcdSmrg source_y = (int)(center_height - prompt_height) / 3; 625f80a6dcdSmrg XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y); 626f80a6dcdSmrg XtSetArg (centerArgs[0], XtNx, dest_x); 627f80a6dcdSmrg XtSetArg (centerArgs[1], XtNy, dest_y); 628f80a6dcdSmrg XtSetValues (promptShell, centerArgs, 2); 629f80a6dcdSmrg XtMapWidget(promptShell); 630f80a6dcdSmrg promptfunction = func; 631f80a6dcdSmrg} 632