Installation of xdvik (relative to the top-level directory):

1. Run `configure' (in the top-level directory, the one with the
`kpathsea' and `xdvi' subdirectories).  This guesses system dependencies.

2. If necessary, edit the default paths or other definitions in
./Makefile, kpathsea/paths.h.in and */c-auto.h. See
kpathsea/INSTALL for details.

Things to add to DEFS or CFLAGS:
-DA4 if you want A4 paper size by default.
-DALTFONT=\"myfont\" to change the fallback from cmr10.
-DBDPI=num to change default resolution from 300.
-DBUTTONS to enable radio buttons for common commands.
-DMFMODE=\"mode\" to change the default mode from cx.
-DNOGREY to disable using grayscale to display shrunken bitmaps 
   (which also works on monochrome monitors).
-DNOMAKEPK to disable MakeTeXPK by default.  It can be disabled (or
  enabled) at runtime, regardless (see the man page). MakeTeXPK must
  echo the generated filename (and nothing else) to standard output.
-DNOQUERY if you have trouble compiling drawingWidgetClass?
-DNOTEXXET to disable DVI opcodes 250 and 251.
-DNOTOOL to compile using only Xlib routines; also set the Make variable
  tool_libs="". Functionality will be reduced.
-DPS_DPS to enable Display PostScript support.
-DPS_NEWS to enable NeWS PostScript support.
-DSELFILE to enable SelFile widget support. Also uncomment the
  definition of SELFILE in ./Makefile.in.
   
The `memlayout' make variable can be set according to what xdvi's CTRL-P
command reports for `bitord' and `Unit':
     bitord = 1  =>  -DMSBITFIRST
     Unit = 32   =>  -DBMLONG
     Unit = 16   =>  -DBMSHORT
I am unconvinced that this makes any substantial difference in
performance, however.

