dix GetSpriteWindow() adjusted for MPX
added device dependency for MPX to DoEnterLeaveEvents, EnterLeaveEvents, EnterNotifies, LeaveNotifies and FixUpEventFromWindow.
This commit is contained in:
parent
70383105de
commit
8c16f21d5d
13
Changelog
13
Changelog
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
99
dix/events.c
99
dix/events.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */);
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue