diff options
Diffstat (limited to 'xts5/Xlib13/XWarpPointer/XWarpPointer.m')
-rw-r--r-- | xts5/Xlib13/XWarpPointer/XWarpPointer.m | 518 |
1 files changed, 518 insertions, 0 deletions
diff --git a/xts5/Xlib13/XWarpPointer/XWarpPointer.m b/xts5/Xlib13/XWarpPointer/XWarpPointer.m new file mode 100644 index 00000000..977dbc5c --- /dev/null +++ b/xts5/Xlib13/XWarpPointer/XWarpPointer.m @@ -0,0 +1,518 @@ +Copyright (c) 2005 X.Org Foundation L.L.C. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +$Header: /cvs/xtest/xtest/xts5/tset/Xlib13/XWarpPointer/XWarpPointer.m,v 1.2 2005-11-03 08:42:42 jmichael Exp $ + +Copyright (c) Applied Testing and Technology, Inc. 1995 +All Rights Reserved. + +>># Project: VSW5 +>># +>># File: xts5/tset/Xlib13/XWarpPointer/XWarpPointer.m +>># +>># Description: +>># Tests for XWarpPointer() +>># +>># Modifications: +>># $Log: wrppntr.m,v $ +>># Revision 1.2 2005-11-03 08:42:42 jmichael +>># clean up all vsw5 paths to use xts5 instead. +>># +>># Revision 1.1.1.2 2005/04/15 14:05:19 anderson +>># Reimport of the base with the legal name in the copyright fixed. +>># +>># Revision 8.0 1998/12/23 23:33:46 mar +>># Branch point for Release 5.0.2 +>># +>># Revision 7.0 1998/10/30 22:55:34 mar +>># Branch point for Release 5.0.2b1 +>># +>># Revision 6.0 1998/03/02 05:25:10 tbr +>># Branch point for Release 5.0.1 +>># +>># Revision 5.0 1998/01/26 03:21:42 tbr +>># Branch point for Release 5.0.1b1 +>># +>># Revision 4.0 1995/12/15 09:08:49 tbr +>># Branch point for Release 5.0.0 +>># +>># Revision 3.1 1995/12/15 01:10:19 andy +>># Prepare for GA Release +>># +/* +Portions of this software are based on Xlib and X Protocol Test Suite. +We have used this material under the terms of its copyright, which grants +free use, subject to the conditions below. Note however that those +portions of this software that are based on the original Test Suite have +been significantly revised and that all such revisions are copyright (c) +1995 Applied Testing and Technology, Inc. Insomuch as the proprietary +revisions cannot be separated from the freely copyable material, the net +result is that use of this software is governed by the ApTest copyright. + +Copyright (c) 1990, 1991 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of UniSoft not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. UniSoft +makes no representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. +*/ +>>TITLE XWarpPointer Xlib13 +void + +Display *display = Dsp; +Window src_w; +Window dest_w; +int src_x = SRC_X; +int src_y = SRC_Y; +unsigned int src_width = SRC_WIDTH; +unsigned int src_height = SRC_HEIGHT; +int dest_x = DEST_X; +int dest_y = DEST_Y; +>>EXTERN + +#define SRC_X 7 +#define SRC_Y 10 +#define SRC_WIDTH 20 +#define SRC_HEIGHT 31 +#define DEST_X 11 +#define DEST_Y 13 + +#define POS_ABS 1 +#define POS_REL 2 + +struct coord { + int x; + int y; +}; + +/* + * Get the current position of the pointer. If type is POS_REL this + * is relative to the given window. For a type POS_ABS the coordinates + * are absolute. + */ +static void +getpos(w, co, type) +Window w; +struct coord *co; +int type; +{ +Window root, child; +unsigned int mask; +int xroot, yroot; +int status; + + if (w == None) + w = DRW(Dsp); + + status = XQueryPointer(Dsp, w, &root, &child, &xroot, &yroot, &co->x, &co->y, &mask); + if (status == False) { + delete("Could not get pointer position"); + return; + } + + if (type == POS_ABS) { + co->x = xroot; + co->y = yroot; + } +} + +>>ASSERTION Good A +When +.A dest_w +is +.S None , +then a call to xname +moves the pointer by the offsets +.A dest_x , +.A dest_y +relative to the current position of the pointer. +>>STRATEGY +Get current position of pointer. +Set dest_w to None. +Call xname. +Verify that new position is offset from old by dest_x, dest_y. +>>CODE +struct coord old; +struct coord new; + + (void) warppointer(display, DRW(display), 100, 100); + + dest_w = None; + src_w = None; + + getpos(None, &old, POS_ABS); + + XCALL; + + getpos(None, &new, POS_ABS); + + if (dest_x == 0 || dest_y == 0) + delete("Setup error of destination coordinates"); + + if (new.x == old.x + dest_x) + CHECK; + else { + report("X position of pointer incorrect - was %d, expecting %d", + new.x, old.x + dest_x); + FAIL; + } + + if (new.y == old.y + dest_y) + CHECK; + else { + report("Y position of pointer incorrect - was %d, expecting %d", + new.y, old.y + dest_y); + FAIL; + } + + CHECKPASS(2); +>>ASSERTION Good A +When +.A dest_w +is a window +and +.A src_w +is +.S None , +then a call to xname +moves the pointer to the offsets +.A dest_x , +.A dest_y +relative to the origin of +.A dest_w . +>>STRATEGY +Create window for dest_w. +Set src_w to None. +Call xname. +Verify that pointer is at (dest_x,dest_y) from origin of dest_w. +>>CODE +struct coord pos; + + (void) warppointer(display, DRW(display), 0, 0); + + dest_w = defwin(display); + src_w = None; + + XCALL; + + getpos(dest_w, &pos, POS_REL); + + if (dest_x == pos.x && dest_y == pos.y) + CHECK; + else { + report("Position relative to destination window was incorrect"); + report(" position was (%d, %d), expecting (%d, %d)", + pos.x, pos.y, dest_x, dest_y); + FAIL; + } + + CHECKPASS(1); +>>ASSERTION Good A +When +.A dest_w +and +.A src_w +are windows +and the pointer is within the specified rectangle of +.A src_w , +then a call to xname +moves the pointer to the offsets +.A dest_x , +.A dest_y +relative to the origin of +.A dest_w . +>>STRATEGY +Create window dest_w. +Create window src_w. +Move pointer to within the specified rectange of src_w. +Call xname. +Verify that pointer moves to offset (dest_x, dest_y) from origin of dest_w. +>>CODE +struct coord pos; + + dest_w = defwin(display); + src_w = defwin(display); + + (void) warppointer(display, src_w, src_x, src_y); + + XCALL; + + getpos(dest_w, &pos, POS_REL); + + if (pos.x == dest_x && pos.y == dest_y) + CHECK; + else { + report("Pointer not positioned correctly when pointer in source rectangle"); + report(" position was (%d, %d), expecting (%d, %d)", + pos.x, pos.y, dest_x, dest_y); + FAIL; + } + + CHECKPASS(1); +>>ASSERTION Good A +When +.A dest_w +and +.A src_w +are windows +and the pointer is not within the specified rectangle of +.A src_w , +then a call to xname does not move the pointer. +>>STRATEGY +Create window dest_w. +Create window src_w. +Move pointer outside the specified rectange of src_w. +Call xname. +Verify that the pointer is not moved. +>>CODE +PointerPlace *pplace; + + dest_w = defwin(display); + src_w = defwin(display); + + pplace = warppointer(display, src_w, (int)(src_x+src_width+2), src_y); + + XCALL; + + if (pointermoved(display, pplace)) { + report("Pointer was moved when outside the source rectangle"); + FAIL; + } else + CHECK; + + CHECKPASS(1); +>>ASSERTION Good A +When +.A src_height +is zero, +then it is replaced with the current height of +.A src_w +minus +.A src_y . +>>STRATEGY +Create window src_w. +Create window dest_w. +Set src_height to 0. +Position pointer in src_w such that it is inside source rectangle. +Call xname. +Verify that pointer is moved. +>>CODE +unsigned int width, height; +struct coord pos; + + src_w = defwin(display); + dest_w = defwin(display); + src_height = 0; + + getsize(display, src_w, &width, &height); + + (void) warppointer(display, src_w, src_x+3, (int)height-3); + + XCALL; + + getpos(dest_w, &pos, POS_REL); + if (pos.x == dest_x && pos.y == dest_y) + CHECK; + else { + report("Pointer not moved correctly when pointer in source rectangle"); + report(" and src_height 0 - position was (%d, %d), expecting (%d, %d)", + pos.x, pos.y, dest_x, dest_y); + FAIL; + } + + CHECKPASS(1); + +>>ASSERTION Good A +When +.A src_width +is zero, +then it is replaced with the current width of +.A src_w +minus +.A src_x . +>>STRATEGY +Create window src_w. +Create window dest_w. +Set src_width to 0. +Position pointer in src_w such that it is inside source rectangle. +Call xname. +Verify that pointer is moved. +>>CODE +unsigned int width, height; +struct coord pos; + + src_w = defwin(display); + dest_w = defwin(display); + src_width = 0; + + getsize(display, src_w, &width, &height); + + (void) warppointer(display, src_w, (int)width-3, src_y+3); + + XCALL; + + getpos(dest_w, &pos, POS_REL); + if (pos.x == dest_x && pos.y == dest_y) + CHECK; + else { + report("Pointer not moved correctly when pointer in source rectangle"); + report(" and src_width 0 - position was (%d, %d), expecting (%d, %d)", + pos.x, pos.y, dest_x, dest_y); + FAIL; + } + + CHECKPASS(1); + +>>ASSERTION Good A +A call to xname generates events as though +the pointer position had been instantaneously moved by the user. +>>STRATEGY +Create dest_w. +Position pointer at 0,0 in dest_w. +Enable events. +Call xname to move pointer within window. +Verify that only one motion event is generated. +>>CODE +XEvent ev; +XMotionEvent good; +struct coord pos; +int n; + + dest_w = defwin(display); + src_w = None; + + (void) warppointer(display, dest_w, 0, 0); + + XSelectInput(display, dest_w, PointerMotionMask); + + XCALL; + + defsetevent(good, display, MotionNotify); + good.window = dest_w; + good.root = DRW(display); + good.subwindow = None; + good.time = 0; + good.x = dest_x; + good.y = dest_y; + good.state = 0; + good.is_hint = False; + good.same_screen = True; + + getpos(None, &pos, POS_ABS); + good.x_root = pos.x; + good.y_root = pos.y; + + n = getevent(display, &ev); + if (n > 1) { + report("More than one event generated"); + FAIL; + } else + CHECK; + + if (checkevent((XEvent*)&good, &ev)) + FAIL; + else + CHECK; + + CHECKPASS(2); +>>ASSERTION Good A +When an active pointer grab is in progress and the pointer is within +the confine_to window, then a call to xname will only move the pointer +as far as the closest edge of the confine_to window. +>>STRATEGY +Create confine_to window. +Create dest_w window. +Call XGrabPointer to actively grab the pointer with confine_to set. +Attempt to move pointer into dest_w window with xname. +Verify that pointer is still within the confine_to window. +>>CODE +Window confine; +Window grabwin; +struct coord pos; +unsigned int width, height; + + confine = defwin(display); + dest_w = defwin(display); + grabwin = defwin(display); + src_w = None; + + /* Set border to zero so that containment size is just width and height */ + XSetWindowBorderWidth(display, confine, 0); + getsize(display, confine, &width, &height); + + /* May as well put the pointer there to begin with */ + (void) warppointer(display, confine, 1, 1); + + XGrabPointer(display, grabwin, False, 0, GrabModeAsync, GrabModeAsync, + confine, None, CurrentTime); + + if (isdeleted()) + return; + + XCALL; + + XUngrabPointer(display, CurrentTime); + getpos(confine, &pos, POS_REL); + if (pos.x > 0 && pos.x < width && pos.y > 0 && pos.y < height) + CHECK; + else { + report("Pointer did not remain within the confine_to window"); + FAIL; + } + + /* + * We can also check that the pointer is on a edge. (The windows + * do not overlap). + */ + if (pos.x == 0 || pos.y == 0 || pos.x == width-1 || pos.y == height-1) + CHECK; + else { + report("Pointer was not on edge of confine_to window"); + FAIL; + } + + CHECKPASS(2); +>>ASSERTION Bad A +.ER BadWindow None |