mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-08 03:08:01 +02:00
path: get ID_SEAT and WL_SEAT from udev for the device node
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
2b4761b94a
commit
f5bc28b31a
2 changed files with 32 additions and 14 deletions
45
src/path.c
45
src/path.c
|
|
@ -29,6 +29,9 @@
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "evdev.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);
|
int path_input_process_event(struct libinput_event);
|
||||||
static void path_seat_destroy(struct libinput_seat *seat);
|
static void path_seat_destroy(struct libinput_seat *seat);
|
||||||
|
|
||||||
|
|
@ -61,7 +64,9 @@ path_seat_destroy(struct libinput_seat *seat)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct path_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;
|
struct path_seat *seat;
|
||||||
|
|
||||||
|
|
@ -69,22 +74,24 @@ path_seat_create(struct path_input *input)
|
||||||
if (!seat)
|
if (!seat)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
seat->name = "default";
|
libinput_seat_init(&seat->base, &input->base, seat_name,
|
||||||
|
seat_logical_name, path_seat_destroy);
|
||||||
/* FIXME: get physical seat from udev */
|
|
||||||
libinput_seat_init(&seat->base, &input->base, seat->name, seat->name, path_seat_destroy);
|
|
||||||
list_insert(&input->base.seat_list, &seat->base.link);
|
list_insert(&input->base.seat_list, &seat->base.link);
|
||||||
|
|
||||||
return seat;
|
return seat;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static int
|
||||||
path_get_sysname(const char *path)
|
path_get_udev_properties(const char *path,
|
||||||
|
char **syspath,
|
||||||
|
char **seat_name,
|
||||||
|
char **seat_logical_name)
|
||||||
{
|
{
|
||||||
struct udev *udev = NULL;
|
struct udev *udev = NULL;
|
||||||
struct udev_device *device = NULL;
|
struct udev_device *device = NULL;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *syspath = NULL;
|
const char *seat;
|
||||||
|
int rc = -1;
|
||||||
|
|
||||||
udev = udev_new();
|
udev = udev_new();
|
||||||
if (!udev)
|
if (!udev)
|
||||||
|
|
@ -97,13 +104,22 @@ path_get_sysname(const char *path)
|
||||||
if (!device)
|
if (!device)
|
||||||
goto out;
|
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:
|
out:
|
||||||
if (device)
|
if (device)
|
||||||
udev_device_unref(device);
|
udev_device_unref(device);
|
||||||
if (udev)
|
if (udev)
|
||||||
udev_unref(udev);
|
udev_unref(udev);
|
||||||
return syspath;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -115,6 +131,7 @@ path_input_enable(struct libinput *libinput)
|
||||||
const char *devnode = input->path;
|
const char *devnode = input->path;
|
||||||
char *syspath;
|
char *syspath;
|
||||||
int fd;
|
int fd;
|
||||||
|
char *seat_name, *seat_logical_name;
|
||||||
|
|
||||||
if (input->device)
|
if (input->device)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -125,14 +142,16 @@ path_input_enable(struct libinput *libinput)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
syspath = path_get_sysname(devnode);
|
if (path_get_udev_properties(devnode, &syspath,
|
||||||
if (!syspath) {
|
&seat_name, &seat_logical_name) == -1) {
|
||||||
close_restricted(libinput, fd);
|
close_restricted(libinput, fd);
|
||||||
log_info("failed to obtain syspath for device '%s'.\n", devnode);
|
log_info("failed to obtain syspath for device '%s'.\n", devnode);
|
||||||
return -1;
|
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);
|
device = evdev_device_create(&seat->base, devnode, syspath, fd);
|
||||||
free(syspath);
|
free(syspath);
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ struct path_input {
|
||||||
|
|
||||||
struct path_seat {
|
struct path_seat {
|
||||||
struct libinput_seat base;
|
struct libinput_seat base;
|
||||||
const char *name;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int path_input_process_event(struct libinput_event);
|
int path_input_process_event(struct libinput_event);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue