
This Motif patch does not apply to the current sources.  If you make it
work, please send me the new patch. --kb@cs.umb.edu


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

