dix GetSpriteWindow() adjusted for MPX

added device dependency for MPX to DoEnterLeaveEvents,
	EnterLeaveEvents, EnterNotifies, LeaveNotifies and
	FixUpEventFromWindow.
This commit is contained in:
Peter Hutterer 2006-11-22 17:06:47 +10:30 committed by Peter Hutterer
parent 70383105de
commit 8c16f21d5d
6 changed files with 86 additions and 40 deletions

View File

@ -17,6 +17,19 @@ Files:
Xi/exevents.c
dix GetSpriteWindow() adjusted for MPX
added device dependency for MPX to DoEnterLeaveEvents,
EnterLeaveEvents, EnterNotifies, LeaveNotifies and
FixUpEventFromWindow.
Files:
Xext/security.c
Xi/exevents.c
ddx/ddxFakeMtn.c
dix/events.c
include/dix.h
== 21.11.06 ==
mi: added MPX to miSpriteReportDamage
added id field to miCursorInfoPtr, required to pass through to miDC

View File

@ -745,12 +745,12 @@ SecurityDetermineEventPropogationLimits(
if (pFocusWin == PointerRootWin)
{ /* focus follows the pointer */
*ppWin = GetSpriteWindow();
*ppWin = GetSpriteWindow(dev);
*ppStopWin = NULL; /* propogate all the way to the root */
}
else
{ /* a real window is set for the focus */
WindowPtr pSpriteWin = GetSpriteWindow();
WindowPtr pSpriteWin = GetSpriteWindow(dev);
*ppStopWin = pFocusWin->parent; /* don't go past the focus window */
/* if the pointer is in a subwindow of the focus window, start

View File

@ -276,9 +276,9 @@ ProcessOtherEvent(xEventPtr xE, register DeviceIntPtr other, int count)
if (grab)
DeliverGrabbedEvent(xE, other, deactivateDeviceGrab, count);
else if (other->focus)
DeliverFocusedEvent(other, xE, GetSpriteWindow(), count);
DeliverFocusedEvent(other, xE, GetSpriteWindow(other), count);
else
DeliverDeviceEvents(GetSpriteWindow(), xE, NullGrab, NullWindow,
DeliverDeviceEvents(GetSpriteWindow(other), xE, NullGrab, NullWindow,
other, count);
if (deactivateDeviceGrab == TRUE)
@ -781,7 +781,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
{
WindowPtr pWin;
WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
WindowPtr spriteWin = GetSpriteWindow();
WindowPtr spriteWin = GetSpriteWindow(d);
if (dest == PointerWindow)
pWin = spriteWin;

View File

@ -270,6 +270,7 @@ _X_EXPORT HotSpot xeviehot;
#endif
static void DoEnterLeaveEvents(
DeviceIntPtr pDev,
WindowPtr fromWin,
WindowPtr toWin,
int mode
@ -614,8 +615,9 @@ XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev)
if (prevSpriteWin != NullWindow) {
if (!xE)
UpdateCurrentTimeIf();
DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal);
}
DoEnterLeaveEvents(pDev, prevSpriteWin, pSprite->win,
NotifyNormal);
}
PostNewCursor(pDev);
return FALSE;
}
@ -991,8 +993,13 @@ GetCurrentRootWindow()
}
_X_EXPORT WindowPtr
GetSpriteWindow()
GetSpriteWindow(DeviceIntPtr pDev)
{
#ifdef MPX
if(IsMPDev(pDev))
return mpsprites[pDev->id].win;
#endif
return sprite->win;
}
@ -1321,7 +1328,7 @@ ActivatePointerGrab(register DeviceIntPtr mouse, register GrabPtr grab,
sprite->hotPhys.x = sprite->hotPhys.y = 0;
ConfineCursorToWindow(grab->confineTo, FALSE, TRUE);
}
DoEnterLeaveEvents(oldWin, grab->window, NotifyGrab);
DoEnterLeaveEvents(mouse, oldWin, grab->window, NotifyGrab);
mouse->valuator->motionHintWindow = NullWindow;
if (syncEvents.playingEvents)
mouse->grabTime = syncEvents.time;
@ -1351,7 +1358,7 @@ DeactivatePointerGrab(register DeviceIntPtr mouse)
if (dev->sync.other == grab)
dev->sync.other = NullGrab;
}
DoEnterLeaveEvents(grab->window, sprite->win, NotifyUngrab);
DoEnterLeaveEvents(mouse, grab->window, sprite->win, NotifyUngrab);
if (grab->confineTo)
ConfineCursorToWindow(ROOT, FALSE, FALSE);
PostNewCursor(inputInfo.pointer);
@ -1823,11 +1830,18 @@ MaybeDeliverEventsToClient(register WindowPtr pWin, xEvent *pEvents,
static void
FixUpEventFromWindow(
DeviceIntPtr pDev,
xEvent *xE,
WindowPtr pWin,
Window child,
Bool calcChild)
{
SpritePtr pSprite = sprite;
#ifdef MPX
if (IsMPDev(pDev))
pSprite = &mpsprites[pDev->id];
#endif
if (calcChild)
{
WindowPtr w=spriteTrace[spriteTraceGood-1];
@ -1857,7 +1871,7 @@ FixUpEventFromWindow(
}
XE_KBPTR.root = ROOT->drawable.id;
XE_KBPTR.event = pWin->drawable.id;
if (sprite->hot.pScreen == pWin->drawable.pScreen)
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
{
XE_KBPTR.sameScreen = xTrue;
XE_KBPTR.child = child;
@ -1896,7 +1910,7 @@ DeliverDeviceEvents(register WindowPtr pWin, register xEvent *xE, GrabPtr grab,
{
if (inputMasks && (inputMasks->inputEvents[mskidx] & filter))
{
FixUpEventFromWindow(xE, pWin, child, FALSE);
FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(pWin, xE, count, filter,
grab, mskidx);
if (deliveries > 0)
@ -1921,7 +1935,7 @@ DeliverDeviceEvents(register WindowPtr pWin, register xEvent *xE, GrabPtr grab,
{
if ((wOtherEventMasks(pWin)|pWin->eventMask) & filter)
{
FixUpEventFromWindow(xE, pWin, child, FALSE);
FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(pWin, xE, count, filter,
grab, 0);
if (deliveries > 0)
@ -2125,8 +2139,9 @@ CheckMotion(xEvent *xE, DeviceIntPtr pDev)
if (prevSpriteWin != NullWindow) {
if (!xE)
UpdateCurrentTimeIf();
DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal);
}
DoEnterLeaveEvents(pDev, prevSpriteWin, pSprite->win,
NotifyNormal);
}
PostNewCursor(pDev);
return FALSE;
}
@ -2600,7 +2615,7 @@ CheckPassiveGrabsOnWindow(
#endif
(*device->ActivateGrab)(device, grab, currentTime, TRUE);
FixUpEventFromWindow(xE, grab->window, None, TRUE);
FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
(void) TryClientEvents(rClient(grab), xE, count,
filters[xE->u.u.type],
@ -2705,7 +2720,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count)
return;
}
/* just deliver it to the focus window */
FixUpEventFromWindow(xE, focus, None, FALSE);
FixUpEventFromWindow(inputInfo.pointer, xE, focus, None, FALSE);
if (xE->u.u.type & EXTENSION_EVENT_BASE)
mskidx = keybd->id;
(void)DeliverEventsToWindow(focus, xE, count, filters[xE->u.u.type],
@ -2745,7 +2760,7 @@ DeliverGrabbedEvent(register xEvent *xE, register DeviceIntPtr thisDev,
}
if (!deliveries)
{
FixUpEventFromWindow(xE, grab->window, None, TRUE);
FixUpEventFromWindow(thisDev, xE, grab->window, None, TRUE);
deliveries = TryClientEvents(rClient(grab), xE, count,
(Mask)grab->eventMask,
filters[xE->u.u.type], grab);
@ -3321,6 +3336,7 @@ CommonAncestor(
static void
EnterLeaveEvent(
DeviceIntPtr pDev,
int type,
int mode,
int detail,
@ -3330,7 +3346,7 @@ EnterLeaveEvent(
xEvent event;
register DeviceIntPtr keybd = inputInfo.keyboard;
WindowPtr focus;
register DeviceIntPtr mouse = inputInfo.pointer;
register DeviceIntPtr mouse = pDev;
register GrabPtr grab = mouse->grab;
Mask mask;
@ -3355,7 +3371,7 @@ EnterLeaveEvent(
event.u.enterLeave.rootX = sprite->hot.x;
event.u.enterLeave.rootY = sprite->hot.y;
/* Counts on the same initial structure of crossing & button events! */
FixUpEventFromWindow(&event, pWin, None, FALSE);
FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
/* Enter/Leave events always set child */
event.u.enterLeave.child = child;
event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
@ -3406,18 +3422,26 @@ EnterLeaveEvent(
}
static void
EnterNotifies(WindowPtr ancestor, WindowPtr child, int mode, int detail)
EnterNotifies(DeviceIntPtr pDev,
WindowPtr ancestor,
WindowPtr child,
int mode,
int detail)
{
WindowPtr parent = child->parent;
if (ancestor == parent)
return;
EnterNotifies(ancestor, parent, mode, detail);
EnterLeaveEvent(EnterNotify, mode, detail, parent, child->drawable.id);
}
EnterNotifies(pDev, ancestor, parent, mode, detail);
EnterLeaveEvent(pDev, EnterNotify, mode, detail, parent,
child->drawable.id); }
static void
LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail)
LeaveNotifies(DeviceIntPtr pDev,
WindowPtr child,
WindowPtr ancestor,
int mode,
int detail)
{
register WindowPtr pWin;
@ -3425,36 +3449,45 @@ LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail)
return;
for (pWin = child->parent; pWin != ancestor; pWin = pWin->parent)
{
EnterLeaveEvent(LeaveNotify, mode, detail, pWin, child->drawable.id);
child = pWin;
EnterLeaveEvent(pDev, LeaveNotify, mode, detail, pWin,
child->drawable.id);
child = pWin;
}
}
static void
DoEnterLeaveEvents(WindowPtr fromWin, WindowPtr toWin, int mode)
DoEnterLeaveEvents(DeviceIntPtr pDev,
WindowPtr fromWin,
WindowPtr toWin,
int mode)
{
if (fromWin == toWin)
return;
if (IsParent(fromWin, toWin))
{
EnterLeaveEvent(LeaveNotify, mode, NotifyInferior, fromWin, None);
EnterNotifies(fromWin, toWin, mode, NotifyVirtual);
EnterLeaveEvent(EnterNotify, mode, NotifyAncestor, toWin, None);
EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyInferior, fromWin,
None);
EnterNotifies(pDev, fromWin, toWin, mode,
NotifyVirtual);
EnterLeaveEvent(pDev, EnterNotify, mode, NotifyAncestor, toWin, None);
}
else if (IsParent(toWin, fromWin))
{
EnterLeaveEvent(LeaveNotify, mode, NotifyAncestor, fromWin, None);
LeaveNotifies(fromWin, toWin, mode, NotifyVirtual);
EnterLeaveEvent(EnterNotify, mode, NotifyInferior, toWin, None);
EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyAncestor, fromWin,
None);
LeaveNotifies(pDev, fromWin, toWin, mode, NotifyVirtual);
EnterLeaveEvent(pDev, EnterNotify, mode, NotifyInferior, toWin, None);
}
else
{ /* neither fromWin nor toWin is descendent of the other */
WindowPtr common = CommonAncestor(toWin, fromWin);
/* common == NullWindow ==> different screens */
EnterLeaveEvent(LeaveNotify, mode, NotifyNonlinear, fromWin, None);
LeaveNotifies(fromWin, common, mode, NotifyNonlinearVirtual);
EnterNotifies(common, toWin, mode, NotifyNonlinearVirtual);
EnterLeaveEvent(EnterNotify, mode, NotifyNonlinear, toWin, None);
EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyNonlinear, fromWin,
None);
LeaveNotifies(pDev, fromWin, common, mode, NotifyNonlinearVirtual);
EnterNotifies(pDev, common, toWin, mode, NotifyNonlinearVirtual);
EnterLeaveEvent(pDev, EnterNotify, mode, NotifyNonlinear, toWin,
None);
}
}

View File

@ -525,7 +525,7 @@ extern Bool IsParent(
extern WindowPtr GetCurrentRootWindow(void);
extern WindowPtr GetSpriteWindow(void);
extern WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
extern void NoticeEventTime(xEventPtr /* xE */);

View File

@ -54,7 +54,7 @@ int oldX,oldY;
ScreenPtr pScreen, oldScreen;
GetSpritePosition(inputInfo.pointer, &oldX, &oldY);
pScreen = oldScreen = GetSpriteWindow()->drawable.pScreen;
pScreen = oldScreen = GetSpriteWindow(inputInfo.pointer)->drawable.pScreen;
#ifdef PANORAMIX
if (!noPanoramiXExtension) {