diff options
Diffstat (limited to 'Xi')
-rw-r--r-- | Xi/Makefile.am | 6 | ||||
-rw-r--r-- | Xi/extinit.c | 13 | ||||
-rw-r--r-- | Xi/querydp.c | 166 | ||||
-rw-r--r-- | Xi/querydp.h | 44 | ||||
-rw-r--r-- | Xi/warpdevp.c | 186 | ||||
-rw-r--r-- | Xi/warpdevp.h | 39 |
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 */ |