Integrate needed changes to support Multiscreen in LG, it is now more

stable.
This commit is contained in:
Amir Bukhari 2005-08-30 12:42:32 +00:00
parent fd36c84948
commit 82f7e5118b

View file

@ -257,6 +257,7 @@ static struct {
*/ */
#ifdef LG3D #ifdef LG3D
WindowPtr *spriteTrace = (WindowPtr *)NULL; WindowPtr *spriteTrace = (WindowPtr *)NULL;
WindowPtr *lgeCurrentRootWin;
#define ROOT spriteTrace[0] #define ROOT spriteTrace[0]
int spriteTraceSize = 0; int spriteTraceSize = 0;
int spriteTraceGood; int spriteTraceGood;
@ -1125,6 +1126,22 @@ lgeTryClientEvents (ClientPtr client, xEvent *pEvents, int count, Mask mask,
return TryClientEvents (client, pEvents, count, mask, filter, grab); return TryClientEvents (client, pEvents, count, mask, filter, grab);
} }
#ifdef LG3D
/*
** Fix for 353: When a 2D grab is enabled the CEP all-grab should be
** disabled. If we don't do this then if you drag outside a native window
** during a grab, the DS will receive events even though a 2D grab is
** active, which is very, very bad.
**
** TODO: KLUDGE: this is a kludgey way to fix this problem. It may be that
** the way to solve the problem is to eliminate all-grab entirely. But we
** are not quite ready to do this yet.
*/
if (lgeDisplayServerIsAlive && grab && !IsWinLgePRWWin(grab->window)) {
return TryClientEvents (client, pEvents, count, mask, filter, grab);
}
#endif /* LG3D */
#ifdef LG3D #ifdef LG3D
/* /*
** Fix for 353: When a 2D grab is enabled the CEP all-grab should be ** Fix for 353: When a 2D grab is enabled the CEP all-grab should be
@ -1327,8 +1344,31 @@ ComputeFreezes()
xE = replayDev->sync.event; xE = replayDev->sync.event;
count = replayDev->sync.evcount; count = replayDev->sync.evcount;
syncEvents.replayDev = (DeviceIntPtr)NULL; syncEvents.replayDev = (DeviceIntPtr)NULL;
#ifdef LG3D
w = XYToWindow( XE_KBPTR.rootX, XE_KBPTR.rootY); WindowPtr pWin = (WindowPtr) LookupIDByType(XE_KBPTR.event, RT_WINDOW);
if (lgeDisplayServerIsAlive && GetLgePRWForRoot(pWin)) {
if (sprite.hotPhys.pScreen != pWin->drawable.pScreen)
{
w = XYToSubWindow(pWin,
xE->u.keyButtonPointer.eventX, xE->u.keyButtonPointer.eventY,
&virtualSprite.hot.x, &virtualSprite.hot.y);
if(IsWinLgePRWOne(w->drawable.id))
{
ErrorF("ComputeFreezes %d %d seq %d\n",xE->u.keyButtonPointer.event,
w->drawable.id, xE->u.u.sequenceNumber);
}
}else
{
w = XYToWindow( XE_KBPTR.rootX, XE_KBPTR.rootY);
}
}else
{
w = XYToWindow( XE_KBPTR.rootX, XE_KBPTR.rootY);
}
#else
w = XYToWindow( XE_KBPTR.rootX, XE_KBPTR.rootY);
#endif /* LG3D */
for (i = 0; i < spriteTraceGood; i++) for (i = 0; i < spriteTraceGood; i++)
{ {
if (syncEvents.replayWin == spriteTrace[i]) if (syncEvents.replayWin == spriteTrace[i])
@ -2062,9 +2102,9 @@ lgeFixUpEventFromPRW(
if (sprite.hot.pScreen != pWin->drawable.pScreen) if (sprite.hot.pScreen != pWin->drawable.pScreen)
{ {
XE_KBPTR.sameScreen = xFalse; XE_KBPTR.sameScreen = xFalse;
XE_KBPTR.child = None; /*XE_KBPTR.child = None;
XE_KBPTR.eventX = 0; XE_KBPTR.eventX = 0;
XE_KBPTR.eventY = 0; XE_KBPTR.eventY = 0;*/
} else { } else {
XE_KBPTR.sameScreen = xTrue; XE_KBPTR.sameScreen = xTrue;
} }
@ -2106,22 +2146,24 @@ lgeFixUpEventFromXWindow(
w = w->parent; w = w->parent;
} }
} }
XE_KBPTR.root = ROOT->drawable.id; XE_KBPTR.root = WindowTable[sprite.hotPhys.pScreen->myNum]->drawable.id;
eventWindowOld = XE_KBPTR.event; eventWindowOld = XE_KBPTR.event;
XE_KBPTR.event = pWin->drawable.id; XE_KBPTR.event = pWin->drawable.id;
XE_KBPTR.sameScreen = xTrue;
if (sprite.hot.pScreen != pWin->drawable.pScreen) if (sprite.hot.pScreen != pWin->drawable.pScreen)
{ {
XE_KBPTR.sameScreen = xFalse; XE_KBPTR.sameScreen = xFalse;
/*
XE_KBPTR.child = None; XE_KBPTR.child = None;
XE_KBPTR.eventX = 0; XE_KBPTR.eventX = 0;
XE_KBPTR.eventY = 0; XE_KBPTR.eventY = 0;
return; return;
*/
} }
XE_KBPTR.sameScreen = xTrue;
XE_KBPTR.child = child; XE_KBPTR.child = child;
/* /*
@ -2506,6 +2548,8 @@ CheckMotion(xEvent *xE)
return TRUE; return TRUE;
#endif #endif
} }
lgeCurrentRootWin = WindowTable[sprite.hotPhys.pScreen->myNum];
sprite.win = XYToSubWindow(pEventWin, sprite.win = XYToSubWindow(pEventWin,
XE_KBPTR.eventX, XE_KBPTR.eventY, XE_KBPTR.eventX, XE_KBPTR.eventY,
&virtualSprite.hot.x, &virtualSprite.hot.y); &virtualSprite.hot.x, &virtualSprite.hot.y);
@ -3315,18 +3359,34 @@ DeliverGrabbedEvent(xE, thisDev, deactivateGrab, count)
else else
focus = PointerRootWin; focus = PointerRootWin;
if (focus == PointerRootWin) if (focus == PointerRootWin)
#ifdef LG3D
deliveries = lg3dDeliverDeviceEvents(sprite.win, xE, grab, NullWindow,
thisDev, count);
#else
deliveries = DeliverDeviceEvents(sprite.win, xE, grab, NullWindow, deliveries = DeliverDeviceEvents(sprite.win, xE, grab, NullWindow,
thisDev, count); thisDev, count);
#endif /* LG3D */
else if (focus && (focus == sprite.win || IsParent(focus, sprite.win))) else if (focus && (focus == sprite.win || IsParent(focus, sprite.win)))
#ifdef LG3D
deliveries = lg3dDeliverDeviceEvents(sprite.win, xE, grab, focus,
thisDev, count);
#else
deliveries = DeliverDeviceEvents(sprite.win, xE, grab, focus, deliveries = DeliverDeviceEvents(sprite.win, xE, grab, focus,
thisDev, count); thisDev, count);
else if (focus) #endif /* LG3D */
else if (focus)
deliveries = DeliverDeviceEvents(focus, xE, grab, focus, deliveries = DeliverDeviceEvents(focus, xE, grab, focus,
thisDev, count); thisDev, count);
} }
if (!deliveries) if (!deliveries)
{ {
#ifdef LG3D
isGrabactivated = 1;
#endif
FixUpEventFromWindow(xE, grab->window, None, TRUE); FixUpEventFromWindow(xE, grab->window, None, TRUE);
#ifdef LG3D
isGrabactivated = 0;
#endif
#ifdef LG3D #ifdef LG3D
deliveries = lgeTryClientEvents(rClient(grab), xE, count, deliveries = lgeTryClientEvents(rClient(grab), xE, count,
(Mask)grab->eventMask, (Mask)grab->eventMask,