[PATCH weston 2/4] compositor: introduce weston_surface_geometry_dirty()
Scott Moreau
oreaus at gmail.com
Tue Dec 18 06:24:17 PST 2012
On Tue, Dec 18, 2012 at 4:58 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> Instead of directly setting the dirty flag on weston_surface geometry,
> use a function for that.
>
> This allows us to hook into geometry dirtying in following patches.
>
> Also add comments to weston_surface fields, whose modification causes
> transform state to become outdated.
>
> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> ---
> src/compositor.c | 20 +++++++++++++-------
> src/compositor.h | 17 ++++++++++-------
> src/shell.c | 24 ++++++++++--------------
> src/util.c | 4 ++--
> src/xwayland/window-manager.c | 4 ++--
> tests/weston-test.c | 2 +-
> 6 files changed, 38 insertions(+), 33 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 0b37e63..24ae6e3 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -297,7 +297,7 @@ weston_surface_create(struct weston_compositor
> *compositor)
> &surface->transform.position.link);
> weston_matrix_init(&surface->transform.position.matrix);
> pixman_region32_init(&surface->transform.boundingbox);
> - surface->geometry.dirty = 1;
> + surface->transform.dirty = 1;
>
> surface->pending.buffer_destroy_listener.notify =
> surface_handle_pending_buffer_destroy;
> @@ -568,10 +568,10 @@ weston_surface_update_transform_enable(struct
> weston_surface *surface)
> WL_EXPORT void
> weston_surface_update_transform(struct weston_surface *surface)
> {
> - if (!surface->geometry.dirty)
> + if (!surface->transform.dirty)
> return;
>
> - surface->geometry.dirty = 0;
> + surface->transform.dirty = 0;
>
> weston_surface_damage_below(surface);
>
> @@ -596,6 +596,12 @@ weston_surface_update_transform(struct weston_surface
> *surface)
> }
>
> WL_EXPORT void
> +weston_surface_geometry_dirty(struct weston_surface *surface)
> +{
> + surface->transform.dirty = 1;
> +}
> +
> +WL_EXPORT void
> weston_surface_to_global_fixed(struct weston_surface *surface,
> wl_fixed_t sx, wl_fixed_t sy,
> wl_fixed_t *x, wl_fixed_t *y)
> @@ -690,7 +696,7 @@ weston_surface_configure(struct weston_surface
> *surface,
> surface->geometry.y = y;
> surface->geometry.width = width;
> surface->geometry.height = height;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> }
>
> WL_EXPORT void
> @@ -699,7 +705,7 @@ weston_surface_set_position(struct weston_surface
> *surface,
> {
> surface->geometry.x = x;
> surface->geometry.y = y;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> }
>
> WL_EXPORT int
> @@ -1393,7 +1399,7 @@ surface_commit(struct wl_client *client, struct
> wl_resource *resource)
> if (surface->pending.sx || surface->pending.sy ||
> (surface->pending.buffer &&
> surface_pending_buffer_has_different_size(surface)))
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
>
> /* wl_surface.set_buffer_rotation */
> surface->buffer_transform = surface->pending.buffer_transform;
> @@ -1426,7 +1432,7 @@ surface_commit(struct wl_client *client, struct
> wl_resource *resource)
>
> if (!pixman_region32_equal(&opaque, &surface->opaque)) {
> pixman_region32_copy(&surface->opaque, &opaque);
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> }
>
> pixman_region32_fini(&opaque);
> diff --git a/src/compositor.h b/src/compositor.h
> index 1d790d3..3a3580a 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -360,8 +360,8 @@ struct weston_region {
> * To add a transformation to a surface, create a struct
> weston_transform, and
> * add it to the list surface->geometry.transformation_list. Whenever you
> * change the list, anything under surface->geometry, or anything in the
> - * weston_transforms linked into the list, you must set
> - * surface->geometry.dirty = 1.
> + * weston_transforms linked into the list, you must call
> + * weston_surface_geometry_dirty().
> *
> * The order in the list defines the order of transformations. Let the
> list
> * contain the transformation matrices M1, ..., Mn as head to tail. The
> @@ -385,17 +385,17 @@ struct weston_surface {
> struct weston_compositor *compositor;
> pixman_region32_t clip;
> pixman_region32_t damage;
> - pixman_region32_t opaque;
> + pixman_region32_t opaque; /* geometry dirty */
>
I'm not sure what this comment is supposed to convey.
> pixman_region32_t input;
> struct wl_list link;
> struct wl_list layer_link;
> - float alpha;
> + float alpha; /* geometry dirty */
>
This one as well.
> struct weston_plane *plane;
>
> void *renderer_state;
>
> /* Surface geometry state, mutable.
> - * If you change anything, set dirty = 1.
> + * If you change anything, call weston_surface_geometry_dirty().
> * That includes the transformations referenced from the list.
> */
> struct {
> @@ -404,14 +404,14 @@ struct weston_surface {
>
> /* struct weston_transform */
> struct wl_list transformation_list;
> -
> - int dirty;
>
Why are we changing whitespace here?
> } geometry;
>
> /* State derived from geometry state, read-only.
> * This is updated by weston_surface_update_transform().
> */
> struct {
> + int dirty;
> +
> pixman_region32_t boundingbox;
> pixman_region32_t opaque;
>
And here?
>
> @@ -489,6 +489,9 @@ void
> weston_surface_update_transform(struct weston_surface *surface);
>
> void
> +weston_surface_geometry_dirty(struct weston_surface *surface);
> +
> +void
> weston_surface_to_global_fixed(struct weston_surface *surface,
> wl_fixed_t sx, wl_fixed_t sy,
> wl_fixed_t *x, wl_fixed_t *y);
> diff --git a/src/shell.c b/src/shell.c
> index aa1c7c1..5b9acd7 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -594,7 +594,7 @@ surface_translate(struct weston_surface *surface,
> double d)
> weston_matrix_init(&shsurf->workspace_transform.matrix);
> weston_matrix_translate(&shsurf->workspace_transform.matrix,
> 0.0, d, 0.0);
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> }
>
> static void
> @@ -670,7 +670,7 @@ workspace_deactivate_transforms(struct workspace *ws)
> wl_list_remove(&shsurf->workspace_transform.link);
> wl_list_init(&shsurf->workspace_transform.link);
> }
> - shsurf->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> }
> }
>
> @@ -1511,7 +1511,7 @@ set_surface_type(struct shell_surface *shsurf)
> if (!wl_list_empty(&shsurf->rotation.transform.link)) {
> wl_list_remove(&shsurf->rotation.transform.link);
> wl_list_init(&shsurf->rotation.transform.link);
> - shsurf->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(shsurf->surface);
> shsurf->saved_rotation_valid = true;
> }
> break;
> @@ -2404,7 +2404,7 @@ surface_opacity_binding(struct wl_seat *seat,
> uint32_t time, uint32_t axis,
> if (surface->alpha < step)
> surface->alpha = step;
>
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> weston_surface_damage(surface);
> }
>
> @@ -2498,7 +2498,7 @@ rotate_grab_motion(struct wl_pointer_grab *grab,
> r = sqrtf(dx * dx + dy * dy);
>
> wl_list_remove(&shsurf->rotation.transform.link);
> - shsurf->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(shsurf->surface);
>
> if (r > 20.0f) {
> struct weston_matrix *matrix =
> @@ -2789,7 +2789,7 @@ show_input_panels(struct wl_listener *listener, void
> *data)
> ws = surface->surface;
> wl_list_insert(&shell->input_panel_layer.surface_list,
> &ws->layer_link);
> - ws->geometry.dirty = 1;
> + weston_surface_geometry_dirty(ws);
> weston_surface_update_transform(ws);
> weston_surface_damage(ws);
> weston_slide_run(ws, ws->geometry.height, 0, NULL, NULL);
> @@ -2903,7 +2903,7 @@ map(struct desktop_shell *shell, struct
> weston_surface *surface,
>
> surface->geometry.width = width;
> surface->geometry.height = height;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
>
> /* initial positioning, see also configure() */
> switch (surface_type) {
> @@ -2997,11 +2997,7 @@ configure(struct desktop_shell *shell, struct
> weston_surface *surface,
> if (shsurf)
> surface_type = shsurf->type;
>
> - surface->geometry.x = x;
> - surface->geometry.y = y;
> - surface->geometry.width = width;
> - surface->geometry.height = height;
> - surface->geometry.dirty = 1;
> + weston_surface_configure(surface, x, y, width, height);
>
> switch (surface_type) {
> case SHELL_SURFACE_FULLSCREEN:
> @@ -3342,7 +3338,7 @@ switcher_next(struct switcher *switcher)
> next = surface;
> prev = surface;
> surface->alpha = 0.25;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> weston_surface_damage(surface);
> break;
> default:
> @@ -3351,7 +3347,7 @@ switcher_next(struct switcher *switcher)
>
> if (is_black_surface(surface, NULL)) {
> surface->alpha = 0.25;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
> weston_surface_damage(surface);
> }
> }
> diff --git a/src/util.c b/src/util.c
> index 5f8e9c8..bae1bb9 100644
> --- a/src/util.c
> +++ b/src/util.c
> @@ -116,7 +116,7 @@ weston_surface_animation_destroy(struct
> weston_surface_animation *animation)
> wl_list_remove(&animation->animation.link);
> wl_list_remove(&animation->listener.link);
> wl_list_remove(&animation->transform.link);
> - animation->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(animation->surface);
> if (animation->done)
> animation->done(animation, animation->data);
> free(animation);
> @@ -153,7 +153,7 @@ weston_surface_animation_frame(struct weston_animation
> *base,
> if (animation->frame)
> animation->frame(animation);
>
> - animation->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(animation->surface);
> weston_compositor_schedule_repaint(animation->surface->compositor);
> }
>
> diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
> index 303ef15..168c717 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -757,7 +757,7 @@ weston_wm_window_draw_decoration(void *data)
> x - 1, y - 1,
> window->width + 2,
> window->height + 2);
> - window->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(window->surface);
>
> pixman_region32_init_rect(&window->surface->input,
> t->margin, t->margin,
> @@ -778,7 +778,7 @@ weston_wm_window_schedule_repaint(struct
> weston_wm_window *window)
>
> pixman_region32_fini(&window->surface->pending.opaque);
>
> pixman_region32_init_rect(&window->surface->pending.opaque, 0, 0,
> width, height);
> - window->surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(window->surface);
> }
> return;
> }
> diff --git a/tests/weston-test.c b/tests/weston-test.c
> index be635fa..e89f104 100644
> --- a/tests/weston-test.c
> +++ b/tests/weston-test.c
> @@ -87,7 +87,7 @@ test_surface_configure(struct weston_surface *surface,
> int32_t sx, int32_t sy)
> surface->geometry.y = test_surface->y;
> surface->geometry.width = surface->buffer_ref.buffer->width;
> surface->geometry.height = surface->buffer_ref.buffer->height;
> - surface->geometry.dirty = 1;
> + weston_surface_geometry_dirty(surface);
>
> if (!weston_surface_is_mapped(surface))
> weston_surface_update_transform(surface);
> --
> 1.7.8.6
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20121218/64be4c39/attachment-0001.html>
More information about the wayland-devel
mailing list