[comp.sources.x] v02i083: X11 Release 3, Patch6

mikew@wyse.wyse.com (Mike Wexler) (01/11/89)

Submitted-by: jim@expo.lcs.mit.edu (Jim Fulton)
Posting-number: Volume 2, Issue 83
Archive-name: x11.3/patch6



		       Created on Monday, 9 January 1989

				  PART 2 of 3


Fixes 5, 6, and 7 are part of a single update to the xman program.  Together
they affect the following files:

	clients/xman/CHANGES
	clients/xman/README
	clients/xman/ScrollByL.c
	clients/xman/TODO
	clients/xman/buttons.c
	clients/xman/defs.h
	clients/xman/globals.c
	clients/xman/globals.h
	clients/xman/handler.c
	clients/xman/help.c
	clients/xman/main.c
	clients/xman/man.c
	clients/xman/man.h
	clients/xman/menu.c
	clients/xman/misc.c
	clients/xman/pages.c
	clients/xman/search.c
	clients/xman/tkfuncs.c
	clients/xman/version.h
	clients/xman/xman.help
	clients/xman/xman.man

To apply these fixes, concatenate all three files and pipe them to patch -p0
from the top of your X sources:

	%  cat fix5 fix6 fix7 | patch -p0


The following is fix6 (you will also need fix5 and fix7):



*** /tmp/,RCSt1a17133	Fri Jan  6 18:56:28 1989
--- clients/xman/ScrollByL.c	Fri Jan  6 18:41:48 1989
***************
*** 1,8 ****
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: ScrollByL.c,v 1.4 88/10/17 20:21:12 swick Exp $
!  * $oHeader: ScrollByL.c,v 4.0 88/08/31 22:11:02 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
--- 1,8 ----
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: ScrollByL.c,v 1.5 89/01/06 18:41:40 kit Exp $
!  * $Header: ScrollByL.c,v 1.5 89/01/06 18:41:40 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
***************
*** 21,27 ****
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: ScrollByL.c,v 4.0 88/08/31 22:11:02 kit Exp $";
  #endif
  
  /*
--- 21,27 ----
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: ScrollByL.c,v 4.5 88/12/19 13:46:04 kit Exp $";
  #endif
  
  /*
***************
*** 30,36 ****
   * and do it much more like the Viewport widget in the Athena widget set.
   * But this works and time is short, so here it is.
   *
!  *                                     Chris Peterson 1/30/88
   */
  
  #include	<X11/IntrinsicP.h>
--- 30,41 ----
   * and do it much more like the Viewport widget in the Athena widget set.
   * But this works and time is short, so here it is.
   *
!  *                                     Chris D. Peterson 1/30/88
!  * 
!  * I removed all the code for horizontal scrolling here, since is was a crock
!  * anyway.
!  * 
!  *                                     Chris D. Peterson 11/13/88
   */
  
  #include	<X11/IntrinsicP.h>
***************
*** 59,65 ****
  static XtResource resources[] = {
      {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.foreground), 
!          XtRString, "Black"},
      {XtNinnerWidth, XtCWidth, XtRInt, sizeof(int),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.inner_width), 
           XtRString, "100"},
--- 64,70 ----
  static XtResource resources[] = {
      {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.foreground), 
!          XtRString, "XtDefaultForeground"},
      {XtNinnerWidth, XtCWidth, XtRInt, sizeof(int),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.inner_width), 
           XtRString, "100"},
***************
*** 69,83 ****
      {XtNforceBars, XtCBoolean, XtRBoolean, sizeof(Boolean),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.force_bars),
           XtRString, "FALSE"},
-     {XtNallowHoriz, XtCBoolean, XtRBoolean, sizeof(Boolean),
- 	 XtOffset(ScrollByLineWidget, scroll_by_line.allow_horiz),
-          XtRString, "FALSE"},
      {XtNallowVert, XtCBoolean, XtRBoolean, sizeof(Boolean),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.allow_vert),
           XtRString, "FALSE"},
-     {XtNuseBottom, XtCBoolean, XtRBoolean, sizeof(Boolean),
- 	 XtOffset(ScrollByLineWidget, scroll_by_line.use_bottom),
-          XtRString, "FALSE"},
      {XtNuseRight, XtCBoolean, XtRBoolean, sizeof(Boolean),
  	 XtOffset(ScrollByLineWidget, scroll_by_line.use_right),
           XtRString, "FALSE"},
--- 74,82 ----
***************
*** 101,113 ****
   *
   ****************************************************************/
  
- static void HorizontalThumb();
  static Boolean ScrollVerticalText();
  static void VerticalThumb();
- static void HorizontalScroll();
  static void VerticalScroll();
  static void Page();
  static void InitializeHook();
  static void Realize();
  static void Resize();
  static void ResetThumb();
--- 100,111 ----
   *
   ****************************************************************/
  
  static Boolean ScrollVerticalText();
  static void VerticalThumb();
  static void VerticalScroll();
  static void Page();
  static void InitializeHook();
+ static void Initialize();
  static void Realize();
  static void Resize();
  static void ResetThumb();
***************
*** 114,120 ****
  static void Redisplay();
  static void ChildExpose();
  static Boolean SetValues();
- static int MergeArglists();
  static Boolean Layout();
  static XtGeometryResult GeometryManager();
  static void ChangeManaged();
--- 112,117 ----
***************
*** 133,139 ****
      /* class_initialize   */    NULL,
      /* class_part_init    */    NULL,
      /* class_inited       */	FALSE,
!     /* initialize         */    NULL,
      /* initialize_hook    */    InitializeHook,
      /* realize            */    Realize,
      /* actions            */    actions,
--- 130,136 ----
      /* class_initialize   */    NULL,
      /* class_part_init    */    NULL,
      /* class_inited       */	FALSE,
!     /* initialize         */    Initialize,
      /* initialize_hook    */    InitializeHook,
      /* realize            */    Realize,
      /* actions            */    actions,
***************
*** 185,190 ****
--- 182,189 ----
  /*	Function Name: Layout
   *	Description: This function lays out the scroll_by_line widget.
   *	Arguments: w - the scroll_by_line widget.
+  *                 key - a boolean: if true then resize the widget to the child
+  *                                  if false the resize children to fit widget.
   *	Returns: TRUE if successful.
   */
  
***************
*** 196,219 ****
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
    Dimension width,height;	/* The size that the widget would like to be */
    XtGeometryResult answer;	/* the answer from the parent. */
!   Widget hbar,vbar,child;	/* The three children of this 
!        			    scrolled widget. */
    int vbar_x,vbar_y;		/* The locations of the various elements. */
!   int hbar_x,hbar_y;
!   int child_x,child_y;
!   int c_width,c_height;
    Boolean make_bar;
  
    vbar = sblw->composite.children[0];
!   hbar = sblw->composite.children[1];
!   child = sblw->composite.children[2];
    height = sblw->core.height;
    width = sblw->core.width;
  
  /* set the initial scroll bar positions. */
  
!   vbar_x = vbar_y = 0;
!   hbar_x = hbar_y = 0;
  
  /* Should I allow the vertical scrollbar to be seen */
  
