[comp.windows.x] R4 twm f.warpto doesn't search "res_name" as well as "name"

idallen@watdragon.waterloo.edu (01/14/90)

From: "Ian! D. Allen [CGL]" <idallen>

			  X Window System Bug Report
			    xbugs@expo.lcs.mit.edu


VERSION:
    R4

CLIENT MACHINE and OPERATING SYSTEM:
    Any

DISPLAY TYPE:
    Any

WINDOW MANAGER:
    twm

AREA:
    twm

SYNOPSIS:
    Twm F_WARPTO function is documented in the man page as looking at
    the resource name as well as the name.  The code doesn't do that.
    It only looks at a prefix of the name.

DESCRIPTION:
    See above and below.  I "fixed" more than the missing test for
    res_name, because I belive an exact match is better than a prefix
    match.  I only use a prefix match if no exact match can be found.

    I test for a match on "res_name" before just "name" because all my
    users put $cwd in their csh prompt strings and set their xterm title
    and icon names with it; hence, nothing ever matches on "name".

REPEAT BY:
    Create any application that has a name with a different prefix
    than the resource name and try to f.warpto "that_application_res_name".
    Won't find it.

SAMPLE FIX:
*** /tmp/,RCSt1002748	Sun Jan 14 01:20:58 1990
--- menus.c	Sun Jan 14 01:04:24 1990
***************
*** 1767,1787 ****
  
      case F_WARPTO:
  	{
  	    register TwmWindow *t;
! 	    int len;
  
  	    len = strlen(action);
  
  	    for (t = Scr->TwmRoot.next; t != NULL; t = t->next) {
! 		/* match only the first portion of WINDOW the name */
! 		if (!strncmp(action, t->name, len)) {
! 		    if (Scr->WarpUnmapped || t->mapped) {
! 			if (!t->mapped) DeIconify (t);
! 			XRaiseWindow (dpy, t->frame);
! 			WarpToWindow (t);
! 			break;
  		    }
! 		}
  	    }
  	    if (!t) XBell (dpy, 0);
  	}
--- 1767,1815 ----
  
      case F_WARPTO:
  	{
+ 	    /* I redid this to find a better match and to conform
+ 	     * more to the documentation.  This should probably be
+ 	     * user-configurable.  It should also match the search
+ 	     * algorithms done elsewhere in twm.  -IAN!
+ 	     */
  	    register TwmWindow *t;
! 	    register TwmWindow *tgoodname = NULL;
! 	    register TwmWindow *tbettername = NULL;
! 	    register TwmWindow *tgoodres = NULL;
! 	    register int len;
  
  	    len = strlen(action);
  
  	    for (t = Scr->TwmRoot.next; t != NULL; t = t->next) {
! 		/* Try to pick the best match, not just the first.
! 		 * Exact match on res_name is best, followed by
! 		 * exact match on name, prefix of res_name, prefix of name.
! 		 */
! 		if (!tbettername) {
! 		    if (!tgoodres) {
! 			if (!tgoodname) {
! 			    if (!strncmp(action, t->name, len)) 
! 				tgoodname = t;
! 			}
! 			if (!strncmp(action, t->class.res_name, len))
! 			    tgoodres = t;
  		    }
! 		    if (!strcmp(action, t->name))
! 			tbettername = t;
! 		} 
! 		if (!strcmp(action, t->class.res_name))
! 		    break;
! 	    }
! 	    t = t ? t : (
! 		 tbettername ? tbettername : (
! 		  tgoodres ? tgoodres : (
! 		   tgoodname ? tgoodname : NULL ) ) ) ;
! 
! 	    if (t && (Scr->WarpUnmapped || t->mapped)) {
! 		if (!t->mapped) DeIconify (t);
! 		XRaiseWindow (dpy, t->frame);
! 		WarpToWindow (t);
! 		break;
  	    }
  	    if (!t) XBell (dpy, 0);
  	}