[comp.windows.x] Proposed Protocol Change to WarpPointer

ellis@audi.mit.EDU (Ellis Cohen) (07/30/87)

PROPOSED PROTOCOL CHANGE TO WarpPointer

    Problem:  WarpPointer provides only absolute warping,
              not relative warping.

------------------------------------------------------------

Consider an application where the user is moving the pointer around.
When the user hits a key, the pointer must jump down 20 pixels.

We tried to use WarpPointer (followed by XFlush, of course) but the
effects were occasionally very distubing visually.

The problem is that between the time the client receives the position
at which the key press occured and then tells the server to WarpPointer
twenty pixels below, the user may continue to move the pointer.

Instead of smoothly jumping 20 pixels down from its current location,
the pointer instead jumps twenty pixels down from where it was when the
key press was received.

------------------------------------------------------------

    Proposal: That the semantics of WarpPointer be modified slightly,
              so that if dst-window is None, then <dst-x,dst-y> are
              taken to be relative to the current pointer position,
              providing a relative warp.

Ellis Cohen
Siemens RTL Tiled Window Project
ellis.cohen@a.gp.cs.cmu.edu
princeton!siemens!ellis
(609) 734-6524

RWS@ZERMATT.LCS.MIT.EDU (Robert Scheifler) (07/31/87)

    Date: Thu, 30 Jul 87 15:18:50 EDT
    From: ellis@audi (Ellis Cohen)

    Proposal: That the semantics of WarpPointer be modified slightly,
	      so that if dst-window is None, then <dst-x,dst-y> are
	      taken to be relative to the current pointer position,
	      providing a relative warp.

The semantics of always moving relative to the current position strikes
me as undesirable and non-intuitive.  I've worked on a program with a
warping user interface (V10 xgedit).  The program admittedly sucks in
various ways, but that isn't the issue here.  I found the most natural
behavior (to me) was obtained by using the conditional semantics of the
warp, namely, warp the pointer to this particular spot, but *only* if
the pointer is still (approximately) where it was at the time of the
command.  Indeed, working on that program instigated the addition of
conditional semantics.  Example, the user types "snap to grid" in xgedit
and then moves the pointer to position the next point.  Very undesirable
if a slow xgedit now wakes up and moves the pointer, whether or not it
is back to some absolute position or relative to the current position.
Example, the user types "snap to grid", and then before xgedit can
react, the user gets distracted by some new frob on the screen and moves
the pointer over to some completely different window and is about to
click on some item.  Now xgedit finally wakes up and unilaterally causes
the pointer to unilaterally warp, and the user clicks on the wrong
thing.  Bad behavior, whether it is to an absolute position or to a
relative position.  These scenarios actually happened to me prior to
defining and using the conditional nature of warp.

Can you provide a concrete example of where this effect is desirable?

ellis@audi.mit.EDU (Ellis Cohen) (07/31/87)

>  The semantics of always moving relative to the current
>  position strikes me as undesirable and non-intuitive.
>  Can you provide a concrete example of where this effect
>  is desirable?

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.

In earlier versions of the manager, we did not warp
the pointer.  Based on experience with user's, we added
warping for two reasons.

   1.  The warp made it clear to the user right away that
       we were doing a center move -- i.e. that the moved
       location of the pointer would be the new window center.

   2.  Some users would inadvertantly click twice, or would
       click so slowly that we would treat the down and up
       press as distinct button events.  Either would cause
       the move to be completed.  Because the pointer was
       warped to the center, the window would simply stay in the
       same place in this case.  In a tiled window system, this
       is especially important, since a move can cause side
       effects -- changing the size and/or location of other 
       windows.

You might argue that instead of warping the pointer, we could
simply blank it out, and track along with our own cursor suitably
displaced from the pointer.  There are a number of problems with
this approach.  First of all, there are timing problems -- at best
feedback may be flaky, at worst, the user may click at the wrong
location (our cursor hasn't caught up with the pointer).
More seriously even than that is the problem that the pointer can't
move outside of the screen, and so our cursor wouldn't be able
to move near the top or right edges of the screen.  Our move has
some semantics (similar to MicroSoft windows) that make it
essential that the cursor be able to be moved to edge of the screen
(basically, it pushes the window that is at the edge out of the way).

I don't see any way of solving these problems short of a relative
warp, but I am certainly open to another solution.

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

    Date: Fri, 31 Jul 87 11:48:43 EDT
    From: ellis@audi (Ellis Cohen)

    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?

       2.  Some users would inadvertantly click twice, or would
	   click so slowly that we would treat the down and up
	   press as distinct button events.

This seems beside the point, but why should the length of time between
down and up matter?  Why aren't all butten events "distinct"?

					     Either would cause
	   the move to be completed.  Because the pointer was
	   warped to the center, the window would simply stay in the
	   same place in this case.

I don't see how warping (no matter how) affects the situation.  If the
user inadvertantly clicks twice, then they probably do so before you
have a chance to warp the pointer at all.  I don't see how a relative
warp after the second click changes anything.

    You might argue that instead of warping the pointer, we could
    simply blank it out, and track along with our own cursor suitably
    displaced from the pointer.

No, I wouldn't argue that.

    I don't see any way of solving these problems short of a relative
    warp, but I am certainly open to another solution.

I'm still open to the idea of a relative warp, but your description
still doesn't provide me with a justification I can make sense of.

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

    Date: Fri, 31 Jul 87 23:52:51 EDT
    From: Kimbo Peebles-Mundy <io!puppy!kimbo%ileaf.uucp%umb.umb.edu@RELAY.CS.NET>

    The Interleaf system frequently makes use of relative displacements of
    the mouse.  This is done in our popup code when traversing levels in the
    menu tree, and in diagramming, when creating objects.

These still seem like cases where, before you issue the warp, you know
where the pointer was, so you know absolutely where it should go to, and
if it has since been moved far from that position you probably don't
want to move it at all.

							   If that weren't
    enough, we also use small deltas to greatly improve the "feel" of the
    system; for example, within a level of the popup tree, if the motion is
    mostly vertical, then the horizontal component is canceled out.  This
    make tall menus much easier to navagate.  I can't see any way this kind
    of correction could be done with an absolute warp.

Ah, now this sounds like a reasonable example.