--- 195,214 ----
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
    Dimension width,height;	/* The size that the widget would like to be */
    XtGeometryResult answer;	/* the answer from the parent. */
!   Widget vbar,child;		/* The two children of this scrolled widget. */
    int vbar_x,vbar_y;		/* The locations of the various elements. */
!   int child_x;
!   int c_width;
    Boolean make_bar;
  
    vbar = sblw->composite.children[0];
!   child = sblw->composite.children[1];
    height = sblw->core.height;
    width = sblw->core.width;
  
  /* set the initial scroll bar positions. */
  
!   vbar_x = vbar_y = - vbar->core.border_width;
  
  /* Should I allow the vertical scrollbar to be seen */
  
***************
*** 238,258 ****
       else
         c_width = width - vbar->core.width -2 * vbar->core.border_width;
  
! /* Put Scrollbar on right side if scrolled window? */
  
       if (sblw->scroll_by_line.use_right) {
         vbar_x = width - vbar->core.width - 2 * vbar->core.border_width;
         child_x = 0;
       }
!      else {
!        child_x = vbar->core.width + 2 * vbar->core.border_width;
!        vbar_x = 0;
!      }
     }
     else {
       /* Make the scroll bar dissappear, note how scroll bar is always there,
          sometimes it is just that we cannot see them. */
!      vbar_x = - vbar->core.width - 10;
       child_x = 0;
       if (key)
         width = child->core.width;
--- 233,251 ----
       else
         c_width = width - vbar->core.width -2 * vbar->core.border_width;
  
!      /* Put Scrollbar on right side if scrolled window? */
  
       if (sblw->scroll_by_line.use_right) {
         vbar_x = width - vbar->core.width - 2 * vbar->core.border_width;
         child_x = 0;
       }
!      else 
!        child_x = vbar->core.width + vbar->core.border_width;
     }
     else {
       /* Make the scroll bar dissappear, note how scroll bar is always there,
          sometimes it is just that we cannot see them. */
!      vbar_x = - vbar->core.width - 2 * vbar->core.border_width - 10;
       child_x = 0;
       if (key)
         width = child->core.width;
***************
*** 260,356 ****
         c_width = width;
     }
  
! /* set the horizontal bar position. */
  
! /* should we allow the horiz. scroll bar. */
  
!    if (sblw->scroll_by_line.allow_horiz && (child->core.width >= width ||
! 					sblw->scroll_by_line.force_bars)) {
!      if (key)
!        height = child->core.height + hbar->core.height + 
! 	        2 * hbar->core.border_width;
!      else
!        c_height = height - hbar->core.height - 2 * hbar->core.border_width;
  
!      hbar_x = child_x;
  
! /* Should we put the scroll bar on the bottom?? */
  
!      if (sblw->scroll_by_line.use_bottom) {
!        hbar_y = height - hbar->core.height - 2 * hbar->core.border_width;
!        child_y = 0;
!      }
!      else {
!        child_y = hbar->core.height + 2 * hbar->core.border_width;
!        vbar_y = child_y;
!        hbar_y = 0;
!      }
!    }
!    else {
!      /* make this scroll bar disappear. */
!      hbar_y = - hbar->core.height - 10;
!      child_y = 0;
!      if (key)
!        height = child->core.height;
!      else
!        c_height = height;
!    }
  
-  /* if the windows are realized we have to move them. */
- 
-    if (XtIsRealized( (Widget) sblw)) {
-      XtMoveWidget(hbar,hbar_x,hbar_y);
-      XtMoveWidget(vbar,vbar_x,vbar_y);
-      XtMoveWidget(child,child_x,child_y);
- 
-  /* resize the children to be the correct height or width. */
- 
-      XtResizeWidget(vbar,vbar->core.width,height - 
- 		    2 * vbar->core.border_width - vbar_y,
- 		    vbar->core.border_width);
- 
-      XtResizeWidget(hbar,width - hbar_x - 
- 		    2 * hbar->core.border_width,
- 		    hbar->core.height,hbar->core.border_width);
- 
-      if (!key)
-        XtResizeWidget(child, (Cardinal) c_width, (Cardinal) c_height,
- 		      child->core.border_width);
- 
-    }
- /* 
-  * If they are not realized we do not need to move them then just set their 
-  * core values, this saves a bit of time. 
-  */
-   else {
-     hbar->core.x = hbar_x;
-     hbar->core.y = hbar_y;
-     vbar->core.x = vbar_x;
-     vbar->core.y = vbar_y;
-     child->core.x = child_x;
-     child->core.y = child_y;
- 
- /* resize the scrollbars to be the correct height or width. */
- 
-     XtResizeWidget(vbar,vbar->core.width,height - 
-        	    2 * vbar->core.border_width - vbar_y,
-        	    vbar->core.border_width);
- 
-     XtResizeWidget(hbar,width - hbar_x - 
-        	    2 * hbar->core.border_width,
-        	    hbar->core.height,hbar->core.border_width);
- 
-     if (!key) { 
-       child->core.width = c_width;
-       child->core.height = c_height;
-     }
-   }    
- 
-   height = height;
-   width = width;
- 
- /* set the thumb size to be correct. */
- 
    ResetThumb( (Widget) sblw);
  
    answer = XtMakeResizeRequest( (Widget) sblw, width, height, &width, &height);
--- 253,273 ----
         c_width = width;
     }
  
!  /* Move child and v_bar to correct location. */
  
!   XtMoveWidget(vbar, vbar_x, vbar_y);
!   XtMoveWidget(child, child_x, 0);
  
!   /* resize the children to be the correct height or width. */
  
!   XtResizeWidget(vbar, vbar->core.width, height, vbar->core.border_width);
  
!   if (!key)
!     XtResizeWidget(child, (Cardinal) (c_width - 20), (Cardinal) height,
! 		   child->core.border_width);
  
!   /* set the thumb size to be correct. */
  
    ResetThumb( (Widget) sblw);
  
    answer = XtMakeResizeRequest( (Widget) sblw, width, height, &width, &height);
***************
*** 378,388 ****
  {
    float shown;
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
!   Widget child,vbar,hbar;
  
    vbar = sblw->composite.children[0];
!   hbar = sblw->composite.children[1];
!   child = sblw->composite.children[2];
  
  /* vertical */
  
--- 295,304 ----
  {
    float shown;
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
!   Widget child,vbar;
  
    vbar = sblw->composite.children[0];
!   child = sblw->composite.children[1];
  
  /* vertical */
  
***************
*** 392,409 ****
      shown = 1.0;
  
    XtScrollBarSetThumb( vbar, (float) -1, shown );
- 
- /* horizontal */
- 
-   shown = (float) child->core.width / (float) child->core.width;
-   XtScrollBarSetThumb( hbar, (float) -1, shown );
  }
  
  /*
   *
   * Geometry Manager - If the height of width is changed then try a new layout.
! *                    else dissallow the requwest.
! *
   */
  
  /*ARGSUSED*/
--- 308,320 ----
      shown = 1.0;
  
    XtScrollBarSetThumb( vbar, (float) -1, shown );
  }
  
  /*
   *
   * Geometry Manager - If the height of width is changed then try a new layout.
!  *                    else dissallow the requwest.
!  *
   */
  
  /*ARGSUSED*/
