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> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
10d6c3ca10
commit
07a892cd82
|
@ -1261,7 +1261,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
|
||||||
xi2event->group.effective_group = dev->key->xkbInfo->state.group;
|
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,
|
DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
|
||||||
GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
|
GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
|
||||||
|
|
43
dix/events.c
43
dix/events.c
|
@ -2181,9 +2181,8 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
|
||||||
return 2;
|
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];
|
WindowPtr w = pSprite->spriteTrace[pSprite->spriteTraceGood-1];
|
||||||
Window child = None;
|
Window child = None;
|
||||||
|
|
||||||
|
@ -2222,16 +2221,14 @@ static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
FixUpEventFromWindow(
|
FixUpEventFromWindow(
|
||||||
DeviceIntPtr pDev,
|
SpritePtr pSprite,
|
||||||
xEvent *xE,
|
xEvent *xE,
|
||||||
WindowPtr pWin,
|
WindowPtr pWin,
|
||||||
Window child,
|
Window child,
|
||||||
Bool calcChild)
|
Bool calcChild)
|
||||||
{
|
{
|
||||||
SpritePtr pSprite = pDev->spriteInfo->sprite;
|
|
||||||
|
|
||||||
if (calcChild)
|
if (calcChild)
|
||||||
child = FindChildForEvent(pDev, pWin);
|
child = FindChildForEvent(pSprite, pWin);
|
||||||
|
|
||||||
if (XI2_EVENT(xE))
|
if (XI2_EVENT(xE))
|
||||||
{
|
{
|
||||||
|
@ -2247,7 +2244,7 @@ FixUpEventFromWindow(
|
||||||
event->evtype == XI_PropertyEvent)
|
event->evtype == XI_PropertyEvent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
event->root = GetCurrentRootWindow(pDev)->drawable.id;
|
event->root = RootWindow(pSprite)->drawable.id;
|
||||||
event->event = pWin->drawable.id;
|
event->event = pWin->drawable.id;
|
||||||
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
|
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
|
||||||
{
|
{
|
||||||
|
@ -2268,7 +2265,7 @@ FixUpEventFromWindow(
|
||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
XE_KBPTR.root = GetCurrentRootWindow(pDev)->drawable.id;
|
XE_KBPTR.root = RootWindow(pSprite)->drawable.id;
|
||||||
XE_KBPTR.event = pWin->drawable.id;
|
XE_KBPTR.event = pWin->drawable.id;
|
||||||
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
|
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
|
||||||
{
|
{
|
||||||
|
@ -2374,6 +2371,7 @@ int
|
||||||
DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
|
DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
|
||||||
WindowPtr stopAt, DeviceIntPtr dev)
|
WindowPtr stopAt, DeviceIntPtr dev)
|
||||||
{
|
{
|
||||||
|
SpritePtr pSprite = dev->spriteInfo->sprite;
|
||||||
Window child = None;
|
Window child = None;
|
||||||
Mask filter;
|
Mask filter;
|
||||||
int deliveries = 0;
|
int deliveries = 0;
|
||||||
|
@ -2396,7 +2394,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
|
||||||
{
|
{
|
||||||
/* XXX: XACE */
|
/* XXX: XACE */
|
||||||
filter = GetEventFilter(dev, xi2);
|
filter = GetEventFilter(dev, xi2);
|
||||||
FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
|
FixUpEventFromWindow(pSprite, xi2, pWin, child, FALSE);
|
||||||
deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
|
deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
|
||||||
filter, grab);
|
filter, grab);
|
||||||
free(xi2);
|
free(xi2);
|
||||||
|
@ -2414,7 +2412,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
|
||||||
if (rc == Success) {
|
if (rc == Success) {
|
||||||
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
|
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
|
||||||
filter = GetEventFilter(dev, xE);
|
filter = GetEventFilter(dev, xE);
|
||||||
FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
|
FixUpEventFromWindow(pSprite, xE, pWin, child, FALSE);
|
||||||
deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
|
deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
|
||||||
filter, grab);
|
filter, grab);
|
||||||
if (deliveries > 0)
|
if (deliveries > 0)
|
||||||
|
@ -2432,7 +2430,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
|
||||||
if (rc == Success) {
|
if (rc == Success) {
|
||||||
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, &core, 1) == Success) {
|
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, &core, 1) == Success) {
|
||||||
filter = GetEventFilter(dev, &core);
|
filter = GetEventFilter(dev, &core);
|
||||||
FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
|
FixUpEventFromWindow(pSprite, &core, pWin, child, FALSE);
|
||||||
deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
|
deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
|
||||||
filter, grab);
|
filter, grab);
|
||||||
if (deliveries > 0)
|
if (deliveries > 0)
|
||||||
|
@ -3368,6 +3366,7 @@ CheckPassiveGrabsOnWindow(
|
||||||
DeviceEvent *event,
|
DeviceEvent *event,
|
||||||
BOOL checkCore)
|
BOOL checkCore)
|
||||||
{
|
{
|
||||||
|
SpritePtr pSprite = device->spriteInfo->sprite;
|
||||||
GrabPtr grab = wPassiveGrabs(pWin);
|
GrabPtr grab = wPassiveGrabs(pWin);
|
||||||
GrabRec tempGrab;
|
GrabRec tempGrab;
|
||||||
GrabInfoPtr grabinfo;
|
GrabInfoPtr grabinfo;
|
||||||
|
@ -3531,7 +3530,7 @@ CheckPassiveGrabsOnWindow(
|
||||||
|
|
||||||
if (xE)
|
if (xE)
|
||||||
{
|
{
|
||||||
FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
|
FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
|
||||||
|
|
||||||
TryClientEvents(rClient(grab), device, xE, count,
|
TryClientEvents(rClient(grab), device, xE, count,
|
||||||
GetEventFilter(device, xE),
|
GetEventFilter(device, xE),
|
||||||
|
@ -3683,7 +3682,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
|
||||||
{
|
{
|
||||||
/* XXX: XACE */
|
/* XXX: XACE */
|
||||||
int filter = GetEventFilter(keybd, xi2);
|
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,
|
deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
|
||||||
filter, NullGrab);
|
filter, NullGrab);
|
||||||
if (deliveries > 0)
|
if (deliveries > 0)
|
||||||
|
@ -3696,7 +3695,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
|
||||||
if (rc == Success &&
|
if (rc == Success &&
|
||||||
XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == 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,
|
deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
|
||||||
GetEventFilter(keybd, xE),
|
GetEventFilter(keybd, xE),
|
||||||
NullGrab);
|
NullGrab);
|
||||||
|
@ -3712,7 +3711,8 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
|
||||||
rc = EventToCore(event, &core);
|
rc = EventToCore(event, &core);
|
||||||
if (rc == Success) {
|
if (rc == Success) {
|
||||||
if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, &core, 1) == 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,
|
deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
|
||||||
GetEventFilter(keybd, &core),
|
GetEventFilter(keybd, &core),
|
||||||
NullGrab);
|
NullGrab);
|
||||||
|
@ -3802,8 +3802,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
rc = EventToCore(event, &core);
|
rc = EventToCore(event, &core);
|
||||||
if (rc == Success)
|
if (rc == Success)
|
||||||
{
|
{
|
||||||
FixUpEventFromWindow(thisDev, &core, grab->window,
|
FixUpEventFromWindow(pSprite, &core, grab->window, None, TRUE);
|
||||||
None, TRUE);
|
|
||||||
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
|
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
|
||||||
grab->window, &core, 1) ||
|
grab->window, &core, 1) ||
|
||||||
XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
|
XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
|
||||||
|
@ -3830,7 +3829,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
grab->xi2mask[XIAllMasterDevices][evtype/8] |
|
grab->xi2mask[XIAllMasterDevices][evtype/8] |
|
||||||
grab->xi2mask[thisDev->id][evtype/8];
|
grab->xi2mask[thisDev->id][evtype/8];
|
||||||
/* try XI2 event */
|
/* try XI2 event */
|
||||||
FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
|
FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
|
||||||
/* XXX: XACE */
|
/* XXX: XACE */
|
||||||
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
|
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
|
||||||
GetEventFilter(thisDev, xi2), grab);
|
GetEventFilter(thisDev, xi2), grab);
|
||||||
|
@ -3851,8 +3850,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
else
|
else
|
||||||
mask = grab->eventMask;
|
mask = grab->eventMask;
|
||||||
|
|
||||||
FixUpEventFromWindow(thisDev, xi, grab->window,
|
FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
|
||||||
None, TRUE);
|
|
||||||
|
|
||||||
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
|
if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
|
||||||
grab->window, xi, count) ||
|
grab->window, xi, count) ||
|
||||||
|
@ -4198,7 +4196,7 @@ CoreEnterLeaveEvent(
|
||||||
event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
|
event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
|
||||||
event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
|
event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
|
||||||
/* Counts on the same initial structure of crossing & button events! */
|
/* 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 */
|
/* Enter/Leave events always set child */
|
||||||
event.u.enterLeave.child = child;
|
event.u.enterLeave.child = child;
|
||||||
event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
|
event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
|
||||||
|
@ -4298,7 +4296,8 @@ DeviceEnterLeaveEvent(
|
||||||
event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
|
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);
|
filter = GetEventFilter(mouse, (xEvent*)event);
|
||||||
|
|
||||||
|
|
|
@ -528,7 +528,7 @@ extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
|
||||||
/* misc event helpers */
|
/* misc event helpers */
|
||||||
extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
|
extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
|
||||||
extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
|
extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
|
||||||
void FixUpEventFromWindow(DeviceIntPtr pDev,
|
void FixUpEventFromWindow(SpritePtr pSprite,
|
||||||
xEvent *xE,
|
xEvent *xE,
|
||||||
WindowPtr pWin,
|
WindowPtr pWin,
|
||||||
Window child,
|
Window child,
|
||||||
|
|
Loading…
Reference in New Issue