summaryrefslogtreecommitdiff
path: root/Xi
diff options
context:
space:
mode:
Diffstat (limited to 'Xi')
-rw-r--r--Xi/Makefile.am6
-rw-r--r--Xi/extinit.c13
-rw-r--r--Xi/querydp.c166
-rw-r--r--Xi/querydp.h44
-rw-r--r--Xi/warpdevp.c186
-rw-r--r--Xi/warpdevp.h39
6 files changed, 453 insertions, 1 deletions
diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index fbe438543..0aa58449f 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -54,6 +54,8 @@ libXi_la_SOURCES = \
listdev.h \
opendev.c \
opendev.h \
+ querydp.c \
+ querydp.h \
queryst.c \
queryst.h \
selectev.c \
@@ -75,6 +77,8 @@ libXi_la_SOURCES = \
ungrdevb.c \
ungrdevb.h \
ungrdevk.c \
- ungrdevk.h
+ ungrdevk.h \
+ warpdevp.c \
+ warpdevp.h
EXTRA_DIST = stubs.c
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 454883762..161995883 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -98,6 +98,7 @@ SOFTWARE.
#include "gtmotion.h"
#include "listdev.h"
#include "opendev.h"
+#include "querydp.h"
#include "queryst.h"
#include "selectev.h"
#include "sendexev.h"
@@ -110,6 +111,7 @@ SOFTWARE.
#include "ungrdev.h"
#include "ungrdevb.h"
#include "ungrdevk.h"
+#include "warpdevp.h"
static Mask lastExtEventMask = 1;
int ExtEventIndex;
@@ -334,6 +336,10 @@ ProcIDispatch(register ClientPtr client)
return (ProcXGetDeviceControl(client));
else if (stuff->data == X_ChangeDeviceControl)
return (ProcXChangeDeviceControl(client));
+ else if (stuff->data == X_QueryDevicePointer)
+ return (ProcXQueryDevicePointer(client));
+ else if (stuff->data == X_WarpDevicePointer)
+ return (ProcXWarpDevicePointer(client));
else {
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
}
@@ -423,6 +429,10 @@ SProcIDispatch(register ClientPtr client)
return (SProcXGetDeviceControl(client));
else if (stuff->data == X_ChangeDeviceControl)
return (SProcXChangeDeviceControl(client));
+ else if (stuff->data == X_QueryDevicePointer)
+ return (SProcXQueryDevicePointer(client));
+ else if (stuff->data == X_WarpDevicePointer)
+ return (SProcXWarpDevicePointer(client));
else {
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
}
@@ -495,6 +505,9 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
else if (rep->RepType == X_ChangeDeviceControl)
SRepXChangeDeviceControl(client, len,
(xChangeDeviceControlReply *) rep);
+ else if (rep->RepType == X_QueryDevicePointer)
+ SRepXQueryDevicePointer(client, len,
+ (xQueryDevicePointerReply *) rep);
else {
FatalError("XINPUT confused sending swapped reply");
}
diff --git a/Xi/querydp.c b/Xi/querydp.c
new file mode 100644
index 000000000..04323e42a
--- /dev/null
+++ b/Xi/querydp.c
@@ -0,0 +1,166 @@
+/*
+
+Copyright 2006 Peter Hutterer <peter@cs.unisa.edu.au>
+
+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 AUTHOR 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 author 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 author.
+
+*/
+
+/***********************************************************************
+ *
+ * Request to query the pointer location of an extension input device.
+ *
+ */
+
+#define NEED_EVENTS
+#define NEED_REPLIES
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h> /* for inputstr.h */
+#include <X11/Xproto.h> /* Request macro */
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "extnsionst.h"
+#include "extinit.h" /* LookupDeviceIntRec */
+#include "exevents.h"
+#include "exglobals.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+#include "querydp.h"
+
+/***********************************************************************
+ *
+ * This procedure allows a client to query the pointer of a device.
+ *
+ */
+
+int
+SProcXQueryDevicePointer(register ClientPtr client)
+{
+ register char n;
+
+ REQUEST(xQueryDevicePointerReq);
+ swaps(&stuff->length, n);
+ return (ProcXQueryDevicePointer(client));
+}
+
+int
+ProcXQueryDevicePointer(register ClientPtr client)
+{
+ int rc;
+ xQueryDevicePointerReply rep;
+ DeviceIntPtr pDev;
+ WindowPtr pWin, t;
+ SpritePtr pSprite;
+
+ REQUEST(xQueryDevicePointerReq);
+ REQUEST_SIZE_MATCH(xQueryDevicePointerReq);
+
+ pDev = LookupDeviceIntRec(stuff->deviceid);
+ if (pDev == NULL) {
+ SendErrorToClient(client, IReqCode, X_QueryDevicePointer,
+ stuff->deviceid, BadDevice);
+ return Success;
+ }
+
+ rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
+ if (rc != Success)
+ {
+ SendErrorToClient(client, IReqCode, X_QueryDevicePointer,
+ stuff->win, rc);
+ return Success;
+ }
+
+ if (pDev->valuator->motionHintWindow)
+ MaybeStopHint(pDev, client);
+
+ pSprite = pDev->pSprite;
+ rep.repType = X_Reply;
+ rep.RepType = X_QueryDevicePointer;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.mask = pDev->button->state | inputInfo.keyboard->key->state;
+ rep.root = (GetCurrentRootWindow())->drawable.id;
+ rep.rootX = pSprite->hot.x;
+ rep.rootY = pSprite->hot.y;
+ rep.child = None;
+ rep.shared = (pDev->isMPDev) ? xFalse : xTrue;
+
+ if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+ {
+ rep.sameScreen = xTrue;
+ rep.winX = pSprite->hot.x - pWin->drawable.x;
+ rep.winY = pSprite->hot.y - pWin->drawable.y;
+ for (t = pSprite->win; t; t = t->parent)
+ if (t->parent == pWin)
+ {
+ rep.child = t->drawable.id;
+ break;
+ }
+ } else
+ {
+ rep.sameScreen = xFalse;
+ rep.winX = 0;
+ rep.winY = 0;
+ }
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ rep.rootX += panoramiXdataPtr[0].x;
+ rep.rootY += panoramiXdataPtr[0].y;
+ if (stuff->win == rep.root)
+ {
+ rep.winX += panoramiXdataPtr[0].x;
+ rep.winY += panoramiXdataPtr[0].y;
+ }
+ }
+#endif
+
+ WriteReplyToClient(client, sizeof(xQueryDevicePointerReply), &rep);
+ return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XQueryDevicePointer function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXQueryDevicePointer(ClientPtr client, int size,
+ xQueryDevicePointerReply * rep)
+{
+ register char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ WriteToClient(client, size, (char *)rep);
+}
diff --git a/Xi/querydp.h b/Xi/querydp.h
new file mode 100644
index 000000000..acad548ab
--- /dev/null
+++ b/Xi/querydp.h
@@ -0,0 +1,44 @@
+/************************************************************
+
+Copyright 2006 by Peter Hutterer <peter@cs.unisa.edu.au>
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+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 the above listed
+copyright holder(s) not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.
+
+THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef QUERYDP_H
+#define QUERYDP_H 1
+
+int SProcXQueryDevicePointer(ClientPtr /* client */
+ );
+
+int ProcXQueryDevicePointer(ClientPtr /* client */
+ );
+
+void SRepXQueryDevicePointer(ClientPtr /* client */ ,
+ int /* size */ ,
+ xQueryDevicePointerReply * /* rep */
+ );
+
+#endif /* QUERYDP_H */
diff --git a/Xi/warpdevp.c b/Xi/warpdevp.c
new file mode 100644
index 000000000..2b558d103
--- /dev/null
+++ b/Xi/warpdevp.c
@@ -0,0 +1,186 @@
+/*
+
+Copyright 2006 Peter Hutterer <peter@cs.unisa.edu.au>
+
+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 AUTHOR 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 author 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 author.
+
+*/
+
+/***********************************************************************
+ *
+ * Request to Warp the pointer location of an extension input device.
+ *
+ */
+
+#define NEED_EVENTS
+#define NEED_REPLIES
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h> /* for inputstr.h */
+#include <X11/Xproto.h> /* Request macro */
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include "scrnintstr.h" /* screen structure */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "extnsionst.h"
+#include "extinit.h" /* LookupDeviceIntRec */
+#include "exevents.h"
+#include "exglobals.h"
+
+
+#include "warpdevp.h"
+/***********************************************************************
+ *
+ * This procedure allows a client to warp the pointer of a device.
+ *
+ */
+
+int
+SProcXWarpDevicePointer(register ClientPtr client)
+{
+ register char n;
+
+ REQUEST(xWarpDevicePointerReq);
+ swaps(&stuff->length, n);
+ return (ProcXWarpDevicePointer(client));
+}
+
+int
+ProcXWarpDevicePointer(register ClientPtr client)
+{
+ int err;
+ int x, y;
+ WindowPtr dest = NULL;
+ DeviceIntPtr pDev;
+ SpritePtr pSprite;
+ ScreenPtr newScreen;
+
+ REQUEST(xWarpDevicePointerReq);
+ REQUEST_SIZE_MATCH(xWarpDevicePointerReq);
+
+ /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
+
+ pDev = LookupDeviceIntRec(stuff->deviceid);
+ if (pDev == NULL) {
+ SendErrorToClient(client, IReqCode, X_WarpDevicePointer, 0,
+ BadDevice);
+ return Success;
+ }
+
+ if (stuff->dst_win != None)
+ {
+ err = dixLookupWindow(&dest, stuff->dst_win, client, DixReadAccess);
+ if (err != Success)
+ {
+ SendErrorToClient(client, IReqCode, X_WarpDevicePointer,
+ stuff->dst_win, err);
+ return Success;
+ }
+ }
+
+ pSprite = pDev->pSprite;
+ x = pSprite->hotPhys.x;
+ y = pSprite->hotPhys.y;
+
+ if (stuff->src_win != None)
+ {
+ int winX, winY;
+ WindowPtr src;
+
+ err = dixLookupWindow(&src, stuff->src_win, client, DixReadAccess);
+ if (err != Success)
+ {
+ SendErrorToClient(client, IReqCode, X_WarpDevicePointer,
+ stuff->src_win, err);
+ return Success;
+ }
+
+ winX = src->drawable.x;
+ winY = src->drawable.y;
+ if (src->drawable.pScreen != pSprite->hotPhys.pScreen ||
+ x < winX + stuff->src_x ||
+ y < winY + stuff->src_y ||
+ (stuff->src_width != 0 &&
+ winX + stuff->src_x + (int)stuff->src_width < 0) ||
+ (stuff->src_height != 0 &&
+ winY + stuff->src_y + (int)stuff->src_height < y) ||
+ !PointInWindowIsVisible(src, x, y))
+ return Success;
+ }
+
+ if (dest)
+ {
+ x = dest->drawable.x;
+ y = dest->drawable.y;
+ newScreen = dest->drawable.pScreen;
+ } else
+ newScreen = pSprite->hotPhys.pScreen;
+
+ x += stuff->dst_x;
+ y += stuff->dst_y;
+
+ if (x < 0)
+ x = 0;
+ else if (x > newScreen->width)
+ x = newScreen->width - 1;
+
+ if (y < 0)
+ y = 0;
+ else if (y > newScreen->height)
+ y = newScreen->height - 1;
+
+ if (newScreen == pSprite->hotPhys.pScreen)
+ {
+ if (x < pSprite->physLimits.x1)
+ x = pSprite->physLimits.x1;
+ else if (x >= pSprite->physLimits.x2)
+ x = pSprite->physLimits.x2 - 1;
+
+ if (y < pSprite->physLimits.y1)
+ y = pSprite->physLimits.y1;
+ else if (y >= pSprite->physLimits.y2)
+ y = pSprite->physLimits.y2 - 1;
+
+#if defined(SHAPE)
+ if (pSprite->hotShape)
+ ConfineToShape(pDev, pSprite->hotShape, &x, &y);
+#endif
+ (*newScreen->SetCursorPosition)(pDev, newScreen, x, y, TRUE);
+ } else if (!PointerConfinedToScreen(pDev))
+ {
+ NewCurrentScreen(pDev, newScreen, x, y);
+ }
+
+ /* if we don't update the device, we get a jump next time it moves */
+ pDev->valuator->lastx = x;
+ pDev->valuator->lasty = x;
+ miPointerUpdateSprite(pDev);
+
+ /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
+ here though. */
+ return Success;
+}
+
diff --git a/Xi/warpdevp.h b/Xi/warpdevp.h
new file mode 100644
index 000000000..8ce5b7098
--- /dev/null
+++ b/Xi/warpdevp.h
@@ -0,0 +1,39 @@
+/************************************************************
+
+Copyright 2006 by Peter Hutterer <peter@cs.unisa.edu.au>
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+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 the above listed
+copyright holder(s) not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.
+
+THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef WARPDEVP_H
+#define WARPDEVP_H 1
+
+int SProcXWarpDevicePointer(ClientPtr /* client */
+ );
+
+int ProcXWarpDevicePointer(ClientPtr /* client */
+ );
+
+#endif /* WARPDEVP_H */