***************
*** 440,446 ****
   * then I call the redisplay routine.
   */
  
!   Redisplay(w->core.parent,event);
  } /* ChildExpose */
  
  /*
--- 351,359 ----
   * then I call the redisplay routine.
   */
  
!   if ((event->type == Expose) || (event->type == GraphicsExpose))
!     Redisplay(w->core.parent, event, NULL);
! 
  } /* ChildExpose */
  
  /*
***************
*** 448,456 ****
   */
  
  /* ARGSUSED */
! static void Redisplay(w, event)
  Widget w;
  XEvent *event;
  {
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
  
--- 361,370 ----
   */
  
  /* ARGSUSED */
! static void Redisplay(w, event, region)
  Widget w;
  XEvent *event;
+ Region region;
  {
    ScrollByLineWidget sblw = (ScrollByLineWidget) w;
  
***************
*** 543,549 ****
   * of scrolling has been turned off. 
   */
  
!    if (vbar->core.x < 0)
       return;
  
     switch ( direction ) {
--- 457,463 ----
   * of scrolling has been turned off. 
   */
  
!    if (vbar->core.x < - vbar->core.border_width)
       return;
  
     switch ( direction ) {
***************
*** 555,561 ****
     case 'b':
     case 'B':
       /* move one page backward */
!      VerticalScroll(vbar,NULL, (int)  - vbar->core.height);
       break;
     case 'L':
     case 'l':
--- 469,475 ----
     case 'b':
     case 'B':
       /* move one page backward */
!      VerticalScroll(vbar,NULL,  - (int) vbar->core.height);
       break;
     case 'L':
     case 'l':
***************
*** 595,602 ****
    ScrollByLineStruct sblw_struct;
    Boolean move_thumb = FALSE;
  
-   child = sblw->composite.children[2];
    vbar =  sblw->composite.children[0];
  
    num_lines =  child->core.height / sblw->scroll_by_line.font_height;
  
--- 509,516 ----
    ScrollByLineStruct sblw_struct;
    Boolean move_thumb = FALSE;
  
    vbar =  sblw->composite.children[0];
+   child = sblw->composite.children[1];
  
    num_lines =  child->core.height / sblw->scroll_by_line.font_height;
  
***************
*** 613,618 ****
--- 527,534 ----
      max_lines = sblw->scroll_by_line.lines -
       child->core.height / sblw->scroll_by_line.font_height;
  
+     if (max_lines < 0) max_lines = 0;
+ 
      if ( new_line > max_lines ) {
        new_line = max_lines;
        move_thumb = TRUE;
***************
*** 787,973 ****
  
  }
  
! /*
!  * I have not thought out the horizontal scrolling yet, I am not sure what 
!  * should be done here.  This code is questionable.
!  */
!  
! 
! /*	Function Name: HorizontalThumb
!  *	Description: This function moves the postition of the interior window
!  *                   as the vertical scroll bar is moved.
!  *	Arguments: w - the scrollbar widget.
!  *                 junk - not used.
!  *                 percent - the position of the scrollbar.
!  *	Returns: none.
!  */
! 
! static void
! HorizontalThumb(w,junk,percent)
! Widget w;
! caddr_t junk;
! float *percent;
  {
-   int x, y;
-   Widget child,vbar;
-   ScrollByLineWidget sblw = (ScrollByLineWidget) w->core.parent;
- 
-   /* reposition the client window (child[2]) */
- 
-   vbar =  sblw->composite.children[0];
-   child = sblw->composite.children[2];
- 
-   x = (int) ( (0.0 - (*percent)) * ((float) child->core.width));
-   y = child->core.y;
- 
- /* 
-  * if there is a vertical scrollbar and it is on the left then 
-  * allow room for it .
-  */
- 
-   if (vbar->core.x == 0)
-     x += vbar->core.width + 2 * vbar->core.border_width;
- 
-   XtMoveWidget(child,x,y);
- }
- 
- /*	Function Name: HorizontalScroll
-  *	Description: This function moves the postition of the interior window
-  *                   as the horizontal scroll bar is moved.
-  *	Arguments: w - the scrollbar widget.
-  *                 junk - not used.
-  *                 pos - the position of the cursor.
-  *	Returns: none.
-  */
- 
- static void
- HorizontalScroll(w,junk,pos)
- Widget w;
- caddr_t junk;
- int pos;
- {
-   int x, y, min_x;
-   float location;
-   Widget child,vbar,hbar;
-   ScrollByLineWidget sblw = (ScrollByLineWidget) w->core.parent;
- 
-   /* reposition the client window (child[2]) */
- 
-   vbar =  sblw->composite.children[0];
-   hbar =  sblw->composite.children[1];
-   child = sblw->composite.children[2];
- 
-   x = child->core.x - pos;
-   y = child->core.y;
-   
- /* 
-  * Keep us in bounds.
-  */
- 
-   if ( x > 0 ) x = 0;
-   min_x = - (child->core.width - hbar->core.width - 
- 	     2 * vbar->core.border_width);
- 
-   if (vbar->core.y > 0)		/* vertical scrollbar is on right.*/
-     min_x -=  vbar->core.width +  2 * vbar->core.border_width;
- 
-   if ( x < min_x ) x = min_x;
- 
- /* reposition the thumb */
- 
-   location = 0.0 - (float) y / (float) child->core.width; 
-   XtScrollBarSetThumb( hbar, location , (float) -1 );
-   
- /* 
-  * if there is a vertical scrollbar and it is on the left then 
-  * allow room for it .
-  */
- 
-   if (vbar->core.x == 0)
-     y += vbar->core.width + 2 * vbar->core.border_width;
-     
-   XtMoveWidget(child,x,y);	/* he's my child so I can move him. */
- }
- 
- static void InitializeHook(new, args, num_args)
-     ScrollByLineWidget new;
-     ArgList args;
-     Cardinal *num_args;
- {
    ScrollByLineWidget sblw = (ScrollByLineWidget) new;
-   Widget window;		/* Window widget. */
-   Arg arglist[50];		/* Must be large enough for the 
- 				 arglist from the scrolled widget to 
- 				 be added to it. */
-   Cardinal scrollbar_num;	/* the number of scrollbar args. */
-   Cardinal window_num;		/* the number of window args. */
    
!   static XtCallbackRec scrollcallback[] = { /* The scroll callback function. */
!     { NULL, NULL },
!     { NULL, NULL },
!   };
!   static XtCallbackRec thumbcallback[] = { /* The thumb callback function. */
!     { NULL, NULL },
!     { NULL, NULL },
!   };
  
-   sblw->scroll_by_line.line_pointer = 0; /* initial point to line 0. */
- 
    if (sblw->core.height <= 0)
      sblw->core.height = DEFAULT_HEIGHT;
    if (sblw->core.width <= 0)
      sblw->core.width = DEFAULT_WIDTH;
  
!   scrollbar_num = 0;  
!   XtSetArg(arglist[scrollbar_num], XtNheight, 10); /* changed in layout. */
!   scrollbar_num++;
!   XtSetArg(arglist[scrollbar_num], XtNwidth, 16);
!   scrollbar_num++;
!   XtSetArg(arglist[scrollbar_num], XtNorientation, XtorientVertical);
!   scrollbar_num++;
!   thumbcallback[0].callback = VerticalThumb;  
!   scrollcallback[0].callback = VerticalScroll;
!   XtSetArg(arglist[scrollbar_num], XtNjumpProc, thumbcallback);
!   scrollbar_num++;
!   XtSetArg(arglist[scrollbar_num], XtNscrollProc, scrollcallback);
!   scrollbar_num++;
  
! /* 
!  * Merge the argument lists so but have the scrollbar arglist take 
!  * control when there is a discrepency this causes us to get the
!  * correct height and width.
!  */
  
-   scrollbar_num = MergeArglists(args, *num_args,arglist,scrollbar_num);
- 
-   XtCreateManagedWidget("Vertical Scroll Bar",
- 		 scrollbarWidgetClass, (Widget) sblw,arglist,scrollbar_num);
- 
-   scrollbar_num = 0;  
-   XtSetArg(arglist[scrollbar_num], XtNwidth, 10); /* changed in layout. */
-   scrollbar_num++;
-   XtSetArg(arglist[scrollbar_num], XtNheight, 16);
-   scrollbar_num++;
-   XtSetArg(arglist[scrollbar_num], XtNorientation, XtorientHorizontal);
-   scrollbar_num++;
-   thumbcallback[0].callback = HorizontalThumb;
-   scrollcallback[0].callback = HorizontalScroll;
-   XtSetArg(arglist[scrollbar_num], XtNjumpProc, thumbcallback);
-   scrollbar_num++;
-   XtSetArg(arglist[scrollbar_num], XtNscrollProc, scrollcallback);
-   scrollbar_num++;
- 
- /* 
-  * Merge the argument lists so but have the scrollbar arglist take 
-  * control when there is a discrepency this causes us to get the
-  * correct height and width.
-  */
- 
-   scrollbar_num = MergeArglists(args, *num_args,arglist,scrollbar_num);
- 
-   XtCreateManagedWidget("Horizontal Scroll Bar",
- 		 scrollbarWidgetClass, (Widget) sblw,arglist,scrollbar_num);
- 
    window_num = 0;  
    XtSetArg(arglist[window_num], XtNwidth, sblw->scroll_by_line.inner_width); 
    window_num++;
--- 703,739 ----
  
  }
  
! static void 
! Initialize(req, new)
! Widget req, new;
  {
    ScrollByLineWidget sblw = (ScrollByLineWidget) new;
    
!   sblw->scroll_by_line.line_pointer = 0; /* initially point to line 0. */
  
    if (sblw->core.height <= 0)
      sblw->core.height = DEFAULT_HEIGHT;
    if (sblw->core.width <= 0)
      sblw->core.width = DEFAULT_WIDTH;
+ } /* Initialize. */
  
! static void 
! InitializeHook(new, args, num_args)
! ScrollByLineWidget new;
! ArgList args;
! Cardinal *num_args;
! {
!   ScrollByLineWidget sblw = (ScrollByLineWidget) new;
!   Widget window, s_bar;		/* Window widget, and scollbar. */
!   Arg arglist[10];		/* an arglist. */
!   ArgList merged_list, XtMergeArgLists(); /* The merged arglist. */
!   Cardinal window_num, merged_num; /* The number of window args. */
  
!   s_bar = XtCreateManagedWidget("verticalScrollBar", scrollbarWidgetClass,
! 				(Widget) sblw, args, *num_args);
!   XtAddCallback(s_bar, XtNjumpProc, VerticalThumb, NULL);
!   XtAddCallback(s_bar, XtNscrollProc, VerticalScroll, NULL);
  
    window_num = 0;  
    XtSetArg(arglist[window_num], XtNwidth, sblw->scroll_by_line.inner_width); 
    window_num++;
***************
*** 975,988 ****
    window_num++;
    XtSetArg(arglist[window_num], XtNborderWidth, 0);
    window_num++;  
    
!   window = XtCreateWidget("Window with file",widgetClass,(Widget) sblw,arglist,
! 			  window_num);
    XtManageChild(window);
  
! /* We want expose events for this window also. */
  
!   XtAddEventHandler(window, (Cardinal) ExposureMask, FALSE, ChildExpose, NULL);
    
  } /* InitializeHook */
  
--- 741,764 ----
    window_num++;
    XtSetArg(arglist[window_num], XtNborderWidth, 0);
    window_num++;  
+ 
+ /* 
+  * I hope this will cause my args to override those passed to the SBL widget.
+  */
    
!   merged_list = XtMergeArgLists(args, *num_args, arglist, window_num);
!   merged_num = *num_args + window_num;
! 
!   window = XtCreateWidget("windowWithFile",widgetClass,(Widget) sblw,
! 			  merged_list, merged_num);
    XtManageChild(window);
+   XtFree(merged_list);		/* done, free it. */
  
! /*
!  * We want expose (and graphic exposuer) events for this window also. 
!  */
  
!   XtAddEventHandler(window, (Cardinal) ExposureMask, TRUE, ChildExpose, NULL);
    
  } /* InitializeHook */
  
***************
*** 1023,1078 ****
  
  } /* Set Values */
  
- /*	Function Name: MergeArglists
-  *	Description: This function merges two arglists.
-  *	Arguments: from,num_from - the number and list of args for the source.
-  *                 to,num_to - the number and list of argument for the
-  *                             destination.
-  *	Returns: new number of argument in to.
-  */
- 
- /* Note: This function will be very unhappy with you if 'to' is not
-  *       large enough to contain 'from', you will end up with pointers 
-  *       in space.
-  */
- 
- static int
- MergeArglists(from,num_from,to,num_to)
- Arg from[],to[];
- Cardinal num_from,num_to;
- {
-   int i,j;			/* a counter. */
- 
- /* When there are two similar values ignore the from value. */
- 
-   i = 0;
-   while ( i < num_from ) {	
-     j = 0;
-     while ( j < num_to ) {
-       if ( !strcmp(from[i].name,to[j].name) ) {
- 	/* if they are the same then goto next on the from list,
- 	   i.e. ignore this entry, do not add to to list. */
- 	i++;
- 	if ( i > num_from)
- 	  j = num_to + 100;
- 	else {
- 	  j = 0;
- 	  continue;
- 	}
-       }
-       j++;
-     }
-     /* add to to list */
-     if (j < num_to + 100) {
-       to[num_to].value = from[i].value;
-       to[num_to].name = from[i].name;
-       num_to++;
-       i++;
-     }
-   }
-   return(num_to);
- }
- 
  /* Public Routines. */
  
  /*	Function Name: XtScrollByLineWidget()
--- 799,804 ----
***************
*** 1087,1093 ****
  {
    ScrollByLineWidget sblw = (ScrollByLineWidget) w; /* the sblw widget. */
    
!   return(sblw->composite.children[2]);
  }
  
  /*	Function Name: XtResetScrollByLine
--- 813,819 ----
  {
    ScrollByLineWidget sblw = (ScrollByLineWidget) w; /* the sblw widget. */
    
!   return(sblw->composite.children[1]);
  }
  
  /*	Function Name: XtResetScrollByLine
***************
*** 1114,1118 ****
               (float) sblw->scroll_by_line.lines; 
    XtScrollBarSetThumb( vbar, location , (float) -1 );
  
!   ResetThumb(w);
  }
--- 840,844 ----
               (float) sblw->scroll_by_line.lines; 
    XtScrollBarSetThumb( vbar, location , (float) -1 );
  
!   Layout(w, FALSE);		/* see if new layout is required. */
  }
*** /tmp/,RCSt1a17182	Fri Jan  6 18:56:42 1989
--- clients/xman/handler.c	Fri Jan  6 18:42:02 1989
***************
*** 1,7 ****
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: handler.c,v 1.2 88/09/06 17:47:50 jim Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
--- 1,7 ----
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: handler.c,v 1.3 89/01/06 18:42:00 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
***************
*** 20,26 ****
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: handler.c,v 4.0 88/08/31 22:11:58 kit Exp $";
  #endif
  
  #include "globals.h"
--- 20,26 ----
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: handler.c,v 4.6 89/01/06 12:17:27 kit Exp $";
  #endif
  
  #include "globals.h"
***************
*** 84,91 ****
   * I did not have a two state or toggle widget, which is the way this
   * should really be done.  1/22/88 - CDP.
   */
-     ChangeLabel(man_globals->label,
- 		man_globals->section_name[man_globals->current_directory]);
      if (man_globals->both_shown == TRUE) {
        label_str = SHOW_BOTH;
        if (man_globals->dir_shown)
--- 84,89 ----
***************
*** 98,104 ****
        Widget dir = man_globals->manpagewidgets.directory;
  
        label_str = SHOW_ONE;
!       XtPanedSetMinMax(dir,directory_height,directory_height);
        if (!man_globals->dir_shown) {
  	XtUnmanageChild(manpage);
  	XtManageChild(dir);
--- 96,103 ----
        Widget dir = man_globals->manpagewidgets.directory;
  
        label_str = SHOW_ONE;
!       XtPanedSetMinMax(dir, resources.directory_height, 
! 		       resources.directory_height);
        if (!man_globals->dir_shown) {
  	XtUnmanageChild(manpage);
  	XtManageChild(dir);
***************
*** 116,121 ****
--- 115,125 ----
   * is up so very little time is wasted in the extra popdown call later.
   */
      XtPopdown( XtParent(XtParent(w)) );
+     if (man_globals->dir_shown)
+       ChangeLabel(man_globals->label,
+ 		  man_globals->section_name[man_globals->current_directory]);
+     else
+       ChangeLabel(man_globals->label, man_globals->manpage_title);
      ChangeLabel(man_globals->both_shown_button, label_str);
      /* if both are shown there is no need to switch between the two. */
      XtSetSensitive(man_globals->put_up_manpage,!man_globals->both_shown);
***************
*** 156,161 ****
--- 160,167 ----
  
  #define OFF_OF_TOP 25
  
+ /* ARGSUSED */
+ 
  void
  PopUpMenu(w,junk,event)
  Widget w;
***************
*** 188,193 ****
--- 194,201 ----
   *	Returns: none
   */
  
+ /* ARGSUSED */
+ 
  void
  PopDown(w,junk,event)
  Widget w;
***************
*** 226,232 ****
    else if ( !strcmp(Name(w),CANCEL) ) 
      file = NULL;
    else 
!     PrintWarning("Unknown widget");
  
    /* popdown the search widget */
  
--- 234,240 ----
    else if ( !strcmp(Name(w),CANCEL) ) 
      file = NULL;
    else 
!     PrintError("Unknown widget, in Search Box.");
  
    /* popdown the search widget */
  
***************
*** 254,270 ****
    InitManpage(man_globals,man_globals->manpagewidgets.manpage,file);
    fclose(file);
    
!   if (!man_globals->both_shown) {
      XtUnmanageChild(man_globals->manpagewidgets.directory);
      XtManageChild(man_globals->manpagewidgets.manpage);
-   }
-   
-   XtSetSensitive(man_globals->both_shown_button,TRUE);
-   if (!man_globals->both_shown) {
      XtSetSensitive(man_globals->put_up_manpage,TRUE); 
      ChangeLabel(man_globals->label,man_globals->manpage_title);
      man_globals->dir_shown = FALSE;
    }
    MakeLong( XtParent(man_globals->both_shown_button) );
    XtResetScrollByLine(man_globals->manpagewidgets.manpage);
  }
--- 262,280 ----
    InitManpage(man_globals,man_globals->manpagewidgets.manpage,file);
    fclose(file);
    
!   if (man_globals->both_shown) {
!     ChangeLabel(man_globals->label, 
! 		man_globals->section_name[man_globals->current_directory]);
!   }
!   else {
      XtUnmanageChild(man_globals->manpagewidgets.directory);
      XtManageChild(man_globals->manpagewidgets.manpage);
      XtSetSensitive(man_globals->put_up_manpage,TRUE); 
      ChangeLabel(man_globals->label,man_globals->manpage_title);
      man_globals->dir_shown = FALSE;
    }
+ 
+   XtSetSensitive(man_globals->both_shown_button,TRUE);
    MakeLong( XtParent(man_globals->both_shown_button) );
    XtResetScrollByLine(man_globals->manpagewidgets.manpage);
  }
***************
*** 309,314 ****
--- 319,326 ----
   *	Returns: none.
   */
  
+ /* ARGSUSED */
+ 
  void
  GotoManpage(w, global_pointer, event)
  Widget w;
***************
*** 350,358 ****
    ManpageGlobals * man_globals = (ManpageGlobals *) global_pointer;
    XtListReturnStruct * ret_struct = (XtListReturnStruct *) ret_val;
  
!   file = FindFilename(man_globals, ret_struct->string,
! 		      man_globals->current_directory,
! 	 &(manual[man_globals->current_directory].entries[ret_struct->index]));
    PutUpManpage(man_globals, file);
  }
  
