diff options
Diffstat (limited to 'xts5/XI/ChangePointerDevice/ChangePointerDevice.m')
-rw-r--r-- | xts5/XI/ChangePointerDevice/ChangePointerDevice.m | 876 |
1 files changed, 876 insertions, 0 deletions
diff --git a/xts5/XI/ChangePointerDevice/ChangePointerDevice.m b/xts5/XI/ChangePointerDevice/ChangePointerDevice.m new file mode 100644 index 00000000..b2104b7e --- /dev/null +++ b/xts5/XI/ChangePointerDevice/ChangePointerDevice.m @@ -0,0 +1,876 @@ +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/XI/ChangePointerDevice/ChangePointerDevice.m,v 1.2 2005-11-03 08:42:04 jmichael Exp $ + +Copyright (c) Applied Testing and Technology, Inc. 1995 +All Rights Reserved. + +>># Project: VSW5 +>># +>># File: xts5/tset/XI/chngpntrdv/chngpntrdv.m +>># +>># Description: +>># Tests for XChangePointerDevice() +>># +>># Modifications: +>># $Log: chgptr.m,v $ +>># Revision 1.2 2005-11-03 08:42:04 jmichael +>># clean up all vsw5 paths to use xts5 instead. +>># +>># Revision 1.1.1.2 2005/04/15 14:05:13 anderson +>># Reimport of the base with the legal name in the copyright fixed. +>># +>># Revision 8.0 1998/12/23 23:31:54 mar +>># Branch point for Release 5.0.2 +>># +>># Revision 7.0 1998/10/30 22:52:00 mar +>># Branch point for Release 5.0.2b1 +>># +>># Revision 6.0 1998/03/02 05:23:29 tbr +>># Branch point for Release 5.0.1 +>># +>># Revision 5.0 1998/01/26 03:20:01 tbr +>># Branch point for Release 5.0.1b1 +>># +>># Revision 4.0 1995/12/15 09:03:27 tbr +>># Branch point for Release 5.0.0 +>># +>># Revision 3.3 1995/12/15 01:01:18 andy +>># Prepare for GA Release +>># +/* +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. + +Copyright 1993 by the Hewlett-Packard Company. + +Copyright 1990, 1991 UniSoft Group Limited. + +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 names of HP, and UniSoft not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. HP, and UniSoft +make no representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. +*/ +>>TITLE XChangePointerDevice XI +void + +Display *display = Dsp; +XDevice *device; +int xaxis = 1; +int yaxis = 0; +>>EXTERN +extern ExtDeviceInfo Devs; +extern int NumValuators, MinKeyCode; + +>>ASSERTION Good B 3 +A call to xname changes the X pointer. +>>STRATEGY +Touch test. +>>EXTERN +verify_ptr(dpy, id) + Display *dpy; + int id; + { + XDeviceInfo *list; + int i, ndevices; + + list = XListInputDevices (display, &ndevices); + for (i=0; i<ndevices; i++,list++) + if (list->use==IsXPointer) + if (list->id == id) + return(True); + else + return(False); + if (i==ndevices) + return(False); + } +>>CODE +XDeviceInfo *list; +int i, ndevices, savid; + int motiontype; + XEventClass motionclass; + Display *client2; /* Second connection */ + + if ((client2 = opendisplay()) == NULL) + return; + + if (!Setup_Extension_DeviceInfo(ValMask) || NumValuators < 2) + { + untested("%s: Required input extension device not present.\n", TestName); + return; + } + list = XListInputDevices (display, &ndevices); + for (i=0; i<ndevices; i++,list++) + if (list->use==IsXPointer) + savid = list->id; + + device = Devs.Valuator; + DeviceMotionNotify(device, motiontype, motionclass); + XSelectExtensionEvent (client2, defwin(client2), &motionclass, 1); + XSync(client2,0); + + XCALL; + + if (verify_ptr(display, Devs.Valuator->device_id)) + CHECK; + else + { + report("%s: Couldn't change X pointer\n",TestName); + FAIL; + } + device = XOpenDevice(display, savid); + XCALL; + if (verify_ptr(display, savid)) + CHECK; + else + { + report("%s: Couldn't restore X pointer\n",TestName); + FAIL; + } + CHECKPASS(2); + +>>ASSERTION Good B 3 +If a button is pressed on the pointer device, then the pointer device is +changed to a new device, then the button is released, the state of the +old pointer device will show all buttons up. +>>STRATEGY +Press a button on the pointer device. +Change the pointer to a new device. +Release the button on the old pointer device. +Verify that the old X pointer device shows all buttons up. +>>CODE +#define BUTTONMAPLEN 32 +XDevice *dev; +XDeviceInfo *list; +XDeviceState *state; +XButtonState *bs; +XEventClass dmnc; +XEvent ev; +int n, dmn, i, j, ndevices, savid, ax=0; +char *buttons; + + if (!Setup_Extension_DeviceInfo(ValMask) || NumValuators < 2) + { + untested("%s: Required input extension device not present.\n", TestName); + return; + } + + if (noext(1)) + return; + + list = XListInputDevices (display, &ndevices); + for (i=0; i<ndevices; i++,list++) + if (list->use==IsXPointer) + savid = list->id; + + device = Devs.Valuator; + buttonpress (display, Button1); + XSync(display, 0); + XCALL; + XSync(display, 0); + dev = XOpenDevice (display, savid); + DeviceMotionNotify(dev, dmn, dmnc); + XSelectExtensionEvent (display, DRW(display), &dmnc, 1); + XSync(display, 0); + devicebuttonrel(display, dev, Button1); + SimulateDeviceMotionEvent(display, dev, 0, 1, &ax, 0); + XSync(display, 0); + + state = XQueryDeviceState (display, dev); + bs = (XButtonState *) state->data; + for (i=0; i<state->num_classes; i++) + { + if (bs->class == ButtonClass) + { + for (j=0,buttons=bs->buttons; j<BUTTONMAPLEN; j++,buttons++) + if (j != Button1 >> 3 && *buttons != 0) + { + report("%s: byte %d of buttons was %x, should be 0\n", + TestName,j,*buttons); + FAIL; + } + else + CHECK; + } + bs = (XButtonState *) ((char *) bs + bs->length); + } + if (((n = getevent(display, &ev)) != 2) || ev.type != MappingNotify) { + report("Expected one MappingNotify event"); + report("Got %d events, first was type %d",n,ev.type); + FAIL; + return; + } else + CHECK; + if (((n = getevent(display, &ev)) != 1) || ev.type != dmn) { + report("Expected one DeviceMotion event"); + report("Got %d events, first was type %d",n,ev.type); + FAIL; + return; + } else + CHECK; + + if (((XDeviceMotionEvent *) &ev)->device_state != 0) { + report ("Device motion state was %x, not 0 after press/release\n", + ((XDeviceMotionEvent *) &ev)->device_state); + FAIL; + } + else + CHECK; + CHECKPASS(BUTTONMAPLEN + 3); + + +>>ASSERTION Good B 3 +Termination of the client that changed the pointer does not affect +which input device is the X pointer. +>>STRATEGY +Change the pointer to a new device. +Terminate the client that made the change. +Verify that the X pointer remains the same. +>>CODE +Display *client2, *client1; +XDeviceInfo *list; +int i, ndevices, savid; + + if (!Setup_Extension_DeviceInfo(ValMask) || NumValuators < 2) + { + untested("%s: Required input extension device not present.\n", TestName); + return; + } + list = XListInputDevices (display, &ndevices); + for (i=0; i<ndevices; i++,list++) + if (list->use==IsXPointer) + savid = list->id; + + device = Devs.Valuator; +/* Create client1, without causing resource registration. */ + if (config.display == (char *) NULL) { + delete("config.display not set"); + return; + } + else + CHECK; + client1 = XOpenDisplay(config.display); + if (client1 == (Display *) NULL) { + delete("Couldn't create client1."); + return; + } + else + CHECK; + + display = client1; + XCALL; + XCloseDisplay(display); + + if ((client2 = opendisplay()) == NULL) + return; + + display = client2; + if (verify_ptr(display, Devs.Valuator->device_id)) + CHECK; + else + { + report("%s: Couldn't change X pointer\n",TestName); + FAIL; + } + device = XOpenDevice(display, savid); + XCALL; + if (verify_ptr(display, savid)) + CHECK; + else + { + report("%s: Couldn't restore X pointer\n",TestName); + FAIL; + } + CHECKPASS(4); + +>>ASSERTION Bad B 3 +If the specified device has no valuators, a call to +XChangePointerDevice will result in a BadMatch error. +>>STRATEGY +Call xname with a device that has no valuators. +Verify that a BadMatch error occurs. +>>CODE BadMatch + + if (!Setup_Extension_DeviceInfo(NValsMask)) + { + untested("%s: No input extension device without valuators.\n", TestName); + return; + } + device = Devs.NoValuators; + + XCALL; + + if (geterr() == BadMatch) + PASS; + else + FAIL; +>>ASSERTION Bad B 1 +If the implementation does not support use of the specified device +as the X pointer, a BadDevice error will result. + +>>ASSERTION Bad B 3 +After a successful call to ChangePointerDevice, a call to any +other input device extension request that requires a Device, +specifying the new X pointer, will result in a BadDevice error. +>>STRATEGY +Change the pointer to a new device. +Verify that all input device extension requests that require a Device pointer +fail with a BadDevice error, when the new pointer is specified. +>>CODE +XID baddevice; +int devicemotionnotify; +XDeviceInfo *list; +int i, ndevices, revert, nfeed, mask, ksyms_per, savid; +int nevents, mode, evcount, valuators, count=0; +Window focus, w; +Time time; +XKbdFeedbackControl feedctl; +KeySym ksyms; +XModifierKeymap *modmap; +unsigned char bmap[8]; +XDeviceResolutionControl dctl; +XEventClass devicemotionnotifyclass; +XEvent ev; +XDevice bogus; + + + if (!Setup_Extension_DeviceInfo(ValMask) || NumValuators < 2) + { + untested("%s: Required input extension device not present.\n", TestName); + return; + } + list = XListInputDevices (display, &ndevices); + for (i=0; i<ndevices; i++,list++) + if (list->use==IsXPointer) + savid = list->id; + + w = defwin(display); + device = Devs.Valuator; + bogus.device_id = Devs.Valuator->device_id; + DeviceMotionNotify(device, devicemotionnotify, devicemotionnotifyclass); + modmap = XGetModifierMapping(display); + XCALL; + + if (verify_ptr(display, Devs.Valuator->device_id)) + { + CHECK; + count++; + } + else + { + report("%s: Couldn't change X pointer\n",TestName); + FAIL; + } + + XSetErrorHandler(error_status); + XOpenDevice(display, device->device_id); + XSync(display,0); + BadDevice (display, baddevice); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + device = &bogus; + XCloseDevice(display, device); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XSetDeviceMode(display, device, Absolute); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceMotionEvents(display, device, CurrentTime, CurrentTime, + &nevents, &mode, &evcount); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XChangeKeyboardDevice(display, device); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XChangePointerDevice(display, device, 0, 1); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGrabDevice(display, device, w, True, 1, &devicemotionnotifyclass, + GrabModeAsync, GrabModeAsync, CurrentTime); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XUngrabDevice(display, device, CurrentTime); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGrabDeviceKey(display, device, AnyKey, AnyModifier, NULL, + w, True, 0, NULL, GrabModeAsync, GrabModeAsync); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XUngrabDeviceKey(display, device, AnyKey, AnyModifier, NULL, w); + XSync(display,0); + + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGrabDeviceButton(display, device, AnyButton, AnyModifier, NULL, + w, True, 0, NULL, GrabModeAsync, GrabModeAsync); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XUngrabDeviceButton(display, device, AnyButton, AnyModifier, NULL, w); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XAllowDeviceEvents(display, device, AsyncAll, CurrentTime); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceFocus(display, device, &focus, &revert, &time); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XSetDeviceFocus(display, device, None, RevertToNone, CurrentTime); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetFeedbackControl(display, device, &nfeed); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + feedctl.class = KbdFeedbackClass; + feedctl.percent = 0; + mask = DvPercent; + XChangeFeedbackControl(display, device, mask, (XFeedbackControl*) &feedctl); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceKeyMapping(display, device, MinKeyCode, 1, &ksyms_per); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XChangeDeviceKeyMapping(display, device, MinKeyCode, 1, &ksyms, 1); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceModifierMapping(display, device); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XSetDeviceModifierMapping(display, device, modmap); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceButtonMapping(display, device, bmap, 8); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XSetDeviceButtonMapping(display, device, bmap, 8); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XQueryDeviceState(display, device); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XSetDeviceValuators(display, device, &valuators, 0, 1); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XDeviceBell(display, device, 0, 0, 100); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + XGetDeviceControl(display, device, DEVICE_RESOLUTION); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + dctl.length = sizeof(XDeviceResolutionControl); + dctl.control = DEVICE_RESOLUTION; + dctl.num_valuators=1; + dctl.first_valuator=0; + dctl.resolutions = &valuators; + XChangeDeviceControl(display, device, DEVICE_RESOLUTION, (XDeviceControl*) &dctl); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + ev.type = devicemotionnotify; + XSendExtensionEvent(display, device, PointerWindow, True, 0, NULL, + &ev); + XSync(display,0); + if (geterr() == baddevice) + { + CHECK; + count++; + } + else + FAIL; + + device = XOpenDevice(display, savid); + XCALL; + XSync(display,0); + if (verify_ptr(display, savid)) + { + CHECK; + count++; + } + else + { + report("%s: Couldn't restore X pointer\n",TestName); + FAIL; + } + XSetErrorHandler(unexp_err); + CHECKPASS(count); + +>>ASSERTION Bad B 3 +When an invalid device is specified, a BadDevice error will result. +>>STRATEGY +Make the call with an invalid device. +>>CODE baddevice +XDevice nodevice; +XID baddevice; +int ximajor, first, err; + + if (!XQueryExtension (display, INAME, &ximajor, &first, &err)) + { + untested("%s: Input extension not supported.\n", TestName); + return; + } + + BadDevice (display, baddevice); + nodevice.device_id = -1; + device = &nodevice; + + XCALL; + + if (geterr() == baddevice) + CHECK; + else + FAIL; + + CHECKPASS(1); + +>>ASSERTION Bad B 3 +When the specified axes are not in the range of axes supported by the device, +then a +.S BadMatch +error occurs. +>>STRATEGY +Call xname with xaxis less than 0. +Verify that a BadMatch error occurs. +Call xname with yaxis greater than the number of axes supported. +Verify that a BadMatch error occurs. +>>CODE BadMatch + + if (!Setup_Extension_DeviceInfo(ValMask)) + { + untested("%s: No input extension valuator device.\n", TestName); + return; + } + device = Devs.Valuator; + + xaxis = -1; + XCALL; + + if (geterr() == BadMatch) + CHECK; + + /* + * Since the protocol only has one byte for the key then this + * assertion cannot be tested when max_button is 255. + */ + if (yaxis < 255) { + + yaxis = 255; + + XCALL; + + if (geterr() == BadMatch) + CHECK; + } else + CHECK; + + CHECKPASS(2); + +>>ASSERTION Bad B 3 +A call to xname will fail with a status of +.S AlreadyGrabbed +if some other client has grabbed the new device. +>>STRATEGY +Grab the new device. +Create client2. +Attempt to change the pointer to the new device. +>>CODE +int ret; +Display *client2; +Window grab_window; + + grab_window = defwin (display); + if (!Setup_Extension_DeviceInfo(ValMask)) + { + untested("%s: No input extension valuator device.\n", TestName); + return; + } + device = Devs.Valuator; + + XGrabDevice(Dsp, device, grab_window, True, 0, + NULL, GrabModeAsync, GrabModeAsync, CurrentTime); + if (isdeleted()) { + delete("Could not set up initial grab"); + return; + } + + if ((client2 = opendisplay()) == NULL) + return; + + display = client2; + ret = XCALL; + + if (ret == AlreadyGrabbed) + CHECK; + else + FAIL; + + CHECKPASS(1); + XUngrabDevice(Dsp, device, CurrentTime); + XSync(display,0); + +>>ASSERTION Bad B 3 +A call to xname will fail with a status of +.S GrabFrozen +if the device is frozen by the grab of some other client. +>>STRATEGY +Grab the new device when it is frozen by a grab of another device. +Create client2. +Attempt to change the pointer to the new device. +>>CODE +int ret; +Display *client2; +Window grab_window; + + if (!Setup_Extension_DeviceInfo(ValMask)) + { + untested("%s: No input extension valuator device.\n", TestName); + return; + } + device = Devs.Valuator; + grab_window = defwin (display); + + XGrabKeyboard (Dsp, grab_window, True, + GrabModeSync, GrabModeSync, CurrentTime); + XSync(Dsp,0); + if (isdeleted()) { + delete("Could not set up initial grab"); + return; + } + + if ((client2 = opendisplay()) == NULL) + return; + + display = client2; + ret = XCALL; + + if (ret == GrabFrozen) + CHECK; + else + { + FAIL; + report("Wanted GrabFrozen, got %d", ret); + } + + CHECKPASS(1); |