diff --git a/compositor/70-wayland.rules b/compositor/70-wayland.rules deleted file mode 100644 index 1b7ca661..00000000 --- a/compositor/70-wayland.rules +++ /dev/null @@ -1,7 +0,0 @@ -KERNEL=="event*", ENV{ID_INPUT_KEYBOARD}=="1", ENV{WAYLAND_SEAT}="1" -KERNEL=="event*", ENV{ID_INPUT_MOUSE}=="1", ENV{WAYLAND_SEAT}="1" -KERNEL=="event*", ENV{ID_INPUT_TOUCHPAD}=="1", ENV{WAYLAND_SEAT}="1" -KERNEL=="event*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{WAYLAND_SEAT}="1" -KERNEL=="event*", ENV{ID_INPUT_TABLET}=="1", ENV{WAYLAND_SEAT}="1" -KERNEL=="card0", ENV{WAYLAND_SEAT}="1" - diff --git a/compositor/Makefile.am b/compositor/Makefile.am index 1e898221..a5b00780 100644 --- a/compositor/Makefile.am +++ b/compositor/Makefile.am @@ -26,11 +26,6 @@ xserver_launcher_sources = \ xserver-server-protocol.h endif -udevrulesddir = $(sysconfdir)/udev/rules.d - -dist_udevrulesd_DATA = \ - 70-wayland.rules - moduledir = @libdir@/wayland module_LTLIBRARIES = \ $(desktop_shell) \ diff --git a/compositor/compositor-drm.c b/compositor/compositor-drm.c index 12f43910..5e62d4c7 100644 --- a/compositor/compositor-drm.c +++ b/compositor/compositor-drm.c @@ -730,14 +730,17 @@ vt_func(struct wlsc_compositor *compositor, int event) }; } +static const char default_seat[] = "seat0"; + static struct wlsc_compositor * -drm_compositor_create(struct wl_display *display, int connector) +drm_compositor_create(struct wl_display *display, + int connector, const char *seat) { struct drm_compositor *ec; struct udev_enumerate *e; struct udev_list_entry *entry; - struct udev_device *device; - const char *path; + struct udev_device *device, *drm_device; + const char *path, *device_seat; struct wl_event_loop *loop; ec = malloc(sizeof *ec); @@ -753,27 +756,38 @@ drm_compositor_create(struct wl_display *display, int connector) e = udev_enumerate_new(ec->udev); udev_enumerate_add_match_subsystem(e, "drm"); - udev_enumerate_add_match_property(e, "WAYLAND_SEAT", "1"); + udev_enumerate_scan_devices(e); - device = NULL; + drm_device = NULL; udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) { path = udev_list_entry_get_name(entry); device = udev_device_new_from_syspath(ec->udev, path); - break; + device_seat = + udev_device_get_property_value(device, "ID_SEAT"); + if (!device_seat) + device_seat = default_seat; + if (strcmp(device_seat, seat) == 0) { + drm_device = device; + break; + } + udev_device_unref(device); } + udev_enumerate_unref(e); - if (device == NULL) { + if (drm_device == NULL) { fprintf(stderr, "no drm device found\n"); return NULL; } ec->base.wl_display = display; - if (init_egl(ec, device) < 0) { + if (init_egl(ec, drm_device) < 0) { fprintf(stderr, "failed to initialize egl\n"); return NULL; } + udev_device_unref(drm_device); + ec->base.destroy = drm_destroy; ec->base.create_cursor_image = drm_compositor_create_cursor_image; @@ -825,18 +839,23 @@ WL_EXPORT struct wlsc_compositor * backend_init(struct wl_display *display, char *options) { int connector = 0, i; + const char *seat; char *p, *value; - static char * const tokens[] = { "connector", NULL }; + static char * const tokens[] = { "connector", "seat", NULL }; p = options; + seat = default_seat; while (i = getsubopt(&p, tokens, &value), i != -1) { switch (i) { case 0: connector = strtol(value, NULL, 0); break; + case 1: + seat = value; + break; } } - return drm_compositor_create(display, connector); + return drm_compositor_create(display, connector, seat); }