--- 362,369 ----
    ManpageGlobals * man_globals = (ManpageGlobals *) global_pointer;
    XtListReturnStruct * ret_struct = (XtListReturnStruct *) ret_val;
  
!   file = FindFilename(man_globals,
! 	 manual[man_globals->current_directory].entries[ret_struct->index]);
    PutUpManpage(man_globals, file);
  }
  
***************
*** 378,391 ****
    int current_box;
  
    menu_struct = (MenuCallbackStruct *) pointer;
- 
    man_globals = (ManpageGlobals *) menu_struct->data;
  
-   /* The callback numbers go from 0 to n - 1 but I want from 1 to n */
- 
    number = menu_struct->number;
-   number++;
- 
    current_box = man_globals->current_directory;
  
    /* We have used this guy, pop down the menu. */
--- 389,397 ----
***************
*** 392,407 ****
    
    if (number != current_box) {
      /* This is the only one that we know has a parent. */
!     parent = XtParent(man_globals->manpagewidgets.box[1]);
  
      MakeDirectoryBox(man_globals, parent,
  		     man_globals->manpagewidgets.box + number, number);
      XtUnmanageChild(man_globals->manpagewidgets.box[current_box]);
      XtManageChild(man_globals->manpagewidgets.box[number]);
!     
      man_globals->current_directory = number;
    }
