Xi: Add SetClientPointer request handling.
This commit is contained in:
parent
b3b2a6a0d4
commit
07806f4081
|
@ -76,6 +76,8 @@ libXi_la_SOURCES = \
|
|||
sendexev.h \
|
||||
setbmap.c \
|
||||
setbmap.h \
|
||||
setcptr.c \
|
||||
setcptr.h \
|
||||
setdval.c \
|
||||
setdval.h \
|
||||
setfocus.c \
|
||||
|
|
|
@ -110,6 +110,7 @@ SOFTWARE.
|
|||
#include "sendexev.h"
|
||||
#include "chgkmap.h"
|
||||
#include "setbmap.h"
|
||||
#include "setcptr.h"
|
||||
#include "setdval.h"
|
||||
#include "setfocus.h"
|
||||
#include "setmmap.h"
|
||||
|
@ -367,6 +368,8 @@ ProcIDispatch(register ClientPtr client)
|
|||
return (ProcXChangeWindowAccess(client));
|
||||
else if (stuff->data == X_QueryWindowAccess)
|
||||
return ProcXQueryWindowAccess(client);
|
||||
else if (stuff->data == X_SetClientPointer)
|
||||
return ProcXSetClientPointer(client);
|
||||
else {
|
||||
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
||||
}
|
||||
|
@ -472,6 +475,8 @@ SProcIDispatch(register ClientPtr client)
|
|||
return (SProcXChangeWindowAccess(client));
|
||||
else if (stuff->data == X_QueryWindowAccess)
|
||||
return SProcXQueryWindowAccess(client);
|
||||
else if (stuff->data == X_SetClientPointer)
|
||||
return SProcXSetClientPointer(client);
|
||||
else {
|
||||
SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest);
|
||||
}
|
||||
|
|
105
Xi/setcptr.c
Normal file
105
Xi/setcptr.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
|
||||
Copyright 2007 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 set the client pointer for the owner of the given window.
|
||||
* All subsequent calls that are ambiguous will choose the client pointer as
|
||||
* default value.
|
||||
*/
|
||||
|
||||
|
||||
#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 "setcptr.h"
|
||||
|
||||
int
|
||||
SProcXSetClientPointer(ClientPtr client)
|
||||
{
|
||||
char n;
|
||||
|
||||
REQUEST(xSetClientPointerReq);
|
||||
swaps(&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xSetClientPointerReq);
|
||||
return (ProcXSetClientPointer(client));
|
||||
}
|
||||
|
||||
int
|
||||
ProcXSetClientPointer(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr pDev;
|
||||
WindowPtr pWin;
|
||||
int err;
|
||||
|
||||
REQUEST(xSetClientPointerReq);
|
||||
REQUEST_SIZE_MATCH(xSetClientPointerReq);
|
||||
|
||||
|
||||
pDev = LookupDeviceIntRec(stuff->deviceid);
|
||||
if (pDev == NULL || !IsPointerDevice(pDev))
|
||||
{
|
||||
SendErrorToClient(client, IReqCode, X_SetClientPointer, 0,
|
||||
BadDevice);
|
||||
return Success;
|
||||
}
|
||||
|
||||
if (stuff->win != None)
|
||||
{
|
||||
err = dixLookupWindow(&pWin, stuff->win, client, DixReadWriteAccess);
|
||||
if (err != Success)
|
||||
{
|
||||
SendErrorToClient(client, IReqCode, X_SetClientPointer,
|
||||
stuff->win, err);
|
||||
return Success;
|
||||
}
|
||||
}
|
||||
|
||||
if (!SetClientPointer(wClient(pWin), client, pDev))
|
||||
{
|
||||
SendErrorToClient(client, IReqCode, X_SetClientPointer,
|
||||
stuff->win, BadAccess);
|
||||
return Success;
|
||||
}
|
||||
return Success;
|
||||
}
|
39
Xi/setcptr.h
Normal file
39
Xi/setcptr.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
|
||||
Copyright 2007 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.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef SETCPTR_H
|
||||
#define SETCPTR_H 1
|
||||
|
||||
int SProcXSetClientPointer(ClientPtr /* client */);
|
||||
int ProcXSetClientPointer(ClientPtr /* client */);
|
||||
|
||||
#endif /* SETCPTR_H */
|
|
@ -131,6 +131,7 @@ FreeCursor(pointer value, XID cid)
|
|||
}
|
||||
FreeCursorBits(pCurs->bits);
|
||||
xfree( pCurs);
|
||||
MPXDBG("freeing memory for cursor\n");
|
||||
return(Success);
|
||||
}
|
||||
|
||||
|
|
72
dix/events.c
72
dix/events.c
|
@ -1706,12 +1706,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, register WindowPtr pWin, xEvent
|
|||
if (filter != CantBeFiltered &&
|
||||
!((wOtherEventMasks(pWin)|pWin->eventMask) & filter))
|
||||
return 0;
|
||||
|
||||
/* core event? check for grab interference */
|
||||
if (!(type & EXTENSION_EVENT_BASE) &&
|
||||
IsInterferingGrab(wClient(pWin), pDev, pEvents))
|
||||
return 0;
|
||||
|
||||
if ( (attempt = TryClientEvents(wClient(pWin), pEvents, count,
|
||||
pWin->eventMask, filter, grab)) )
|
||||
{
|
||||
|
@ -1740,11 +1734,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, register WindowPtr pWin, xEvent
|
|||
other = (InputClients *)wOtherClients(pWin);
|
||||
for (; other; other = other->next)
|
||||
{
|
||||
/* core event? check for grab interference */
|
||||
if (!(type & EXTENSION_EVENT_BASE) &&
|
||||
IsInterferingGrab(rClient(other), pDev, pEvents))
|
||||
continue;
|
||||
|
||||
if ( (attempt = TryClientEvents(rClient(other), pEvents, count,
|
||||
other->mask[mskidx], filter, grab)) )
|
||||
{
|
||||
|
@ -4861,11 +4850,22 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the client pointer for the given client. Second parameter setter could
|
||||
* be used in the future to determine access rights. Unused for now.
|
||||
*/
|
||||
_X_EXPORT Bool
|
||||
SetClientPointer(ClientPtr client, ClientPtr setter, DeviceIntPtr device)
|
||||
{
|
||||
client->clientPtr = device;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* PickPointer will pick an appropriate pointer for the given client.
|
||||
*
|
||||
* If a client pointer is set, it will pick the client pointer, otherwise the
|
||||
* first available pointer in the list. If no physical device is attached, it
|
||||
* will pick the core pointer.
|
||||
* will pick the core pointer, but will not store it on the client.
|
||||
*/
|
||||
_X_EXPORT DeviceIntPtr
|
||||
PickPointer(ClientPtr client)
|
||||
|
@ -4887,7 +4887,7 @@ PickPointer(ClientPtr client)
|
|||
if (!it)
|
||||
{
|
||||
ErrorF("Picking VCP\n");
|
||||
client->clientPtr = inputInfo.pointer;
|
||||
return inputInfo.pointer;
|
||||
}
|
||||
}
|
||||
return client->clientPtr;
|
||||
|
@ -4916,49 +4916,3 @@ PickKeyboard(ClientPtr client)
|
|||
return inputInfo.keyboard;
|
||||
}
|
||||
|
||||
/* A client that has one or more core grabs does not get core events from
|
||||
* devices it does not have a grab on. Legacy applications behave bad
|
||||
* otherwise because they are not used to it and the events interfere.
|
||||
* Only applies for core events.
|
||||
*
|
||||
* Return true if a core event from the device would interfere and should not
|
||||
* be delivered.
|
||||
*/
|
||||
Bool
|
||||
IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
|
||||
{
|
||||
DeviceIntPtr it = inputInfo.devices;
|
||||
|
||||
if (dev->coreGrab.grab && SameClient(dev->coreGrab.grab, client))
|
||||
return FALSE;
|
||||
|
||||
switch(event->u.u.type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
case MotionNotify:
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
while(it)
|
||||
{
|
||||
if (it != dev)
|
||||
{
|
||||
if (it->coreGrab.grab && SameClient(it->coreGrab.grab, client))
|
||||
{
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
}
|
||||
it = it->next;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -603,17 +603,17 @@ extern int TryClientEvents(
|
|||
|
||||
extern void WindowsRestructured(void);
|
||||
|
||||
extern Bool SetClientPointer(
|
||||
ClientPtr /* client */,
|
||||
ClientPtr /* setter */,
|
||||
DeviceIntPtr /* device */);
|
||||
|
||||
extern DeviceIntPtr PickPointer(
|
||||
ClientPtr /* client */);
|
||||
|
||||
extern DeviceIntPtr PickKeyboard(
|
||||
ClientPtr /* client */);
|
||||
|
||||
extern Bool IsInterferingGrab(
|
||||
ClientPtr /* client */,
|
||||
DeviceIntPtr /* dev */,
|
||||
xEvent* /* events */);
|
||||
|
||||
#ifdef PANORAMIX
|
||||
extern void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue
Block a user