summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2010-09-20 15:03:04 +1000
committerChase Douglas <chase.douglas@ubuntu.com>2010-10-13 21:37:41 +0200
commit547e933d4d842a5f92a60fdf07d43fd9f69ca138 (patch)
tree54cd81a7555fdcb1fba81884d7c8918145396b16
parentd29da02eb7d1aea8b5568e255f6ef12856a73b59 (diff)
Input: Pass sprite instead of device to FixUpEventFromWindow
Since FixUpEventFromWindow only uses the sprite trace to determine the window stack, pass in a sprite instead of hardcoding the device sprite, so we can deliver to windows other than the one currently containing the sprite. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r--Xi/exevents.c3
-rw-r--r--dix/events.c43
-rw-r--r--include/input.h3
-rw-r--r--include/inputstr.h4
4 files changed, 27 insertions, 26 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c
index e19e207fd..1f02cb0d9 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1262,7 +1262,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
xi2event->group.effective_group = dev->key->xkbInfo->state.group;
}
- FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
+ FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent*)xi2event, pWin,
+ None, FALSE);
DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
diff --git a/dix/events.c b/dix/events.c
index e8cf8d417..2c9005256 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2183,9 +2183,8 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
return 2;
}
-static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
+static Window FindChildForEvent(SpritePtr pSprite, WindowPtr event)
{
- SpritePtr pSprite = dev->spriteInfo->sprite;
WindowPtr w = pSprite->spriteTrace[pSprite->spriteTraceGood-1];
Window child = None;
@@ -2224,16 +2223,14 @@ static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
*/
void
FixUpEventFromWindow(
- DeviceIntPtr pDev,
+ SpritePtr pSprite,
xEvent *xE,
WindowPtr pWin,
Window child,
Bool calcChild)
{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
if (calcChild)
- child = FindChildForEvent(pDev, pWin);
+ child = FindChildForEvent(pSprite, pWin);
if (XI2_EVENT(xE))
{
@@ -2249,7 +2246,7 @@ FixUpEventFromWindow(
event->evtype == XI_PropertyEvent)
return;
- event->root = RootWindow(pDev)->drawable.id;
+ event->root = pSprite->spriteTrace[0]->drawable.id;
event->event = pWin->drawable.id;
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
{
@@ -2270,7 +2267,7 @@ FixUpEventFromWindow(
} else
{
- XE_KBPTR.root = RootWindow(pDev)->drawable.id;
+ XE_KBPTR.root = pSprite->spriteTrace[0]->drawable.id;
XE_KBPTR.event = pWin->drawable.id;
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
{
@@ -2387,6 +2384,7 @@ int
DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
WindowPtr stopAt, DeviceIntPtr dev)
{
+ SpritePtr pSprite = dev->spriteInfo->sprite;
Window child = None;
Mask filter;
int deliveries = 0;
@@ -2409,7 +2407,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
{
/* XXX: XACE */
filter = GetEventFilter(dev, xi2);
- FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
+ FixUpEventFromWindow(pSprite, xi2, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
filter, grab);
free(xi2);
@@ -2427,7 +2425,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
if (rc == Success) {
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
filter = GetEventFilter(dev, xE);
- FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
+ FixUpEventFromWindow(pSprite, xE, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
filter, grab);
if (deliveries > 0)
@@ -2445,7 +2443,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
if (rc == Success) {
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, &core, 1) == Success) {
filter = GetEventFilter(dev, &core);
- FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
+ FixUpEventFromWindow(pSprite, &core, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
filter, grab);
if (deliveries > 0)
@@ -3380,6 +3378,7 @@ CheckPassiveGrabsOnWindow(
DeviceEvent *event,
BOOL checkCore)
{
+ SpritePtr pSprite = device->spriteInfo->sprite;
GrabPtr grab = wPassiveGrabs(pWin);
GrabRec tempGrab;
GrabInfoPtr grabinfo;
@@ -3543,7 +3542,7 @@ CheckPassiveGrabsOnWindow(
if (xE)
{
- FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
+ FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
TryClientEvents(rClient(grab), device, xE, count,
GetEventFilter(device, xE),
@@ -3695,7 +3694,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
{
/* XXX: XACE */
int filter = GetEventFilter(keybd, xi2);
- FixUpEventFromWindow(ptr, xi2, focus, None, FALSE);
+ FixUpEventFromWindow(ptr->spriteInfo->sprite, xi2, focus, None, FALSE);
deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
filter, NullGrab);
if (deliveries > 0)
@@ -3708,7 +3707,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
if (rc == Success &&
XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
{
- FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
+ FixUpEventFromWindow(ptr->spriteInfo->sprite, xE, focus, None, FALSE);
deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
GetEventFilter(keybd, xE),
NullGrab);
@@ -3724,7 +3723,8 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
rc = EventToCore(event, &core);
if (rc == Success) {
if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, &core, 1) == Success) {
- FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
+ FixUpEventFromWindow(keybd->spriteInfo->sprite, &core, focus,
+ None, FALSE);
deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
GetEventFilter(keybd, &core),
NullGrab);
@@ -3814,8 +3814,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
rc = EventToCore(event, &core);
if (rc == Success)
{
- FixUpEventFromWindow(thisDev, &core, grab->window,
- None, TRUE);
+ FixUpEventFromWindow(pSprite, &core, grab->window, None, TRUE);
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
grab->window, &core, 1) ||
XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
@@ -3842,7 +3841,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
grab->xi2mask[XIAllMasterDevices][evtype/8] |
grab->xi2mask[thisDev->id][evtype/8];
/* try XI2 event */
- FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
+ FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
/* XXX: XACE */
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
GetEventFilter(thisDev, xi2), grab);
@@ -3863,8 +3862,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
else
mask = grab->eventMask;
- FixUpEventFromWindow(thisDev, xi, grab->window,
- None, TRUE);
+ FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
grab->window, xi, count) ||
@@ -4210,7 +4208,7 @@ CoreEnterLeaveEvent(
event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
/* Counts on the same initial structure of crossing & button events! */
- FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
+ FixUpEventFromWindow(mouse->spriteInfo->sprite, &event, pWin, None, FALSE);
/* Enter/Leave events always set child */
event.u.enterLeave.child = child;
event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
@@ -4310,7 +4308,8 @@ DeviceEnterLeaveEvent(
event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
}
- FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
+ FixUpEventFromWindow(mouse->spriteInfo->sprite, (xEvent*)event, pWin,
+ None, FALSE);
filter = GetEventFilter(mouse, (xEvent*)event);
diff --git a/include/input.h b/include/input.h
index 8a1f41c0a..dbdc863c4 100644
--- a/include/input.h
+++ b/include/input.h
@@ -103,6 +103,7 @@ typedef struct _OtherClients *OtherClientsPtr;
typedef struct _InputClients *InputClientsPtr;
typedef struct _DeviceIntRec *DeviceIntPtr;
typedef struct _ClassesRec *ClassesPtr;
+typedef struct _SpriteRec *SpritePtr;
typedef union _GrabMask GrabMask;
typedef struct _EventList {
@@ -539,7 +540,7 @@ extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
/* misc event helpers */
extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
-void FixUpEventFromWindow(DeviceIntPtr pDev,
+void FixUpEventFromWindow(SpritePtr pSprite,
xEvent *xE,
WindowPtr pWin,
Window child,
diff --git a/include/inputstr.h b/include/inputstr.h
index 1b504e939..e1cf06ad5 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -362,7 +362,7 @@ typedef struct _ClassesRec {
/**
* Sprite information for a device.
*/
-typedef struct {
+typedef struct _SpriteRec {
CursorPtr current;
BoxRec hotLimits; /* logical constraints of hot spot */
Bool confined; /* confined to screen */
@@ -398,7 +398,7 @@ typedef struct {
ScreenPtr pEnqueueScreen;
ScreenPtr pDequeueScreen;
-} SpriteRec, *SpritePtr;
+} SpriteRec;
/* Device properties */
typedef struct _XIPropertyValue