home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / groff / grot / xditview / xditview.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-30  |  10.8 KB  |  445 lines

  1. /*
  2.  * xditview -- 
  3.  *
  4.  *   Display ditroff output in an X window
  5.  */
  6.  
  7. #ifndef lint
  8. static char rcsid[] = "$XConsortium: xditview.c,v 1.17 89/12/10 17:05:08 rws Exp $";
  9. #endif /* lint */
  10.  
  11. #include <X11/Xatom.h>
  12. #include <X11/Xlib.h>
  13. #include <X11/Intrinsic.h>
  14. #include <X11/StringDefs.h>
  15. #include <X11/Shell.h>
  16. #include <X11/Xaw/Paned.h>
  17. #include <X11/Xaw/Viewport.h>
  18. #include <X11/Xaw/Box.h>
  19. #include <X11/Xaw/Command.h>
  20. #include <X11/Xaw/Dialog.h>
  21. #include <X11/Xaw/Label.h>
  22. #include <X11/Xaw/SimpleMenu.h>
  23. #include <X11/Xaw/SmeBSB.h>
  24.  
  25. #include "libXdvi/Dvi.h"
  26.  
  27. #include "xdit.bm"
  28. #include "xdit_mask.bm"
  29. #include "stdio.h"
  30.  
  31. extern FILE *popen();
  32. extern void exit();
  33.  
  34. /* Command line options table.  Only resources are entered here...there is a
  35.    pass over the remaining options after XtParseCommand is let loose. */
  36.  
  37. static XrmOptionDescRec options[] = {
  38. {"-page",        "*dvi.pageNumber",        XrmoptionSepArg,    NULL},
  39. {"-backingStore",   "*dvi.backingStore",    XrmoptionSepArg,    NULL},
  40. {"-noPolyText",        "*dvi.noPolyText",        XrmoptionNoArg,    "TRUE"},
  41. };
  42.  
  43. static char    current_file_name[1024];
  44. static FILE    *current_file;
  45.  
  46. /*
  47.  * Report the syntax for calling xditview.
  48.  */
  49.  
  50. static
  51. Syntax(call)
  52.     char *call;
  53. {
  54.     (void) printf ("Usage: %s [-fg <color>] [-bg <color>]\n", call);
  55.     (void) printf ("       [-bd <color>] [-bw <pixels>] [-help]\n");
  56.     (void) printf ("       [-display displayname] [-geometry geom]\n");
  57.     (void) printf ("       [-page <page-number>] [-backing <backing-store>]\n\n");
  58.     exit(1);
  59. }
  60.  
  61. static void    NewFile (), SetPageNumber ();
  62. static Widget    toplevel, paned, viewport, dvi;
  63. static Widget    page;
  64. static Widget    simpleMenu;
  65.  
  66. static void    NextPage(), PreviousPage(), SelectPage(), OpenFile(), Quit();
  67.  
  68. static struct menuEntry {
  69.     char    *name;
  70.     void    (*function)();
  71. } menuEntries[] = {
  72.     "nextPage",        NextPage,
  73.     "previousPage", PreviousPage,
  74.     "selectPage",   SelectPage,
  75.     "openFile",        OpenFile,
  76.     "quit",        Quit,
  77. };
  78.  
  79. static void    NextPageAction(), PreviousPageAction(), SelectPageAction();
  80. static void    OpenFileAction(), QuitAction();
  81. static void    AcceptAction(), CancelAction();
  82.  
  83. XtActionsRec xditview_actions[] = {
  84.     "NextPage",        NextPageAction,
  85.     "PreviousPage", PreviousPageAction,
  86.     "SelectPage",   SelectPageAction,
  87.     "OpenFile",        OpenFileAction,
  88.     "Quit",        QuitAction,
  89.     "Accept",        AcceptAction,
  90.     "Cancel",        CancelAction,
  91. };
  92.  
  93. #define MenuNextPage        0
  94. #define MenuPreviousPage    1
  95. #define MenuSelectPage        2
  96. #define MenuOpenFile        3
  97. #define    MenuQuit        4
  98.  
  99. static char    pageLabel[256] = "Page <none>";
  100.  
  101. void main(argc, argv)
  102.     int argc;
  103.     char **argv;
  104. {
  105.     char        *file_name = 0;
  106.     int            i;
  107.     static Arg        labelArgs[] = {
  108.             {XtNlabel, (XtArgVal) pageLabel},
  109.     };
  110.     Arg            topLevelArgs[2];
  111.     Widget          entry;
  112.     Arg            pageNumberArgs[1];
  113.     int            page_number;
  114.  
  115.     toplevel = XtInitialize("main", "Xditview",
  116.                 options, XtNumber (options),
  117.                  &argc, argv);
  118.     if (argc > 2)
  119.     Syntax(argv[0]);
  120.  
  121.     XtAppAddActions(XtWidgetToApplicationContext(toplevel),
  122.             xditview_actions, XtNumber (xditview_actions));
  123.  
  124.     XtSetArg (topLevelArgs[0], XtNiconPixmap,
  125.           XCreateBitmapFromData (XtDisplay (toplevel),
  126.                      XtScreen(toplevel)->root,
  127.                      xdit_bits, xdit_width, xdit_height));
  128.                     
  129.     XtSetArg (topLevelArgs[1], XtNiconMask,
  130.           XCreateBitmapFromData (XtDisplay (toplevel),
  131.                      XtScreen(toplevel)->root,
  132.                      xdit_mask_bits, 
  133.                      xdit_mask_width, xdit_mask_height));
  134.     XtSetValues (toplevel, topLevelArgs, 2);
  135.     if (argc > 1)
  136.     file_name = argv[1];
  137.  
  138.     /*
  139.      * create the menu and insert the entries
  140.      */
  141.     simpleMenu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, toplevel,
  142.                     NULL, 0);
  143.     for (i = 0; i < XtNumber (menuEntries); i++) {
  144.     entry = XtCreateManagedWidget(menuEntries[i].name, 
  145.                       smeBSBObjectClass, simpleMenu,
  146.                       NULL, (Cardinal) 0);
  147.     XtAddCallback(entry, XtNcallback, menuEntries[i].function, NULL);
  148.     }
  149.  
  150.     paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel,
  151.                     NULL, (Cardinal) 0);
  152.     viewport = XtCreateManagedWidget("viewport", viewportWidgetClass, paned,
  153.                      NULL, (Cardinal) 0);
  154.     dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, viewport, NULL, 0);
  155.     page = XtCreateManagedWidget ("label", labelWidgetClass, paned,
  156.                     labelArgs, XtNumber (labelArgs));
  157.     XtSetArg (pageNumberArgs[0], XtNpageNumber, &page_number);
  158.     XtGetValues (dvi, pageNumberArgs, 1);
  159.     if (file_name)
  160.     NewFile (file_name);
  161.     XtRealizeWidget (toplevel);
  162.     if (file_name)
  163.     SetPageNumber (page_number);
  164.     XtMainLoop();
  165. }
  166.  
  167. static void
  168. SetPageNumber (number)
  169. {
  170.     Arg    arg[2];
  171.     int    actual_number, last_page;
  172.  
  173.     XtSetArg (arg[0], XtNpageNumber, number);
  174.     XtSetValues (dvi, arg, 1);
  175.     XtSetArg (arg[0], XtNpageNumber, &actual_number);
  176.     XtSetArg (arg[1], XtNlastPageNumber, &last_page);
  177.     XtGetValues (dvi, arg, 2);
  178.     if (actual_number == 0)
  179.     sprintf (pageLabel, "Page <none>");
  180.     else if (last_page > 0)
  181.     sprintf (pageLabel, "Page %d of %d", actual_number, last_page);
  182.     else
  183.     sprintf (pageLabel, "Page %d", actual_number);
  184.     XtSetArg (arg[0], XtNlabel, pageLabel);
  185.     XtSetValues (page, arg, 1);
  186. }
  187.  
  188. static void
  189. SelectPageNumber (number_string)
  190. char    *number_string;
  191. {
  192.     SetPageNumber (atoi(number_string));
  193. }
  194.  
  195. static int hadFile = 0;
  196.  
  197. static void
  198. NewFile (name)
  199. char    *name;
  200. {
  201.     Arg        arg[2];
  202.     char    *n, *rindex ();
  203.     FILE    *new_file;
  204.     Boolean seek = 0;
  205.  
  206.     if (current_file) {
  207.     if (!strcmp (current_file_name, "-"))
  208.         ;
  209.     else if (current_file_name[0] == '|')
  210.         pclose (current_file);
  211.     else
  212.         fclose (current_file);
  213.     }
  214.     if (!strcmp (name, "-"))
  215.     new_file = stdin;
  216.     else if (name[0] == '|')
  217.     new_file = popen (name+1, "r");
  218.     else {
  219.     new_file = fopen (name, "r");
  220.     seek = 1;
  221.     }
  222.     if (!new_file) {
  223.     /* XXX display error message */
  224.     return;
  225.     }
  226.     XtSetArg (arg[0], XtNfile, new_file);
  227.     XtSetArg (arg[1], XtNseek, seek);
  228.     XtSetValues (dvi, arg, 2);
  229.     if (hadFile || name[0] != '-' || name[1] != '\0') {
  230.     XtSetArg (arg[0], XtNtitle, name);
  231.     if (name[0] != '/' && (n = rindex (name, '/')))
  232.         n = n + 1;
  233.     else
  234.         n = name;
  235.     XtSetArg (arg[1], XtNiconName, n);
  236.     XtSetValues (toplevel, arg, 2);
  237.     }
  238.     hadFile = 1;
  239.     SelectPageNumber ("1");
  240.     strcpy (current_file_name, name);
  241.     current_file = new_file;
  242. }
  243.  
  244. static char fileBuf[1024];
  245.  
  246. ResetMenuEntry (entry)
  247.     Widget  entry;
  248. {
  249.     Arg    arg[1];
  250.  
  251.     XtSetArg (arg[0], XtNpopupOnEntry, entry);
  252.     XtSetValues (XtParent(entry) , arg, (Cardinal) 1);
  253. }
  254.  
  255. static void
  256. NextPage (entry, name, data)
  257.     Widget  entry;
  258.     caddr_t name, data;
  259. {
  260.     NextPageAction();
  261.     ResetMenuEntry (entry);
  262. }
  263.  
  264. static void
  265. NextPageAction ()
  266. {
  267.     Arg    args[1];
  268.     int    number;
  269.  
  270.     XtSetArg (args[0], XtNpageNumber, &number);
  271.     XtGetValues (dvi, args, 1);
  272.     SetPageNumber (number+1);
  273. }
  274.  
  275. static void
  276. PreviousPage (entry, name, data)
  277.     Widget  entry;
  278.     caddr_t name, data;
  279. {
  280.     PreviousPageAction ();
  281.     ResetMenuEntry (entry);
  282. }
  283.  
  284. static void
  285. PreviousPageAction ()
  286. {
  287.     Arg    args[1];
  288.     int    number;
  289.  
  290.     XtSetArg (args[0], XtNpageNumber, &number);
  291.     XtGetValues (dvi, args, 1);
  292.     SetPageNumber (number-1);
  293. }
  294.  
  295. static void
  296. SelectPage (entry, name, data)
  297.     Widget  entry;
  298.     caddr_t name, data;
  299. {
  300.     SelectPageAction ();
  301.     ResetMenuEntry (entry);
  302. }
  303.  
  304. static void
  305. SelectPageAction ()
  306. {
  307.     MakePrompt (toplevel, "Page number", SelectPageNumber, "");
  308. }
  309.  
  310. static void
  311. OpenFile (entry, name, data)
  312.     Widget  entry;
  313.     caddr_t name, data;
  314. {
  315.     OpenFileAction ();
  316.     ResetMenuEntry (entry);
  317. }
  318.  
  319. static void
  320. OpenFileAction ()
  321. {
  322.     if (current_file_name[0])
  323.     strcpy (fileBuf, current_file_name);
  324.     else
  325.     fileBuf[0] = '\0';
  326.     MakePrompt (toplevel, "File to open:", NewFile, fileBuf);
  327. }
  328.  
  329. static void
  330. Quit (entry, closure, data)
  331.     Widget  entry;
  332.     caddr_t closure, data;
  333. {
  334.     QuitAction ();
  335. }
  336.  
  337. static void
  338. QuitAction ()
  339. {
  340.     exit (0);
  341. }
  342.  
  343. Widget    promptShell, promptDialog;
  344. void    (*promptfunction)();
  345.  
  346. /* ARGSUSED */
  347. static
  348. void CancelAction (widget, event, params, num_params)
  349.     Widget    widget;
  350.     XEvent    *event;
  351.     String    *params;
  352.     Cardinal    *num_params;
  353. {
  354.     if (promptShell) {
  355.     XtSetKeyboardFocus(toplevel, (Widget) None);
  356.     XtDestroyWidget(promptShell);
  357.     promptShell = (Widget) 0;
  358.     }
  359. }
  360.  
  361.  
  362. /* ARGSUSED */
  363. static
  364. void AcceptAction (widget, event, params, num_params)
  365.     Widget    widget;
  366.     XEvent    *event;
  367.     String    *params;
  368.     Cardinal    *num_params;
  369. {
  370.     (*promptfunction)(XawDialogGetValueString(promptDialog));
  371.     CancelAction (widget, event, params, num_params);
  372. }
  373.  
  374. MakePrompt(centerw, prompt, func, def)
  375. Widget    centerw;
  376. char *prompt;
  377. void (*func)();
  378. char    *def;
  379. {
  380.     static Boolean true = TRUE;
  381.     static Arg dialogArgs[] = {
  382.     {XtNlabel, NULL},
  383.     {XtNvalue, NULL},
  384.     };
  385.     Arg valueArgs[1];
  386.     Arg centerArgs[2];
  387.     Position    source_x, source_y;
  388.     Position    dest_x, dest_y;
  389.     Dimension center_width, center_height;
  390.     Dimension prompt_width, prompt_height;
  391.     Widget  valueWidget;
  392.     
  393.     CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0);
  394.     promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass,
  395.                       toplevel, NULL, (Cardinal) 0);
  396.     dialogArgs[0].value = (XtArgVal)prompt;
  397.     dialogArgs[1].value = (XtArgVal)def;
  398.     promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass,
  399.             promptShell, dialogArgs, XtNumber (dialogArgs));
  400.     XawDialogAddButton(promptDialog, "accept", NULL, (caddr_t) 0);
  401.     XawDialogAddButton(promptDialog, "cancel", NULL, (caddr_t) 0);
  402.     valueWidget = XtNameToWidget (promptDialog, "value");
  403.     if (valueWidget) {
  404.         XtSetArg (valueArgs[0], XtNresizable, TRUE);
  405.         XtSetValues (valueWidget, valueArgs, 1);
  406.     /*
  407.      * as resizable isn't set until just above, the
  408.      * default value will be displayed incorrectly.
  409.      * rectify the situation by resetting the values
  410.      */
  411.         XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs));
  412.     }
  413.     XtSetKeyboardFocus (promptDialog, valueWidget);
  414.     XtSetKeyboardFocus (toplevel, valueWidget);
  415.     XtRealizeWidget (promptShell);
  416.     /*
  417.      * place the widget in the center of the "parent"
  418.      */
  419.     XtSetArg (centerArgs[0], XtNwidth, ¢er_width);
  420.     XtSetArg (centerArgs[1], XtNheight, ¢er_height);
  421.     XtGetValues (centerw, centerArgs, 2);
  422.     XtSetArg (centerArgs[0], XtNwidth, &prompt_width);
  423.     XtSetArg (centerArgs[1], XtNheight, &prompt_height);
  424.     XtGetValues (promptShell, centerArgs, 2);
  425.     source_x = (center_width - prompt_width) / 2;
  426.     source_y = (center_height - prompt_height) / 3;
  427.     XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y);
  428.     XtSetArg (centerArgs[0], XtNx, dest_x);
  429.     XtSetArg (centerArgs[1], XtNy, dest_y);
  430.     XtSetValues (promptShell, centerArgs, 2);
  431.     XtMapWidget(promptShell);
  432.     promptfunction = func;
  433. }
  434.  
  435. /*
  436. Local Variables:
  437. c-indent-level: 4
  438. c-continued-statement-offset: 4
  439. c-brace-offset: -4
  440. c-argdecl-indent: 4
  441. c-label-offset: -4
  442. c-tab-always-indent: nil
  443. End:
  444. */
  445.