On Fri, Mar 08, 2013 at 02:56:49PM +0200, Pekka Paalanen 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 a following patch.
> 
> Also add comments to weston_surface fields, whose modification causes
> transform state to become outdated.
> 
> Signed-off-by: Pekka Paalanen <[email protected]>

Looks good, committed.

Kristian

> ---
>  src/animation.c               |  4 ++--
>  src/compositor.c              | 18 ++++++++++++------
>  src/compositor.h              | 17 ++++++++++-------
>  src/shell.c                   | 24 ++++++++++--------------
>  src/xwayland/window-manager.c |  4 ++--
>  tests/weston-test.c           |  7 ++-----
>  6 files changed, 38 insertions(+), 36 deletions(-)
> 
> diff --git a/src/animation.c b/src/animation.c
> index 9e2ad4e..229946f 100644
> --- a/src/animation.c
> +++ b/src/animation.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/compositor.c b/src/compositor.c
> index 75ff035..125276e 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -304,7 +304,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;
> @@ -657,10 +657,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);
>  
> @@ -685,6 +685,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)
> @@ -779,7 +785,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
> @@ -788,7 +794,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
> @@ -1422,7 +1428,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 4a0c1e3..bdd4874 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -368,8 +368,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
> @@ -393,17 +393,17 @@ struct weston_surface {
>       struct weston_compositor *compositor;
>       pixman_region32_t clip;
>       pixman_region32_t damage;
> -     pixman_region32_t opaque;
> +     pixman_region32_t opaque;        /* part of geometry, see below */
>       pixman_region32_t input;
>       struct wl_list link;
>       struct wl_list layer_link;
> -     float alpha;
> +     float alpha;                     /* part of geometry, see below */
>       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 {
> @@ -412,14 +412,14 @@ struct weston_surface {
>  
>               /* struct weston_transform */
>               struct wl_list transformation_list;
> -
> -             int dirty;
>       } 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;
>  
> @@ -498,6 +498,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 3da5321..61a5be8 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -610,7 +610,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
> @@ -686,7 +686,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);
>       }
>  }
>  
> @@ -1530,7 +1530,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;
> @@ -2479,7 +2479,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);
>  }
>  
> @@ -2573,7 +2573,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 =
> @@ -2938,7 +2938,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);
> @@ -3055,7 +3055,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) {
> @@ -3149,11 +3149,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:
> @@ -3585,7 +3581,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:
> @@ -3594,7 +3590,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/xwayland/window-manager.c b/src/xwayland/window-manager.c
> index 9c7638f..8f0a377 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -823,7 +823,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);
>       }
>  
>       if (window->surface && !window->fullscreen) {
> @@ -847,7 +847,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 b29b64f..4dc2e5c 100644
> --- a/tests/weston-test.c
> +++ b/tests/weston-test.c
> @@ -83,11 +83,8 @@ test_surface_configure(struct weston_surface *surface, 
> int32_t sx, int32_t sy, i
>               wl_list_insert(&test->layer.surface_list,
>                              &surface->layer_link);
>  
> -     surface->geometry.x = test_surface->x;
> -     surface->geometry.y = test_surface->y;
> -     surface->geometry.width = width;
> -     surface->geometry.height = height;
> -     surface->geometry.dirty = 1;
> +     weston_surface_configure(surface, test_surface->x, test_surface->y,
> +                              width, height);
>  
>       if (!weston_surface_is_mapped(surface))
>               weston_surface_update_transform(surface);
> -- 
> 1.7.12.4
> 
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to