summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2010-05-20 18:07:12 +1000
committerKeith Packard <keithp@keithp.com>2010-05-25 17:47:32 -0700
commit531ff40301975519af7b20109c17d296312d3f2b (patch)
tree181c01e61b9ed5311d69834675e1a3f16ea8bf33
parentc2d0b3b437b7ce6ce975f2ead4d8bb8295ef0ddc (diff)
Add a "flags" field to DeleteInputDeviceRequest.
Some input drivers need to implement an internal hotplugging scheme for dependent devices to provide multiple X devices off one kernel device file. Such dependent devices can be added with NewInputDeviceRequest() but they are not removed when the config backend calls DeleteInputDeviceRequest(), leaving the original device to clean up. Example of the wacom driver: config/udev calls NewInputDeviceRequest("stylus") wacom PreInit calls NewInputDeviceRequest("eraser") NewInputDeviceRequest("pad") NewInputDeviceRequest("cursor") PreInit finishes. When the device is removed, the config backend only calls DeleteInputDeviceRequest for "stylus". The driver needs to call DeleteInputDeviceRequest for the dependent devices eraser, pad and cursor to clean up properly. However, when the server terminates, DeleteInputDeviceRequest is called for all devices - the driver must not remove the dependent devices to avoid double-frees. There is no method for the driver to detect why a device is being removed, leading to elaborate guesswork and some amount of wishful thinking. Though the input driver's UnInit already supports flags, they are unused. This patch uses the flags to supply information where the DeleteInputDeviceRequest request originates from, allowing a driver to selectively call DeleteInputDeviceRequest when necessary. Also bumps XINPUT ABI. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Dan Nicholson <dbn.lists@gmail.com> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--Xi/stubs.c2
-rw-r--r--config/config.c2
-rw-r--r--config/dbus.c2
-rw-r--r--dix/devices.c2
-rw-r--r--hw/dmx/dmxinput.c2
-rw-r--r--hw/kdrive/linux/evdev.c4
-rw-r--r--hw/xfree86/common/xf86Module.h2
-rw-r--r--hw/xfree86/common/xf86Xinput.c8
-rw-r--r--hw/xquartz/darwinXinput.c2
-rw-r--r--include/input.h6
10 files changed, 18 insertions, 14 deletions
diff --git a/Xi/stubs.c b/Xi/stubs.c
index 04ba9769e..8285549cf 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -241,6 +241,6 @@ NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
*
*/
void
-DeleteInputDeviceRequest(DeviceIntPtr dev)
+DeleteInputDeviceRequest(DeviceIntPtr dev, int flags)
{
}
diff --git a/config/config.c b/config/config.c
index 65ef67987..f49420d0e 100644
--- a/config/config.c
+++ b/config/config.c
@@ -81,7 +81,7 @@ remove_device(const char *backend, DeviceIntPtr dev)
* already been removed. */
OsBlockSignals();
ProcessInputEvents();
- DeleteInputDeviceRequest(dev);
+ DeleteInputDeviceRequest(dev, 0);
OsReleaseSignals();
}
diff --git a/config/dbus.c b/config/dbus.c
index 72a0a05dd..511908ac1 100644
--- a/config/dbus.c
+++ b/config/dbus.c
@@ -226,7 +226,7 @@ remove_device(DBusMessage *message, DBusMessage *reply, DBusError *error)
* already been removed. */
OsBlockSignals();
ProcessInputEvents();
- DeleteInputDeviceRequest(dev);
+ DeleteInputDeviceRequest(dev, 0);
OsReleaseSignals();
ret = Success;
diff --git a/dix/devices.c b/dix/devices.c
index cf23bc6d0..27840240d 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -891,7 +891,7 @@ CloseDeviceList(DeviceIntPtr *listHead)
while (dev != NULL)
{
freedIds[dev->id] = TRUE;
- DeleteInputDeviceRequest(dev);
+ DeleteInputDeviceRequest(dev, DEVICE_REMOVE_ALL);
dev = *listHead;
while (dev != NULL && freedIds[dev->id])
diff --git a/hw/dmx/dmxinput.c b/hw/dmx/dmxinput.c
index 568bb882b..eceb25163 100644
--- a/hw/dmx/dmxinput.c
+++ b/hw/dmx/dmxinput.c
@@ -114,6 +114,6 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
}
void
-DeleteInputDeviceRequest(DeviceIntPtr pDev)
+DeleteInputDeviceRequest(DeviceIntPtr pDev, int flags)
{
}
diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c
index 3797f0926..cb16176c7 100644
--- a/hw/kdrive/linux/evdev.c
+++ b/hw/kdrive/linux/evdev.c
@@ -165,7 +165,7 @@ EvdevPtrRead (int evdevPort, void *closure)
n = read (evdevPort, &events, NUM_EVENTS * sizeof (struct input_event));
if (n <= 0) {
if (errno == ENODEV)
- DeleteInputDeviceRequest(pi->dixdev);
+ DeleteInputDeviceRequest(pi->dixdev, 0);
return;
}
@@ -375,7 +375,7 @@ EvdevKbdRead (int evdevPort, void *closure)
n = read (evdevPort, &events, NUM_EVENTS * sizeof (struct input_event));
if (n <= 0) {
if (errno == ENODEV)
- DeleteInputDeviceRequest(ki->dixdev);
+ DeleteInputDeviceRequest(ki->dixdev, 0);
return;
}
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index d61758f78..51b9b16a3 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
*/
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(8, 0)
-#define ABI_XINPUT_VERSION SET_ABI_VERSION(10, 0)
+#define ABI_XINPUT_VERSION SET_ABI_VERSION(11, 0)
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(4, 0)
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 356ddab4c..b30ebbb1c 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -854,7 +854,7 @@ unwind:
}
void
-DeleteInputDeviceRequest(DeviceIntPtr pDev)
+DeleteInputDeviceRequest(DeviceIntPtr pDev, int flags)
{
LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate;
InputDriverPtr drv = NULL;
@@ -874,9 +874,9 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
if (!isMaster && pInfo != NULL)
{
if(drv->UnInit)
- drv->UnInit(drv, pInfo, 0);
+ drv->UnInit(drv, pInfo, flags);
else
- xf86DeleteInput(pInfo, 0);
+ xf86DeleteInput(pInfo, flags);
/* devices added through HAL aren't in the config layout */
it = xf86ConfigLayout.inputs;
@@ -1267,7 +1267,7 @@ xf86DisableDevice(DeviceIntPtr dev, Bool panic)
} else
{
SendDevicePresenceEvent(dev->id, DeviceUnrecoverable);
- DeleteInputDeviceRequest(dev);
+ DeleteInputDeviceRequest(dev, 0);
}
}
diff --git a/hw/xquartz/darwinXinput.c b/hw/xquartz/darwinXinput.c
index 90e440e54..59ca6273d 100644
--- a/hw/xquartz/darwinXinput.c
+++ b/hw/xquartz/darwinXinput.c
@@ -245,7 +245,7 @@ NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
*
*/
void
-DeleteInputDeviceRequest(DeviceIntPtr dev)
+DeleteInputDeviceRequest(DeviceIntPtr dev, int flags)
{
DEBUG_LOG("DeleteInputDeviceRequest(%p)\n", dev);
}
diff --git a/include/input.h b/include/input.h
index c68a28441..5426c44a0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -62,6 +62,9 @@ SOFTWARE.
#define DEVICE_OFF 2
#define DEVICE_CLOSE 3
+/* DeleteInputDeviceRequest flags */
+#define DEVICE_REMOVE_ALL (1 << 0) /* all devices will be removed */
+
#define POINTER_RELATIVE (1 << 1)
#define POINTER_ABSOLUTE (1 << 2)
#define POINTER_ACCELERATE (1 << 3)
@@ -536,7 +539,8 @@ extern _X_EXPORT int NewInputDeviceRequest(
InputAttributes *attrs,
DeviceIntPtr *dev);
extern _X_EXPORT void DeleteInputDeviceRequest(
- DeviceIntPtr dev);
+ DeviceIntPtr dev,
+ int flags);
extern _X_EXPORT void DDXRingBell(
int volume,