From 5c38ef4d4ad7e0b4754c5398340f4155a2688312 Mon Sep 17 00:00:00 2001 From: Ander Conselvan de Oliveira Date: Fri, 14 Dec 2012 13:37:25 -0200 Subject: [PATCH] compositor: Update output state after mode switch After a mode switch, the output region and transformation matrix need to be updated. The call to weston_output_move() would do the former but not the latter, but calling that when the output remains in the same coordinate doesn't make much sense. Instead, update this state and the transformation matrix in weston_output_mode_switch(). --- src/compositor-drm.c | 2 -- src/compositor.c | 20 +++++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index ab1e4a93..3f2cd0c6 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -1041,8 +1041,6 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo /*update output*/ output->base.current = &drm_mode->base; - output->base.dirty = 1; - weston_output_move(&output->base, output->base.x, output->base.y); return 0; err_gl: diff --git a/src/compositor.c b/src/compositor.c index f6c94b6d..567105ed 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -84,13 +84,31 @@ sigchld_handler(int signal_number, void *data) return 1; } +static void +weston_output_transform_init(struct weston_output *output, uint32_t transform); + WL_EXPORT int weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode) { + int ret; + if (!output->switch_mode) return -1; - return output->switch_mode(output, mode); + ret = output->switch_mode(output, mode); + if (ret < 0) + return ret; + + /* Update output region and transformation matrix */ + weston_output_transform_init(output, output->transform); + + pixman_region32_init(&output->previous_damage); + pixman_region32_init_rect(&output->region, output->x, output->y, + output->width, output->height); + + weston_output_update_matrix(output); + + return ret; } WL_EXPORT void