diff --git a/src/compositor.c b/src/compositor.c index 5baf50ab..67bf778b 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -716,8 +716,6 @@ weston_surface_draw(struct weston_surface *es, struct weston_output *output) GLint filter; int n; - weston_surface_update_transform(es); - pixman_region32_init(&repaint); pixman_region32_intersect(&repaint, &es->transform.boundingbox, &output->region); @@ -892,8 +890,6 @@ weston_output_set_cursor(struct weston_output *output, if (device->sprite == NULL) return; - weston_surface_update_transform(device->sprite); - pixman_region32_init(&cursor_region); pixman_region32_intersect(&cursor_region, &device->sprite->transform.boundingbox, @@ -951,6 +947,8 @@ weston_output_repaint(struct weston_output *output, int msecs) pixman_region32_init(&overlap); wl_list_for_each(es, &ec->surface_list, link) { + /* Update surface transform now to avoid calling it ever + * again from the repaint sub-functions. */ weston_surface_update_transform(es); pixman_region32_init(&surface_overlap); diff --git a/src/shell.c b/src/shell.c index 5632c734..fbb12033 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1034,6 +1034,11 @@ rotate_grab_motion(struct wl_grab *grab, weston_matrix_init(&surface->rotation.rotation); weston_matrix_init(&rotate->rotation); } + + /* Repaint implies weston_surface_update_transform(), which + * lazily applies the damage due to rotation update. + */ + weston_compositor_schedule_repaint(surface->surface->compositor); } static void