struct evdev_dispatch_interface fallback_interface = {
fallback_process,
- fallback_destroy
+ fallback_destroy,
+ NULL, /* device_added */
+ NULL, /* device_removed */
};
static uint32_t
return 0;
}
+static void
+evdev_notify_added_device(struct evdev_device *device)
+{
+ struct libinput_device *dev;
+
+ list_for_each(dev, &device->base.seat->devices_list, link) {
+ struct evdev_device *d = (struct evdev_device*)dev;
+ if (dev == &device->base)
+ continue;
+
+ if (d->dispatch->interface->device_added)
+ d->dispatch->interface->device_added(d, device);
+
+ if (device->dispatch->interface->device_added)
+ device->dispatch->interface->device_added(device, d);
+ }
+
+ notify_added_device(&device->base);
+}
+
struct evdev_device *
evdev_device_create(struct libinput_seat *seat,
const char *devnode,
goto err;
list_insert(seat->devices_list.prev, &device->base.link);
- notify_added_device(&device->base);
+ evdev_notify_added_device(device);
return device;
void
evdev_device_remove(struct evdev_device *device)
{
+ struct libinput_device *dev;
+
+ list_for_each(dev, &device->base.seat->devices_list, link) {
+ struct evdev_device *d = (struct evdev_device*)dev;;
+ if (dev == &device->base)
+ continue;
+
+ if (d->dispatch->interface->device_removed)
+ d->dispatch->interface->device_removed(d, device);
+ }
+
evdev_device_suspend(device);
/* A device may be removed while suspended. Free the syspath to
/* Destroy an event dispatch handler and free all its resources. */
void (*destroy)(struct evdev_dispatch *dispatch);
+
+ /* A new device was added */
+ void (*device_added)(struct evdev_device *device,
+ struct evdev_device *added_device);
+
+ /* A device was removed */
+ void (*device_removed)(struct evdev_device *device,
+ struct evdev_device *removed_device);
};
struct evdev_dispatch {