summaryrefslogtreecommitdiff
path: root/src/XTest.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/XTest.c')
-rw-r--r--src/XTest.c488
1 files changed, 488 insertions, 0 deletions
diff --git a/src/XTest.c b/src/XTest.c
new file mode 100644
index 0000000..108d9e4
--- /dev/null
+++ b/src/XTest.c
@@ -0,0 +1,488 @@
+/* $Xorg: XTest.c,v 1.5 2001/02/09 02:04:00 xorgcvs Exp $ */
+/*
+Copyright 1990, 1991 by UniSoft Group Limited
+*/
+
+/*
+
+Copyright 1992, 1993, 1998 The Open Group
+
+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.
+
+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 OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#define NEED_REPLIES
+#include "Xlibint.h"
+#include "XTest.h"
+#include "xteststr.h"
+#include "Xext.h"
+#include "extutil.h"
+#include "XInput.h"
+#include "XIproto.h"
+
+static XExtensionInfo _xtest_info_data;
+static XExtensionInfo *xtest_info = &_xtest_info_data;
+static /* const */ char *xtest_extension_name = XTestExtensionName;
+
+#define XTestCheckExtension(dpy,i,val) \
+ XextCheckExtension (dpy, i, xtest_extension_name, val)
+
+#define XTestICheckExtension(dpy,i,val) \
+ XextCheckExtension (dpy, i, xtest_extension_name, val); \
+ if (!i->data) return val
+
+/*****************************************************************************
+ * *
+ * private utility routines *
+ * *
+ *****************************************************************************/
+
+static int close_display();
+static /* const */ XExtensionHooks xtest_extension_hooks = {
+ NULL, /* create_gc */
+ NULL, /* copy_gc */
+ NULL, /* flush_gc */
+ NULL, /* free_gc */
+ NULL, /* create_font */
+ NULL, /* free_font */
+ close_display, /* close_display */
+ NULL, /* wire_to_event */
+ NULL, /* event_to_wire */
+ NULL, /* error */
+ NULL /* error_string */
+};
+
+static XPointer
+get_xinput_base(dpy)
+ Display *dpy;
+{
+ int major_opcode, first_event, first_error;
+ first_event = 0;
+
+ XQueryExtension(dpy, INAME, &major_opcode, &first_event, &first_error);
+ return (XPointer)first_event;
+}
+
+static XEXT_GENERATE_FIND_DISPLAY (find_display, xtest_info,
+ xtest_extension_name,
+ &xtest_extension_hooks, XTestNumberEvents,
+ get_xinput_base(dpy))
+
+static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xtest_info)
+
+/*****************************************************************************
+ * *
+ * public routines *
+ * *
+ *****************************************************************************/
+
+Bool
+XTestQueryExtension (dpy, event_basep, error_basep, majorp, minorp)
+ Display *dpy;
+ int *event_basep, *error_basep;
+ int *majorp, *minorp;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestGetVersionReq *req;
+ xXTestGetVersionReply rep;
+
+ if (XextHasExtension(info)) {
+ LockDisplay(dpy);
+ GetReq(XTestGetVersion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestGetVersion;
+ req->majorVersion = XTestMajorVersion;
+ req->minorVersion = XTestMinorVersion;
+ if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ *event_basep = info->codes->first_event;
+ *error_basep = info->codes->first_error;
+ *majorp = rep.majorVersion;
+ *minorp = rep.minorVersion;
+ return True;
+ } else {
+ return False;
+ }
+}
+
+Bool
+XTestCompareCursorWithWindow(dpy, window, cursor)
+ Display *dpy;
+ Window window;
+ Cursor cursor;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestCompareCursorReq *req;
+ xXTestCompareCursorReply rep;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestCompareCursor, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestCompareCursor;
+ req->window = window;
+ req->cursor = cursor;
+ if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return rep.same;
+}
+
+Bool
+XTestCompareCurrentCursorWithWindow(dpy, window)
+ Display *dpy;
+ Window window;
+{
+ return XTestCompareCursorWithWindow(dpy, window, XTestCurrentCursor);
+}
+
+XTestFakeKeyEvent(dpy, keycode, is_press, delay)
+ Display *dpy;
+ unsigned int keycode;
+ Bool is_press;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = is_press ? KeyPress : KeyRelease;
+ req->detail = keycode;
+ req->time = delay;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeButtonEvent(dpy, button, is_press, delay)
+ Display *dpy;
+ unsigned int button;
+ Bool is_press;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = is_press ? ButtonPress : ButtonRelease;
+ req->detail = button;
+ req->time = delay;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeMotionEvent(dpy, screen, x, y, delay)
+ Display *dpy;
+ int screen;
+ int x, y;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = MotionNotify;
+ req->detail = False;
+ if (screen == -1)
+ req->root = None;
+ else
+ req->root = RootWindow(dpy, screen);
+ req->rootX = x;
+ req->rootY = y;
+ req->time = delay;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeRelativeMotionEvent(dpy, dx, dy, delay)
+ Display *dpy;
+ int dx, dy;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = MotionNotify;
+ req->detail = True;
+ req->root = None;
+ req->rootX = dx;
+ req->rootY = dy;
+ req->time = delay;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+static void
+send_axes(dpy, info, req, dev, first_axis, axes, n_axes)
+ Display *dpy;
+ XExtDisplayInfo *info;
+ xXTestFakeInputReq *req;
+ XDevice *dev;
+ int first_axis;
+ int *axes;
+ int n_axes;
+{
+ deviceValuator ev;
+ int n;
+
+ req->deviceid |= MORE_EVENTS;
+ req->length += ((n_axes + 5) / 6) * (SIZEOF(xEvent) >> 2);
+ ev.type = XI_DeviceValuator + (int)info->data;
+ ev.deviceid = dev->device_id;
+ ev.num_valuators = n_axes;
+ ev.first_valuator = first_axis;
+ while (n_axes > 0) {
+ n = n_axes;
+ if (n > 6)
+ n = 6;
+ switch (n) {
+ case 6:
+ ev.valuator5 = *(axes+5);
+ case 5:
+ ev.valuator4 = *(axes+4);
+ case 4:
+ ev.valuator3 = *(axes+3);
+ case 3:
+ ev.valuator2 = *(axes+2);
+ case 2:
+ ev.valuator1 = *(axes+1);
+ case 1:
+ ev.valuator0 = *axes;
+ }
+ Data(dpy, (char *)&ev, SIZEOF(xEvent));
+ axes += n;
+ n_axes -= n;
+ ev.first_valuator += n;
+ }
+}
+
+XTestFakeDeviceKeyEvent(dpy, dev, keycode, is_press, axes, n_axes, delay)
+ Display *dpy;
+ XDevice *dev;
+ unsigned int keycode;
+ Bool is_press;
+ int *axes;
+ int n_axes;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestICheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = is_press ? XI_DeviceKeyPress : XI_DeviceKeyRelease;
+ req->type += (int)info->data;
+ req->detail = keycode;
+ req->time = delay;
+ req->deviceid = dev->device_id;
+ if (n_axes)
+ send_axes(dpy, info, req, dev, 0, axes, n_axes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeDeviceButtonEvent(dpy, dev, button, is_press, axes, n_axes, delay)
+ Display *dpy;
+ XDevice *dev;
+ unsigned int button;
+ Bool is_press;
+ int *axes;
+ int n_axes;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestICheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = is_press ? XI_DeviceButtonPress : XI_DeviceButtonRelease;
+ req->type += (int)info->data;
+ req->detail = button;
+ req->time = delay;
+ req->deviceid = dev->device_id;
+ if (n_axes)
+ send_axes(dpy, info, req, dev, 0, axes, n_axes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeProximityEvent(dpy, dev, in_prox, axes, n_axes, delay)
+ Display *dpy;
+ XDevice *dev;
+ Bool in_prox;
+ int *axes;
+ int n_axes;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestICheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = in_prox ? XI_ProximityIn : XI_ProximityOut;
+ req->type += (int)info->data;
+ req->time = delay;
+ req->deviceid = dev->device_id;
+ if (n_axes)
+ send_axes(dpy, info, req, dev, 0, axes, n_axes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestFakeDeviceMotionEvent(dpy, dev, is_relative,
+ first_axis, axes, n_axes, delay)
+ Display *dpy;
+ XDevice *dev;
+ Bool is_relative;
+ int first_axis;
+ int *axes;
+ int n_axes;
+ unsigned long delay;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestFakeInputReq *req;
+
+ XTestICheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestFakeInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestFakeInput;
+ req->type = XI_DeviceMotionNotify + (int)info->data;
+ req->detail = is_relative;
+ req->time = delay;
+ req->deviceid = dev->device_id;
+ send_axes(dpy, info, req, dev, first_axis, axes, n_axes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+XTestGrabControl(dpy, impervious)
+ Display *dpy;
+ Bool impervious;
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ register xXTestGrabControlReq *req;
+
+ XTestCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq(XTestGrabControl, req);
+ req->reqType = info->codes->major_opcode;
+ req->xtReqType = X_XTestGrabControl;
+ req->impervious = impervious;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 1;
+}
+
+void
+XTestSetGContextOfGC(gc, gid)
+ GC gc;
+ GContext gid;
+{
+ gc->gid = gid;
+}
+
+void
+XTestSetVisualIDOfVisual(visual, visualid)
+ Visual *visual;
+ VisualID visualid;
+{
+ visual->visualid = visualid;
+}
+
+static xReq _dummy_request = {
+ 0, 0, 0
+};
+
+Status
+XTestDiscard(dpy)
+ Display *dpy;
+{
+ Bool something;
+ register char *ptr;
+
+ LockDisplay(dpy);
+ if ((something = (dpy->bufptr != dpy->buffer))) {
+ for (ptr = dpy->buffer;
+ ptr < dpy->bufptr;
+ ptr += (((xReq *)ptr)->length << 2))
+ dpy->request--;
+ dpy->bufptr = dpy->buffer;
+ dpy->last_req = (char *)&_dummy_request;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return something;
+}