summaryrefslogtreecommitdiff
path: root/xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m
diff options
context:
space:
mode:
Diffstat (limited to 'xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m')
-rw-r--r--xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m1493
1 files changed, 1493 insertions, 0 deletions
diff --git a/xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m b/xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m
new file mode 100644
index 000000000..9cb099013
--- /dev/null
+++ b/xc/test/xsuite/xtest/tset/CH08/entrntfy/entrntfy.m
@@ -0,0 +1,1493 @@
+/*
+ * Copyright 1990, 1991 by the Massachusetts Institute of Technology and
+ * 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 MIT and UniSoft not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. MIT and UniSoft
+ * make no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * $XConsortium$
+ */
+>>TITLE EnterNotify CH08
+>>EXTERN
+#define EVENT EnterNotify
+#define OTHEREVENT LeaveNotify
+#define MASK EnterWindowMask
+#define OTHERMASK LeaveWindowMask
+#define BOTHMASKS (MASK|OTHERMASK)
+#define EVENTMASK MASK
+#define OTHEREVENTMASK LeaveWindowMask
+
+static int _detail_;
+static XEvent good;
+
+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->xcrossing.detail) {
+ report("Expected detail of %d, got %d on window 0x%x",
+ _detail_, d->event->xcrossing.detail, current->window);
+ return(1);
+ }
+ return(0);
+}
+>>ASSERTION Good A
+>>#NOTE
+>>#NOTE Hierarchy events are:
+>>#NOTE UnmapNotify,
+>>#NOTE MapNotify,
+>>#NOTE ConfigureNotify,
+>>#NOTE GravityNotify, and
+>>#NOTE CirculateNotify.
+>>#NOTE
+When an xname event is generated by a hierarchy change,
+then the xname event is delivered after any hierarchy event.
+>>STRATEGY
+Create client2.
+Create window1.
+Create window2 on top of window1.
+Select for xname events on window1.
+Select for xname events on window1 with client2.
+Select for UnmapNotify events on window2.
+Move pointer to window2.
+Call XUnmapWindow on window2.
+Verify that UnmapNotify event was received on window2.
+Verify that xname event was received on window1.
+Verify that xname event was received on window1 by client2.
+Verify that pointer has remained where it was moved.
+>>CODE
+int i;
+Display *display = Dsp;
+Display *client2;
+Window w1, w2;
+XEvent event;
+struct area area;
+PointerPlace *warp;
+
+/* Create client2. */
+ if ((client2 = opendisplay()) == (Display *) NULL) {
+ delete("Couldn't create client2.");
+ return;
+ }
+ else
+ CHECK;
+/* Create window1. */
+ area.x = 0;
+ area.y = 0;
+ area.width = W_STDWIDTH;
+ area.height = W_STDHEIGHT;
+ w1 = mkwin(display, (XVisualInfo *) NULL, &area, True);
+/* Create window2 on top of window1. */
+ w2 = mkwin(display, (XVisualInfo *) NULL, &area, True);
+/* Select for xname events on window1. */
+ XSelectInput(display, w1, MASK);
+/* Select for xname events on window1 with client2. */
+ XSelectInput(client2, w1, MASK);
+/* Select for UnmapNotify events on window2. */
+ XSelectInput(display, w2, StructureNotifyMask);
+/* Move pointer to window2. */
+ warp = warppointer(display, w2, 0, 0);
+ if (warp == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+ XSync(display, True);
+ XSync(client2, True);
+/* Call XUnmapWindow on window2. */
+ XUnmapWindow(display, w2);
+ XSync(display, False);
+ XSync(client2, False);
+/* Verify that UnmapNotify event was received on window2. */
+ if (XPending(display) < 1) {
+ report("Expected UnmapNotify event not delivered.");
+ FAIL;
+ return;
+ }
+ else
+ CHECK;
+ XNextEvent(display, &event);
+ if (event.type != UnmapNotify) {
+ report("Expected %s, got %s", eventname(UnmapNotify), eventname(event.type));
+ FAIL;
+ }
+ else
+ CHECK;
+/* Verify that xname event was received on window1. */
+ if (XPending(display) < 1) {
+ report("Expected %s event not delivered.", TestName);
+ FAIL;
+ return;
+ }
+ else
+ CHECK;
+ XNextEvent(display, &event);
+ if (event.type != EVENT) {
+ report("Expected %s, got %s", eventname(EVENT), eventname(event.type));
+ FAIL;
+ }
+ else
+ CHECK;
+ if ((i = XPending(display)) > 0) {
+ report("Expected 2 events, got %d", i+2);
+ FAIL;
+ }
+ else
+ CHECK;
+/* Verify that xname event was received on window1 by client2. */
+ if (XPending(client2) < 1) {
+ report("Expected %s event not delivered to client2.", TestName);
+ FAIL;
+ return;
+ }
+ else
+ CHECK;
+ XNextEvent(client2, &event);
+ if (event.type != EVENT) {
+ report("Expected %s, got %s with client2", eventname(EVENT), eventname(event.type));
+ FAIL;
+ }
+ else
+ CHECK;
+ if ((i = XPending(client2)) > 0) {
+ report("For client2: Expected 1 event, got %d", i+1);
+ FAIL;
+ }
+ else
+ CHECK;
+
+ /* Additional possible testing: */
+ /* Select for no events on window1. */
+ /* Select for MapNotify events on window2. */
+ /* Select for xname events on window2. */
+ /* Select for xname events on window2 with client2. */
+ /* Call XMapWindow on window2. */
+ /* Verify that MapNotify event was received on window2. */
+ /* Verify that xname event was received on window2. */
+ /* Verify that xname event was received on window2 by client2. */
+ /* Verify that pointer has remained where it was moved. */
+ /* Select for xname events on window1. */
+ /* Select for xname events on window1 with client2. */
+ /* Select for ConfigureNotify events on window2. */
+ /* Call XLowerWindow on window2. */
+ /* Verify that ConfigureNotify event was received on window2. */
+ /* Verify that xname event was received on window1. */
+ /* Verify that xname event was received on window1 by client2. */
+ /* Verify that pointer has remained where it was moved. */
+
+ /* Others: GravityNotify, CirculateNotify. */
+
+/* Verify that pointer has remained where it was moved. */
+ if (pointermoved(display, warp)) {
+ delete("Pointer moved unexpectedly");
+ return;
+ }
+ else
+ CHECK;
+ CHECKPASS(11);
+>>#NOTEd >>ASSERTION
+>>#NOTEd When the window which contains the pointer changes,
+>>#NOTEd then ARTICLE xname event is generated.
+>>#NOTEm >>ASSERTION
+>>#NOTEm When a client calls
+>>#NOTEm .F XGrabPointer
+>>#NOTEm or
+>>#NOTEm .F XUngrabPointer ,
+>>#NOTEm then ARTICLE xname event is generated.
+>>ASSERTION def
+>>#NOTE Checked in previous test.
+When an xname event is generated,
+then
+all clients having set
+.S EnterWindowMask
+event mask bits on the event window are delivered
+an xname event.
+>>ASSERTION Good A
+>>#NOTE True for most events (except MappingNotify and selection stuff).
+When an xname event is generated,
+then
+clients not having set
+.S EnterWindowMask
+event mask bits on the event window are not delivered
+an xname event.
+>>STRATEGY
+Create client2.
+Create window.
+Move pointer outside of window.
+Select for xname events on window.
+Select for no events on window with client2.
+Warp pointer to window.
+Verify that a single xname event was received.
+Verify that no events were received by client2.
+>>CODE
+int i;
+Display *display = Dsp;
+Display *client2;
+Window w;
+XEvent event;
+XEvent good;
+struct area area;
+PointerPlace *warp1, *warp2;
+
+/* Create client2. */
+ if ((client2 = opendisplay()) == (Display *) NULL) {
+ delete("Couldn't create client2.");
+ return;
+ }
+ else
+ CHECK;
+/* Create window. */
+ area.x = 10;
+ area.y = 10;
+ area.width = W_STDWIDTH;
+ area.height = W_STDHEIGHT;
+ w = mkwin(display, (XVisualInfo *) NULL, &area, True);
+/* Move pointer outside of window. */
+ warp1 = warppointer(display, DRW(display), 0, 0);
+ if (warp1 == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+/* Select for xname events on window. */
+ XSelectInput(display, w, MASK);
+/* Select for no events on window with client2. */
+ XSelectInput(client2, w, NoEventMask);
+/* Warp pointer to window. */
+ XSync(display, True);
+ XSync(client2, True);
+ warp2 = warppointer(display, w, 2, 3);
+ if (warp2 == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+ XSync(display, False);
+ XSync(client2, False);
+/* Verify that a single xname event was received. */
+ if (XPending(display) < 1) {
+ report("Expected %s event not delivered.", TestName);
+ FAIL;
+ return;
+ }
+ else
+ CHECK;
+ XNextEvent(display, &event);
+ good.xcrossing.type = EVENT;
+ good.xcrossing.serial = event.xcrossing.serial;
+ good.xcrossing.send_event = False;
+ good.xcrossing.display = display;
+ good.xcrossing.window = w;
+ good.xcrossing.root = DRW(display);
+ good.xcrossing.subwindow = None;
+ good.xcrossing.time = event.xcrossing.time;
+ good.xcrossing.x = 2;
+ good.xcrossing.y = 3;
+ ROOTCOORDSET(display, &(good.xcrossing)); /* x_root and y_root */
+ good.xcrossing.mode = NotifyNormal;
+ /* under virtual root windows detail gets set to NotifyNonlinear */
+ good.xcrossing.detail = NotifyAncestor;
+ good.xcrossing.same_screen = True;
+ good.xcrossing.focus = True; /* assumes focus follows pointer */
+ good.xcrossing.state = 0;
+ if (checkevent(&good, &event)) {
+ FAIL;
+ }
+ else
+ CHECK;
+ if ((i = XPending(display)) > 0) {
+ report("Expected 1 event, got %d", i+1);
+ FAIL;
+ }
+ else
+ CHECK;
+/* Verify that no events were received by client2. */
+ if ((i = XPending(client2)) > 0) {
+ report("For client2: Expected 0 events, got %d", i);
+ FAIL;
+ }
+ else
+ CHECK;
+ CHECKPASS(7);
+>>#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 delivered,
+>>#NOTEs then
+>>#NOTEs .M root
+>>#NOTEs is set to the source window's root window.
+>>ASSERTION Good A
+When an xname event is delivered
+and the child of the event window contains the final pointer position,
+then
+.M subwindow
+is set to
+that child.
+>>STRATEGY
+Build window hierarchy.
+Create the hierarchy.
+Move pointer to outside of window.
+Select no events on the sourcew.
+Set EnterWindowMask event mask bits on the eventw.
+Move pointer to child of event window.
+Verify that a xname event was received.
+Verify that subwindow is set to the source window.
+>>CODE
+int status;
+Display *display = Dsp;
+Winh *eventw;
+Winh *sourcew;
+XEvent good;
+Winhg winhg;
+PointerPlace *warp1, *warp2;
+
+/* Build window hierarchy. */
+ winhg.area.x = 1;
+ winhg.area.y = 1;
+ winhg.area.width = W_STDWIDTH;
+ winhg.area.height = W_STDHEIGHT;
+ winhg.border_width = 1;
+ eventw = winh_adopt(display, (Winh *) NULL, 0L, (XSetWindowAttributes *) NULL, &winhg, WINH_NOMASK);
+ if (eventw == (Winh *) NULL) {
+ report("Could not create eventw");
+ return;
+ }
+ else
+ CHECK;
+ winhg.area.width /= 2;
+ winhg.area.height /= 2;
+ sourcew = winh_adopt(display, eventw, 0L, (XSetWindowAttributes *) NULL, &winhg, WINH_NOMASK);
+ if (sourcew == (Winh *) NULL) {
+ report("Could not create sourcew");
+ return;
+ }
+ else
+ CHECK;
+/* Create the hierarchy. */
+ if (winh_create(display, (Winh *) NULL, WINH_MAP))
+ return;
+ else
+ CHECK;
+/* Move pointer to outside of window. */
+ warp1 = warppointer(display, DRW(display), 0, 0);
+ if (warp1 == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+/* Select no events on the sourcew. */
+ if (winh_selectinput(display, sourcew, NoEventMask))
+ return;
+ else
+ CHECK;
+/* Set EnterWindowMask event mask bits on the eventw. */
+ if (winh_selectinput(display, eventw, MASK))
+ return;
+ else
+ CHECK;
+ XSync(display, True);
+ good.type = EVENT;
+ good.xcrossing.display = display;
+ good.xcrossing.window = eventw->window;
+ good.xcrossing.subwindow = sourcew->window;
+/* Move pointer to child of event window. */
+ warp2 = warppointer(display, sourcew->window, 2, 2);
+ if (warp2 == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+/* Verify that a xname event was received. */
+ XSync(display, False);
+ if (winh_plant(eventw, &good, NoEventMask, WINH_NOMASK))
+ return;
+ else
+ CHECK;
+ if (winh_harvest(display, (Winh *) NULL))
+ 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 subwindow is set to the source window. */
+ /* since only one event was expected, it must be first in list */
+ if (eventw->delivered->event->xcrossing.subwindow != sourcew->window) {
+ report("Subwindow set to 0x%x, expected 0x%x",
+ eventw->delivered->event->xcrossing.subwindow, sourcew->window);
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+
+ CHECKPASS(10);
+
+>>ASSERTION def
+>>#NOTE Already tested for in a test with only a single window involved.
+When an xname event is delivered
+and the child of the event window does not contain the final pointer position,
+then
+.M subwindow
+is set to
+.S None .
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered,
+>>#NOTEs then
+>>#NOTEs .M time
+>>#NOTEs is set to
+>>#NOTEs the time in milliseconds at which the event was generated.
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered
+>>#NOTEs and the event window is on the same screen as the root window,
+>>#NOTEs then
+>>#NOTEs .M x
+>>#NOTEs and
+>>#NOTEs .M y
+>>#NOTEs are set to
+>>#NOTEs the coordinates of
+>>#NOTEs the final pointer position relative to the event window's origin.
+>>#REMOVED >>ASSERTION Good C
+>>#COMMENT:
+>># This assertion was removed April 1992 because
+>># an enter notify event is not generated when the root
+>># is on the alternate screen (bug report 0234).
+>># -stuart.
+>>#REMOVED >>#COMMENT:
+>>#REMOVED >># Assertion category changed March 1992 since it was found not to require
+>>#REMOVED >># device events.
+>>#REMOVED >># - Cal.
+>>#REMOVED If multiple screens are supported:
+>>#REMOVED When an xname event is delivered
+>>#REMOVED and the event and root windows are not on the same screen,
+>>#REMOVED then
+>>#REMOVED .M x
+>>#REMOVED and
+>>#REMOVED .M y
+>>#REMOVED are set to
+>>#REMOVED zero.
+>>#REMOVED >>STRATEGY
+>>#REMOVED If multiple screens are supported:
+>>#REMOVED Create a window on the default screen.
+>>#REMOVED Create a window on the alternate screen.
+>>#REMOVED Warp the pointer into the first window.
+>>#REMOVED Grab the pointer for the first window.
+>>#REMOVED Warp the pointer into the alternate screen window.
+>>#REMOVED Verify that an xname event was generated relative to the grab window.
+>>#REMOVED Verify that the x and y components were set to zero.
+>>#REMOVED >>CODE
+>>#REMOVED Window wg;
+>>#REMOVED Window w2;
+>>#REMOVED XEvent ev;
+>>#REMOVED int gr;
+>>#REMOVED
+>>#REMOVED /* If multiple screens are supported: */
+>>#REMOVED if (config.alt_screen == -1) {
+>>#REMOVED unsupported("Multiple screens not supported.");
+>>#REMOVED return;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED
+>>#REMOVED /* Create a window on the default screen. */
+>>#REMOVED wg = defwin(Dsp);
+>>#REMOVED /* Create a window on the alternate screen. */
+>>#REMOVED w2 = defdraw(Dsp, VI_ALT_WIN);
+>>#REMOVED
+>>#REMOVED /* Warp the pointer into the first window. */
+>>#REMOVED (void) warppointer(Dsp, wg, 13, 17);
+>>#REMOVED XSync(Dsp, True);
+>>#REMOVED
+>>#REMOVED /* Grab the pointer for the first window. */
+>>#REMOVED if((gr = XGrabPointer(Dsp, wg, False, EVENTMASK|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime)) != GrabSuccess) {
+>>#REMOVED delete("XGrabPointer() returned %s instead of GrabSuccess.", grabreplyname(gr));
+>>#REMOVED return;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED
+>>#REMOVED /* Warp the pointer into the alternate screen window. */
+>>#REMOVED XSync(Dsp, True);
+>>#REMOVED (void) warppointer(Dsp, w2, 7,11);
+>>#REMOVED XSync(Dsp, False);
+>>#REMOVED
+>>#REMOVED /* Verify that an xname event was generated relative to the grab window. */
+>>#REMOVED if (XCheckWindowEvent(Dsp, wg, EVENTMASK, &ev) == False) {
+>>#REMOVED report("Expected %s event was not received.", eventname(EVENT));
+>>#REMOVED FAIL;
+>>#REMOVED } else {
+>>#REMOVED CHECK;
+>>#REMOVED
+>>#REMOVED /* Verify that the x and y components were set to zero. */
+>>#REMOVED if(ev.xcrossing.x != 0 || ev.xcrossing.y != 0) {
+>>#REMOVED report("The x (value %d) and y (value %d) components of the %s event were not set to zero.",
+>>#REMOVED ev.xcrossing.x, ev.xcrossing.y, eventname(EVENT));
+>>#REMOVED FAIL;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED }
+>>#REMOVED
+>>#REMOVED XUngrabPointer(Dsp, CurrentTime);
+>>#REMOVED CHECKPASS(4);
+>>#REMOVED
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered,
+>>#NOTEs then
+>>#NOTEs .M x_root
+>>#NOTEs and
+>>#NOTEs .M y_root
+>>#NOTEs are set to coordinates of the pointer
+>>#NOTEs when the event was generated
+>>#NOTEs relative to the root window's origin.
+>>#NOTEm >>ASSERTION
+>>#NOTEm >>#NOTE
+>>#NOTEm >>#NOTE The spec does not actually state this. What the spec states is that
+>>#NOTEm >>#NOTE things behave as if the pointer moved from the confine-to window to
+>>#NOTEm >>#NOTE the grab window, the opposite of what one might expect.
+>>#NOTEm >>#NOTE
+>>#NOTEm When ARTICLE xname event is generated as the result of a grab activation,
+>>#NOTEm then xname event generation occurs as if the pointer moved from
+>>#NOTEm the grab window to the confine-to window with
+>>#NOTEm .M mode
+>>#NOTEm set to
+>>#NOTEm .S NotifyGrab .
+>>#NOTEm >>ASSERTION
+>>#NOTEm >>#NOTE
+>>#NOTEm >>#NOTE The spec does not actually state this. What the spec states is that
+>>#NOTEm >>#NOTE things behave as if the pointer moved from the grab window to
+>>#NOTEm >>#NOTE the confine-to window, the opposite of what one might expect.
+>>#NOTEm >>#NOTE
+>>#NOTEm When ARTICLE xname event is generated as the result of a grab deactivation,
+>>#NOTEm then xname event generation occurs as if the pointer moved from
+>>#NOTEm the confine-to window to the grab window with
+>>#NOTEm .M mode
+>>#NOTEm set to
+>>#NOTEm .S NotifyUngrab .
+>>ASSERTION def
+All xname events are delivered after
+any related
+.S LeaveNotify
+are delivered.
+>>#NOTE
+>>#NOTE It would not surprise me in the least if these assertions could
+>>#NOTE be simplified and/or reduced in number.
+>>#NOTE
+>>ASSERTION Good A
+When the pointer moves from window A to window B
+and A is an inferior of B,
+then an xname event is generated on window B with
+.M detail
+set to
+.S NotifyInferior .
+>>STRATEGY
+Build window hierarchy.
+Move pointer to known location.
+Set window B.
+Set window A to child of window B.
+Select for xname and LeaveNotify events on windows A and B.
+Move pointer from window A to window B.
+Verify xname event received on window B.
+Verify that detail is set to NotifyInferior.
+Verify that all xname events are delivered after all
+LeaveNotify events.
+>>CODE
+Display *display = Dsp;
+int depth = 3;
+Winh *A, *B;
+int status;
+XEvent *event;
+
+/* 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 child of window B. */
+ A = B->firstchild;
+/* Select for xname and LeaveNotify events on windows A and B. */
+ if (winh_selectinput(display, A, BOTHMASKS)) {
+ report("Error selecting for events.");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_selectinput(display, B, BOTHMASKS)) {
+ report("Error selecting for events.");
+ return;
+ }
+ else
+ CHECK;
+
+/* Move pointer from window A to window B. */
+ XWarpPointer(display, None, A->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, True);
+ XWarpPointer(display, None, B->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ return;
+ }
+ else
+ CHECK;
+/* Verify xname event received on window B. */
+ if (B->delivered == (Winhe *) NULL || (event = B->delivered->event)->type != EVENT) {
+ report("Expected event not generated");
+ FAIL;
+ }
+ else
+ {
+/* Verify that detail is set to NotifyInferior. */
+ if (event->xcrossing.detail != NotifyInferior) {
+ report("Got detail %d, expected %d", event->xcrossing.detail, NotifyInferior);
+ FAIL;
+ }
+ else
+ CHECK;
+/* Verify that all xname events are delivered after all */
+/* LeaveNotify events. */
+ status = winh_ordercheck(OTHEREVENT, EVENT);
+ if (status == -1)
+ return;
+ else if (status)
+ FAIL;
+ else
+ CHECK;
+ }
+ CHECKPASS(7);
+>>ASSERTION Good A
+When the pointer moves from window A to window B
+and B is an inferior of A,
+then an xname event is generated once on each window
+between window A and window B, exclusive,
+in window hierarchy order,
+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.
+Select for xname and LeaveNotify events on all windows.
+Move pointer from window A to window B.
+Verify events delivered, between window A and window B, exclusive,
+in proper order.
+Verify that detail is set to NotifyVirtual.
+Verify that event delivered to window B with detail set to NotifyAncestor.
+Verify that all xname events are delivered after all
+LeaveNotify 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;
+/* Select for xname and LeaveNotify events on all windows. */
+ if (winh_selectinput(display, (Winh *) NULL, BOTHMASKS)) {
+ 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;
+/* Move pointer from window A to window B. */
+ XWarpPointer(display, None, A->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, True);
+ XWarpPointer(display, None, B->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK))
+ 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 events delivered, between window A and window B, exclusive, */
+/* in proper order. */
+ increasing = True;
+ if (winh_climb(B, A->firstchild, checksequence))
+ FAIL;
+ else
+ CHECK;
+/* Verify that detail is 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 that all xname events are delivered after all */
+/* LeaveNotify events. */
+ status = winh_ordercheck(OTHEREVENT, EVENT);
+ if (status == -1)
+ return;
+ else if (status)
+ FAIL;
+ else
+ CHECK;
+ }
+ CHECKPASS(11);
+>>ASSERTION Good A
+When the pointer moves from window A to window B
+and there exists a window C that is their least common ancestor,
+then an xname event is generated once on each window
+between window C and window 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 windows A, B, and C.
+Select for xname and LeaveNotify events on all windows.
+Move pointer from window A to window B.
+Verify events delivered, between window C and window B, exclusive,
+in proper order.
+Verify that detail is set to NotifyNonlinearVirtual.
+Verify that event delivered to window B with detail set to NotifyNonlinear.
+Verify that all xname events are delivered after all
+LeaveNotify events.
+>>CODE
+Display *display;
+int depth = 5;
+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 windows A, B, and C. */
+ C = guardian->firstchild;
+ A = C->firstchild->nextsibling->firstchild->firstchild;
+ B = C->firstchild-> firstchild->firstchild;
+/* Select for xname and LeaveNotify events on all windows. */
+ if (winh_selectinput(display, (Winh *) NULL, BOTHMASKS)) {
+ report("Could not select for events");
+ 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;
+/* Move pointer from window A to window B. */
+ XWarpPointer(display, None, A->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, True);
+ XWarpPointer(display, None, B->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK))
+ 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 events delivered, between window C and window B, exclusive, */
+/* in proper order. */
+ increasing = True;
+ if (winh_climb(B, C->firstchild, checksequence))
+ FAIL;
+ else
+ CHECK;
+/* Verify that detail is 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 all xname events are delivered after all */
+/* LeaveNotify events. */
+ status = winh_ordercheck(OTHEREVENT, EVENT);
+ if (status == -1)
+ return;
+ else if (status) {
+ report("Incorrect event ordering.");
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+ CHECKPASS(11);
+>>ASSERTION Good A
+If the implementation supports multiple screens:
+When the pointer moves from window A to window B
+and window A and window B are on different screens
+and window B is not a root window,
+then an 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
+and then on window B with
+.M detail
+set to
+.S NotifyNonlinear .
+>>STRATEGY
+Check to see if multiple screens are supported.
+Build window hierarchy.
+Move pointer to known location.
+Select for xname and LeaveNotify events between windows B and
+B's root window.
+Move pointer from window A to window B.
+Verify events delivered on each window from window B's root
+down to but not including window B in proper order.
+Verify that detail is set to NotifyNonlinearVirtual.
+Verify that event delivered to window B with detail set to NotifyNonlinear.
+Verify that all xname events are delivered after all
+LeaveNotify events.
+>>CODE
+Display *display;
+int depth = 5;
+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. */
+ 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 windows A and B. */
+ A = guardian->firstchild;
+ Broot = guardian->nextsibling;
+ B = Broot->firstchild->firstchild->firstchild;
+/* Select for xname and LeaveNotify events on all windows. */
+ if (winh_selectinput(display, (Winh *) NULL, BOTHMASKS)) {
+ report("Could not select for events");
+ return;
+ }
+ else
+ CHECK;
+ good.type = EVENT;
+ good.xany.display = display;
+ if (winh_climb(B, Broot, plant)) {
+ report("Could not plant events");
+ return;
+ }
+ else
+ CHECK;
+/* Move pointer from window A to window B. */
+ XWarpPointer(display, None, A->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, True);
+ XWarpPointer(display, None, B->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_ignore_event((Winh *) NULL, OTHEREVENT, WINH_NOMASK))
+ 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 events delivered on each window from window B's root */
+/* down to but not including window B in proper order. */
+ increasing = True;
+ if (winh_climb(B, Broot, checksequence))
+ FAIL;
+ else
+ CHECK;
+/* Verify that detail is set to NotifyNonlinearVirtual. */
+ _detail_ = NotifyNonlinearVirtual;
+ if (winh_climb(B->parent, Broot, 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 all xname events are delivered after all */
+/* LeaveNotify events. */
+ status = winh_ordercheck(OTHEREVENT, EVENT);
+ if (status == -1)
+ return;
+ else if (status) {
+ report("Incorrect event ordering.");
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+ CHECKPASS(12);
+>>ASSERTION def
+>>#NOTE Tested above.
+If the implementation supports multiple screens:
+When the pointer moves from window A to window B
+and window A and window B are on different screens,
+then an xname event is generated on window B with
+.M detail
+set to
+.S NotifyNonlinear .
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered
+>>#NOTEs and the event and root windows are on the same screen,
+>>#NOTEs then
+>>#NOTEs .M same_screen
+>>#NOTEs is set to
+>>#NOTEs .S True .
+>>#REMOVED >>ASSERTION Good C
+>>#COMMENT:
+>># This assertion was removed April 1992 because
+>># an enter notify event is not generated when the root
+>># is on the alternate screen (bug report 0234).
+>># -stuart.
+>>#REMOVED >>#COMMENT:
+>>#REMOVED >># Assertion category changed March 1992 since it was found not to require
+>>#REMOVED >># device events.
+>>#REMOVED >># - Cal.
+>>#REMOVED If multiple screens are supported:
+>>#REMOVED When an xname event is delivered
+>>#REMOVED and the event and root windows are not on the same screen,
+>>#REMOVED then
+>>#REMOVED .M same_screen
+>>#REMOVED is set to
+>>#REMOVED .S False .
+>>#REMOVED >>STRATEGY
+>>#REMOVED If multiple screens are supported:
+>>#REMOVED Create a window on the default screen.
+>>#REMOVED Create a window on the alternate screen.
+>>#REMOVED Warp the pointer into the first window.
+>>#REMOVED Grab the pointer for the first window.
+>>#REMOVED Warp the pointer into the alternate screen window.
+>>#REMOVED Verify that an xname event was generated relative to the grab window.
+>>#REMOVED Verify that the same_screen component was False.
+>>#REMOVED >>CODE
+>>#REMOVED Window wg;
+>>#REMOVED Window w2;
+>>#REMOVED XEvent ev;
+>>#REMOVED int gr;
+>>#REMOVED
+>>#REMOVED
+>>#REMOVED /* If multiple screens are supported: */
+>>#REMOVED if (config.alt_screen == -1) {
+>>#REMOVED unsupported("Multiple screens not supported.");
+>>#REMOVED return;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED
+>>#REMOVED /* Create a window on the default screen. */
+>>#REMOVED wg = defwin(Dsp);
+>>#REMOVED /* Create a window on the alternate screen. */
+>>#REMOVED w2 = defdraw(Dsp, VI_ALT_WIN);
+>>#REMOVED
+>>#REMOVED /* Warp the pointer into the first window. */
+>>#REMOVED (void) warppointer(Dsp, wg, 13, 17);
+>>#REMOVED XSync(Dsp, True);
+>>#REMOVED
+>>#REMOVED /* Grab the pointer for the first window. */
+>>#REMOVED if((gr = XGrabPointer(Dsp, wg, False, EVENTMASK|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime)) != GrabSuccess) {
+>>#REMOVED delete("XGrabPointer() returned %s instead of GrabSuccess.", grabreplyname(gr));
+>>#REMOVED return;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED
+>>#REMOVED /* Warp the pointer into the alternate screen window. */
+>>#REMOVED XSync(Dsp, True);
+>>#REMOVED (void) warppointer(Dsp, w2, 7,11);
+>>#REMOVED XSync(Dsp, False);
+>>#REMOVED
+>>#REMOVED /* Verify that an xname event was generated relative to the grab window. */
+>>#REMOVED if (XCheckWindowEvent(Dsp, wg, EVENTMASK, &ev) == False) {
+>>#REMOVED report("Expected %s event was not received.", eventname(EVENT));
+>>#REMOVED FAIL;
+>>#REMOVED } else {
+>>#REMOVED
+>>#REMOVED CHECK;
+>>#REMOVED /* Verify that the same_screen component was False. */
+>>#REMOVED if(ev.xcrossing.same_screen != False) {
+>>#REMOVED report("The same_screen component of the %s event was not set to False.", eventname(EVENT));
+>>#REMOVED FAIL;
+>>#REMOVED } else
+>>#REMOVED CHECK;
+>>#REMOVED }
+>>#REMOVED
+>>#REMOVED XUngrabPointer(Dsp, CurrentTime);
+>>#REMOVED CHECKPASS(4);
+>>#REMOVED
+>>ASSERTION Good A
+When an xname event is delivered
+and the event window is the focus window,
+then
+.M focus
+is set to
+.S True .
+>>STRATEGY
+Build window hierarchy.
+Set input focus to eventw.
+Move pointer to known location.
+Select xname events on the eventw.
+Call XWarpPointer to move the pointer to eventw.
+Verify event was delivered with focus set to True.
+Move pointer back to known location.
+Clear event expectations.
+Set input focus to known window.
+Call XWarpPointer to move the pointer to eventw.
+Verify event was delivered with focus set to False.
+>>CODE
+Display *display = Dsp;
+Winh *eventw;
+int status;
+
+/* Build window hierarchy. */
+ if (winh(display, 1, WINH_MAP)) {
+ report("Could not build window hierarchy");
+ return;
+ }
+ else
+ CHECK;
+ eventw = guardian->firstchild;
+/* Set input focus to eventw. */
+ XSetInputFocus(display, eventw->window, RevertToPointerRoot, CurrentTime);
+/* Move pointer to known location. */
+ if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+/* Select xname events on the eventw. */
+ if (winh_selectinput(display, eventw, MASK))
+ return;
+ else
+ CHECK;
+/* Call XWarpPointer to move the pointer to eventw. */
+ XSync(display, True);
+ XWarpPointer(display, None, eventw->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+/* Verify event was delivered with focus set to True. */
+ good.type = EVENT;
+ good.xany.display = display;
+ good.xany.window = eventw->window;
+ if (winh_plant(eventw, &good, NoEventMask, WINH_NOMASK)) {
+ report("Could not initialize for event delivery");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ 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 {
+ if (eventw->delivered->event->xcrossing.focus != True) {
+ report("Focus set to %d, expected %d",
+ eventw->delivered->event->xcrossing.focus,True);
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+/* Move pointer back to known location. */
+ XWarpPointer(display, None, DRW(display), 0, 0, 0, 0, 0, 0);
+/* Set input focus to known window. */
+ XSetInputFocus(display, eventw->nextsibling->window, RevertToPointerRoot, CurrentTime);
+/* Call XWarpPointer to move the pointer to eventw. */
+ XSync(display, True);
+ XWarpPointer(display, None, eventw->window, 0, 0, 0, 0, 0, 0);
+ XSync(display, False);
+/* Verify event was delivered with focus set to False. */
+ if (winh_plant(eventw, &good, NoEventMask, WINH_NOMASK)) {
+ report("Could not initialize for event delivery");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ 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 {
+ if (eventw->delivered->event->xcrossing.focus != False) {
+ report("Focus set to %d, expected %d",
+ eventw->delivered->event->xcrossing.focus, False);
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+ CHECKPASS(9);
+>>ASSERTION Good A
+When an xname event is delivered
+and the event window is an inferior of the focus window,
+then
+.M focus
+is set to
+.S True .
+>>STRATEGY
+Build window hierarchy.
+Set input focus to ancestor of window eventw.
+Move pointer to known location.
+Select xname events on the eventw.
+Call XWarpPointer to move the pointer to eventw.
+Verify event was delivered with focus set to True.
+>>CODE
+Display *display = Dsp;
+Winh *eventw, *focusw;
+int status;
+
+/* Build window hierarchy. */
+ if (winh(display, 2, WINH_MAP)) {
+ report("Could not build window hierarchy");
+ return;
+ }
+ else
+ CHECK;
+ focusw = guardian->firstchild;
+ eventw = guardian->firstchild->firstchild;
+/* Set input focus to ancestor of window eventw. */
+ XSetInputFocus(display, focusw->window, RevertToPointerRoot, CurrentTime);
+/* Move pointer to known location. */
+ if (warppointer(display, DRW(display), 0, 0) == (PointerPlace *) NULL)
+ return;
+ else
+ CHECK;
+/* Select xname events on the eventw. */
+ if (winh_selectinput(display, eventw, MASK))
+ return;
+ else
+ CHECK;
+/* Call XWarpPointer to move the pointer to eventw. */
+ XSync(display, True);
+ XWarpPointer(display, None, eventw->window, 0, 0, 0, 0, 2, 2);
+ XSync(display, False);
+/* Verify event was delivered with focus set to True. */
+ good.type = EVENT;
+ good.xany.display = display;
+ good.xany.window = eventw->window;
+ if (winh_plant(eventw, &good, NoEventMask, WINH_NOMASK)) {
+ report("Could not initialize for event delivery");
+ return;
+ }
+ else
+ CHECK;
+ if (winh_harvest(display, (Winh *) NULL)) {
+ report("Could not harvest events");
+ 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 {
+ if (eventw->delivered->event->xcrossing.focus != True) {
+ report("Focus set to %d, expected %d",
+ eventw->delivered->event->xcrossing.focus, True);
+ FAIL;
+ }
+ else
+ CHECK;
+ }
+ CHECKPASS(6);
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered
+>>#NOTEs and the event window is not the focus window or
+>>#NOTEs an inferior of the focus window,
+>>#NOTEs then
+>>#NOTEs .M focus
+>>#NOTEs is set to
+>>#NOTEs .S False .
+>>#NOTEs >>ASSERTION
+>>#NOTEs When ARTICLE xname event is delivered,
+>>#NOTEs then
+>>#NOTEs .M state
+>>#NOTEs is set to
+>>#NOTEs indicate the logical state
+>>#NOTEs of the pointer buttons,
+>>#NOTEs which is the bitwise OR of one or more of
+>>#NOTEs the button or modifier key masks
+>>#NOTEs .S Button1Mask ,
+>>#NOTEs .S Button2Mask ,
+>>#NOTEs .S Button3Mask ,
+>>#NOTEs .S Button4Mask ,
+>>#NOTEs .S Button5Mask ,
+>>#NOTEs .S ShiftMask ,
+>>#NOTEs .S LockMask ,
+>>#NOTEs .S ControlMask ,
+>>#NOTEs .S Mod1Mask ,
+>>#NOTEs .S Mod2Mask ,
+>>#NOTEs .S Mod3Mask ,
+>>#NOTEs .S Mod4Mask ,
+>>#NOTEs and
+>>#NOTEs .S Mod5Mask .