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 ----