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