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 <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2011-12-02 15:27:01 +01:00
parent 9b88fe87e2
commit 3aad1107d8
2 changed files with 21 additions and 1 deletions

View File

@ -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);

View File

@ -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);