dix: Move sprite initalization/pairing from ActivateDevice to

EnableDevice.
        zero out spriteTrace, otherwise GetCurrentRootWindow() may return
        invalid data.

        Evdev adds previously hotplugged devices on its own when rescanning,
        and ActivateDevice does not get called for those devices. Sprites need
        to be initialized or paired before the device gets started, so the
        safest place to do so is EnableDevice (which actually does get called
        by the evdev driver).
This commit is contained in:
Peter Hutterer 2007-03-19 16:11:01 +10:30
parent 015d728bcd
commit 0acf993e28
2 changed files with 10 additions and 6 deletions

View File

@ -173,6 +173,11 @@ EnableDevice(DeviceIntPtr dev)
dev->enabled = TRUE;
*prev = dev->next;
if (IsPointerDevice(dev) && dev->isMPDev)
InitializeSprite(dev, GetCurrentRootWindow());
else
PairDevices(NULL, inputInfo.pointer, dev);
for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
;
*prev = dev;
@ -221,11 +226,6 @@ ActivateDevice(DeviceIntPtr dev)
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1);
if (IsPointerDevice(dev) && dev->isMPDev)
InitializeSprite(dev, GetCurrentRootWindow());
else
PairDevices(NULL, inputInfo.pointer, dev);
return ret;
}
@ -448,7 +448,6 @@ InitAndStartDevices()
PairDevices(NULL, GuessFreePointerDevice(), dev);
}
return Success;
}

View File

@ -4290,6 +4290,11 @@ InitEvents()
{
spriteTraceSize = 32;
spriteTrace = (WindowPtr *)xalloc(32*sizeof(WindowPtr));
/* FIXME: spriteTrace[0] needs to be NULL, otherwise
* GetCurrentRootWindow() in EnableDevice() may return a invalid
* value. (whot)
*/
memset(spriteTrace, 0, 32 * sizeof(WindowPtr));
if (!spriteTrace)
FatalError("failed to allocate spriteTrace");
}