summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>2012-12-14 13:37:25 -0200
committerKristian Høgsberg <krh@bitplanet.net>2012-12-14 11:27:40 -0500
commit5c38ef4d4ad7e0b4754c5398340f4155a2688312 (patch)
tree9d472d8cb20520aef781812a48f4e7832470a6d2
parentb77aa062c97be37f8f8a622710d612aeb61f4b80 (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.c2
-rw-r--r--src/compositor.c20
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