summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2014-01-21 12:03:47 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-01-22 11:16:29 +1000
commitf5bc28b31a7ca39b1c3cab0f43399745c75d47f5 (patch)
tree43ac26e5df0f7800c56cf194abb50c6269a1e22c
parent2b4761b94a7846a25d54e03ed957b7dd955d4552 (diff)
path: get ID_SEAT and WL_SEAT from udev for the device node
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/path.c45
-rw-r--r--src/path.h1
2 files changed, 32 insertions, 14 deletions
diff --git a/src/path.c b/src/path.c
index f2962bf..e09ef9e 100644
--- a/src/path.c
+++ b/src/path.c
@@ -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);
diff --git a/src/path.h b/src/path.h
index 72cc547..b840acf 100644
--- a/src/path.h
+++ b/src/path.h
@@ -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);