3. `make'.

4. `make install'.
(Or `make install-exec', to install just the executables,
or `make install-data', to install just the architecture-independent files.)
ls

5. `make distclean' (or `mostlyclean', or `clean', or `realclean',
depending on how clean you want to be).

If you wish to preview documents using PostScript fonts, you may find
ftp.cs.umb.edu:pub/tex/psfonts.tar.gz (Ghostscript-generated bitmaps for
the standard 35 PS fonts at multiples of 300dpi) useful.
Alternatives, programs that can generate PK's from PostScript fonts
include:
  math.berkeley.edu:pub/Software/TeX/gsftopk.tar.Z
  ftp.urc.tue.nl:/pub/tex/ps2pk*.tar.gz
  <ctan.host>:tex-archive/fonts/utilities/ps2mf

None of these use kpathsea (or do subdirectory searching). I work around
this by setting up the programs' font paths to include all the (fonts
in) /usr/local/lib/tex/texmf/fonts/.../type1 directories.  One directory
with links to all the Type 1 fonts would be another way to go.  I don't
think these will (or should) ever be kpathsea-using programs.

If problems:

* See kpathsea/INSTALL for common system-dependent problems.

* If MakeTeXPK isn't run: see -DMAKETEXPK above.

* IBM RT running BSD, compiling with hc: XDEFS="-U__STDC__ -w", as
  <stdarg.h> isn't supplied, and the warnings are meaningless.
--kb@cs.umb.edu

* SCO: download libXaw from sosco.sco.com:/TLS/tls005.tar.Z.
--lieder@skyler.mavd.honeywell.com

* Tadpole Sparcbook: Comes with obsolete X11 libraries in
  /usr/openwin/lib. You must install more recent libraries.
--ato@bellcore.com

Date: Wed, 9 Feb 94 16:29 MET
From: simon@lia.di.epfl.ch (Simon Leinen)
To: tex-k@cs.umb.edu
Subject: First hack at a Motif interface for xdvi

If you find that xdvi isn't ugly enough yet, you can apply this patch
and recompile xdvi with -DHAVE_MOTIF (and preferably without
-DBUTTONS).  You also need to link against -lXm.  Tested only on IRIX
5.1 (X11R5/Motif 1.2.2).

Have fun(???),
-- 
Simon.

*** xdvik/xdvi.c	1994/02/08 21:36:30	1.1
--- xdvik/xdvi.c	1994/02/09 15:21:00
***************
*** 96,104 ****
  #define	XtSpecificationRelease	0
  #endif
  #if	XtSpecificationRelease >= 4
  #include <X11/Xaw/Viewport.h>
  #ifdef	BUTTONS
  #include <X11/Xaw/Command.h>
! #endif
  #else	/* XtSpecificationRelease < 4 */
  #define	XtPointer caddr_t
--- 96,113 ----
  #define	XtSpecificationRelease	0
  #endif
+ #ifdef  HAVE_MOTIF
+ #include <Xm/MainW.h>
+ #include <Xm/PushB.h>
+ #include <Xm/ToggleB.h>
+ #include <Xm/BulletinB.h>
+ #include <Xm/Form.h>
+ #include <Xm/RowColumn.h>
+ #include <Xm/MenuShell.h>
+ #else /* not HAVE_MOTIF */
  #if	XtSpecificationRelease >= 4
  #include <X11/Xaw/Viewport.h>
  #ifdef	BUTTONS
  #include <X11/Xaw/Command.h>
! #endif /* BUTTONS */
  #else	/* XtSpecificationRelease < 4 */
  #define	XtPointer caddr_t
***************
*** 108,111 ****
--- 117,121 ----
  #endif
  #endif	/* XtSpecificationRelease */
+ #endif /* not HAVE_MOTIF */
  #else	/* !TOOLKIT */
  #define	XtNumber(arr)	(sizeof(arr)/sizeof(arr[0]))
***************
*** 319,322 ****
--- 329,338 ----
  #ifdef	TOOLKIT
  static	Widget	top_level, vport_widget, draw_widget, clip_widget;
+ #ifdef HAVE_MOTIF
+ static	Widget	menubar;
+ static	Widget	scale_menu;
+ static	Widget	shrink_button[5];
+ static	unsigned max_shrink_button = 0;
+ #endif /* HAVE_MOTIF */
  #ifdef	BUTTONS
  static	Widget	form_widget, line_widget, panel_widget;
***************
*** 325,328 ****
--- 341,347 ----
  
  static	Arg	vport_args[] = {
+ #ifdef HAVE_MOTIF
+   {XmNscrollingPolicy, (XtArgVal) XmAUTOMATIC},
+ #else /* not HAVE_MOTIF */
  #ifdef	BUTTONS
  	{XtNborderWidth, (XtArgVal) 0},
***************
*** 334,337 ****
--- 353,357 ----
  	{XtNallowHoriz,	(XtArgVal) True},
  	{XtNallowVert,	(XtArgVal) True},
+ #endif /* not HAVE_MOTIF */
  };
  
***************
*** 351,362 ****
  #ifdef	BUTTONS
  static	Arg	form_args[] = {
  	{XtNdefaultDistance, (XtArgVal) 0},
  };
  #define	XTRA_WID	79
  
  static	Arg	line_args[] = {
- 	{XtNbackground,	(XtArgVal) 0},
- 	{XtNwidth,	(XtArgVal) 1},
  	{XtNheight,	(XtArgVal) 0},
  	{XtNfromHoriz,	(XtArgVal) NULL},
  	{XtNborderWidth, (XtArgVal) 0},
--- 371,390 ----
  #ifdef	BUTTONS
  static	Arg	form_args[] = {
+ #ifdef HAVE_MOTIF
+ 	{XmNhorizontalSpacing, (XtArgVal) 0},
+ 	{XmNverticalSpacing, (XtArgVal) 0},
+ #else /* not HAVE_MOTIF */
  	{XtNdefaultDistance, (XtArgVal) 0},
+ #endif /* not HAVE_MOTIF */
  };
  #define	XTRA_WID	79
  
  static	Arg	line_args[] = {
  	{XtNheight,	(XtArgVal) 0},
+ #ifdef HAVE_MOTIF
+ 	{XmNleftWidget,	(XtArgVal) NULL},
+ 	{XmNleftAttachment,	(XtArgVal) XmATTACH_WIDGET},
+ 	{XmNresizable, (XtArgVal) False},
+ #else /* not HAVE_MOTIF */
  	{XtNfromHoriz,	(XtArgVal) NULL},
  	{XtNborderWidth, (XtArgVal) 0},
***************
*** 365,371 ****
--- 393,410 ----
  	{XtNleft,	(XtArgVal) XtChainRight},
  	{XtNright,	(XtArgVal) XtChainRight},
+ 	{XtNbackground,	(XtArgVal) 0},
+ 	{XtNwidth,	(XtArgVal) 1},
+ #endif /* not HAVE_MOTIF */
  };
  
  static	Arg	panel_args[] = {
+ #ifdef HAVE_MOTIF
+ 	{XmNleftWidget,	(XtArgVal) NULL},
+ 	{XtNwidth,	(XtArgVal) (XTRA_WID - 1)},
+ 	{XtNheight,	(XtArgVal) 0},
+ 	{XtNborderWidth, (XtArgVal) 0},
+ 	{XmNleftAttachment,	(XtArgVal) XmATTACH_WIDGET},
+ 	{XmNresizable, (XtArgVal) False},
+ #else /* not HAVE_MOTIF */
  	{XtNfromHoriz,	(XtArgVal) NULL},
  	{XtNwidth,	(XtArgVal) (XTRA_WID - 1)},
***************
*** 376,379 ****
--- 415,419 ----
  	{XtNleft,	(XtArgVal) XtChainRight},
  	{XtNright,	(XtArgVal) XtChainRight},
+ #endif /* not HAVE_MOTIF */
  };
  
***************
*** 406,415 ****
--- 446,463 ----
  
  static	Arg	command_args[] = {
+ #ifdef HAVE_MOTIF
+ 	{XmNlabelString,	(XtArgVal) NULL},
+ #else /* not HAVE_MOTIF */
  	{XtNlabel,	(XtArgVal) NULL},
+ #endif /* not HAVE_MOTIF */
  	{XtNx,		(XtArgVal) 6},
  	{XtNy,		(XtArgVal) 0},
  	{XtNwidth,	(XtArgVal) 64},
  	{XtNheight,	(XtArgVal) 30},
+ #ifdef HAVE_MOTIF
+ 	{XmNactivateCallback,	(XtArgVal) command_call},
+ #else /* not HAVE_MOTIF */
  	{XtNcallback,	(XtArgVal) command_call},
+ #endif /* not HAVE_MOTIF */
  };
  
***************
*** 420,434 ****
  	int i;
  
! 	line_args[2].value = h;
! 	line_args[3].value = (XtArgVal) vport_widget;
  	line_widget = XtCreateManagedWidget("line", widgetClass, form_widget,
  		line_args, XtNumber(line_args));
  	panel_args[0].value = (XtArgVal) line_widget;
  	panel_args[2].value = h;
  	panel_widget = XtCreateManagedWidget("panel", compositeWidgetClass,
  		form_widget, panel_args, XtNumber(panel_args));
  
  	command_args[2].value = (XtArgVal) vport_widget;
  	for (i = 0; i < XtNumber(command_table); ++i) {
  	    command_args[0].value = (XtArgVal) command_table[i].label;
  	    command_args[2].value = (XtArgVal) command_table[i].y_pos;
--- 468,498 ----
  	int i;
  
! 	line_args[0].value = h;
! 	line_args[1].value = (XtArgVal) vport_widget;
  	line_widget = XtCreateManagedWidget("line", widgetClass, form_widget,
  		line_args, XtNumber(line_args));
  	panel_args[0].value = (XtArgVal) line_widget;
  	panel_args[2].value = h;
+ #ifdef HAVE_MOTIF
+ 	panel_widget = XtCreateManagedWidget("panel", xmBulletinBoardWidgetClass,
+ 		form_widget, panel_args, XtNumber(panel_args));
+ #else /* not HAVE_MOTIF */
  	panel_widget = XtCreateManagedWidget("panel", compositeWidgetClass,
  		form_widget, panel_args, XtNumber(panel_args));
+ #endif /* not HAVE_MOTIF */
  
  	command_args[2].value = (XtArgVal) vport_widget;
+ #ifdef HAVE_MOTIF
  	for (i = 0; i < XtNumber(command_table); ++i) {
+ 	    command_args[0].value = (XtArgVal) 
+ 	      XmCvtCTToXmString ((char *) command_table[i].label);
+ 	    command_args[2].value = (XtArgVal) command_table[i].y_pos;
+ 	    command_call[0].closure = (caddr_t) command_table[i].closure;
+ 	    (void) XtCreateManagedWidget(command_table[i].name,
+ 		xmPushButtonWidgetClass, panel_widget,
+ 		command_args, XtNumber(command_args));
+ 	}
+ #else /* not HAVE_MOTIF */
+ 	for (i = 0; i < XtNumber(command_table); ++i) {
  	    command_args[0].value = (XtArgVal) command_table[i].label;
  	    command_args[2].value = (XtArgVal) command_table[i].y_pos;
***************
*** 438,441 ****
--- 502,506 ----
  		command_args, XtNumber(command_args));
  	}
+ #endif /* not HAVE_MOTIF */
  }
  #endif	/* BUTTONS */
***************
*** 1036,1040 ****
  }
  
! #ifdef	BUTTONS
  	/*ARGSUSED*/
  static	void
--- 1101,1105 ----
  }
  
! #if defined(BUTTONS) || defined(HAVE_MOTIF)
  	/*ARGSUSED*/
  static	void
***************
*** 1408,1411 ****
--- 1473,1498 ----
  }
  
+ static void
+ set_shrink_factor(win, shrink)
+      struct WindowRec * win;
+      int shrink;
+ {
+ #ifdef HAVE_MOTIF
+   static Widget active_shrink_button = 0;
+ 
+   if (win->shrinkfactor != shrink || !active_shrink_button)
+     {
+       if (active_shrink_button)
+ 	XmToggleButtonSetState (active_shrink_button, False, False);
+       win->shrinkfactor = shrink;
+       if (shrink <= max_shrink_button
+ 	  && (active_shrink_button = shrink_button[shrink]))
+ 	XmToggleButtonSetState (active_shrink_button, True, False);
+     }
+ #else /* not HAVE_MOTIF */
+   win->shrinkfactor = shrink;
+ #endif /* not HAVE_MOTIF */
+ }
+ 
  #ifdef	TOOLKIT
  	/*ARGSUSED*/
***************
*** 1648,1652 ****
  		if (number0 <= 0) goto bad;
  		if (number0 == mane.shrinkfactor) return;
! 		mane.shrinkfactor = number0;
  		init_page();
  		if (number0 != 1 && number0 != bak_shrink) {
--- 1735,1739 ----
  		if (number0 <= 0) goto bad;
  		if (number0 == mane.shrinkfactor) return;
! 		set_shrink_factor (&mane, number0);
  		init_page();
  		if (number0 != 1 && number0 != bak_shrink) {
***************
*** 2746,2749 ****
--- 2833,2902 ----
   */
  
+ static void
+ file_pulldown_callback (w, client_data, call_data)
+      Widget w;
+      XtPointer client_data;
+      XtPointer call_data;
+ {
+   switch ((int) client_data) {
+   case 0:
+     keystroke ('R', 0, False, 0);
+     break;
+   case 1:
+     keystroke ('q', 0, False, 0);
+     break;
+   }
+ }
+ 
+ static void
+ navigate_pulldown_callback (w, client_data, call_data)
+      Widget w;
+      XtPointer client_data;
+      XtPointer call_data;
+ {
+   switch ((int) client_data) {
+   case 0:
+     keystroke ('p', 10, True, 0);
+     break;
+   case 1:
+     keystroke ('p', 5, True, 0);
+     break;
+   case 2:
+     keystroke ('p', 0, False, 0);
+     break;
+   case 5:
+     keystroke ('n', 10, True, 0);
+     break;
+   case 4:
+     keystroke ('n', 5, True, 0);
+     break;
+   case 3:
+     keystroke ('n', 0, False, 0);
+     break;
+   }
+ }
+ 
+ static void
+ scale_pulldown_callback (w, client_data, call_data)
+      Widget w;
+      XtPointer client_data;
+      XtPointer call_data;
+ {
+   switch ((int) client_data) {
+   case 0:
+     keystroke ('s', 1, True, 0);
+     break;
+   case 1:
+     keystroke ('s', 2, True, 0);
+     break;
+   case 2:
+     keystroke ('s', 3, True, 0);
+     break;
+   case 3:
+     keystroke ('s', 4, True, 0);
+     break;
+   }
+ }
+ 
  int
  main(argc, argv)
***************
*** 2838,2842 ****
  		dvi_name == NULL) usage();
  	if (shrink_factor != 1) bak_shrink = shrink_factor;
! 	mane.shrinkfactor = shrink_factor;
  	if (RESOURCE(debug_arg) != NULL)
  	    debug = isdigit(*RESOURCE(debug_arg)) ? atoi(RESOURCE(debug_arg))
--- 2991,2995 ----
  		dvi_name == NULL) usage();
  	if (shrink_factor != 1) bak_shrink = shrink_factor;
! 	set_shrink_factor (&mane, shrink_factor);
  	if (RESOURCE(debug_arg) != NULL)
  	    debug = isdigit(*RESOURCE(debug_arg)) ? atoi(RESOURCE(debug_arg))
***************
*** 3012,3017 ****
--- 3165,3175 ----
  
  #ifdef	BUTTONS
+ #ifdef HAVE_MOTIF
+ 	form_widget = XtCreateManagedWidget("form", xmFormWidgetClass,
+ 		top_level, form_args, XtNumber(form_args));
+ #else /* not HAVE_MOTIF */
  	form_widget = XtCreateManagedWidget("form", formWidgetClass,
  		top_level, form_args, XtNumber(form_args));
+ #endif /* not HAVE_MOTIF */
  
  	line_args[0].value = (XtArgVal) resource.high_color
***************
*** 3020,3026 ****
--- 3178,3237 ----
  #define	form_widget	top_level	/* for calls to XtAddEventHandler */
  #endif	/* BUTTONS */
+ #ifdef HAVE_MOTIF
+ 	vport_widget = XtCreateManagedWidget
+ 	  ("vport",
+ 	   xmMainWindowWidgetClass, form_widget,
+ 	   vport_args, XtNumber(vport_args));
+ 	XtVaGetValues (vport_widget, XmNclipWindow, &clip_widget, NULL);
+ 	menubar = XmVaCreateSimpleMenuBar
+ 	  (vport_widget, "menubar",
+ 	   XmVaCASCADEBUTTON, (XtArgVal) XmCvtCTToXmString("File"), 0, 
+ 	   XmVaCASCADEBUTTON, (XtArgVal) XmCvtCTToXmString("Navigate"), 0,
+ 	   XmVaCASCADEBUTTON, (XtArgVal) XmCvtCTToXmString("Scale"), 0,
+ 	   0);
+ 	{
+ 	  XmVaCreateSimplePulldownMenu 
+ 	     (menubar, "file_pulldown", 0, file_pulldown_callback,
+ 	      XmNtearOffModel, (XtArgVal) XmTEAR_OFF_ENABLED,
+ 	      XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Reload"), 0, 0, 0,
+ 	      XmVaSEPARATOR,
+ 	      XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Quit"), 0, 0, 0,
+ 	      0);
+ 	}
+ 	{
+ 	  XmVaCreateSimplePulldownMenu 
+ 	    (menubar, "navigate_pulldown", 1, navigate_pulldown_callback,
+ 	     XmNtearOffModel, (XtArgVal) XmTEAR_OFF_ENABLED,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Page-10"), 0, 0, 0,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Page-5"), 0, 0, 0,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Prev"), 0, 0, 0,
+ 	     XmVaSEPARATOR,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Next"), 0, 0, 0,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Page+5"), 0, 0, 0,
+ 	     XmVaPUSHBUTTON, (XtArgVal) XmCvtCTToXmString("Page+10"), 0, 0, 0,
+ 	     0);
+ 	}
+ 	{
+ 	  scale_menu = XmVaCreateSimplePulldownMenu 
+ 	    (menubar, "scale_pulldown", 2, scale_pulldown_callback,
+ 	     XmNradioBehavior, (XtArgVal) True,
+ 	     XmNtearOffModel, (XtArgVal) XmTEAR_OFF_ENABLED,
+ 	     XmVaRADIOBUTTON, (XtArgVal) XmCvtCTToXmString("Shrink1"), 0, 0, 0,
+ 	     XmVaRADIOBUTTON, (XtArgVal) XmCvtCTToXmString("Shrink2"), 0, 0, 0,
+ 	     XmVaRADIOBUTTON, (XtArgVal) XmCvtCTToXmString("Shrink3"), 0, 0, 0,
+ 	     XmVaRADIOBUTTON, (XtArgVal) XmCvtCTToXmString("Shrink4"), 0, 0, 0,
+ 	     0);
+ 	  shrink_button[1] = XtNameToWidget(scale_menu, "button_0");
+ 	  shrink_button[2] = XtNameToWidget(scale_menu, "button_1");
+ 	  shrink_button[3] = XtNameToWidget(scale_menu, "button_2");
+ 	  shrink_button[4] = XtNameToWidget(scale_menu, "button_3");
+ 	  max_shrink_button = 4;
+ 	  set_shrink_factor (&mane, mane.shrinkfactor);
+ 	}
+ #else /* not HAVE_MOTIF */
  	vport_widget = XtCreateManagedWidget("vport", viewportWidgetClass,
  		form_widget, vport_args, XtNumber(vport_args));
  	clip_widget = XtNameToWidget(vport_widget, "clip");
+ #endif /* not HAVE_MOTIF */
  	draw_args[0].value = (XtArgVal) page_w;
  	draw_args[1].value = (XtArgVal) page_h;
***************
*** 3030,3033 ****
--- 3241,3248 ----
  	draw_widget = XtCreateManagedWidget("drawing", drawWidgetClass,
  		vport_widget, draw_args, XtNumber(draw_args));
+ #ifdef HAVE_MOTIF
+ 	XmMainWindowSetAreas(vport_widget, menubar, 0, 0, 0, draw_widget);
+ 	XtManageChild(menubar);
+ #endif /* HAVE_MOTIF */
  	{	/* set default window size */
  #ifdef	BUTTONS

