[comp.windows.x] Relative Warp

ellis@audi.mit.EDU (Ellis Cohen) (08/11/87)

    
        In our tiled window manager, we have a move gadget
        to the right of the title bar.
        Clicking on the gadget warps the pointer to the
        middle of the window.
        The user then moves the pointer to another place
        on the screen and clicks again, and this location
        becomes the new center location of the window.
    
    This seems like a perfect example of where a relative warp is a bad
    idea, and a conditional absolute warp is a good idea.  The position you
    ideally want to end up at (the center of the window) is known
    absolutely.  If the window manager suffers a delay in warping, and the
    user has since moved the pointer off to the new center and is about to
    click, I find it hard to imagine that it is desirable to suddenly do a
    relative warp.
    
    What am I missing?

Well, suppose that the user wants to move the window a bit to the right.
He could click in the move gadget, wait for the manager to warp the pointer
to the center of the window, move the pointer to the right, and then click.

However, our experience is that users like to "point ahead".  That is,
the user clicks the move gadget, and immediately starts moving the
pointer to the right.  In the middle of moving it to the right, the
server catches up, and the pointer is warped relative to its current
location (i.e. if it was not moved at all, it is moved to the window
center; if it was moved slightly to the right, it is warped slightly to
the right of the window center, etc.). This is the way our 1 year old
Sunview implementation works, and it is just fine.

The problem is, without the relative warp, even when the user has moved
the pointer slightly, the cursor is warped back to the original window
center, which is pretty annoying.




Ellis Cohen
Ellis.Cohen@a.gp.cs.cmu.edu
princeton!siemens!ellis

RWS@ZERMATT.LCS.MIT.EDU (Robert Scheifler) (08/11/87)

Relative pointer warp is being added to the V11 protocol.

lord+@andrew.cmu.edu (Tom Lord) (08/12/87)

In our tiled window manager, we have a move gadget
        to the right of the title bar.
        Clicking on the gadget warps the pointer to the
        middle of the window.
        The user then moves the pointer to another place
        on the screen and clicks again, and this location
        becomes the new center location of the window.



Why warp the mouse at all, relatively or conditionally?  A lot of confusion
could be avoided by positioning the move gadget, not the window center, at
the location of the second click.  The warp is superfluous noise.

Tom
lord+@andrew

RWS@ZERMATT.LCS.MIT.EDU (Robert Scheifler) (10/02/87)

    Date: Fri, 2 Oct 87 14:15:14 EDT
    From: ellis%cadillac.siemens.com@PRINCETON.EDU (Ellis Cohen)
    Subject: Relative Warp Not Implemented

    VERSION:
	    X11 release 1 - from hesiod - Xsun server
	    on Sun-3/140, monochrome, 12mb, SunOS 3.2

    SYNOPSIS:
	    Relative warp has not been implemented

    DESCRIPTION:

	    Calling
                
		XWarpPointer(dpy, None, None,
			     0, 0, 0, 0,
			     x, y);
		XFlush(dpy);

	    has no effect on the pointer at all, regardless of the value of
	    x and y.

    REPEAT-BY:

	    Try the call with non-zero x and y.

Actually, it has been implemented, but the person who installed the code
for that protocol addition failed to remove some of the old code.  You
should have been getting BadWindow errors back from your test (I
certainly was via CLX).  The following will remedy the situation, but I
will point out that testing it revealed another problem, namely that the
server requires the pointer to be in a visible region of the source
window, *excluding* visible regions of its inferiors.  That is not what
I intended in the protocol spec, but I admit the wording of the spec
easily leads one to that conclusion.  Further discussion on this point
will have to take place before a fix is provided.

*** /tmp/,RCSt1020347	Fri Oct  2 15:39:08 1987
--- events.c	Fri Oct  2 15:32:56 1987
***************
*** 23,29 ****
  ********************************************************/
  
  
! /* $Header: events.c,v 1.108 87/09/09 10:18:23 toddb Exp $ */
  
  #include "X.h"
  #include "misc.h"
--- 23,29 ----
  ********************************************************/
  
  
! /* $Header: events.c,v 1.109 87/10/02 15:31:47 rws Exp $ */
  
  #include "X.h"
  #include "misc.h"
***************
*** 1071,1082 ****
      REQUEST(xWarpPointerReq);
  
      REQUEST_SIZE_MATCH(xWarpPointerReq);
-     dest = LookupWindow(stuff->dstWid, client);
-     if (!dest)
-     {
- 	client->errorValue = stuff->dstWid;
- 	return BadWindow;
-     }
      if (stuff->dstWid != None)
      {
  	dest = LookupWindow(stuff->dstWid, client);
--- 1071,1076 ----