path: get ID_SEAT and WL_SEAT from udev for the device node
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 21 Jan 2014 02:03:47 +0000 (12:03 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 22 Jan 2014 01:16:29 +0000 (11:16 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/path.c
src/path.h

index f2962bf..e09ef9e 100644 (file)
@@ -29,6 +29,9 @@
 #include "path.h"
 #include "evdev.h"
 
+static const char default_seat[] = "seat0";
+static const char default_seat_name[] = "default";
+
 int path_input_process_event(struct libinput_event);
 static void path_seat_destroy(struct libinput_seat *seat);
 
@@ -61,7 +64,9 @@ path_seat_destroy(struct libinput_seat *seat)
 }
 
 static struct path_seat*
-path_seat_create(struct path_input *input)
+path_seat_create(struct path_input *input,
+                const char *seat_name,
+                const char *seat_logical_name)
 {
        struct path_seat *seat;
 
@@ -69,22 +74,24 @@ path_seat_create(struct path_input *input)
        if (!seat)
                return NULL;
 
-       seat->name = "default";
-
-       /* FIXME: get physical seat from udev */
-       libinput_seat_init(&seat->base, &input->base, seat->name, seat->name, path_seat_destroy);
+       libinput_seat_init(&seat->base, &input->base, seat_name,
+                          seat_logical_name, path_seat_destroy);
        list_insert(&input->base.seat_list, &seat->base.link);
 
        return seat;
 }
 
-static char *
-path_get_sysname(const char *path)
+static int
+path_get_udev_properties(const char *path,
+                        char **syspath,
+                        char **seat_name,
+                        char **seat_logical_name)
 {
        struct udev *udev = NULL;
        struct udev_device *device = NULL;
        struct stat st;
-       char *syspath = NULL;
+       const char *seat;
+       int rc = -1;
 
        udev = udev_new();
        if (!udev)
@@ -97,13 +104,22 @@ path_get_sysname(const char *path)
        if (!device)
                goto out;
 
-       syspath = strdup(udev_device_get_syspath(device));
+       *syspath = strdup(udev_device_get_syspath(device));
+
+       seat = udev_device_get_property_value(device, "ID_SEAT");
+       *seat_name = strdup(seat ? seat : default_seat);
+
+       seat = udev_device_get_property_value(device, "WL_SEAT");
+       *seat_logical_name = strdup(seat ? seat : default_seat_name);
+
+       rc = 0;
+
 out:
        if (device)
                udev_device_unref(device);
        if (udev)
                udev_unref(udev);
-       return syspath;
+       return rc;
 }
 
 static int
@@ -115,6 +131,7 @@ path_input_enable(struct libinput *libinput)
        const char *devnode = input->path;
        char *syspath;
        int fd;
+       char *seat_name, *seat_logical_name;
 
        if (input->device)
                return 0;
@@ -125,14 +142,16 @@ path_input_enable(struct libinput *libinput)
                return -1;
        }
 
-       syspath = path_get_sysname(devnode);
-       if (!syspath) {
+       if (path_get_udev_properties(devnode, &syspath,
+                                    &seat_name, &seat_logical_name) == -1) {
                close_restricted(libinput, fd);
                log_info("failed to obtain syspath for device '%s'.\n", devnode);
                return -1;
        }
 
-       seat = path_seat_create(input);
+       seat = path_seat_create(input, seat_name, seat_logical_name);
+       free(seat_name);
+       free(seat_logical_name);
 
        device = evdev_device_create(&seat->base, devnode, syspath, fd);
        free(syspath);
index 72cc547..b840acf 100644 (file)
@@ -34,7 +34,6 @@ struct path_input {
 
 struct path_seat {
        struct libinput_seat base;
-       const char *name;
 };
 
 int path_input_process_event(struct libinput_event);