If the compositor updated the geometry of a surface, the input region would still represent the original geometry. By intersecting the input region specified by the client, if any, by the new geometry when updating surface transformations the active input region can be kept up to date.
Signed-off-by: Jonas Ådahl <[email protected]> --- src/compositor.c | 23 +++++++++++++++++------ src/compositor.h | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index 83bd244..75c66ab 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -249,6 +249,7 @@ weston_surface_create(struct weston_compositor *compositor) pixman_region32_init(&surface->opaque); pixman_region32_init(&surface->clip); region_init_infinite(&surface->input); + region_init_infinite(&surface->full_input); pixman_region32_init(&surface->transform.opaque); wl_list_init(&surface->frame_callback_list); @@ -508,6 +509,17 @@ weston_surface_update_transform_enable(struct weston_surface *surface) return 0; } +static void +weston_surface_update_input_region(struct weston_surface *surface) +{ + pixman_region32_fini(&surface->input); + pixman_region32_init_rect(&surface->input, 0, 0, + surface->geometry.width, + surface->geometry.height); + pixman_region32_intersect(&surface->input, + &surface->input, &surface->full_input); +} + WL_EXPORT void weston_surface_update_transform(struct weston_surface *surface) { @@ -522,6 +534,8 @@ weston_surface_update_transform(struct weston_surface *surface) pixman_region32_fini(&surface->transform.opaque); pixman_region32_init(&surface->transform.opaque); + weston_surface_update_input_region(surface); + /* transform.position is always in transformation_list */ if (surface->geometry.transformation_list.next == &surface->transform.position.link && @@ -791,6 +805,7 @@ destroy_surface(struct wl_resource *resource) pixman_region32_fini(&surface->opaque); pixman_region32_fini(&surface->clip); pixman_region32_fini(&surface->input); + pixman_region32_fini(&surface->full_input); wl_list_for_each_safe(cb, next, &surface->frame_callback_list, link) wl_resource_destroy(&cb->resource); @@ -1286,12 +1301,8 @@ surface_commit(struct wl_client *client, struct wl_resource *resource) pixman_region32_fini(&opaque); /* wl_surface.set_input_region */ - pixman_region32_fini(&surface->input); - pixman_region32_init_rect(&surface->input, 0, 0, - surface->geometry.width, - surface->geometry.height); - pixman_region32_intersect(&surface->input, - &surface->input, &surface->pending.input); + pixman_region32_copy(&surface->full_input, &surface->pending.input); + weston_surface_update_input_region(surface); /* wl_surface.frame */ wl_list_insert_list(&surface->frame_callback_list, diff --git a/src/compositor.h b/src/compositor.h index d2e121b..933831c 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -415,6 +415,7 @@ struct weston_surface { pixman_region32_t damage; pixman_region32_t opaque; pixman_region32_t input; + pixman_region32_t full_input; int32_t pitch; struct wl_list link; struct wl_list layer_link; -- 1.7.10.4 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
