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>
This commit is contained in:
parent
c2d0b3b437
commit
531ff40301
|
|
@ -241,6 +241,6 @@ NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
|
|||
*
|
||||
*/
|
||||
void
|
||||
DeleteInputDeviceRequest(DeviceIntPtr dev)
|
||||
DeleteInputDeviceRequest(DeviceIntPtr dev, int flags)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ remove_device(const char *backend, DeviceIntPtr dev)
|
|||
* already been removed. */
|
||||
OsBlockSignals();
|
||||
ProcessInputEvents();
|
||||
DeleteInputDeviceRequest(dev);
|
||||
DeleteInputDeviceRequest(dev, 0);
|
||||
OsReleaseSignals();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -114,6 +114,6 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
|
|||
}
|
||||
|
||||
void
|
||||
DeleteInputDeviceRequest(DeviceIntPtr pDev)
|
||||
DeleteInputDeviceRequest(DeviceIntPtr pDev, int flags)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -245,7 +245,7 @@ NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
|
|||
*
|
||||
*/
|
||||
void
|
||||
DeleteInputDeviceRequest(DeviceIntPtr dev)
|
||||
DeleteInputDeviceRequest(DeviceIntPtr dev, int flags)
|
||||
{
|
||||
DEBUG_LOG("DeleteInputDeviceRequest(%p)\n", dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue