From c7e2ba0c9b9b1fc1aed8f91f86471c4c8e650b78 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 24 Apr 2007 21:34:47 +0930 Subject: [PATCH] Use DevicePresence events to tell the client about enabled/disabled devices. Include the device id in the event sent to the client. --- dix/devices.c | 33 +++++++++++++++++++++++++++++---- hw/xfree86/common/xf86Xinput.c | 25 +++++++++++++++++++++++++ hw/xfree86/common/xf86Xinput.h | 3 +++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 7d8fd0398..e8ca5dfa7 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -75,6 +75,7 @@ SOFTWARE. #include "swaprep.h" #include "dixevents.h" +#include #include #include "exglobals.h" #include "exevents.h" @@ -157,6 +158,8 @@ EnableDevice(DeviceIntPtr dev) { DeviceIntPtr *prev; int ret; + DeviceIntRec dummyDev; + devicePresenceNotify ev; for (prev = &inputInfo.off_devices; *prev && (*prev != dev); @@ -175,6 +178,14 @@ EnableDevice(DeviceIntPtr dev) *prev = dev; dev->next = NULL; + ev.type = DevicePresenceNotify; + ev.time = currentTime.milliseconds; + ev.devchange = DeviceEnabled; + ev.deviceid = dev->id; + dummyDev.id = 0; + SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, + (xEvent *) &ev, 1); + return TRUE; } @@ -182,6 +193,8 @@ Bool DisableDevice(DeviceIntPtr dev) { DeviceIntPtr *prev; + DeviceIntRec dummyDev; + devicePresenceNotify ev; for (prev = &inputInfo.devices; *prev && (*prev != dev); @@ -194,6 +207,15 @@ DisableDevice(DeviceIntPtr dev) *prev = dev->next; dev->next = inputInfo.off_devices; inputInfo.off_devices = dev; + + ev.type = DevicePresenceNotify; + ev.time = currentTime.milliseconds; + ev.devchange = DeviceDisabled; + ev.deviceid = dev->id; + dummyDev.id = 0; + SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, + (xEvent *) &ev, 1); + return TRUE; } @@ -212,8 +234,8 @@ ActivateDevice(DeviceIntPtr dev) ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; - ev.devchange = 0; - ev.deviceid = 0; + ev.devchange = DeviceAdded; + ev.deviceid = dev->id; dummyDev.id = 0; SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, (xEvent *) &ev, 1); @@ -547,12 +569,15 @@ RemoveDevice(DeviceIntPtr dev) int ret = BadMatch; devicePresenceNotify ev; DeviceIntRec dummyDev; + int deviceid; DebugF("(dix) removing device %d\n", dev->id); if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer) return BadImplementation; + deviceid = dev->id; + prev = NULL; for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) { next = tmp->next; @@ -587,8 +612,8 @@ RemoveDevice(DeviceIntPtr dev) inputInfo.numDevices--; ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; - ev.devchange = 0; - ev.deviceid = 0; + ev.devchange = DeviceRemoved; + ev.deviceid = deviceid; dummyDev.id = 0; SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, (xEvent *) &ev, 1); diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 6ebb087cf..0af1c6a59 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -764,4 +764,29 @@ xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum) } } + +/** + * Deactivate a device. Call this function from the driver if you receive a + * read error or something else that spoils your day. + * Device will be moved to the off_devices list, but it will still be there + * until you really clean up after it. + * Notifies the client about an inactive device. + */ +_X_EXPORT void +xf86DisableDevice(DeviceIntPtr dev) +{ + DisableDevice(dev); +} + +/** + * Reactivate a device. Call this function from the driver if you just found + * out that the read error wasn't quite that bad after all. + * Device will be re-activated, and an event sent to the client. + */ +_X_EXPORT void +xf86EnableDevice(DeviceIntPtr dev) +{ + EnableDevice(dev); +} + /* end of xf86Xinput.c */ diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index b2bc8dec1..f5beb6c94 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -187,6 +187,8 @@ void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum); void xf86AddEnabledDevice(InputInfoPtr pInfo); void xf86RemoveEnabledDevice(InputInfoPtr pInfo); +void xf86DisableDevice(DeviceIntPtr dev); +void xf86EnableDevice(DeviceIntPtr dev); /* xf86Helper.c */ void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags); @@ -204,6 +206,7 @@ int xf86GetMotionEvents(DeviceIntPtr dev, xTimecoord *buff, void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts, pointer extraOpts); + /* Legacy hatred */ #define SendCoreEvents 59 #define DontSendCoreEvents 60