[RFC] [PATCH weston v2] Allow output configuration from config file.
Scott Moreau
oreaus at gmail.com
Mon Jul 30 18:51:08 PDT 2012
Parse the config file for [output] sections and check for 'name'
and 'mode' keys. The key strings are compared to what is reported
by weston log. The 'mode' key string can be one of the following:
1) WIDTHxHEIGHT - one that is reported by weston log
2) off - Disables the output
3) preferred - Uses the preferred mode
4) current - Uses the mode currently driving the crtc
---
Hi Kristian, thanks for the review. I agree with everything you said, it
makes for a much cleaner patch and log output. Hopefully I've addressed everything.
src/compositor-drm.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++-
weston.ini | 11 +++---
2 files changed, 104 insertions(+), 6 deletions(-)
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index cd0395e..48202ba 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -44,6 +44,25 @@
#include "log.h"
static int option_current_mode = 0;
+static char *output_name;
+static char *output_mode;
+static struct wl_list configured_output_list;
+
+enum output_config {
+ OUTPUT_CONFIG_INVALID = 0,
+ OUTPUT_CONFIG_OFF,
+ OUTPUT_CONFIG_PREFERRED,
+ OUTPUT_CONFIG_CURRENT,
+ OUTPUT_CONFIG_MODE
+};
+
+struct drm_configured_output {
+ char *name;
+ char *mode;
+ int32_t width, height;
+ enum output_config config;
+ struct wl_list link;
+};
enum {
WESTON_PLANE_DRM_CURSOR = 0x100,
@@ -1296,7 +1315,8 @@ create_output_for_connector(struct drm_compositor *ec,
{
struct drm_output *output;
struct drm_mode *drm_mode, *next;
- struct weston_mode *m, *preferred, *current;
+ struct weston_mode *m, *preferred, *current, *configured;
+ struct drm_configured_output *o = NULL, *temp;
drmModeEncoder *encoder;
drmModeModeInfo crtc_mode;
drmModeCrtc *crtc;
@@ -1356,7 +1376,29 @@ create_output_for_connector(struct drm_compositor *ec,
preferred = NULL;
current = NULL;
+ configured = NULL;
+
+ wl_list_for_each(temp, &configured_output_list, link) {
+ if (strcmp(temp->name, output->name) == 0) {
+ weston_log("%s mode \"%s\" in config\n",
+ temp->name, temp->mode);
+ o = temp;
+ break;
+ }
+ }
+
+ if (o && strcmp("off", o->mode) == 0) {
+ weston_log("Disabling output %s\n", o->name);
+
+ drmModeSetCrtc(ec->drm.fd, output->crtc_id,
+ 0, 0, 0, 0, 0, NULL);
+ goto err_free;
+ }
+
wl_list_for_each(drm_mode, &output->base.mode_list, base.link) {
+ if (o && o->width == drm_mode->base.width &&
+ o->height == drm_mode->base.height)
+ configured = &drm_mode->base;
if (!memcmp(&crtc_mode, &drm_mode->mode_info, sizeof crtc_mode))
current = &drm_mode->base;
if (drm_mode->base.flags & WL_OUTPUT_MODE_PREFERRED)
@@ -1371,8 +1413,13 @@ create_output_for_connector(struct drm_compositor *ec,
struct weston_mode, link);
}
+ if (o && o->config == OUTPUT_CONFIG_CURRENT)
+ configured = current;
+
if (option_current_mode && current)
output->base.current = current;
+ else if (configured)
+ output->base.current = configured;
else if (preferred)
output->base.current = preferred;
else if (current)
@@ -1712,9 +1759,12 @@ drm_destroy(struct weston_compositor *ec)
{
struct drm_compositor *d = (struct drm_compositor *) ec;
struct weston_seat *seat, *next;
+ struct drm_configured_output *o, *n;
wl_list_for_each_safe(seat, next, &ec->seat_list, link)
evdev_input_destroy(seat);
+ wl_list_for_each_safe(o, n, &configured_output_list, link)
+ free(o);
wl_event_source_remove(d->udev_drm_source);
wl_event_source_remove(d->drm_source);
@@ -1982,6 +2032,38 @@ err_base:
return NULL;
}
+static void
+output_section_done(void *data)
+{
+ struct drm_configured_output *output;
+
+ output = malloc(sizeof *output);
+
+ if (!output)
+ return;
+
+ output->config = OUTPUT_CONFIG_INVALID;
+ output->name = output_name;
+ output->mode = output_mode;
+
+ if (strcmp(output_mode, "off") == 0)
+ output->config = OUTPUT_CONFIG_OFF;
+ else if (strcmp(output_mode, "preferred") == 0)
+ output->config = OUTPUT_CONFIG_PREFERRED;
+ else if (strcmp(output_mode, "current") == 0)
+ output->config = OUTPUT_CONFIG_CURRENT;
+ else if (sscanf(output_mode, "%dx%d", &output->width, &output->height) == 2)
+ output->config = OUTPUT_CONFIG_MODE;
+
+ if (output->config != OUTPUT_CONFIG_INVALID)
+ wl_list_insert(&configured_output_list, &output->link);
+ else {
+ free(output);
+ weston_log("Invalid mode \"%s\" for output %s\n",
+ output_mode, output_name);
+ }
+}
+
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int argc, char *argv[],
const char *config_file)
@@ -1998,6 +2080,21 @@ backend_init(struct wl_display *display, int argc, char *argv[],
parse_options(drm_options, ARRAY_LENGTH(drm_options), argc, argv);
+ wl_list_init(&configured_output_list);
+
+ const struct config_key drm_config_keys[] = {
+ { "name", CONFIG_KEY_STRING, &output_name },
+ { "mode", CONFIG_KEY_STRING, &output_mode },
+ };
+
+ const struct config_section config_section[] = {
+ { "output", drm_config_keys,
+ ARRAY_LENGTH(drm_config_keys), output_section_done },
+ };
+
+ parse_config_file(config_file, config_section,
+ ARRAY_LENGTH(config_section), NULL);
+
return drm_compositor_create(display, connector, seat, tty, argc, argv,
config_file);
}
diff --git a/weston.ini b/weston.ini
index f736c8a..375f4ee 100644
--- a/weston.ini
+++ b/weston.ini
@@ -34,9 +34,10 @@ path=./clients/flower
path=/usr/libexec/weston-screensaver
duration=600
-[output]
-name=LVDS1
-mode=off
+#[output]
+#name=LVDS1
+#mode=off
-mode=1366x768
-modeline=36.25 912 936 1024 1136 512 515 525 533 -hsync +vsync
+#[output]
+#name=VGA1
+#mode=1280x1024
--
1.7.11.2
More information about the wayland-devel
mailing list