From 3aad1107d88ec410b3f2d740c03aef896c3594d2 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Fri, 2 Dec 2011 15:27:01 +0100 Subject: [PATCH] Output: Choose sane default mode We currently use the first mode in the list if no mode is explicitely specified by the caller. However, this is most often the lowest available resolution reported by the kernel. This patch adds a new pointer to every output which remembers a sane default. This is currently the first mode reported by the kernel but may later be optimized to choose a better default mode. Signed-off-by: David Herrmann --- src/output.c | 21 ++++++++++++++++++++- src/output.h | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/output.c b/src/output.c index 2423705..02bad14 100644 --- a/src/output.c +++ b/src/output.c @@ -86,6 +86,7 @@ struct kmscon_output { size_t count_modes; struct kmscon_mode *modes; struct kmscon_mode *current; + struct kmscon_mode *def_mode; uint32_t conn_id; uint32_t crtc_id; @@ -189,6 +190,9 @@ static int kmscon_mode_bind(struct kmscon_mode *mode, mode->output = output; kmscon_mode_ref(mode); + if (!output->def_mode) + output->def_mode = mode; + return 0; } @@ -225,6 +229,9 @@ static int kmscon_mode_unbind(struct kmscon_mode *mode) --output->count_modes; kmscon_mode_unref(mode); + if (output->def_mode == mode) + output->def_mode = output->modes; + return 0; } @@ -522,6 +529,18 @@ struct kmscon_mode *kmscon_output_get_current(struct kmscon_output *output) return output->current; } +/* + * Returns a pointer to the default mode which will be used if no other mode is + * set explicitely. Returns NULL if no default mode is available. + */ +struct kmscon_mode *kmscon_output_get_default(struct kmscon_output *output) +{ + if (!output) + return NULL; + + return output->def_mode; +} + static int init_rb(struct render_buffer *rb, struct kmscon_compositor *comp, drmModeModeInfo *mode) { @@ -605,7 +624,7 @@ int kmscon_output_activate(struct kmscon_output *output, return -EALREADY; if (!mode) - mode = output->modes; + mode = output->def_mode; comp = output->comp; output->saved_crtc = drmModeGetCrtc(comp->drm_fd, output->crtc_id); diff --git a/src/output.h b/src/output.h index 47a7209..e2b89e9 100644 --- a/src/output.h +++ b/src/output.h @@ -84,6 +84,7 @@ void kmscon_output_unref(struct kmscon_output *output); struct kmscon_output *kmscon_output_next(struct kmscon_output *output); struct kmscon_mode *kmscon_output_get_modes(struct kmscon_output *output); struct kmscon_mode *kmscon_output_get_current(struct kmscon_output *output); +struct kmscon_mode *kmscon_output_get_default(struct kmscon_output *output); int kmscon_output_activate(struct kmscon_output *output, struct kmscon_mode *mode);