summaryrefslogtreecommitdiff
path: root/xts5/XI/GrabDeviceKey/GrabDeviceKey.m
diff options
context:
space:
mode:
Diffstat (limited to 'xts5/XI/GrabDeviceKey/GrabDeviceKey.m')
-rw-r--r--xts5/XI/GrabDeviceKey/GrabDeviceKey.m1142
1 files changed, 1142 insertions, 0 deletions
diff --git a/xts5/XI/GrabDeviceKey/GrabDeviceKey.m b/xts5/XI/GrabDeviceKey/GrabDeviceKey.m
new file mode 100644
index 00000000..95329af9
--- /dev/null
+++ b/xts5/XI/GrabDeviceKey/GrabDeviceKey.m
@@ -0,0 +1,1142 @@
+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/GrabDeviceKey/GrabDeviceKey.m,v 1.2 2005-11-03 08:42:06 jmichael Exp $
+
+Copyright (c) Applied Testing and Technology, Inc. 1995
+All Rights Reserved.
+
+>># Project: VSW5
+>>#
+>># File: xts5/tset/XI/grbdvcky/grbdvcky.m
+>>#
+>># Description:
+>># Tests for XGrabDeviceKey()
+>>#
+>># Modifications:
+>># $Log: grbdvky.m,v $
+>># Revision 1.2 2005-11-03 08:42:06 jmichael
+>># clean up all vsw5 paths to use xts5 instead.
+>>#
+>># Revision 1.1.1.2 2005/04/15 14:05:14 anderson
+>># Reimport of the base with the legal name in the copyright fixed.
+>>#
+>># Revision 8.0 1998/12/23 23:32:00 mar
+>># Branch point for Release 5.0.2
+>>#
+>># Revision 7.0 1998/10/30 22:52:12 mar
+>># Branch point for Release 5.0.2b1
+>>#
+>># Revision 6.0 1998/03/02 05:23:34 tbr
+>># Branch point for Release 5.0.1
+>>#
+>># Revision 5.0 1998/01/26 03:20:07 tbr
+>># Branch point for Release 5.0.1b1
+>>#
+>># Revision 4.0 1995/12/15 09:03:45 tbr
+>># Branch point for Release 5.0.0
+>>#
+>># Revision 3.4 1995/12/15 01:01:45 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 XGrabDeviceKey XI
+void
+
+Display *display = Dsp;
+XDevice *device;
+int keycode = AnyKey;
+unsigned int modifiers = AnyModifier;
+XDevice *modifier_device;
+Window grab_window = defwin(display);
+Bool owner_events = False;
+int event_count = 0;
+XEventClass *event_list;
+int this_device_mode = GrabModeAsync;
+int other_devices_mode = GrabModeAsync;
+>>EXTERN
+extern int MinKeyCode;
+extern ExtDeviceInfo Devs;
+
+>>ASSERTION Good B 3
+A call to xname establishes a passive grab on the key device that is activated
+in the future by
+the specified key being logically pressed,
+the specified modifier keys being logically down,
+no other modifier keys being logically down,
+the
+.A grab_window
+being the focus window or an ancestor of the focus window
+or being a descendant of the focus window that contains the pointer
+and
+a passive grab on the same key combination not existing on any
+ancestor of
+.A grab_window .
+>>STRATEGY
+Touch test.
+>>CODE
+int ret;
+Display *client1;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = NULL;
+ XCALL;
+ ret = XCALL;
+ XSync(display,0);
+
+ if (noext(1))
+ return;
+ warppointer(display, grab_window, 1, 1);
+ devicekeypress (display, Devs.Key, MinKeyCode);
+ XSync (display, 0);
+
+ ret = XGrabDevice(client1, Devs.Key, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ FAIL;
+ else
+ PASS;
+ devicekeyrel (display, Devs.Key, MinKeyCode);
+ devicerelkeys (Devs.Key);
+ XUngrabDeviceKey(display, device, AnyKey, AnyModifier, NULL, grab_window);
+ XSync (display, 0);
+
+>>ASSERTION Good B 3
+When the conditions for activating the grab are otherwise satisfied
+and the key device is already grabbed,
+then no active grab is established.
+>>STRATEGY
+Establish an active grab on the target device. Then establish a passive
+grab from another client. Press a key to activate the grab.
+If the passive grab worked, the client that established the passive grab
+should be able to replace it with an active grab. If it failed, the active
+grab should also fail with an error of AlreadyGrabbed.
+>>CODE
+int ret;
+Display *client1;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != Success)
+ FAIL;
+ else
+ CHECK;
+
+ ret = XCALL;
+ if (ret != Success)
+ FAIL;
+ else
+ CHECK;
+
+ if (noext(1))
+ {
+ untested("Test extension not present - touch test only.\n");
+ return;
+ }
+ warppointer(display, grab_window, 1, 1);
+ devicekeypress (display, device, MinKeyCode);
+ XSync (display, 0);
+
+ ret = XGrabDevice(display, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ FAIL;
+ else
+ CHECK;
+ CHECKPASS(3);
+ devicekeyrel (display, device, MinKeyCode);
+ devicerelkeys (device);
+ XUngrabDevice(client1, device, CurrentTime);
+ XUngrabDeviceKey(display, device, AnyKey, AnyModifier, NULL, grab_window);
+ XSync(client1,0);
+ XSync(display,0);
+
+>>ASSERTION Good B 3
+When the conditions for activating the grab are satisfied
+and the grab subsequently becomes active, then
+the last-device-grab time is set to the time at which the key was pressed.
+>>STRATEGY
+If extensions are available:
+ Set and activate grab.
+ Check activated.
+ Check activating event received.
+ Check event type and event window are DeviceKeyPress and grab_window.
+ Attempt UngrabDevice at time just before event time.
+ Check no longer grabbed.
+ Release grab and key.
+else
+ Report untested.
+>>CODE
+Display *client1;
+XEvent ev;
+int dkp, dkr;
+XEventClass dkpclass, dkrclass;
+XDeviceKeyPressedEvent good;
+XWindowAttributes atts;
+int ret, n;
+
+ if (noext(1))
+ return;
+ else
+ CHECK;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ XSync(display, True);
+ XCALL;
+
+ DeviceKeyPress(device, dkp, dkpclass);
+ DeviceKeyRelease(device, dkr, dkrclass);
+ XSelectExtensionEvent(display, grab_window, &dkpclass, 1);
+
+ (void) warppointer(display, grab_window, 1, 1);
+ XSync(display, True); /* Discard any events */
+ devicekeypress(display, device, MinKeyCode);
+ XSync(display, False);
+
+ ret = XGrabDevice(client1, Devs.Key, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("Failed to activate grab, ret was %d.\n",ret);
+ FAIL;
+ }
+ else
+ PASS;
+
+ n = getevent(display, &ev);
+ if (n)
+ CHECK;
+ else {
+ report("No events received for activating grab");
+ XUngrabDeviceKey (display, device, AnyKey, AnyModifier, NULL, grab_window);
+ devicekeyrel(display, device, MinKeyCode);
+ devicerelkeys(device);
+ FAIL;
+ return;
+ }
+
+ XGetWindowAttributes(display, grab_window, &atts);
+ defsetevent(good, display, dkp);
+ good.window = grab_window;
+ good.root = DRW(display);
+ good.subwindow = None;
+ good.time = ((XDeviceKeyPressedEvent*)&ev)->time;
+ good.x = 1;
+ good.y = 1;
+ good.x_root = good.x + atts.x + atts.border_width;
+ good.y_root = good.y + atts.y + atts.border_width;
+ good.state = modifiers;
+ good.keycode = MinKeyCode;
+ good.same_screen = True;
+ good.deviceid = Devs.Key->device_id;
+
+ if (check_ext_event((XEvent*)&good, &ev) == 0)
+ CHECK;
+ else
+ FAIL;
+
+ trace("Grabbed at time 0x%lx.",(unsigned long) good.time);
+ XUngrabDevice(display, device, good.time - 1);
+ XSync(display,0);
+ ret = XGrabDevice(client1, Devs.Key, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("Last device grab time set earlier than reported event time.\n");
+ FAIL;
+ }
+ else
+ CHECK;
+
+ XUngrabDevice(display, device, good.time);
+ XSync(display,0);
+ ret = XGrabDevice(client1, Devs.Key, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret == AlreadyGrabbed)
+ {
+ report("Last device grab time set later than reported event time.\n");
+ FAIL;
+ }
+ else
+ CHECK;
+ XUngrabDeviceKey (display, device, AnyKey, AnyModifier, NULL, grab_window);
+ XUngrabDevice(client1, Devs.Key, CurrentTime);
+ devicekeyrel(display, device, MinKeyCode);
+ devicerelkeys(device);
+ XSync (display, 0);
+ XSync (client1, 0);
+ CHECKPASS(5);
+
+>>ASSERTION Good B 3
+When the grab subsequently becomes active and later
+the logical state of the
+device has the specified key released,
+then the active grab is terminated automatically.
+>>#(independent of the logical state of the modifier keys).
+>>STRATEGY
+If extensions are available:
+ Place passive grab with xname.
+ Activate grab with simulated device events.
+ Simulate pressing some modifier keys.
+ Release the key.
+ Verify that the grab has been released.
+else
+ Report untested.
+>>CODE
+unsigned int mods, ret;
+Display *client1;
+
+ if (noext(1))
+ return;
+
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ XCALL;
+
+ devicekeypress(display, device, MinKeyCode);
+ mods = wantmods(display, 3);
+ modpress(display, mods);
+ XSync(display,0);
+
+ devicekeyrel(display, device, MinKeyCode);
+ XSync(display,0);
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != Success)
+ {
+ report("Grab was not released, when key was released and ");
+ report(" modifier keys were down");
+ FAIL;
+ }
+ else
+ PASS;
+ modrel(display, mods);
+ devicerelkeys(device);
+ relalldev();
+ XUngrabDevice (client1, device, CurrentTime);
+ XSync(client1, 0);
+
+>>ASSERTION Good B 3
+A call to xname overrides all previous passive grabs by the same client on the
+same key combinations on the same window.
+>>STRATEGY
+If extensions are available:
+ Place a passive grab with this_device_mode = GrabModeSync.
+ Place a passive grab as before but with this_device_mode = GrabModeAsync.
+ Move pointer to grab_window and activate grab.
+ Verify that the device is not frozen, and thus the second
+ grab overrode the first.
+else
+ Report untested.
+>>CODE
+int dkp, dkr;
+XEventClass dkpclass, dkrclass;
+XEvent ev;
+
+ if (noext(1))
+ return;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ DeviceKeyPress(device, dkp, dkpclass);
+ DeviceKeyRelease(device, dkr, dkrclass);
+ XSelectExtensionEvent(display, grab_window, &dkpclass, 1);
+ XSync(display,0);
+ warppointer(display, grab_window, 1, 1);
+
+ this_device_mode = GrabModeSync;
+ XCALL;
+
+ /* Try to override first grab */
+ this_device_mode = GrabModeAsync;
+ XCALL;
+ XSync(display,0);
+
+ devicekeypress(display, device, MinKeyCode);
+ devicekeyrel(display, device, MinKeyCode);
+ devicekeypress(display, device, MinKeyCode+1);
+ devicekeyrel(display, device, MinKeyCode+1);
+ devicekeypress(display, device, MinKeyCode+2);
+ devicekeyrel(display, device, MinKeyCode+2);
+ XSync(display,0);
+
+ while (XPending(display))
+ {
+ XNextEvent(display, &ev);
+ if (ev.type==dkp)
+ CHECK;
+ else
+ FAIL;
+ }
+
+ devicerelkeys(device);
+ CHECKPASS(3);
+>>ASSERTION Good B 3
+When the
+.A modifiers
+argument is
+.S AnyModifier ,
+then this is equivalent to separate calls to xname for all
+possible modifier combinations including no modifiers.
+>>STRATEGY
+If extensions are available:
+ Place passive grab with a modifiers of AnyModifier.
+ Press a bunch of modifier keys.
+ Press key to activate grab.
+ Verify that grab is activated.
+ Release keys.
+
+ Press key (no modifiers).
+ Verify that grab is active.
+else
+ Perform touch test.
+ Report untested.
+>>CODE
+unsigned int ret, mods;
+Display *client1;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ modifiers = AnyModifier;
+ device = Devs.Key;
+ modifier_device = NULL;
+ XCALL;
+
+ if (noext(1)) {
+ untested("There is no reliable test method, but a touch test was performed");
+ return;
+ }
+
+ mods = wantmods(display, 4);
+ modpress(display, mods);
+
+ /*
+ * modifiers was AnyModifier, several modifier keys are held down.
+ */
+ warppointer(display, grab_window, 1, 1);
+ devicekeypress(display, device, MinKeyCode);
+ XSync(display,0);
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("Grab not activated for AnyModifier");
+ report(" Modifiers used %s", keymaskname((unsigned long)mods));
+ FAIL;
+ }
+ else
+ CHECK;
+
+ /* Release all keys and modifiers */
+ devicekeyrel(display, device, MinKeyCode);
+ relalldev();
+ XSync(display,0);
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret == AlreadyGrabbed)
+ {
+ delete("Could not release grab for second part of test");
+ FAIL;
+ }
+ else
+ {
+ XUngrabDevice(client1, device, CurrentTime);
+ XSync(client1,0);
+ CHECK;
+ }
+
+ devicekeypress(display, device, MinKeyCode);
+ XSync(display,0);
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("Grab with AnyModifier was not activated by a key press with");
+ report(" no modifiers");
+ FAIL;
+ }
+ else
+ CHECK;
+ CHECKPASS(3);
+ devicekeyrel(display, device, MinKeyCode);
+ devicerelkeys(device);
+ XSync(display,0);
+>>ASSERTION Good B 3
+It is not required that all modifiers specified have
+currently assigned KeyCodes.
+>>STRATEGY
+If extensions are available:
+ Get a modifier mask.
+ Remove the keycode for the modifier from the map.
+ Call xname to set up a passive grab with that modifier.
+ Reset the keycode in the modifier map.
+ Verify that the grab can be activated with the newly set modifier.
+else
+ Report untested.
+>>CODE
+XModifierKeymap *mmap;
+XModifierKeymap *newmap;
+int i, ret;
+Display *client1;
+
+ if (noext(1))
+ return;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = NULL;
+ modifiers = wantmods(display, 1);
+ if (modifiers == 0) {
+ untested("No available modifier keys");
+ return;
+ } else
+ CHECK;
+
+ mmap = XGetModifierMapping(display);
+ if (mmap == NULL) {
+ delete("Could not get modifier map");
+ return;
+ } else
+ CHECK;
+
+ /*
+ * Remove all the modifiers mappings.
+ */
+ newmap = XNewModifiermap(mmap->max_keypermod);
+ for (i = 0; i < newmap->max_keypermod*8; i++)
+ newmap->modifiermap[i] = NoSymbol;
+
+ if (XSetModifierMapping(display, newmap) == MappingSuccess)
+ CHECK;
+ else {
+ delete("Could not remove modifier mapping");
+ return;
+ }
+
+ /*
+ * Now we have a modifier that has no keycode - set up a passive grab.
+ */
+ XCALL;
+ XSync(display,0);
+
+ /*
+ * Reset the modifier map, and try to activate the grab.
+ */
+ if (XSetModifierMapping(display, mmap) == MappingSuccess)
+ CHECK;
+ else {
+ delete("Could not reset modifier mapping");
+ return;
+ }
+
+ warppointer(display, grab_window, 1, 1);
+ XSync(display,0);
+ modpress(display, modifiers);
+ devicekeypress(display, device, MinKeyCode);
+ XSync(display,0);
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("Passive grab not set when the modifier did not have a current keycode");
+ FAIL;
+ }
+ else
+ CHECK;
+
+ CHECKPASS(5);
+ devicekeyrel(display, device, MinKeyCode);
+ modrel(display, modifiers);
+ devicerelkeys(device);
+ relalldev();
+>>ASSERTION Good B 3
+When the
+.A keycode
+argument is
+.S AnyKey ,
+then this is equivalent to separate calls to xname for
+all possible KeyCodes.
+>>STRATEGY
+Establish a passive grab for AnyKey on an input extension device.
+Press each of the keys on that device.
+Verify that pressing each of the keys activates the grab.
+>>CODE
+int i, j, ret, ndevices, nkeys, count=0;
+Display *client1;
+XDeviceInfo *list;
+XAnyClassPtr any;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ list = XListInputDevices(display, &ndevices);
+ for (i=0; i<ndevices; i++, list++)
+ if (list->id == Devs.Key->device_id)
+ {
+ any = (XAnyClassPtr) (list->inputclassinfo);
+ for (j=0; j<list->num_classes; j++)
+ {
+ if (any->class == KeyClass)
+ {
+ nkeys = ((XKeyInfo *) any)->num_keys;
+ break;
+ }
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ break;
+ }
+ modifier_device = NULL;
+ warppointer(display, grab_window, 1, 1);
+ for (i=0;i<nkeys;i++)
+ {
+ ret = XCALL;
+ XSync(display,0);
+
+ if (noext(1))
+ return;
+ devicekeypress (display, device, MinKeyCode + i);
+ XSync (display, 0);
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ FAIL;
+ else
+ {
+ CHECK;
+ count++;
+ }
+ XUngrabDeviceKey(display, device, AnyKey, AnyModifier,
+ NULL, grab_window);
+ XSync(display,0);
+ }
+ for (i=0;i<nkeys;i++)
+ devicekeyrel(display, device, MinKeyCode + i);
+ devicerelkeys(device);
+ CHECKPASS(count);
+>>ASSERTION Good B 3
+When the event window for an active grab becomes not viewable, then the
+grab is released automatically.
+>>STRATEGY
+Establish a passive grab on an input device extension device.
+Activate the grab by pressing a key on the device.
+Verify that the grab is active by trying to establish another active grab
+from a different client, and verifying that AlreadyGrabbed is returned.
+Make the grab window non-viewable.
+Attempt another active grab and verify that it works this time.
+>>CODE
+int ret;
+Display *client1;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = NULL;
+ ret = XCALL;
+ XSync(display,0);
+
+ if (noext(1))
+ return;
+ warppointer(display, grab_window, 1, 1);
+ devicekeypress (display, device, MinKeyCode);
+ XSync (display, 0);
+
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ FAIL;
+ else
+ CHECK;
+ XUnmapWindow(display,grab_window);
+ XSync(display,0);
+
+ grab_window = defwin(display);
+ ret = XGrabDevice(client1, device, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != Success)
+ FAIL;
+ else
+ CHECK;
+ devicekeyrel (display, device, MinKeyCode);
+ devicerelkeys(device);
+ XSync(display,0);
+ CHECKPASS(2);
+>>ASSERTION Good B 3
+NULL may be specified as the modifier device. This will cause the X keyboard
+to be used as the modifier device.
+>>STRATEGY
+Specify NULL as the modifier device.
+>>CODE
+Display *client1;
+int minkey, maxkey, numkeys, ret;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ if ((client1 = opendisplay()) == 0) {
+ delete("Could not open display");
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = NULL;
+ modifiers = wantmods(display, 1);
+ if (modifiers == 0) {
+ untested("No available modifier keys");
+ return;
+ } else
+ CHECK;
+ XCALL;
+ if (noext(1))
+ {
+ untested("%d: No XTest extension, can't complete test.",TestName);
+ return;
+ }
+ MinMaxKeys(display, device, &minkey, &maxkey, &numkeys);
+ warppointer(display, grab_window, 1, 1);
+ modpress(display, modifiers);
+ devicekeypress (display, Devs.Key, minkey);
+ XSync (display, 0);
+
+ ret = XGrabDevice(client1, Devs.Key, grab_window, True, 0, NULL,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (ret != AlreadyGrabbed)
+ {
+ report("%s: Grab failed to activate.", TestName);
+ FAIL;
+ }
+ else
+ CHECK;
+
+ modrel(display, modifiers);
+ devicekeyrel (display, Devs.Key, minkey);
+ devicerelkeys (Devs.Key);
+ relalldev();
+ XUngrabDeviceKey(display, device, AnyKey, AnyModifier,
+ NULL, grab_window);
+ CHECKPASS(2);
+
+>>ASSERTION Bad B 3
+When the specified keycode is not in the range
+specified by min_keycode and max_keycode in the connection setup or
+.S AnyKey ,
+then a
+.S BadValue
+error occurs.
+>>STRATEGY
+Call xname with keycode less than min_keycode.
+Verify that a BadValue error occurs.
+Call xname with keycode greater than max_keycode if it is less than 255.
+Verify that a BadValue error occurs.
+>>CODE BadValue
+extern int MinKeyCode, MaxKeyCode;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ keycode = MinKeyCode-1;
+ XCALL;
+
+ if (geterr() == BadValue)
+ CHECK;
+
+ /*
+ * Since the protocol only has one byte for the key then this
+ * assertion cannot be tested when max_keycode is 255.
+ */
+ if (MaxKeyCode < 255) {
+
+ keycode = MaxKeyCode+1;
+
+ XCALL;
+ XSync(display,0);
+
+ if (geterr() == BadValue)
+ CHECK;
+ } else
+ CHECK;
+
+ CHECKPASS(2);
+>>ASSERTION Bad B 3
+When an invalid value is specified for the modifiers parameter,
+a BadValue error results.
+>>CODE BadValue
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ modifiers = ~0;
+ XCALL;
+ XSync(display,0);
+
+ if (geterr() == BadValue)
+ CHECK;
+ else
+ FAIL;
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid value is specified for the owner_events parameter, a
+BadValue error results.
+>>CODE BadValue
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ owner_events = -1;
+ XCALL;
+ XSync(display,0);
+
+ if (geterr() == BadValue)
+ CHECK;
+ else
+ FAIL;
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid value is specified for the this_device_mode parameter, a
+BadValue error results.
+>>CODE BadValue
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ this_device_mode = -1;
+ XCALL;
+
+ if (geterr() == BadValue)
+ CHECK;
+ else
+ FAIL;
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid value is specified for the other_devices_mode parameter, a
+BadValue error results.
+>>CODE BadValue
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ other_devices_mode = -1;
+ XCALL;
+
+ if (geterr() == BadValue)
+ CHECK;
+ else
+ FAIL;
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+.ER Access grab
+>>STRATEGY
+Grab key/modifier.
+Create client2.
+Attempt to grab same key modifier for client2.
+Verify BadAccess error.
+>>CODE BadAccess
+Display *client2;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ XGrabDeviceKey(Dsp, device, keycode, modifiers, modifier_device,
+ grab_window, owner_events, event_count, event_list,
+ this_device_mode, other_devices_mode);
+ XSync (Dsp,0);
+ if (isdeleted()) {
+ delete("Could not set up initial grab");
+ return;
+ }
+
+ if ((client2 = opendisplay()) == NULL)
+ return;
+
+ display = client2;
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == BadAccess)
+ CHECK;
+ else
+ FAIL;
+
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid window parameter is specified on an xname protocol request,
+a BadWindow error results.
+>>CODE BadWindow
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+
+ grab_window = 0;
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == BadWindow)
+ CHECK;
+ else
+ FAIL;
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an modifier_device is specified that has no keys, a
+BadMatch error results.
+>>CODE BadMatch
+
+ if (!Setup_Extension_DeviceInfo(KeyMask | NKeysMask))
+ {
+ untested("%s: Required input extension devices not present.\n", TestName);
+ return;
+ }
+ device = Devs.Key;
+ modifier_device = Devs.NoKeys;
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == BadMatch)
+ CHECK;
+ else
+ FAIL;
+
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid modifier_device is specified in an xname protocol request, a
+BadValue error results.
+>>CODE baddevice
+XID baddevice;
+XDevice bogus;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ BadDevice(display, baddevice);
+ device = Devs.Key;
+ modifier_device = &bogus;
+ bogus.device_id = 128;
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == baddevice)
+ CHECK;
+ else
+ FAIL;
+
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid device is specified in an xname protocol request, a
+BadValue error results.
+>>CODE baddevice
+XID baddevice;
+XDevice bogus;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ BadDevice(display, baddevice);
+ modifier_device = Devs.Key;
+ device = &bogus;
+ bogus.device_id = 128;
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == baddevice)
+ CHECK;
+ else
+ FAIL;
+
+ CHECKPASS(1);
+>>ASSERTION Bad B 3
+When an invalid event class is specified, a
+BadValue error results.
+>>STRATEGY
+Specify an invalid event class.
+>>CODE badclass
+Display *client2;
+XEventClass eclass = -1;
+XID badclass;
+
+ if (!Setup_Extension_DeviceInfo(KeyMask))
+ {
+ untested("%s: Input extension key device not present.\n", TestName);
+ return;
+ }
+ BadClass(display,badclass);
+ device = Devs.Key;
+ modifier_device = Devs.Key;
+ event_count = 1;
+ event_list = &eclass;
+
+ XCALL;
+ XSync (Dsp,0);
+
+ if (geterr() == badclass)
+ CHECK;
+ else
+ FAIL;
+
+ CHECKPASS(1);