diff options
author | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2012-12-14 13:37:25 -0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-12-14 11:27:40 -0500 |
commit | 5c38ef4d4ad7e0b4754c5398340f4155a2688312 (patch) | |
tree | 9d472d8cb20520aef781812a48f4e7832470a6d2 | |
parent | b77aa062c97be37f8f8a622710d612aeb61f4b80 (diff) |
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().
-rw-r--r-- | src/compositor-drm.c | 2 | ||||
-rw-r--r-- | src/compositor.c | 20 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index ab1e4a9..3f2cd0c 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 f6c94b6..567105e 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 |