[PATCH weston] compositor-fbdev: enumerate available fbdevs using udev

Ryo Munakata ryomnktml at gmail.com
Mon Mar 9 19:34:45 PDT 2015


This was a TODO:
"Ideally, available frame buffers should be enumerated
using udev, rather than passing a device node in as a
parameter."

Signed-off-by: Ryo Munakata <ryomnktml at gmail.com>
---
 src/compositor-fbdev.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 52 insertions(+), 3 deletions(-)

diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
index eedf252..c0e6985 100644
--- a/src/compositor-fbdev.c
+++ b/src/compositor-fbdev.c
@@ -46,6 +46,8 @@
 #include "gl-renderer.h"
 #include "presentation_timing-server-protocol.h"
 
+#define FBDEV_MAJOR_NUMBER (29)
+
 struct fbdev_compositor {
 	struct weston_compositor base;
 	uint32_t prev_state;
@@ -690,6 +692,9 @@ fbdev_output_destroy(struct weston_output *base)
 		gl_renderer->output_destroy(base);
 	}
 
+	if (output->device)
+		free((char *)output->device);
+
 	/* Remove the output. */
 	weston_output_destroy(&output->base);
 
@@ -748,6 +753,7 @@ fbdev_output_reenable(struct fbdev_compositor *compositor,
 		 * the frame buffer X/Y resolution (such as the shadow buffer)
 		 * are re-initialised. */
 		device = output->device;
+		output->device = NULL;
 		fbdev_output_destroy(base);
 		fbdev_output_create(compositor, device);
 
@@ -795,6 +801,7 @@ fbdev_compositor_destroy(struct weston_compositor *base)
 	struct fbdev_compositor *compositor = to_fbdev_compositor(base);
 
 	udev_input_destroy(&compositor->input);
+	udev_unref(compositor->udev);
 
 	/* Destroy the output. */
 	weston_compositor_shutdown(&compositor->base);
@@ -861,6 +868,47 @@ switch_vt_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *d
 	weston_launcher_activate_vt(compositor->launcher, key - KEY_F1 + 1);
 }
 
+static char *
+udev_get_fbdev(struct udev *udev)
+{
+	char *fbdev = NULL;
+	struct udev_enumerate *enumerate;
+	struct udev_list_entry *list, *entry;
+
+	if (!(enumerate = udev_enumerate_new(udev)))
+		goto err;
+
+	udev_enumerate_add_match_subsystem(enumerate, "graphics");
+	udev_enumerate_scan_devices(enumerate);
+
+	list = udev_enumerate_get_list_entry(enumerate);
+	udev_list_entry_foreach(entry, list) {
+		const char *devnode;
+		const char *syspath = udev_list_entry_get_name(entry);
+		struct udev_device *device;
+
+		if (fbdev)
+			break;
+
+		if (!(device = udev_device_new_from_syspath(udev, syspath)))
+			continue;
+
+		devnode = udev_device_get_devnode(device);
+		if (devnode) {
+			dev_t devnum = udev_device_get_devnum(device);
+
+			if (major(devnum) == FBDEV_MAJOR_NUMBER)
+				fbdev = strdup(devnode);
+		}
+
+		udev_device_unref(device);
+	}
+
+	udev_enumerate_unref(enumerate);
+err:
+	return fbdev ? fbdev : strdup("/dev/fb0");
+}
+
 static struct weston_compositor *
 fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
                         struct weston_config *config,
@@ -933,6 +981,9 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
 		}
 	}
 
+	if (!param->device)
+		param->device = udev_get_fbdev(compositor->udev);
+
 	if (fbdev_output_create(compositor, param->device) < 0)
 		goto out_pixman;
 
@@ -962,11 +1013,9 @@ WL_EXPORT struct weston_compositor *
 backend_init(struct wl_display *display, int *argc, char *argv[],
 	     struct weston_config *config)
 {
-	/* TODO: Ideally, available frame buffers should be enumerated using
-	 * udev, rather than passing a device node in as a parameter. */
 	struct fbdev_parameters param = {
 		.tty = 0, /* default to current tty */
-		.device = "/dev/fb0", /* default frame buffer */
+		.device = NULL,
 		.use_gl = 0,
 	};
 
-- 
2.3.2



More information about the wayland-devel mailing list