-   ChangeLabel(man_globals->label, man_globals->section_name[number]);
  
    XtPopdown( XtParent(XtParent(w)) );
  
--- 398,414 ----
    
    if (number != current_box) {
      /* This is the only one that we know has a parent. */
!     parent = XtParent(man_globals->manpagewidgets.box[INITIAL_DIR]);
  
      MakeDirectoryBox(man_globals, parent,
  		     man_globals->manpagewidgets.box + number, number);
      XtUnmanageChild(man_globals->manpagewidgets.box[current_box]);
      XtManageChild(man_globals->manpagewidgets.box[number]);
! 
!     XtListUnhighlight(man_globals->manpagewidgets.box[current_box]);
!     ChangeLabel(man_globals->label, man_globals->section_name[number]);
      man_globals->current_directory = number;
    }
  
    XtPopdown( XtParent(XtParent(w)) );
  
***************
*** 422,427 ****
--- 429,436 ----
   *	Returns: none
   */
  
+ /* ARGSUSED */
+ 
  void
  SaveCallback(w,global_pointer,junk)
  Widget w;
***************
*** 453,458 ****
--- 462,469 ----
   *                 junk - the callback and closure date are not used.
   *	Returns: none.
   */
+ 
+ /* ARGSUSED */
  
  void
  ManpageButtonPress(w,global_pointer,event)
*** /tmp/,RCSt1a17197	Fri Jan  6 18:56:47 1989
--- clients/xman/main.c	Fri Jan  6 18:42:11 1989
**************
*** 1,7 ****
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: main.c,v 1.3 88/10/20 10:05:04 swick Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
--- 1,7 ----
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: main.c,v 1.4 89/01/06 18:42:08 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
   *
***************
*** 20,26 ****
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: main.c,v 4.0 88/08/31 22:12:26 kit Exp $";
  #endif
  
  #include "globals.h"
--- 20,26 ----
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: main.c,v 4.5 88/12/19 13:47:28 kit Exp $";
  #endif
  
  #include "globals.h"
***************
*** 31,63 ****
  
  static void ArgError();
  
