From 0acf993e2878d0866fd4e2db8252c1ea6841e494 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 19 Mar 2007 16:11:01 +1030 Subject: [PATCH] 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). --- dix/devices.c | 11 +++++------ dix/events.c | 5 +++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 927d16e8d..579203f1f 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -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; } diff --git a/dix/events.c b/dix/events.c index dc9c4e507..c9b5a4f32 100644 --- a/dix/events.c +++ b/dix/events.c @@ -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"); }