diff options
Diffstat (limited to 'xts5/Xlib11/FocusIn/FocusIn.m')
-rw-r--r-- | xts5/Xlib11/FocusIn/FocusIn.m | 3103 |
1 files changed, 3103 insertions, 0 deletions
diff --git a/xts5/Xlib11/FocusIn/FocusIn.m b/xts5/Xlib11/FocusIn/FocusIn.m new file mode 100644 index 00000000..b86c06c8 --- /dev/null +++ b/xts5/Xlib11/FocusIn/FocusIn.m @@ -0,0 +1,3103 @@ +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/Xlib11/FocusIn/FocusIn.m,v 1.2 2005-11-03 08:42:28 jmichael Exp $ + +Copyright (c) Applied Testing and Technology, Inc. 1995 +All Rights Reserved. + +>># Project: VSW5 +>># +>># File: xts5/tset/Xlib11/FocusIn/FocusIn.m +>># +>># Description: +>># Tests for FocusIn() +>># +>># Modifications: +>># $Log: fcsin.m,v $ +>># Revision 1.2 2005-11-03 08:42:28 jmichael +>># clean up all vsw5 paths to use xts5 instead. +>># +>># Revision 1.1.1.2 2005/04/15 14:05:16 anderson +>># Reimport of the base with the legal name in the copyright fixed. +>># +>># Revision 8.0 1998/12/23 23:31:13 mar +>># Branch point for Release 5.0.2 +>># +>># Revision 7.0 1998/10/30 22:50:46 mar +>># Branch point for Release 5.0.2b1 +>># +>># Revision 6.0 1998/03/02 05:22:54 tbr +>># Branch point for Release 5.0.1 +>># +>># Revision 5.0 1998/01/26 03:19:27 tbr +>># Branch point for Release 5.0.1b1 +>># +>># Revision 4.0 1995/12/15 09:01:21 tbr +>># Branch point for Release 5.0.0 +>># +>># Revision 3.1 1995/12/15 00:58:06 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 FocusIn Xlib11 +>>SET startup focusstartup +>>SET cleanup focuscleanup +>>EXTERN +#define EVENT FocusIn +#define OTHEREVENT FocusOut +#define MASK FocusChangeMask + +static Display *_display_; +static int _detail_; +static long _event_mask_; +static XEvent good; + +static int +selectinput(start, stop, current, previous) +Winh *start, *stop, *current, *previous; +{ +#ifdef lint + winh_free(start); + winh_free(stop); + winh_free(previous); +#endif + return(winh_selectinput(_display_, current, _event_mask_)); +} + +static int +plant(start, stop, current, previous) +Winh *start, *stop, *current, *previous; +{ +#ifdef lint + winh_free(start); + winh_free(stop); + winh_free(previous); +#endif + good.xany.window = current->window; + return(winh_plant(current, &good, NoEventMask, WINH_NOMASK)); +} + +static Bool increasing; /* event sequence increases as we climb */ + +static int +checksequence(start, stop, current, previous) +Winh *start, *stop, *current, *previous; +{ + Winhe *d; + int current_sequence; + int status; + static int last_sequence; + +#ifdef lint + winh_free(start); + winh_free(stop); +#endif + /* look for desired event type */ + for (d = current->delivered; d != (Winhe *) NULL; d = d->next) { + if (d->event->type == good.type) { + current_sequence = d->sequence; + break; + } + } + if (d == (Winhe *) NULL) { + report("%s event not delivered", eventname(good.type)); + delete("Missing event"); + return(-1); + } + if (previous == (Winh *) NULL) + status = 0; /* first call, no previous sequence value */ + else { + /* assume sequence numbers are not the same */ + status = (current_sequence < last_sequence); + if (increasing) + status = (status ? 0 : 1); + if (status) + report("Ordering problem between 0x%x (%d) and 0x%x (%d)", + current->window, current_sequence, + previous->window, last_sequence); + } + last_sequence = current_sequence; + return(status); +} + +static int +checkdetail(start, stop, current, previous) +Winh *start, *stop, *current, *previous; +{ + Winhe *d; + +#ifdef lint + winh_free(start); + winh_free(stop); + winh_free(previous); +#endif + /* look for desired event type */ + for (d = current->delivered; d != (Winhe *) NULL; d = d->next) + if (d->event->type == good.type) + break; + if (d == (Winhe *) NULL) { + report("%s event not delivered to window 0x%x", + eventname(good.type), current->window); + delete("Missing event"); + return(-1); + } + /* check detail */ + if (_detail_ != d->event->xfocus.detail) { + report("Expected detail of %d, got %d on window 0x%x", + _detail_, d->event->xfocus.detail, current->window); + return(1); + } + return(0); +} +>>ASSERTION Good A +When a xname event is generated, +then +all clients having set +.S FocusChangeMask +event mask bits on the event window are delivered +a xname event. +>>STRATEGY +Create client. +Create clients client2 and client3. +Create window. +Move pointer to known location. +Select for xname events on window. +Select for xname events on window with client2. +Select for no events on window with client3. +Generate xname event by changing focus to window. +Verify that xname event was delivered. +Verify members in delivered xname event structure. +Verify that xname event was delivered to client2. +Verify members in delivered xname event structure. +Verify that no events were delivered to client3. +>>CODE +int i; +Display *display; +Display *client2, *client3; +Window w; +XEvent event; +XFocusChangeEvent good; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Create clients client2 and client3. */ + if ((client2 = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client2."); + return; + } + else + CHECK; + if ((client3 = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client3."); + return; + } + else + CHECK; +/* Create window. */ + w = mkwin(display, (XVisualInfo *) NULL, (struct area *) NULL, True); +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) { + report("Couldn't move pointer"); + return; + } + else + CHECK; +/* Select for xname events on window. */ + XSelectInput(display, w, MASK); +/* Select for xname events on window with client2. */ + XSelectInput(client2, w, MASK); +/* Select for no events on window with client3. */ + XSelectInput(client3, w, NoEventMask); +/* Generate xname event by changing focus to window. */ + XSync(display, True); + XSync(client2, True); + XSync(client3, True); + XSetInputFocus(display, w, RevertToNone, CurrentTime); + XSync(display, False); + XSync(client2, False); + XSync(client3, False); +/* Verify that xname event was delivered. */ + if (XPending(display) < 1) { + report("Expected %s event not delivered.", eventname(EVENT)); + FAIL; + return; + } + else + CHECK; +/* Verify members in delivered xname event structure. */ + XNextEvent(display, &event); + good = event.xfocus; + good.type = EVENT; + good.send_event = False; + good.display = display; + good.window = w; + good.mode = NotifyNormal; + good.detail = NotifyAncestor; + if (checkevent((XEvent*)&good, &event)) { + report("Unexpected event structure member value(s)"); + FAIL; + } + else + CHECK; + if ((i = XPending(display)) > 0) { + report("Expected 1 event, got %d", i+1); + FAIL; + } + else + CHECK; +/* Verify that xname event was delivered to client2. */ + if (XPending(client2) < 1) { + report("Expected %s event not delivered to client2.", eventname(EVENT)); + FAIL; + return; + } + else + CHECK; +/* Verify members in delivered xname event structure. */ + XNextEvent(client2, &event); + good = event.xfocus; + good.type = EVENT; + good.send_event = False; + good.display = client2; + good.window = w; + good.mode = NotifyNormal; + good.detail = NotifyAncestor; + if (checkevent((XEvent*)&good, &event)) { + report("Unexpected event structure member value(s) for client2"); + FAIL; + } + else + CHECK; + if ((i = XPending(client2)) > 0) { + report("Expected 1 event, got %d for client2", i+1); + FAIL; + } + else + CHECK; +/* Verify that no events were delivered to client3. */ + if ((i = XPending(client3)) > 0) { + report("Expected 0 events, got %d for client3", i); + FAIL; + } + else + CHECK; + CHECKPASS(11); +>>ASSERTION def +>>#NOTE Tested for in pervious assertion. +When a xname event is generated, +then +clients not having set +.S FocusChangeMask +event mask bits on the event window are not delivered +a xname event. +>>#NOTEd >>ASSERTION +>>#NOTEd When the input focus changes, +>>#NOTEd then ARTICLE xname event is generated. +>>#NOTEs >>ASSERTION +>>#NOTEs When ARTICLE xname event is delivered, +>>#NOTEs then +>>#NOTEs .M type +>>#NOTEs is set to +>>#NOTEs xname. +>>#NOTEs >>ASSERTION +>>#NOTEs >>#NOTE The method of expansion is not clear. +>>#NOTEs When ARTICLE xname event is delivered, +>>#NOTEs then +>>#NOTEs .M serial +>>#NOTEs is set +>>#NOTEs from the serial number reported in the protocol +>>#NOTEs but expanded from the 16-bit least-significant bits +>>#NOTEs to a full 32-bit value. +>>#NOTEm >>ASSERTION +>>#NOTEm When ARTICLE xname event is delivered +>>#NOTEm and the event came from a +>>#NOTEm .S SendEvent +>>#NOTEm protocol request, +>>#NOTEm then +>>#NOTEm .M send_event +>>#NOTEm is set to +>>#NOTEm .S True . +>>#NOTEs >>ASSERTION +>>#NOTEs When ARTICLE xname event is delivered +>>#NOTEs and the event was not generated by a +>>#NOTEs .S SendEvent +>>#NOTEs protocol request, +>>#NOTEs then +>>#NOTEs .M send_event +>>#NOTEs is set to +>>#NOTEs .S False . +>>#NOTEs >>ASSERTION +>>#NOTEs When ARTICLE xname event is delivered, +>>#NOTEs then +>>#NOTEs .M display +>>#NOTEs is set to +>>#NOTEs a pointer to the display on which the event was read. +>>#NOTEs >>ASSERTION +>>#NOTEs >>#NOTE Global except for MappingNotify and KeymapNotify. +>>#NOTEs When ARTICLE xname event is delivered, +>>#NOTEs then +>>#NOTEs .M window +>>#NOTEs is set to +>>#NOTEs the +>>#NOTEs ifdef(`WINDOWTYPE', WINDOWTYPE, event) +>>#NOTEs window. +>>#NOTEs >>ASSERTION +>>#NOTEs When ARTICLE xname event is generated while the pointer is not grabbed, +>>#NOTEs then +>>#NOTEs .A mode +>>#NOTEs is set to +>>#NOTEs .S NotifyNormal . +>>#NOTEs >>ASSERTION +>>#NOTEs When ARTICLE xname event is generated while the pointer is grabbed, +>>#NOTEs then +>>#NOTEs .A mode +>>#NOTEs is set to +>>#NOTEs .S NotifyWhileGrabbed . +>>#NOTEm >>ASSERTION +>>#NOTEm When ARTICLE xname event is generated +>>#NOTEm and a keyboard grab activates, +>>#NOTEm then xname events are generated as if the focus were to change from +>>#NOTEm the old focus to the grab window with +>>#NOTEm .A mode +>>#NOTEm is set to +>>#NOTEm .S NotifyGrab . +>>#NOTEm >>ASSERTION +>>#NOTEm When ARTICLE xname event is generated +>>#NOTEm and a keyboard grab deactivates, +>>#NOTEm then xname events are generated as if the focus were to change from +>>#NOTEm the grab window to the new focus with +>>#NOTEm .A mode +>>#NOTEm is set to +>>#NOTEm .S NotifyUngrab . +>>ASSERTION def +>>#NOTE Tested for in most assertions. +All xname events are delivered after +any related +.S FocusOut +are delivered. +>>ASSERTION Good A +>>#NOTE Am getting a detail of NotifyAncestor instead of NotifyInferior +>>#NOTE (i.e. the test fails). +When the input focus moves from window A to window B +and window A is an inferior of window B +and the pointer is in window P, +then a xname event is generated on window B, +with +.M detail +set to +.S NotifyInferior . +>>STRATEGY +Create client. +Build window hierarchy. +Move pointer to known location. +Set window B. +Set window A to inferior of window B. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to window B with detail set to NotifyInferior. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 3; +Winh *A, *B; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window B. */ + B = guardian->firstchild; +/* Set window A to inferior of window B. */ + A = B->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(A, B, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, B, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event(A, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to window B with detail set to NotifyInferior. */ + _detail_ = NotifyInferior; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(9); +>>ASSERTION Good A +When the input focus moves from window A to window B +and window A is an inferior of window B +and the pointer is in window P +and window P is an inferior of window B +and window P is not the same window as window A +and window P is not an inferior of window A +and window P is not an ancestor of window A, +then, after a xname event is generated on window B +with +.M detail +set to +.S NotifyInferior , +a xname event is generated on each window +below window B, +down to and including window P, +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Create client. +Build window hierarchy. +Move pointer to known location. +Set window B. +Set window A to inferior of window B. +Set window P to inferior of sibling of window A. +Move pointer to window P. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to window B with detail set to NotifyInferior. +Verify that event delivered below window B, down to and including +window P, with detail set to NotifyPointer. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *B, *P, *Pancestor; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window B. */ + B = guardian->firstchild; +/* Set window A to inferior of window B. */ + A = B->firstchild; +/* Set window P to inferior of sibling of window A. */ + Pancestor = B->firstchild->nextsibling; + P = Pancestor->firstchild->firstchild; +/* Move pointer to window P. */ + XWarpPointer(display, None, P->window, 0, 0, 0, 0, 0, 0); +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(P, Pancestor, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, B, selectinput)) { + report("Could not select for events between A and B"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(P, B, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to window B with detail set to NotifyInferior. */ + _detail_ = NotifyInferior; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered below window B, down to and including */ +/* window P, with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, Pancestor, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(P, B, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(12); +>>ASSERTION Good A +When the input focus moves from window A to window B +and window B is an inferior of window A +and the pointer is in window P, +then a xname event is generated on each window +between window A and window B, +exclusive, +with +.M detail +set to +.S NotifyVirtual +and then on window B +with +.M detail +set to +.S NotifyAncestor . +>>STRATEGY +Create client. +Build window hierarchy. +Move pointer to known location. +Set window A. +Set window B to inferior of window A. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to windows between window A and window B, exclusive, +with detail set to NotifyVirtual. +Verify that event delivered to window B with detail set to NotifyAncestor. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *B; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window B to inferior of window A. */ + B = A->firstchild->firstchild->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _display_ = display; +#if 0 + _event_mask_ = MASK; + if (winh_climb(B, A->firstchild, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; +#endif + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, A->firstchild, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to windows between window A and window B, exclusive, */ +/* with detail set to NotifyVirtual. */ + _detail_ = NotifyVirtual; + if (winh_climb(B->parent, A->firstchild, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered to window B with detail set to NotifyAncestor. */ + _detail_ = NotifyAncestor; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(B, A->firstchild, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(11); +>>ASSERTION Good A +When the input focus moves from window A to window B +and window C is their least common ancestor +and the pointer is in window P, +then a xname event is generated on +each window between C and B, exclusive, +with +.M detail +set to +.S NotifyNonlinearVirtual +and then on window B +with +.M detail +set to +.S NotifyNonlinear . +>>STRATEGY +Create client. +Build window hierarchy. +Move pointer to known location. +Set window C. +Set window B to inferior of window C. +Set window A to inferior of window C. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to windows between window C and window B, exclusive, +with detail set to NotifyNonlinearVirtual. +Verify that event delivered to window B with detail set to NotifyNonlinear. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *B, *C; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window C. */ + C = guardian->firstchild; +/* Set window B to inferior of window C. */ + B = C->firstchild->firstchild->firstchild; +/* Set window A to inferior of window C. */ + A = C->firstchild->nextsibling->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(B, C->firstchild, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, C, selectinput)) { + report("Could not select for events between A and C"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, C->firstchild, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to windows between window C and window B, exclusive, */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(B->parent, C->firstchild, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered to window B with detail set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(B, C->firstchild, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(12); +>>ASSERTION Good A +When the input focus moves from window A to window B +and window C is their least common ancestor +and the pointer is in window P +and window P is an inferior of window B, +then, after the related xname events are generated +with +.M detail +set to +.S NotifyNonlinearVirtual +and +.S NotifyNonlinear , +a xname event is generated on +each window below window B down to and including window P, +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Create client. +Build window hierarchy. +Move pointer to known location. +Set window C. +Set window B to inferior of window C. +Set window P to inferior of window B. +Set window A to inferior of window C. +Move pointer to window P. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to windows between window C and window B, exclusive, +with detail set to NotifyNonlinearVirtual. +Verify that event delivered to window B with detail set to NotifyNonlinear. +Verify that events were delivered to windows below window B down to and +including window P, exclusive, +with detail set to NotifyPointer. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 5; +Winh *A, *B, *C, *P; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window C. */ + C = guardian->firstchild; +/* Set window B to inferior of window C. */ + B = C->firstchild->firstchild; +/* Set window P to inferior of window B. */ + P = B->firstchild->firstchild; +/* Set window A to inferior of window C. */ + A = C->firstchild->nextsibling->firstchild; +/* Move pointer to window P. */ + XWarpPointer(display, None, P->window, 0, 0, 0, 0, 0, 0); +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(B, C->firstchild, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, C, selectinput)) { + report("Could not select for events between A and C"); + return; + } + else + CHECK; + if (winh_climb(P, B, selectinput)) { + report("Could not select for events between P and B"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, C->firstchild, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; + if (winh_climb(P, B->firstchild, plant)) { + report("Could not plant events below B"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to windows between window C and window B, exclusive, */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(B->parent, C->firstchild, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered to window B with detail set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify that events were delivered to windows below window B down to and */ +/* including window P, exclusive, */ +/* with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, B->firstchild, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(B, C->firstchild, checksequence)) + FAIL; + else + CHECK; + increasing = True; + if (winh_climb(P, B->firstchild, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(16); +>>ASSERTION Good C +If the implementation supports multiple screens: +When the input focus moves from window A to window B +and window A and window B are not on the same screens +and the pointer is in window P +and window B is not a root window, +then a xname event is generated on +each window from window B's root down to but not including window B, +with +.M detail +set to +.S NotifyNonlinearVirtual . +>>STRATEGY +Check to see if multiple screens are supported. +Create client. +Build window hierarchy on all supported screens. +Move pointer to known location. +Set window A. +Set window B to an inferior of the root window on a different screen than A. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to each window from window B's root down +to but not including window B +with detail set to NotifyNonlinearVirtual. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *B, *Broot; +int status; + +/* Check to see if multiple screens are supported. */ + if (config.alt_screen == -1) { + unsupported("Multiple screens not supported."); + return; + } + else + CHECK; +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window B to an inferior of the root window on a different screen than A. */ + Broot = guardian->nextsibling; + B = Broot->firstchild->firstchild->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(B->parent, Broot, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, A, selectinput)) { + report("Could not select for events on window A"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B->parent, Broot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to each window from window B's root down */ +/* to but not including window B */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(B->parent, Broot, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(B->parent, Broot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(12); +>>ASSERTION Good C +If the implementation supports multiple screens: +When the input focus moves from window A to window B +and window A and window B are not on the same screens +and the pointer is in window P, +then, +after any related xname events are generated with +.M detail +set to +.S NotifyNonlinearVirtual , +a xname event is generated on window B +with +.M detail +set to +.S NotifyNonlinear . +>>STRATEGY +Check to see if multiple screens are supported. +Create client. +Build window hierarchy on all supported screens. +Move pointer to known location. +Set window A. +Set window B to an inferior of the root window on a different screen than A. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to each window from window B's root down +to but not including window B +with detail set to NotifyNonlinearVirtual. +Verify that event delivered on window B with detail +set to NotifyNonlinear. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *B, *Broot; +int status; + +/* Check to see if multiple screens are supported. */ + if (config.alt_screen == -1) { + unsupported("Multiple screens not supported."); + return; + } + else + CHECK; +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window B to an inferior of the root window on a different screen than A. */ + Broot = guardian->nextsibling; + B = Broot->firstchild->firstchild->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(B, Broot, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, A, selectinput)) { + report("Could not select for events on window A"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, Broot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to each window from window B's root down */ +/* to but not including window B */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(B->parent, Broot, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered on window B with detail */ +/* set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(B, Broot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(13); +>>ASSERTION Good C +If the implementation supports multiple screens: +When the input focus moves from window A to window B +and window A and window B are not on the same screens +and the pointer is in window P +and window P is an inferior of window B, +then a xname event is generated on window B +with +.M detail +set to +.S NotifyNonlinear . +>>STRATEGY +Check to see if multiple screens are supported. +Create client. +Build window hierarchy on all supported screens. +Move pointer to known location. +Set window A. +Set window B. +Set P to inferior of window B. +Set input focus to window A. +Move pointer to window P. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered on window B with detail +set to NotifyNonlinear. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 2; +Winh *A, *B, *P; +int status; + +/* Check to see if multiple screens are supported. */ + if (config.alt_screen == -1) { + unsupported("Multiple screens not supported."); + return; + } + else + CHECK; +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window B. */ + B = guardian->nextsibling->firstchild; +/* Set P to inferior of window B. */ + P = guardian->nextsibling->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Move pointer to window P. */ + XWarpPointer(display, None, P->window, 0, 0, 0, 0, 0, 0); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(B, B, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, A, selectinput)) { + report("Could not select for events on window A"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(B, B, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered on window B with detail */ +/* set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(11); +>>ASSERTION Good C +If the implementation supports multiple screens: +When the input focus moves from window A to window B +and window A and window B are not on the same screens +and the pointer is in window P +and window P is an inferior of window B, +then, after the related xname events are generated +with +.M detail +set to +.S NotifyNonlinearVirtual +and +.S NotifyNonlinear , +a xname event is generated on +each window below window B down to and including window P +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Check to see if multiple screens are supported. +Create client. +Build window hierarchy on all supported screens. +Move pointer to known location. +Set window A. +Set window B to an inferior of the root window on a different screen than A. +Set window P to an inferior of B. +Set input focus to window A. +Move pointer to window P. +Select for Focus events on windows. +Generate xname event by changing focus from A to B. +Verify that the expected events were delivered. +Verify that event delivered to each window from window B's root down +to but not including window B +with detail set to NotifyNonlinearVirtual. +Verify that event delivered on window B with detail +set to NotifyNonlinear. +Verify that event delivered to each window from window B down +to and including window P +with detail set to NotifyPointer. +Verify order of xname event delivery. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 5; +Winh *A, *B, *Broot, *P; +int status; + +/* Check to see if multiple screens are supported. */ + if (config.alt_screen == -1) { + unsupported("Multiple screens not supported."); + return; + } + else + CHECK; +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window B to an inferior of the root window on a different screen than A. */ + Broot = guardian->nextsibling; + B = Broot->firstchild->firstchild; +/* Set window P to an inferior of B. */ + P = B->firstchild->firstchild; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Move pointer to window P. */ + XWarpPointer(display, None, P->window, 0, 0, 0, 0, 0, 0); +/* Select for Focus events on windows. */ + _event_mask_ = MASK; + _display_ = display; + if (winh_climb(P, Broot, selectinput)) { + report("Could not select for events"); + return; + } + else + CHECK; + if (winh_climb(A, A, selectinput)) { + report("Could not select for events on window A"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(P, Broot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to B. */ + XSync(display, True); + XSetInputFocus(display, B->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to each window from window B's root down */ +/* to but not including window B */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(B->parent, Broot, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered on window B with detail */ +/* set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(B, B, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered to each window from window B down */ +/* to and including window P */ +/* with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, B->firstchild, checkdetail)) + FAIL; + else + CHECK; +/* Verify order of xname event delivery. */ + increasing = True; + if (winh_climb(P, Broot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(14); +>>ASSERTION def +>>#NOTE Tested for in next test. +When the focus moves from window A to +.S PointerRoot +(events sent to the window under the pointer) +and the pointer is in window P, +then a xname event is generated on +the root window of all screens, +with +.M detail +set to +.S NotifyPointerRoot . +>>ASSERTION Good A +When the focus moves from window A to +.S PointerRoot +(events sent to the window under the pointer) +and the pointer is in window P, +then, after the related xname events are generated +with +.M detail +set to +.S NotifyPointerRoot , +a xname event is generated on +each window from window P's root down to and including window P, +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Create client. +Build window hierarchy on all supported screens. +Set window A. +Set window P. +Move pointer to window P. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to PointerRoot. +Verify that the expected events were delivered. +Verify that event delivered to the root window of all screens +with detail set to NotifyPointerRoot. +Verify that event generated on each window from window P's root down +to and including window P with detail set to NotifyPointer. +Verify that these events occurred in the correct order. +Verify that the NotifyPointerRoot events were delivered before +NotifyPointer events. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *A, *P, *Proot, *ptr; +Winhe *winhe; +int status; +int high; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; +/* Set window P. */ + Proot = guardian; + P = Proot->firstchild->firstchild; +/* Move pointer to window P. */ + if (warppointer(display, P->window, 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* root window of all screens */ + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + good.xany.window = ptr->window; + if (winh_plant(ptr, &good, MASK, WINH_NOMASK)) { + report("Could not plant events"); + return; + } + } + /* from P's root to P */ + if (winh_climb(P, Proot, plant)) { + report("Could not plant events between P's root and P"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from A to PointerRoot. */ + XSync(display, True); + XSetInputFocus(display, PointerRoot, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to the root window of all screens */ +/* with detail set to NotifyPointerRoot. */ + _detail_ = NotifyPointerRoot; + /* used to keep track of last NotifyPointerRoot event */ + high = 0; + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + /* + * skip to first FocusIn-type event + */ + for (winhe = ptr->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list", + eventname(EVENT)); + return; + } + if (winhe->sequence > high) + high = winhe->sequence; + if (winhe->event->xfocus.detail != _detail_) { + report("Got detail %d, expected %d on window 0x%x", + winhe->event->xfocus.detail, + _detail_, ptr->window); + FAIL; + } + else { + /* + * cause this event to be ignored during + * later checks for FocusIn events + */ + winhe->event->type = 0; + } + } +/* Verify that event generated on each window from window P's root down */ +/* to and including window P with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, Proot, checkdetail)) + FAIL; + else + CHECK; +/* Verify that these events occurred in the correct order. */ + increasing = True; + if (winh_climb(P, Proot, checksequence)) + FAIL; + else + CHECK; +/* Verify that the NotifyPointerRoot events were delivered before */ +/* NotifyPointer events. */ + for (winhe = Proot->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe == Proot->delivered) + CHECK; + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list of Proot", + eventname(EVENT)); + return; + } + else + CHECK; + if (high > winhe->sequence) { + report("NotifyPointerRoot events not delivered before all NotifyPointer events"); + FAIL; + } + else + CHECK; + +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) { + int in, out; + + in = winh_eventindex(EVENT); + out = winh_eventindex(OTHEREVENT); + report("%s: %d, %s: %d", + eventname(EVENT), winh_event_stats[in].low, + eventname(OTHEREVENT), winh_event_stats[out].high + ); + FAIL; + } + else + CHECK; + } + CHECKPASS(15); +>>ASSERTION Good A +When the focus moves from window A to +.S None +(discard) +and the pointer is in window P, +then a xname event is generated on +the root window of all screens, +with +.M detail +set to +.S NotifyDetailNone . +>>STRATEGY +Create client. +Build window hierarchy on all supported screens. +Set window A. +Set input focus to window A. +Select for Focus events on windows. +Generate xname event by changing focus from A to None. +Verify that the expected events were delivered. +Verify that event delivered to the root window of all screens +with detail set to NotifyDetailNone. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 1; +Winh *A, *ptr; +Winhe *winhe; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window A. */ + A = guardian->firstchild; + /* Don't bother moving the pointer to known location. */ +/* Set input focus to window A. */ + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* root window of all screens */ + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + good.xany.window = ptr->window; + if (winh_plant(ptr, &good, MASK, WINH_NOMASK)) { + report("Could not plant events"); + return; + } + } +/* Generate xname event by changing focus from A to None. */ + XSync(display, True); + XSetInputFocus(display, None, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to the root window of all screens */ +/* with detail set to NotifyDetailNone. */ + _detail_ = NotifyDetailNone; + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + /* + * skip to first FocusIn-type event + */ + for (winhe = ptr->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list", + eventname(EVENT)); + return; + } + if (winhe->event->xfocus.detail != _detail_) { + report("Got detail %d, expected %d on window 0x%x", + winhe->event->xfocus.detail, + _detail_, ptr->window); + FAIL; + } + } +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(8); +>>ASSERTION Good A +>>#NOTE One could argue that this is tested sufficiently in the next assertion. +When the focus moves from +.S PointerRoot +(events sent to the window under the pointer) +or +.S None +(discard) +to window A +and the pointer is in window P +and window A is not a root window, +then a xname event is generated on +each window from window A's root down to but not including window A, +with +.M detail +set to +.S NotifyNonlinearVirtual . +>>STRATEGY +Create client. +Build window hierarchy. +Set window A. +Move pointer to known location. +Set input focus to PointerRoot. +Select for Focus events on windows. +Generate xname event by changing focus from PointerRoot to A. +Verify that the expected events were delivered. +Verify that event delivered on each window from window A's root down to +but not including window A +with detail set to NotifyNonlinearVirtual. +Verify that these events occurred in the correct order. +Verify that all xname events are delivered after all +FocusOut events. +Repeat with focus initially set to None. +>>CODE +Display *display; +int depth = 4; +Winh *A, *Aroot; +int status; +int i; +static Window focuses[] = { + (Window) PointerRoot, + (Window) None +}; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window A. */ + Aroot = guardian; + A = Aroot->firstchild->firstchild->firstchild; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; + for (i = 0; i < NELEM(focuses); i++) { +/* Set input focus to PointerRoot. */ + XSetInputFocus(display, focuses[i], RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* + * Plant at A instead of A->parent because we will also be getting + * an xname event on A with detail set to NotifyNonlinear. + */ + if (winh_climb(A, Aroot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from PointerRoot to A. */ + XSync(display, True); + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered on each window from window A's root down to */ +/* but not including window A */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(A->parent, Aroot, checkdetail)) + FAIL; + else + CHECK; +/* Verify that these events occurred in the correct order. */ + increasing = True; + if (winh_climb(A->parent, Aroot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } +/* Repeat with focus initially set to None. */ + } + CHECKPASS(3 + (7*NELEM(focuses))); +>>ASSERTION Good A +>>#NOTE One could argue that this is tested sufficiently in the next assertion. +>>#NOTE +>>#NOTE The approved (and incorrect) form of this assertion used to +>>#NOTE contain the following phrase: +>>#NOTE +>>#NOTE then a xname event is generated on +>>#NOTE +>>#NOTE Additional text was inserted after the "then" to reflect +>>#NOTE ordering with respect to NotifyNonlinearVirtual FocusIn events. +When the focus moves from +.S PointerRoot +(events sent to the window under the pointer) +or +.S None +(discard) +to window A +and the pointer is in window P, +then, after any related xname events are generated +with +.M detail +set to +.S NotifyNonlinearVirtual , +a xname event is generated +on window A +with +.M detail +set to +.S NotifyNonlinear . +>>STRATEGY +Create client. +Build window hierarchy. +Set window A. +Move pointer to known location. +Set input focus to PointerRoot. +Select for Focus events on windows. +Generate xname event by changing focus from PointerRoot to A. +Verify that the expected events were delivered. +Verify that event delivered on each window from window A's root down to +but not including window A +with detail set to NotifyNonlinearVirtual. +Verify that event delivered on to window A +with detail set to NotifyNonlinear. +Verify that these events occurred in the correct order. +Verify that all xname events are delivered after all +FocusOut events. +Repeat with focus initially set to None. +>>CODE +Display *display; +int depth = 4; +Winh *A, *Aroot; +int status; +int i; +static Window focuses[] = { + (Window) PointerRoot, + (Window) None +}; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window A. */ + Aroot = guardian; + A = Aroot->firstchild->firstchild->firstchild; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; + for (i = 0; i < NELEM(focuses); i++) { +/* Set input focus to PointerRoot. */ + XSetInputFocus(display, focuses[i], RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(A, Aroot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from PointerRoot to A. */ + XSync(display, True); + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered on each window from window A's root down to */ +/* but not including window A */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(A->parent, Aroot, checkdetail)) + FAIL; + else + CHECK; +/* Verify that event delivered on to window A */ +/* with detail set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(A, A, checkdetail)) + FAIL; + else + CHECK; +/* Verify that these events occurred in the correct order. */ + increasing = True; + if (winh_climb(A, Aroot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } +/* Repeat with focus initially set to None. */ + } + CHECKPASS(3 + (8*NELEM(focuses))); +>>ASSERTION Good A +When the focus moves from +.S PointerRoot +(events sent to the window under the pointer) +or +.S None +(discard) +to window A +and the pointer is in window P +and window P is an inferior of window A, +then, after the related xname events are generated +with +.M detail +set to +.S NotifyNonlinearVirtual +and +.S NotifyNonlinear , +a xname event is generated on +each window below window A down to and including window P, +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Create client. +Build window hierarchy. +Set window A. +Set window P. +Move pointer to window P. +Set input focus to PointerRoot. +Select for Focus events on windows. +Generate xname event by changing focus from PointerRoot to A. +Verify that the expected events were delivered. +Verify that event delivered on each window from window A's root down to +but not including window A +with detail set to NotifyNonlinearVirtual. +Verify that event delivered on to window A +with detail set to NotifyNonlinear. +Verify that event delivered on each window below window A down to +and including window P +with detail set to NotifyPointer. +Verify that these events occurred in the correct order. +Verify that all xname events are delivered after all +FocusOut events. +Repeat with focus initially set to None. +>>CODE +Display *display; +int depth = 5; +Winh *A, *Aroot, *P; +int status; +int i; +static Window focuses[] = { + (Window) PointerRoot, + (Window) None +}; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy. */ + if (winh(display, depth, WINH_MAP)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window A. */ + Aroot = guardian; + A = Aroot->firstchild->firstchild; +/* Set window P. */ + P = A->firstchild->firstchild; +/* Move pointer to window P. */ + if (warppointer(display, P->window, 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; + for (i = 0; i < NELEM(focuses); i++) { +/* Set input focus to PointerRoot. */ + XSetInputFocus(display, focuses[i], RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + if (winh_climb(P, Aroot, plant)) { + report("Could not plant events"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from PointerRoot to A. */ + XSync(display, True); + XSetInputFocus(display, A->window, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered on each window from window A's root down to */ +/* but not including window A */ +/* with detail set to NotifyNonlinearVirtual. */ + _detail_ = NotifyNonlinearVirtual; + if (winh_climb(A->parent, Aroot, checkdetail)) { + report("Bad detail on some window above A's parent"); + FAIL; + } + else + CHECK; +/* Verify that event delivered on to window A */ +/* with detail set to NotifyNonlinear. */ + _detail_ = NotifyNonlinear; + if (winh_climb(A, A, checkdetail)) { + report("Bad detail on window A"); + FAIL; + } + else + CHECK; +/* Verify that event delivered on each window below window A down to */ +/* and including window P */ +/* with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, A->firstchild, checkdetail)) { + report("Bad detail on some window below window A down to window P"); + FAIL; + } + else + CHECK; +/* Verify that these events occurred in the correct order. */ + increasing = True; + if (winh_climb(P, Aroot, checksequence)) + FAIL; + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } +/* Repeat with focus initially set to None. */ + } + CHECKPASS(3 + (9*NELEM(focuses))); +>>ASSERTION Good A +>>#NOTE +>>#NOTE The approved wording for this assertion specified that detail +>>#NOTE should be set to NotifyPointerRoot. This was incorrect and the +>>#NOTE wording has been changed to specify that detail should be set to +>>#NOTE NotifyDetailNone. +>>#NOTE +When the focus moves from +.S PointerRoot +(events sent to the window under the pointer) +to +.S None +(discard) +and the pointer is in window P, +then a xname event is generated on +the root window of all screens, +with +.M detail +set to +.S NotifyDetailNone . +>>STRATEGY +Create client. +Build window hierarchy on all supported screens. +Move pointer to known location. +Set input focus to PointerRoot. +Select for Focus events on windows. +Generate xname event by changing focus from PointerRoot to None. +Verify that the expected events were delivered. +Verify that event delivered to the root window of all screens +with detail set to NotifyDetailNone. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 2; +Winh *ptr; +Winhe *winhe; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Move pointer to known location. */ + if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set input focus to PointerRoot. */ + XSetInputFocus(display, PointerRoot, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* root window of all screens */ + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + good.xany.window = ptr->window; + if (winh_plant(ptr, &good, MASK, WINH_NOMASK)) { + report("Could not plant events"); + return; + } + } +/* Generate xname event by changing focus from PointerRoot to None. */ + XSync(display, True); + XSetInputFocus(display, None, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to the root window of all screens */ +/* with detail set to NotifyDetailNone. */ + _detail_ = NotifyDetailNone; + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + /* + * skip to first FocusIn-type event + */ + for (winhe = ptr->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list", + eventname(EVENT)); + return; + } + if (winhe->event->xfocus.detail != _detail_) { + report("Got detail %d, expected %d on window 0x%x", + winhe->event->xfocus.detail, + _detail_, ptr->window); + FAIL; + } + else { + /* + * cause this event to be ignored during + * later checks for FocusIn events + */ + winhe->event->type = 0; + } + } +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(9); +>>ASSERTION Good A +>>#NOTE +>>#NOTE The approved wording for this assertion specified that detail +>>#NOTE should be set to NotifyDetailNone. This was incorrect and the +>>#NOTE wording has been changed to specify that detail should be set to +>>#NOTE NotifyPointerRoot. +>>#NOTE +When the focus moves from +None to PointerRoot +and the pointer is in window P, +then a xname event is generated on +the root window of all screens, +with +.M detail +set to +.S NotifyPointerRoot . +>>STRATEGY +Create client. +Build window hierarchy on all supported screens. +Set window P. +Move pointer to known location. +Set input focus to None. +Select for Focus events on windows. +Generate xname event by changing focus from None to PointerRoot. +Verify that the expected events were delivered. +Verify that event delivered to the root window of all screens +with detail set to NotifyPointerRoot. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 2; +Winh *P, *ptr; +Winhe *winhe; +int status; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window P. */ + P = guardian; +/* Move pointer to known location. */ + if (warppointer(display, P->window, 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set input focus to None. */ + XSetInputFocus(display, None, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* root window of all screens */ + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + good.xany.window = ptr->window; + if (winh_plant(ptr, &good, MASK, WINH_NOMASK)) { + report("Could not plant events"); + return; + } + } + /* also expect a subsequent event on P */ + good.xany.window = P->window; + if (winh_plant(P, &good, MASK, WINH_NOMASK)) { + report("Could not plant events on P"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from None to PointerRoot. */ + XSync(display, True); + XSetInputFocus(display, PointerRoot, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to the root window of all screens */ +/* with detail set to NotifyPointerRoot. */ + _detail_ = NotifyPointerRoot; + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + /* + * skip to first FocusIn-type event + */ + for (winhe = ptr->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list", + eventname(EVENT)); + return; + } + if (winhe->event->xfocus.detail != _detail_) { + report("Got detail %d, expected %d on window 0x%x", + winhe->event->xfocus.detail, + _detail_, ptr->window); + FAIL; + } + else { + /* + * cause this event to be ignored during + * later checks for FocusIn events + */ + winhe->event->type = 0; + } + } +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(10); +>>ASSERTION Good A +>>#NOTE +>>#NOTE The wording of this assertion was changed from that which was +>>#NOTE approved to eliminate extraneous wording: +>>#NOTE +>>#NOTE .S PointerRoot +>>#NOTE (events sent to the window under the pointer) +>>#NOTE to +>>#NOTE .S None +>>#NOTE (discard) +>>#NOTE +>>#NOTE .S NotifyDetailNone +>>#NOTE and +>>#NOTE +When the focus moves from +None to PointerRoot +and the pointer is in window P, +then, after the related xname events are generated +with +.M detail +set to +.S NotifyPointerRoot , +a xname event is generated on +each window from window P's root down to and including window P, +with +.M detail +set to +.S NotifyPointer . +>>STRATEGY +Create client. +Build window hierarchy on all supported screens. +Set window P. +Move pointer to known location. +Set input focus to None. +Select for Focus events on windows. +Generate xname event by changing focus from None to PointerRoot. +Verify that the expected events were delivered. +Verify that event delivered to the root window of all screens +with detail set to NotifyPointerRoot. +Verify that event delivered on each window from window P's root down to +and including window P +with detail set to NotifyPointer. +Verify that the NotifyPointerRoot events were delivered before +NotifyPointer events. +Verify that all xname events are delivered after all +FocusOut events. +>>CODE +Display *display; +int depth = 4; +Winh *P, *Proot, *ptr; +Winhe *winhe; +int status; +int high; + +/* Create client. */ + if ((display = opendisplay()) == (Display *) NULL) { + delete("Couldn't create client."); + return; + } + else + CHECK; +/* Build window hierarchy on all supported screens. */ + if (winh(display, depth, WINH_MAP|WINH_BOTH_SCREENS)) { + report("Could not build window hierarchy"); + return; + } + else + CHECK; +/* Set window P. */ + Proot = guardian; + P = Proot->firstchild->firstchild->firstchild; +/* Move pointer to known location. */ + if (warppointer(display, P->window, 0, 0) == (PointerPlace *) NULL) + return; + else + CHECK; +/* Set input focus to None. */ + XSetInputFocus(display, None, RevertToNone, CurrentTime); +/* Select for Focus events on windows. */ + if (winh_selectinput(display, (Winh *) NULL, MASK)) { + report("Could not select for events"); + return; + } + else + CHECK; + good.type = EVENT; + good.xany.display = display; + /* root window of all screens */ + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + good.xany.window = ptr->window; + if (winh_plant(ptr, &good, MASK, WINH_NOMASK)) { + report("Could not plant events"); + return; + } + } + if (winh_climb(P, Proot, plant)) { + report("Could not plant events from P's root to P"); + return; + } + else + CHECK; +/* Generate xname event by changing focus from None to PointerRoot. */ + XSync(display, True); + XSetInputFocus(display, PointerRoot, RevertToNone, CurrentTime); + XSync(display, False); + if (winh_harvest(display, (Winh *) NULL)) { + report("Could not harvest events"); + return; + } + else + CHECK; +/* Verify that the expected events were delivered. */ + if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK)) { + delete("Could not ignore %s events", eventname(OTHEREVENT)); + return; + } + else + CHECK; + status = winh_weed((Winh *) NULL, -1, WINH_WEED_IDENTITY); + if (status < 0) + return; + else if (status > 0) { + report("Event delivery was not as expected"); + FAIL; + } + else { +/* Verify that event delivered to the root window of all screens */ +/* with detail set to NotifyPointerRoot. */ + _detail_ = NotifyPointerRoot; + high = 0; + for (ptr = guardian; ptr != (Winh *) NULL; ptr = ptr->nextsibling) { + if (ptr == guardian) + CHECK; + /* + * skip to first FocusIn-type event + */ + for (winhe = ptr->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list", + eventname(EVENT)); + return; + } + if (winhe->sequence > high) + high = winhe->sequence; + if (winhe->event->xfocus.detail != _detail_) { + report("Got detail %d, expected %d on window 0x%x", + winhe->event->xfocus.detail, + _detail_, ptr->window); + FAIL; + } + else { + /* + * cause this event to be ignored during + * later checks for FocusIn events + */ + winhe->event->type = 0; + } + } +/* Verify that event delivered on each window from window P's root down to */ +/* and including window P */ +/* with detail set to NotifyPointer. */ + _detail_ = NotifyPointer; + if (winh_climb(P, Proot, checkdetail)) { + report("Bad detail on some window between windows P's root and P"); + FAIL; + } + else + CHECK; +/* Verify that the NotifyPointerRoot events were delivered before */ +/* NotifyPointer events. */ + for (winhe = Proot->delivered; winhe != (Winhe *) NULL; winhe = winhe->next) { + if (winhe == Proot->delivered) + CHECK; + if (winhe->event->type == EVENT) + break; + } + if (winhe == (Winhe *) NULL) { + delete("Lost %s event in delivered list of Proot", + eventname(EVENT)); + return; + } + else + CHECK; + if (high > winhe->sequence) { + report("NotifyPointerRoot events not delivered before all NotifyPointer events"); + FAIL; + } + else + CHECK; +/* Verify that all xname events are delivered after all */ +/* FocusOut events. */ + status = winh_ordercheck(OTHEREVENT, EVENT); + if (status == -1) + return; + else if (status) + FAIL; + else + CHECK; + } + CHECKPASS(14); |