compositor: Use systemd seat configuration conventions

http://www.freedesktop.org/wiki/Software/systemd/multiseat
diff --git a/compositor/70-wayland.rules b/compositor/70-wayland.rules
deleted file mode 100644
index 1b7ca66..0000000
--- 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 1e89822..a5b0078 100644
--- a/compositor/Makefile.am
+++ b/compositor/Makefile.am
@@ -26,11 +26,6 @@
 	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 12f4391..5e62d4c 100644
--- a/compositor/compositor-drm.c
+++ b/compositor/compositor-drm.c
@@ -730,14 +730,17 @@
 	};
 }
 
+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 @@
 
 	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 @@
 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);
 }