! /* XtOffset() hack for ibmrt BandAidCompiler */
  
  static XtResource my_resources[] = {
    {"manualFontNormal", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      (Cardinal) &(fonts.normal), XtRString, MANPAGE_NORMAL},
    {"manualFontBold", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      (Cardinal) &(fonts.bold), XtRString, MANPAGE_BOLD},
    {"manualFontItalic", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      (Cardinal) &(fonts.italic), XtRString, MANPAGE_ITALIC},
    {"directoryFontNormal", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      (Cardinal) &(fonts.directory), XtRString, DIRECTORY_NORMAL},
    {"bothShown", XtCBoolean, XtRBoolean, sizeof(Boolean),
!      (Cardinal) &both_shown_initial, XtRString, "False"},
    {"directoryHeight", "DirectoryHeight", XtRInt, sizeof(int),
!      (Cardinal) &directory_height, XtRString, "150"},  
    {"topCursor", XtCCursor, XtRCursor, sizeof(Cursor), 
!      (Cardinal) &(cursors.top), XtRString, XMAN_CURSOR},
    {"helpCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      (Cardinal) &(cursors.help), XtRString, HELP_CURSOR},
    {"manpageCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      (Cardinal) &(cursors.manpage), XtRString, MANPAGE_CURSOR},
    {"searchEntryCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      (Cardinal) &(cursors.search_entry), XtRString, SEARCH_ENTRY_CURSOR},
    {"helpFile", XtCFile, XtRString, sizeof(char *),
!      (Cardinal) &(help_file), XtRString, HELPFILE},
    {"topBox", XtCBoolean, XtRBoolean, sizeof(Boolean),
!      (Cardinal) &top_box_active, XtRString, "True"},
  };
  
  /*
--- 31,63 ----
  
  static void ArgError();
  
! #define Offset(field) (XtOffset(Xman_Resources *, field))
  
  static XtResource my_resources[] = {
    {"manualFontNormal", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      Offset(fonts.normal), XtRString, MANPAGE_NORMAL},
    {"manualFontBold", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      Offset(fonts.bold), XtRString, MANPAGE_BOLD},
    {"manualFontItalic", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      Offset(fonts.italic), XtRString, MANPAGE_ITALIC},
    {"directoryFontNormal", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
!      Offset(fonts.directory), XtRString, DIRECTORY_NORMAL},
    {"bothShown", XtCBoolean, XtRBoolean, sizeof(Boolean),
!      Offset(both_shown_initial), XtRString, "False"},
    {"directoryHeight", "DirectoryHeight", XtRInt, sizeof(int),
!      Offset(directory_height), XtRString, "150"},  
    {"topCursor", XtCCursor, XtRCursor, sizeof(Cursor), 
!      Offset(cursors.top), XtRString, XMAN_CURSOR},
    {"helpCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      Offset(cursors.help), XtRString, HELP_CURSOR},
    {"manpageCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      Offset(cursors.manpage), XtRString, MANPAGE_CURSOR},
    {"searchEntryCursor", XtCCursor, XtRCursor, sizeof(Cursor),
!      Offset(cursors.search_entry), XtRString, SEARCH_ENTRY_CURSOR},
    {"helpFile", XtCFile, XtRString, sizeof(char *),
!      Offset(help_file), XtRString, HELPFILE},
    {"topBox", XtCBoolean, XtRBoolean, sizeof(Boolean),
!      Offset(top_box_active), XtRString, "True"},
  };
  
  /*
***************
*** 85,134 ****
  char ** argv;
  int argc;
  {
!   Widget top_menu;
! 
!   top_menu = XtInitialize(TOPBOXNAME,"XMan", 
! 			  xman_options, XtNumber(xman_options),
! 			  (unsigned int*) &argc,argv);
    if (argc != 1) {
      ArgError(argc, argv);
      exit(42);
    }
  
!   XtGetApplicationResources( (Widget) top_menu, (caddr_t) NULL, 
  			    my_resources, XtNumber(my_resources),
  			    NULL, (Cardinal) 0);
-   if (!fonts.normal)
- 	XtError("failed to get the manualFontNormal font");
-   if (!fonts.bold)
- 	fonts.bold = fonts.normal;
-   if (!fonts.italic)
- 	fonts.italic = fonts.bold;
-   if (!fonts.directory)
- 	fonts.directory = fonts.normal;
  
  #ifdef DEBUG
    printf("debugging mode\n");
-   XSynchronize( XtDisplay(top_menu), TRUE);
  #endif
  
!   /* set default width and height. */
  
!   default_width = DisplayWidth(XtDisplay(top_menu), 
! 			       XtDisplay(top_menu)->default_screen);
!   default_width /= 2; 
!   default_height=DisplayHeight(XtDisplay(top_menu), 
! 			       XtDisplay(top_menu)->default_screen);
    default_height *= 3;
    default_height /= 4;
  
    sections = Man();
  
!   MakeTopMenuWidget(top_menu);	
! 
!   if (top_box_active) {
!     XtRealizeWidget(top_menu);
!     AddCursor(top_menu,cursors.top);
    }
    else
      CreateManpage();
--- 85,133 ----
  char ** argv;
  int argc;
  {
!   initial_widget = XtInitialize(NULL, "XMan", 
! 				xman_options, XtNumber(xman_options),
! 				(unsigned int*) &argc,argv);
    if (argc != 1) {
      ArgError(argc, argv);
      exit(42);
    }
  
!   XtGetApplicationResources( initial_widget, (caddr_t) &resources, 
  			    my_resources, XtNumber(my_resources),
  			    NULL, (Cardinal) 0);
  
+   if (!resources.fonts.normal)
+ 	PrintError("Failed to get the manualFontNormal font");
+   if (!resources.fonts.bold)
+ 	resources.fonts.bold = resources.fonts.normal;
+   if (!resources.fonts.italic)
+ 	resources.fonts.italic = resources.fonts.bold;
+   if (!resources.fonts.directory)
+ 	resources.fonts.directory = resources.fonts.normal;
+ 
  #ifdef DEBUG
    printf("debugging mode\n");
  #endif
  
! /*
!  * Set the default width and height.
!  * I am not real happy with this method, but it will usually do something
!  * reasonable, if not the "right" thing.  It is not a real big issue since
!  * it is easy to change the values with resources or command line options.
!  * NOTE: if you are in a 100 dpi display you will lose.
!  */
  
!   default_width = DEFAULT_WIDTH;
!   default_height=DisplayHeight(XtDisplay(initial_widget), 
! 			       XtDisplay(initial_widget)->default_screen);
    default_height *= 3;
    default_height /= 4;
  
    sections = Man();
  
!   if (resources.top_box_active) {
!     MakeTopMenuWidget();	
    }
    else
      CreateManpage();
***************
*** 138,144 ****
   * the screen so that if this user does not have a top box then when he
   * removes all his manual pages we can kill off the xman process.
   * To make things easier we will consider the top box a shown manual page
!  * here, but since you cannot remove it, man_page_show only goes to zero when
   * no top box is present.
   */
  
--- 137,143 ----
   * the screen so that if this user does not have a top box then when he
   * removes all his manual pages we can kill off the xman process.
   * To make things easier we will consider the top box a shown manual page
!  * here, but since you cannot remove it, man_page_shown only goes to zero when
   * no top box is present.
   */
  
***************
*** 174,180 ****
  int argc;
  {
    int i;
-   char * prog;
  
    static char **syntax, *syntax_def[] = {
    "-helpfile <filename>",    "Specifies the helpfile to use.",
--- 173,178 ----
***************
*** 205,217 ****
    for (i = 1; i < argc ; i++) 
      (void) printf("This argument is unknown to Xman: %s\n", argv[i]);
    
-   if ( (prog = rindex(argv[0], '/')) == NULL)
-     prog = argv[0];
- 
    (void) printf("\nKnown arguments are:\n");
  
    while ( *syntax != NULL ) {
!     printf("%-20s - %s\n", syntax[0], syntax[1]);
      syntax += 2;
    }
  }
--- 203,212 ----
    for (i = 1; i < argc ; i++) 
      (void) printf("This argument is unknown to Xman: %s\n", argv[i]);
    
    (void) printf("\nKnown arguments are:\n");
  
    while ( *syntax != NULL ) {
!     printf("%-30s - %s\n", syntax[0], syntax[1]);
      syntax += 2;
    }
  }
*** /tmp/,RCSt1a17248	Fri Jan  6 18:57:03 1989
--- clients/xman/search.c	Fri Jan  6 18:42:29 1989
***************
*** 1,7 ****
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: search.c,v 1.2 88/09/04 20:27:33 swick Exp $
   * $oHeader: search.c,v 4.0 88/08/31 22:13:19 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
--- 1,7 ----
  /*
   * xman - X window system manual page display program.
   *
!  * $XConsortium: search.c,v 1.3 89/01/06 18:42:28 kit Exp $
   * $oHeader: search.c,v 4.0 88/08/31 22:13:19 kit Exp $
   *
   * Copyright 1987, 1988 Massachusetts Institute of Technology
***************
*** 21,27 ****
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: search.c,v 4.0 88/08/31 22:13:19 kit Exp $";
  #endif
  
  #include "globals.h"
--- 21,27 ----
   */
  
  #if ( !defined(lint) && !defined(SABER))
!   static char rcs_version[] = "$Athena: search.c,v 4.7 89/01/06 15:59:02 kit Exp $";
  #endif
  
  #include "globals.h"
***************
*** 35,41 ****
  #define SEARCHARGS 10
  
  FILE * DoManualSearch();
! struct entry * BEntrySearch();
  
  /*	Function Name: MakeSearchWidget
   *	Description: This Function Creates the Search Widget.
--- 35,41 ----
  #define SEARCHARGS 10
  
  FILE * DoManualSearch();
! static int BEntrySearch();
  
  /*	Function Name: MakeSearchWidget
   *	Description: This Function Creates the Search Widget.
***************
*** 66,72 ****
    popup_shell = XtCreatePopupShell(SEARCHNAME, transientShellWidgetClass, 
  				   parent, arglist, num_args);
  
!   box = XtCreateWidget("box",boxWidgetClass, popup_shell,NULL,0);
  
    num_args = 0;
    XtSetArg(arglist[num_args], XtNborderWidth, 0);
--- 66,72 ----
    popup_shell = XtCreatePopupShell(SEARCHNAME, transientShellWidgetClass, 
  				   parent, arglist, num_args);
  
!   box = XtCreateWidget("box",boxWidgetClass, popup_shell,NULL, (Cardinal) 0);
  
    num_args = 0;
    XtSetArg(arglist[num_args], XtNborderWidth, 0);
***************
*** 81,87 ****
    XtSetArg(arglist[num_args], XtNeditType, XttextEdit);
    num_args++;
  
!   man_globals->search_string = INIT_SEARCH_STRING;
  
    XtSetArg(arglist[num_args], XtNstring, man_globals->search_string);
    num_args++;
--- 81,87 ----
    XtSetArg(arglist[num_args], XtNeditType, XttextEdit);
    num_args++;
  
!   strcpy(man_globals->search_string, INIT_SEARCH_STRING);
  
    XtSetArg(arglist[num_args], XtNstring, man_globals->search_string);
    num_args++;
***************
*** 90,96 ****
  
    XtSetArg(arglist[num_args], XtNlength, SEARCH_STRING_LENGTH);
    num_args++;
!   XtSetArg(arglist[num_args], XtNcursor, cursors.search_entry);
    num_args++;
  
    text = XtCreateWidget("textWidgetSearch",asciiStringWidgetClass,
--- 90,96 ----
  
    XtSetArg(arglist[num_args], XtNlength, SEARCH_STRING_LENGTH);
    num_args++;
!   XtSetArg(arglist[num_args], XtNcursor, resources.cursors.search_entry);
    num_args++;
  
    text = XtCreateWidget("textWidgetSearch",asciiStringWidgetClass,
***************
*** 156,172 ****
  
    answer = XtMakeResizeRequest(text, width, height, &width, &height);
      
!     switch(answer) {
!     case XtGeometryYes:
!     case XtGeometryNo:
!       break;
!     case XtGeometryAlmost:
!       (void) XtMakeResizeRequest(text, width, height, &width, &height);
!     }
  
    XtManageChild(box);
    XtRealizeWidget(popup_shell);
!   AddCursor(popup_shell,cursors.search_entry);
  }
  
  /*	Function Name: DoSearch
--- 156,172 ----
  
    answer = XtMakeResizeRequest(text, width, height, &width, &height);
      
!   switch(answer) {
!   case XtGeometryYes:
!   case XtGeometryNo:
!     break;
!   case XtGeometryAlmost:
!     (void) XtMakeResizeRequest(text, width, height, &width, &height);
!   }
  
    XtManageChild(box);
    XtRealizeWidget(popup_shell);
!   AddCursor(popup_shell,resources.cursors.search_entry);
  }
  
  /*	Function Name: DoSearch
***************
*** 212,218 ****
  
    if (!strcmp(man_globals->search_string,"") || 
        (man_globals->search_string[0] == ' ')) {
!     PrintWarning("You want me to search for what???");
      return(NULL);
    }
  
--- 212,218 ----
  
    if (!strcmp(man_globals->search_string,"") || 
        (man_globals->search_string[0] == ' ')) {
!     PrintWarning(man_globals, "You want me to search for what???");
      return(NULL);
    }
  
***************
*** 228,235 ****
      strcpy(path,manpath);
  
    if (type == APROPOS) {
!     sprintf(cmdbuf,"%s %s %s | %s > %s",APROPOSCOMMAND,path,
! 	    man_globals->search_string,APROPOSFILTER,mantmp);
      sprintf(label,"Results of apropos search on: %s",
  	    man_globals->search_string);
  
--- 228,234 ----
      strcpy(path,manpath);
  
    if (type == APROPOS) {
!     sprintf(cmdbuf, APROPOSFILTER, path, man_globals->search_string, mantmp);
      sprintf(label,"Results of apropos search on: %s",
  	    man_globals->search_string);
  
***************
*** 272,278 ****
      if (flag) {
        fclose(file);
        file = NULL;
- /*    PrintWarning(string_buf); */
        ChangeLabel(man_globals->label,string_buf);
        return(NULL);
      }
--- 271,276 ----
***************
*** 285,291 ****
      file = DoManualSearch(man_globals);
      if (file == NULL) {
        sprintf(string_buf,"No manual entry for %s.",man_globals->search_string);
-       /*    PrintWarning(string_buf); */
        ChangeLabel(man_globals->label,string_buf);
        return(NULL);
      }
--- 283,288 ----
***************
*** 299,338 ****
   *	Returns: the filename of the man page.
   */
  
  FILE * 
  DoManualSearch(man_globals)
  ManpageGlobals *man_globals;
  {
!   struct entry * entry = NULL;
!   char *string, *name;
!   int i;
!   FILE * file;
  
  /* search current section first. */
    
    string = man_globals->search_string;
    i = man_globals->current_directory;
!   entry = BEntrySearch(string, manual[i].entries, manual[i].nentries);
  
  /* search other sections. */
  
!   if (entry == NULL) {
      i = -1;			/* At the exit of the loop i needs to
  				   be the one we used. */
      do {
        i++;
        if (i == man_globals->current_directory) i++;
!       entry = BEntrySearch(string, manual[i].entries, manual[i].nentries);
!     } while ( (i < sections) && (entry == NULL) );
    }
!     
!   if (entry == NULL)
!     return(NULL);
! 
!   name = CreateManpageName(entry->label);
!   file = FindFilename(man_globals, name, i, entry);
!   free(name);
!   return(file);
  }
  
  /*	Function Name: BEntrySearch
--- 296,344 ----
   *	Returns: the filename of the man page.
   */
  
+ #define NO_ENTRY -100
+ 
  FILE * 
  DoManualSearch(man_globals)
  ManpageGlobals *man_globals;
  {
!   char *string;
!   int e_num = NO_ENTRY;
!   int i, initial_entry;
  
  /* search current section first. */
    
    string = man_globals->search_string;
    i = man_globals->current_directory;
!   e_num = BEntrySearch(string, manual[i].entries, manual[i].nentries);
  
  /* search other sections. */
  
!   if (e_num == NO_ENTRY) {
      i = -1;			/* At the exit of the loop i needs to
  				   be the one we used. */
      do {
        i++;
        if (i == man_globals->current_directory) i++;
!       e_num = BEntrySearch(string, manual[i].entries, manual[i].nentries);
!     } while ( (i < sections) && (e_num == NO_ENTRY) );
!     if (e_num == NO_ENTRY)
!       return(NULL);
! /*
!  * Manual page found in some other section, unhighlight the current one.
!  */
!     XtListUnhighlight(
!             man_globals->manpagewidgets.box[man_globals->current_directory]);
    }
!   else {
!     /* 
!      * Highlight the element we are searching for if it is in the directory
!      * listing currently being shown.
!      */
!    
!     XtListHighlight(man_globals->manpagewidgets.box[i], e_num);
!   }
!   return(FindFilename(man_globals, manual[i].entries[e_num]));
  }
  
  /*	Function Name: BEntrySearch
***************
*** 343,377 ****
   *	Returns: a pointer to the entry found.
   */
  
! struct entry *  
  BEntrySearch(string, first, number)
  char * string;
! struct entry * first;
  int number;
  {
!   int check, cmp;
!   char * c, label[BUFSIZ];
    
    while (TRUE) {
  
!     if (number == 0)
!       return(NULL);		/* didn't find it. */
!   
      check = number/2;
  
!     strcpy (label, first[check].label);
!     c = index(label, '.');
!     if (c != NULL);
!     *c = '\0';
  
!     cmp = strcmp(string, label);
  
!     if ( cmp == 0 )
!       return(&(first[check]));
!     else if (cmp < 0) 
        number = check;
!     else /* cmp > 0 */ {
!       first = &(first[check + 1]);
        number -= ( check + 1 );
      }
    }
--- 349,391 ----
   *	Returns: a pointer to the entry found.
   */
  
! static int
  BEntrySearch(string, first, number)
  char * string;
! char ** first;
  int number;
  {
!   int check, cmp, len_cmp, global_number;
!   char *head, *tail;
    
+   global_number = 0;
    while (TRUE) {
  
!     if (number == 0) {
!       return(NO_ENTRY);		/* didn't find it. */
!     }
! 
      check = number/2;
  
!     head = rindex(first[ global_number + check ], '/');
!     if (head == NULL) 
!       PrintError("index failure in BEntrySearch");
!     head++;
  
!     tail = rindex(head, '.');
!     if (tail == NULL) 
!       PrintError("index failure in BEntrySearch");
  
!     cmp = strncmp(string, head, (tail - head));
!     len_cmp = strlen(string) - (int) (tail - head);
! 
!     if ( cmp == 0 && len_cmp == 0) {
!       return(global_number + check);
!     }
!     else if ( cmp < 0 || ((cmp == 0) && (len_cmp < 0)) ) 
        number = check;
!     else /* cmp > 0 || ((cmp == 0) && (len_cmp > 0)) */ {
!       global_number += (check + 1);
        number -= ( check + 1 );
      }
    }
-- 
Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
Moderator of comp.sources.x