xfree86: Changing "IsMPDevice" to "SharedPointer" option. Devices will default
to MP devices. Xi: Adding QueryDevicePointer request/reply Adding WarpDevicePointer request/reply
This commit is contained in:
parent
2d0a63126b
commit
202b46eb6b
25
Changelog
25
Changelog
|
@ -1,4 +1,27 @@
|
||||||
== 14.12.06 ==
|
== 20.12.06 ==
|
||||||
|
xfree86: Changing "IsMPDevice" to "SharedPointer" option. Devices will default
|
||||||
|
to MP devices.
|
||||||
|
|
||||||
|
Xi: Adding QueryDevicePointer request/reply
|
||||||
|
Adding WarpDevicePointer request/reply
|
||||||
|
|
||||||
|
Files:
|
||||||
|
hw/xfree86/common/xf86Xinput.c
|
||||||
|
hw/xfree86/common/xf86Cursor.c
|
||||||
|
hw/xfree86/common/xf86Xinput.h
|
||||||
|
Xi/extinit.c
|
||||||
|
Xi/querydp.c
|
||||||
|
Xi/querydp.h
|
||||||
|
Xi/Makefile.am
|
||||||
|
Xi/warpdevp.c
|
||||||
|
Xi/warpdevp.h
|
||||||
|
dix/cursor.c
|
||||||
|
dix/events.c
|
||||||
|
dix/dix.h
|
||||||
|
|
||||||
|
Note: This commit requires libXi additions to use the new functions.
|
||||||
|
|
||||||
|
== 18.12.06 ==
|
||||||
mi: removing MPX ifdefs
|
mi: removing MPX ifdefs
|
||||||
global sprite renaming in mipointer and misprite
|
global sprite renaming in mipointer and misprite
|
||||||
fixed: multiple remove cursor call in miSpriteInstallColormap
|
fixed: multiple remove cursor call in miSpriteInstallColormap
|
||||||
|
|
|
@ -54,6 +54,8 @@ libXi_la_SOURCES = \
|
||||||
listdev.h \
|
listdev.h \
|
||||||
opendev.c \
|
opendev.c \
|
||||||
opendev.h \
|
opendev.h \
|
||||||
|
querydp.c \
|
||||||
|
querydp.h \
|
||||||
queryst.c \
|
queryst.c \
|
||||||
queryst.h \
|
queryst.h \
|
||||||
selectev.c \
|
selectev.c \
|
||||||
|
@ -75,6 +77,8 @@ libXi_la_SOURCES = \
|
||||||
ungrdevb.c \
|
ungrdevb.c \
|
||||||
ungrdevb.h \
|
ungrdevb.h \
|
||||||
ungrdevk.c \
|
ungrdevk.c \
|
||||||
ungrdevk.h
|
ungrdevk.h \
|
||||||
|
warpdevp.c \
|
||||||
|
warpdevp.h
|
||||||
|
|
||||||
EXTRA_DIST = stubs.c
|
EXTRA_DIST = stubs.c
|
||||||
|
|
13
Xi/extinit.c
13
Xi/extinit.c
|
@ -98,6 +98,7 @@ SOFTWARE.
|
||||||
#include "gtmotion.h"
|
#include "gtmotion.h"
|
||||||
#include "listdev.h"
|
#include "listdev.h"
|
||||||
#include "opendev.h"
|
#include "opendev.h"
|
||||||
|
#include "querydp.h"
|
||||||
#include "queryst.h"
|
#include "queryst.h"
|
||||||
#include "selectev.h"
|
#include "selectev.h"
|
||||||
#include "sendexev.h"
|
#include "sendexev.h"
|
||||||
|
@ -110,6 +111,7 @@ SOFTWARE.
|
||||||
#include "ungrdev.h"
|
#include "ungrdev.h"
|
||||||
#include "ungrdevb.h"
|
#include "ungrdevb.h"
|
||||||
#include "ungrdevk.h"
|
#include "ungrdevk.h"
|
||||||
|
#include "warpdevp.h"
|
||||||
|
|
||||||
static Mask lastExtEventMask = 1;
|
static Mask lastExtEventMask = 1;
|
||||||
int ExtEventIndex;
|
int ExtEventIndex;
|
||||||
|
@ -334,6 +336,10 @@ ProcIDispatch(register ClientPtr client)
|
||||||
return (ProcXGetDeviceControl(client));
|
return (ProcXGetDeviceControl(client));
|
||||||
else if (stuff->data == X_ChangeDeviceControl)
|
else if (stuff->data == X_ChangeDeviceControl)
|
||||||
return (ProcXChangeDeviceControl(client));
|
return (ProcXChangeDeviceControl(client));
|
||||||
|
else if (stuff->data == X_QueryDevicePointer)
|
||||||
|
return (ProcXQueryDevicePointer(client));
|
||||||
|
else if (stuff->data == X_WarpDevicePointer)
|
||||||
|
return (ProcXWarpDevicePointer(client));
|
||||||
else {
|
else {
|
||||||
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
||||||
}
|
}
|
||||||
|
@ -423,6 +429,10 @@ SProcIDispatch(register ClientPtr client)
|
||||||
return (SProcXGetDeviceControl(client));
|
return (SProcXGetDeviceControl(client));
|
||||||
else if (stuff->data == X_ChangeDeviceControl)
|
else if (stuff->data == X_ChangeDeviceControl)
|
||||||
return (SProcXChangeDeviceControl(client));
|
return (SProcXChangeDeviceControl(client));
|
||||||
|
else if (stuff->data == X_QueryDevicePointer)
|
||||||
|
return (SProcXQueryDevicePointer(client));
|
||||||
|
else if (stuff->data == X_WarpDevicePointer)
|
||||||
|
return (SProcXWarpDevicePointer(client));
|
||||||
else {
|
else {
|
||||||
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
||||||
}
|
}
|
||||||
|
@ -495,6 +505,9 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
|
||||||
else if (rep->RepType == X_ChangeDeviceControl)
|
else if (rep->RepType == X_ChangeDeviceControl)
|
||||||
SRepXChangeDeviceControl(client, len,
|
SRepXChangeDeviceControl(client, len,
|
||||||
(xChangeDeviceControlReply *) rep);
|
(xChangeDeviceControlReply *) rep);
|
||||||
|
else if (rep->RepType == X_QueryDevicePointer)
|
||||||
|
SRepXQueryDevicePointer(client, len,
|
||||||
|
(xQueryDevicePointerReply *) rep);
|
||||||
else {
|
else {
|
||||||
FatalError("XINPUT confused sending swapped reply");
|
FatalError("XINPUT confused sending swapped reply");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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 */
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
|
@ -117,9 +117,6 @@ FreeCursor(pointer value, XID cid)
|
||||||
ScreenPtr pscr;
|
ScreenPtr pscr;
|
||||||
DeviceIntPtr pDev;
|
DeviceIntPtr pDev;
|
||||||
|
|
||||||
/* FIXME: MPX: When FreeClientRessources is called, it calls FreeCursor
|
|
||||||
* too often. Refcnt gots < 0 and FreeCursorBits segfaults because the
|
|
||||||
* memory is already freed. */
|
|
||||||
MPXDBG("freecursor refcount %d\n", pCurs->refcnt);
|
MPXDBG("freecursor refcount %d\n", pCurs->refcnt);
|
||||||
if ( --pCurs->refcnt != 0)
|
if ( --pCurs->refcnt != 0)
|
||||||
return(Success);
|
return(Success);
|
||||||
|
|
|
@ -324,7 +324,6 @@ static CARD8 criticalEvents[32] =
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef PANORAMIX
|
#ifdef PANORAMIX
|
||||||
static void ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py);
|
|
||||||
static void PostNewCursor(DeviceIntPtr pDev);
|
static void PostNewCursor(DeviceIntPtr pDev);
|
||||||
|
|
||||||
#define SyntheticMotion(dev, x, y) \
|
#define SyntheticMotion(dev, x, y) \
|
||||||
|
@ -700,7 +699,7 @@ SetCriticalEvent(int event)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SHAPE
|
#ifdef SHAPE
|
||||||
static void
|
void
|
||||||
ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
|
ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
|
||||||
{
|
{
|
||||||
BoxRec box;
|
BoxRec box;
|
||||||
|
|
|
@ -434,9 +434,9 @@ xf86WarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
|
||||||
{
|
{
|
||||||
int sigstate;
|
int sigstate;
|
||||||
sigstate = xf86BlockSIGIO ();
|
sigstate = xf86BlockSIGIO ();
|
||||||
miPointerWarpCursor(pDev, pScreen,x,y);
|
miPointerWarpCursor(pDev, pScreen, x, y);
|
||||||
|
|
||||||
xf86Info.currentScreen = pScreen;
|
xf86Info.currentScreen = pScreen;
|
||||||
xf86UnblockSIGIO (sigstate);
|
xf86UnblockSIGIO (sigstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,10 +132,10 @@ xf86ProcessCommonOptions(LocalDevicePtr local,
|
||||||
xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name);
|
xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xf86SetBoolOption(list, "IsMPDevice", 0)) {
|
if (xf86SetBoolOption(list, "SharedPointer", 0)) {
|
||||||
local->flags |= XI86_MP_DEVICE;
|
local->flags &= ~XI86_SHARED_POINTER;
|
||||||
xf86Msg(X_CONFIG, "%s: is MP device\n", local->name);
|
xf86Msg(X_CONFIG, "%s: is shared device\n", local->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xf86SetBoolOption(list, "SendDragEvents", 1)) {
|
if (xf86SetBoolOption(list, "SendDragEvents", 1)) {
|
||||||
local->flags |= XI86_SEND_DRAG_EVENTS;
|
local->flags |= XI86_SEND_DRAG_EVENTS;
|
||||||
|
@ -171,7 +171,7 @@ xf86ActivateDevice(LocalDevicePtr local)
|
||||||
local->dev = dev;
|
local->dev = dev;
|
||||||
|
|
||||||
dev->coreEvents = local->flags & XI86_ALWAYS_CORE;
|
dev->coreEvents = local->flags & XI86_ALWAYS_CORE;
|
||||||
dev->isMPDev = (local->flags & XI86_MP_DEVICE);
|
dev->isMPDev = !(local->flags & XI86_SHARED_POINTER);
|
||||||
InitSprite(dev, dev->isMPDev);
|
InitSprite(dev, dev->isMPDev);
|
||||||
|
|
||||||
RegisterOtherDevice(dev);
|
RegisterOtherDevice(dev);
|
||||||
|
|
|
@ -82,7 +82,7 @@
|
||||||
#define XI86_CORE_KEYBOARD 0x20 /* device is the core keyboard */
|
#define XI86_CORE_KEYBOARD 0x20 /* device is the core keyboard */
|
||||||
#define XI86_POINTER_CAPABLE 0x40 /* capable of being a core pointer */
|
#define XI86_POINTER_CAPABLE 0x40 /* capable of being a core pointer */
|
||||||
#define XI86_KEYBOARD_CAPABLE 0x80 /* capable of being a core keyboard */
|
#define XI86_KEYBOARD_CAPABLE 0x80 /* capable of being a core keyboard */
|
||||||
#define XI86_MP_DEVICE 0x100 /* device is multipointer device */
|
#define XI86_SHARED_POINTER 0x100 /* device shares core cursor */
|
||||||
|
|
||||||
#define XI_PRIVATE(dev) \
|
#define XI_PRIVATE(dev) \
|
||||||
(((LocalDevicePtr)((dev)->public.devicePrivate))->private)
|
(((LocalDevicePtr)((dev)->public.devicePrivate))->private)
|
||||||
|
|
|
@ -416,6 +416,13 @@ extern void SetMaskForEvent(
|
||||||
Mask /* mask */,
|
Mask /* mask */,
|
||||||
int /* event */);
|
int /* event */);
|
||||||
|
|
||||||
|
#ifdef SHAPE
|
||||||
|
extern void ConfineToShape(
|
||||||
|
DeviceIntPtr /* pDev */,
|
||||||
|
RegionPtr /* shape */,
|
||||||
|
int* /* px */,
|
||||||
|
int* /* py */);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern Bool IsParent(
|
extern Bool IsParent(
|
||||||
WindowPtr /* maybeparent */,
|
WindowPtr /* maybeparent */,
|
||||||
|
|
Loading…
Reference in New Issue