dix: pass the sourceid around for enter/leave events.
The sourceid for enter/leave events as a result of pointer motion is the ID of the slave device. The sourceid for those as a result of a grab activating is the device itself. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
c299b2228f
commit
46ac9f9241
|
@ -218,6 +218,7 @@ CommonAncestor(
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
DeviceEnterNotifies(DeviceIntPtr dev,
|
DeviceEnterNotifies(DeviceIntPtr dev,
|
||||||
|
int sourceid,
|
||||||
WindowPtr ancestor,
|
WindowPtr ancestor,
|
||||||
WindowPtr child,
|
WindowPtr child,
|
||||||
int mode,
|
int mode,
|
||||||
|
@ -227,8 +228,8 @@ DeviceEnterNotifies(DeviceIntPtr dev,
|
||||||
|
|
||||||
if (ancestor == parent)
|
if (ancestor == parent)
|
||||||
return;
|
return;
|
||||||
DeviceEnterNotifies(dev, ancestor, parent, mode, detail);
|
DeviceEnterNotifies(dev, sourceid, ancestor, parent, mode, detail);
|
||||||
DeviceEnterLeaveEvent(dev, XI_Enter, mode, detail, parent,
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Enter, mode, detail, parent,
|
||||||
child->drawable.id);
|
child->drawable.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -323,6 +324,7 @@ CoreLeaveNotifies(DeviceIntPtr dev,
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
DeviceLeaveNotifies(DeviceIntPtr dev,
|
DeviceLeaveNotifies(DeviceIntPtr dev,
|
||||||
|
int sourceid,
|
||||||
WindowPtr child,
|
WindowPtr child,
|
||||||
WindowPtr ancestor,
|
WindowPtr ancestor,
|
||||||
int mode,
|
int mode,
|
||||||
|
@ -334,7 +336,7 @@ DeviceLeaveNotifies(DeviceIntPtr dev,
|
||||||
return;
|
return;
|
||||||
for (win = child->parent; win != ancestor; win = win->parent)
|
for (win = child->parent; win != ancestor; win = win->parent)
|
||||||
{
|
{
|
||||||
DeviceEnterLeaveEvent(dev, XI_Leave, mode, detail, win,
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Leave, mode, detail, win,
|
||||||
child->drawable.id);
|
child->drawable.id);
|
||||||
child = win;
|
child = win;
|
||||||
}
|
}
|
||||||
|
@ -562,30 +564,31 @@ CoreEnterLeaveEvents(DeviceIntPtr dev,
|
||||||
|
|
||||||
static void
|
static void
|
||||||
DeviceEnterLeaveEvents(DeviceIntPtr dev,
|
DeviceEnterLeaveEvents(DeviceIntPtr dev,
|
||||||
|
int sourceid,
|
||||||
WindowPtr from,
|
WindowPtr from,
|
||||||
WindowPtr to,
|
WindowPtr to,
|
||||||
int mode)
|
int mode)
|
||||||
{
|
{
|
||||||
if (IsParent(from, to))
|
if (IsParent(from, to))
|
||||||
{
|
{
|
||||||
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyInferior, from, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Leave, mode, NotifyInferior, from, None);
|
||||||
DeviceEnterNotifies(dev, from, to, mode, NotifyVirtual);
|
DeviceEnterNotifies(dev, sourceid, from, to, mode, NotifyVirtual);
|
||||||
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyAncestor, to, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Enter, mode, NotifyAncestor, to, None);
|
||||||
}
|
}
|
||||||
else if (IsParent(to, from))
|
else if (IsParent(to, from))
|
||||||
{
|
{
|
||||||
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyAncestor, from, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Leave, mode, NotifyAncestor, from, None);
|
||||||
DeviceLeaveNotifies(dev, from, to, mode, NotifyVirtual);
|
DeviceLeaveNotifies(dev, sourceid, from, to, mode, NotifyVirtual);
|
||||||
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyInferior, to, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Enter, mode, NotifyInferior, to, None);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* neither from nor to is descendent of the other */
|
{ /* neither from nor to is descendent of the other */
|
||||||
WindowPtr common = CommonAncestor(to, from);
|
WindowPtr common = CommonAncestor(to, from);
|
||||||
/* common == NullWindow ==> different screens */
|
/* common == NullWindow ==> different screens */
|
||||||
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyNonlinear, from, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Leave, mode, NotifyNonlinear, from, None);
|
||||||
DeviceLeaveNotifies(dev, from, common, mode, NotifyNonlinearVirtual);
|
DeviceLeaveNotifies(dev, sourceid, from, common, mode, NotifyNonlinearVirtual);
|
||||||
DeviceEnterNotifies(dev, common, to, mode, NotifyNonlinearVirtual);
|
DeviceEnterNotifies(dev, sourceid, common, to, mode, NotifyNonlinearVirtual);
|
||||||
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyNonlinear, to, None);
|
DeviceEnterLeaveEvent(dev, sourceid, XI_Enter, mode, NotifyNonlinear, to, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -598,6 +601,7 @@ DeviceEnterLeaveEvents(DeviceIntPtr dev,
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
DoEnterLeaveEvents(DeviceIntPtr pDev,
|
DoEnterLeaveEvents(DeviceIntPtr pDev,
|
||||||
|
int sourceid,
|
||||||
WindowPtr fromWin,
|
WindowPtr fromWin,
|
||||||
WindowPtr toWin,
|
WindowPtr toWin,
|
||||||
int mode)
|
int mode)
|
||||||
|
@ -610,7 +614,7 @@ DoEnterLeaveEvents(DeviceIntPtr pDev,
|
||||||
|
|
||||||
if (mode != XINotifyPassiveGrab && mode != XINotifyPassiveUngrab)
|
if (mode != XINotifyPassiveGrab && mode != XINotifyPassiveUngrab)
|
||||||
CoreEnterLeaveEvents(pDev, fromWin, toWin, mode);
|
CoreEnterLeaveEvents(pDev, fromWin, toWin, mode);
|
||||||
DeviceEnterLeaveEvents(pDev, fromWin, toWin, mode);
|
DeviceEnterLeaveEvents(pDev, sourceid, fromWin, toWin, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
extern void DoEnterLeaveEvents(
|
extern void DoEnterLeaveEvents(
|
||||||
DeviceIntPtr pDev,
|
DeviceIntPtr pDev,
|
||||||
|
int sourceid,
|
||||||
WindowPtr fromWin,
|
WindowPtr fromWin,
|
||||||
WindowPtr toWin,
|
WindowPtr toWin,
|
||||||
int mode
|
int mode
|
||||||
|
@ -64,6 +65,7 @@ extern void CoreEnterLeaveEvent(DeviceIntPtr mouse,
|
||||||
WindowPtr pWin,
|
WindowPtr pWin,
|
||||||
Window child);
|
Window child);
|
||||||
extern void DeviceEnterLeaveEvent(DeviceIntPtr mouse,
|
extern void DeviceEnterLeaveEvent(DeviceIntPtr mouse,
|
||||||
|
int sourceid,
|
||||||
int type,
|
int type,
|
||||||
int mode,
|
int mode,
|
||||||
int detail,
|
int detail,
|
||||||
|
|
23
dix/events.c
23
dix/events.c
|
@ -1474,7 +1474,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
|
||||||
mouse->spriteInfo->sprite->hotPhys.y = 0;
|
mouse->spriteInfo->sprite->hotPhys.y = 0;
|
||||||
ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
|
ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
|
||||||
}
|
}
|
||||||
DoEnterLeaveEvents(mouse, oldWin, grab->window, NotifyGrab);
|
DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
|
||||||
mouse->valuator->motionHintWindow = NullWindow;
|
mouse->valuator->motionHintWindow = NullWindow;
|
||||||
if (syncEvents.playingEvents)
|
if (syncEvents.playingEvents)
|
||||||
grabinfo->grabTime = syncEvents.time;
|
grabinfo->grabTime = syncEvents.time;
|
||||||
|
@ -1511,7 +1511,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
|
||||||
if (dev->deviceGrab.sync.other == grab)
|
if (dev->deviceGrab.sync.other == grab)
|
||||||
dev->deviceGrab.sync.other = NullGrab;
|
dev->deviceGrab.sync.other = NullGrab;
|
||||||
}
|
}
|
||||||
DoEnterLeaveEvents(mouse, grab->window,
|
DoEnterLeaveEvents(mouse, mouse->id, grab->window,
|
||||||
mouse->spriteInfo->sprite->win, NotifyUngrab);
|
mouse->spriteInfo->sprite->win, NotifyUngrab);
|
||||||
if (grab->confineTo)
|
if (grab->confineTo)
|
||||||
ConfineCursorToWindow(mouse, RootWindow(mouse), FALSE, FALSE);
|
ConfineCursorToWindow(mouse, RootWindow(mouse), FALSE, FALSE);
|
||||||
|
@ -2585,7 +2585,7 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
|
||||||
if (dev->deviceGrab.grab->window == win ||
|
if (dev->deviceGrab.grab->window == win ||
|
||||||
IsParent(dev->deviceGrab.grab->window, win))
|
IsParent(dev->deviceGrab.grab->window, win))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
|
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
|
||||||
(*dev->deviceGrab.DeactivateGrab)(dev);
|
(*dev->deviceGrab.DeactivateGrab)(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2602,7 +2602,7 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
|
||||||
event.detail.button = 0;
|
event.detail.button = 0;
|
||||||
rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
|
rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
|
||||||
if (rc)
|
if (rc)
|
||||||
DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
|
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2625,7 +2625,7 @@ ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
|
||||||
if (dev->deviceGrab.grab->window == win ||
|
if (dev->deviceGrab.grab->window == win ||
|
||||||
IsParent(dev->deviceGrab.grab->window, win))
|
IsParent(dev->deviceGrab.grab->window, win))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
|
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
|
||||||
(*dev->deviceGrab.DeactivateGrab)(dev);
|
(*dev->deviceGrab.DeactivateGrab)(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2639,7 +2639,7 @@ ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
|
||||||
event.detail.button = 0;
|
event.detail.button = 0;
|
||||||
rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
|
rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
|
||||||
if (rc)
|
if (rc)
|
||||||
DoEnterLeaveEvents(dev, old, win, XINotifyPassiveGrab);
|
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveGrab);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -2740,12 +2740,16 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
|
||||||
|
|
||||||
if (newSpriteWin != prevSpriteWin)
|
if (newSpriteWin != prevSpriteWin)
|
||||||
{
|
{
|
||||||
if (!ev)
|
int sourceid;
|
||||||
|
if (!ev) {
|
||||||
UpdateCurrentTimeIf();
|
UpdateCurrentTimeIf();
|
||||||
|
sourceid = pDev->id; /* when from WindowsRestructured */
|
||||||
|
} else
|
||||||
|
sourceid = ev->sourceid;
|
||||||
|
|
||||||
if (prevSpriteWin != NullWindow) {
|
if (prevSpriteWin != NullWindow) {
|
||||||
if (!ActivateEnterGrab(pDev, prevSpriteWin, newSpriteWin))
|
if (!ActivateEnterGrab(pDev, prevSpriteWin, newSpriteWin))
|
||||||
DoEnterLeaveEvents(pDev, prevSpriteWin,
|
DoEnterLeaveEvents(pDev, sourceid, prevSpriteWin,
|
||||||
newSpriteWin, NotifyNormal);
|
newSpriteWin, NotifyNormal);
|
||||||
}
|
}
|
||||||
/* set pSprite->win after ActivateEnterGrab, otherwise
|
/* set pSprite->win after ActivateEnterGrab, otherwise
|
||||||
|
@ -4216,6 +4220,7 @@ CoreEnterLeaveEvent(
|
||||||
void
|
void
|
||||||
DeviceEnterLeaveEvent(
|
DeviceEnterLeaveEvent(
|
||||||
DeviceIntPtr mouse,
|
DeviceIntPtr mouse,
|
||||||
|
int sourceid,
|
||||||
int type,
|
int type,
|
||||||
int mode,
|
int mode,
|
||||||
int detail,
|
int detail,
|
||||||
|
@ -4245,7 +4250,7 @@ DeviceEnterLeaveEvent(
|
||||||
event->detail = detail;
|
event->detail = detail;
|
||||||
event->time = currentTime.milliseconds;
|
event->time = currentTime.milliseconds;
|
||||||
event->deviceid = mouse->id;
|
event->deviceid = mouse->id;
|
||||||
event->sourceid = 0; /*XXX */
|
event->sourceid = sourceid;
|
||||||
event->mode = mode;
|
event->mode = mode;
|
||||||
event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
|
event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
|
||||||
event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
|
event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user