static const char default_seat[] = "seat0";
static const char default_seat_name[] = "default";
+static struct list devices_list;
static void
path_disable_device(struct evdev_device *device)
{
struct path_input *path_input = (struct path_input*)input;
struct path_device *dev;
+ struct device_node *dev_node;
udev_unref(path_input->udev);
list_for_each_safe(dev, &path_input->path_list, link)
path_device_destroy(dev);
+ list_for_each_safe(dev_node, &devices_list, link) {
+ free(dev_node->devname);
+ free(dev_node);
+ }
}
static struct libinput_device *
struct path_input *input = (struct path_input*)libinput;
struct path_device *dev;
struct libinput_device *device;
+ struct device_node *dev_node;
+ const char *name;
dev = zalloc(sizeof *dev);
dev->udev_device = udev_device_ref(udev_device);
list_insert(&input->path_list, &dev->link);
+ name = udev_device_get_devnode(udev_device);
+ if (name)
+ {
+ dev_node = zalloc(sizeof *dev_node);
+ if (dev_node)
+ {
+ dev_node->devname = strdup(name);
+ if (dev_node->devname)
+ list_insert(&devices_list, &dev_node->link);
+ }
+ }
+
device = path_device_enable(input, udev_device, seat_name);
if (!device)
input->udev = udev;
list_init(&input->path_list);
+ list_init(&devices_list);
+
return &input->base;
}
struct libinput_seat *seat;
struct evdev_device *evdev = evdev_device(device);
struct path_device *dev;
+ struct device_node *dev_node;
if (libinput->interface_backend != &interface_backend) {
log_bug_client(libinput, "Mismatching backends.\n");
}
}
+ list_for_each(dev_node, &devices_list, link) {
+ if (strcmp(dev_node->devname, udev_device_get_devnode(evdev->udev_device)) == 0) {
+ list_remove(&dev_node->link);
+ free(dev_node->devname);
+ free(dev_node);
+ break;
+ }
+ }
+
seat = device->seat;
libinput_seat_ref(seat);
path_disable_device(evdev);
libinput_seat_unref(seat);
}
+
+struct list *
+libinput_path_get_devices(void)
+{
+ return &devices_list;
+}
static struct udev_seat *
udev_seat_get_named(struct udev_input *input, const char *seat_name);
-
static inline bool
filter_duplicates(struct udev_seat *udev_seat,
struct udev_device *udev_device)
return ignore_device;
}
+static bool
+libinput_path_has_device(struct libinput *libinput, const char *devnode)
+{
+ struct device_node *dev;
+ struct list *dev_list;
+
+ if (!devnode) return false;
+ dev_list = libinput_path_get_devices();
+ if (dev_list->prev == NULL && dev_list->next == NULL) return false;
+
+ list_for_each(dev, dev_list, link) {
+ const char *name = dev->devname;
+ if (!name) break;
+ if (strcmp(name, devnode) == 0)
+ return true;
+ }
+
+ return false;
+}
+
static int
device_added(struct udev_device *udev_device,
struct udev_input *input,
return -1;
}
+ if (libinput_path_has_device(&input->base, devnode))
+ {
+ log_info(&input->base, "libinput_path already created input device '%s.\n", devnode);
+ return 0;
+ }
device = evdev_device_create(&seat->base, udev_device);
libinput_seat_unref(&seat->base);
if (input->udev_monitor || !input->seat_id)
return 0;
- input->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
+ char *env;
+
+ if ((env = getenv("UDEV_MONITOR_EVENT_SOURCE")))
+ {
+ log_info(libinput, "udev: event source is %s.\n", env);
+ input->udev_monitor = udev_monitor_new_from_netlink(udev, env);
+ }
+ else
+ input->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
+
if (!input->udev_monitor) {
log_info(libinput,
"udev: failed to create the udev monitor\n");