compositor-fbdev: support the --seat option, (and XDG_SEAT variable)

This allows the fbdev backend to run on, and use devices from the
specified seat, similar to the drm backend.

Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
diff --git a/compositor/main.c b/compositor/main.c
index 04d8ff0..89e389b 100644
--- a/compositor/main.c
+++ b/compositor/main.c
@@ -525,6 +525,7 @@
 		"Options for fbdev-backend.so:\n\n"
 		"  --tty=TTY\t\tThe tty to use\n"
 		"  --device=DEVICE\tThe framebuffer device to use\n"
+		"  --seat=SEAT\t\tThe seat that weston should run on, instead of the seat defined in XDG_SEAT\n"
 		"\n");
 #endif
 
@@ -2059,6 +2060,7 @@
 	const struct weston_option fbdev_options[] = {
 		{ WESTON_OPTION_INTEGER, "tty", 0, &config.tty },
 		{ WESTON_OPTION_STRING, "device", 0, &config.device },
+		{ WESTON_OPTION_STRING, "seat", 0, &config.seat_id },
 	};
 
 	parse_options(fbdev_options, ARRAY_LENGTH(fbdev_options), argc, argv);
diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
index a78f6fa..09a2eb3 100644
--- a/libweston/compositor-fbdev.c
+++ b/libweston/compositor-fbdev.c
@@ -776,6 +776,13 @@
 {
 	struct fbdev_backend *backend;
 	const char *seat_id = default_seat;
+	const char *session_seat;
+
+	session_seat = getenv("XDG_SEAT");
+	if (session_seat)
+		seat_id = session_seat;
+	if (param->seat_id)
+		seat_id = param->seat_id;
 
 	weston_log("initializing fbdev backend\n");
 
@@ -800,7 +807,7 @@
 	wl_signal_add(&compositor->session_signal,
 		      &backend->session_listener);
 	compositor->launcher =
-		weston_launcher_connect(compositor, param->tty, "seat0", false);
+		weston_launcher_connect(compositor, param->tty, seat_id, false);
 	if (!compositor->launcher) {
 		weston_log("fatal: fbdev backend should be run using "
 			   "weston-launch binary, or your system should "
@@ -846,6 +853,7 @@
 	 * udev, rather than passing a device node in as a parameter. */
 	config->tty = 0; /* default to current tty */
 	config->device = "/dev/fb0"; /* default frame buffer */
+	config->seat_id = NULL;
 }
 
 WL_EXPORT int
diff --git a/libweston/compositor-fbdev.h b/libweston/compositor-fbdev.h
index 8b7d900..29c2182 100644
--- a/libweston/compositor-fbdev.h
+++ b/libweston/compositor-fbdev.h
@@ -52,6 +52,15 @@
 	 */
 	void (*configure_device)(struct weston_compositor *compositor,
 				 struct libinput_device *device);
+
+	/** The seat to be used for input and output.
+	 *
+	 * If seat_id is NULL, the seat is taken from XDG_SEAT environment
+	 * variable. If neither is set, "seat0" is used. The backend will
+	 * take ownership of the seat_id pointer and will free it on
+	 * backend destruction.
+	 */
+	char *seat_id;
 };
 
 #ifdef  __cplusplus