From d42909b23a9be64a26aa349c1d6dcd8b228bffa7 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 5 Oct 2007 13:04:10 +0930 Subject: [PATCH] dix: when disabling a device, make sure all paired devices are re-paired. We re-pair them with the VCP, not a real device! If we would do otherwise, somebody may change our keyboard focus and thus get us typing where we don't want to type. --- dix/devices.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dix/devices.c b/dix/devices.c index 7cf82eead..59404e9cf 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -252,7 +252,7 @@ EnableDevice(DeviceIntPtr dev) Bool DisableDevice(DeviceIntPtr dev) { - DeviceIntPtr *prev; + DeviceIntPtr *prev, paired; DeviceIntRec dummyDev; devicePresenceNotify ev; @@ -268,6 +268,16 @@ DisableDevice(DeviceIntPtr dev) dev->next = inputInfo.off_devices; inputInfo.off_devices = dev; + /* Some other device may have been paired with this device. + Re-pair with VCP. We don't repair with a real device, as this + may cause somebody suddenly typing where they shouldn't. + */ + for (paired = inputInfo.devices; paired; paired = paired->next) + { + if (paired->spriteInfo->paired == dev) + PairDevices(NULL, inputInfo.pointer, paired); + } + ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; ev.devchange = DeviceDisabled;