[PATCH weston 3/4] compositor: put weston_matrix_pointer into transformation_list

Scott Moreau oreaus at gmail.com
Tue Dec 18 06:24:23 PST 2012


Hi Pekka,

I notice you use the name 'ptr' which doesn't exactly fit the surrounding
code. I don't really care for this, but I guess as long as it's used in
context and has comments, it's ok.

On Tue, Dec 18, 2012 at 4:58 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:

> Define struct weston_matrix_pointer, which acts as pointer to a matrix,
> not a matrix itself. This type is stored into
> weston_surface::geometry.transformation_list instead of
> weston_transform.
>
> This is a step towards making surface transformations properly
> inheritable. Transformation list can refer to another matrix, without
> adding hooks to maintain a copy of that matrix.
>
> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> ---
>  src/compositor.c |   18 +++++++++++-------
>  src/compositor.h |   27 +++++++++++++++++++--------
>  src/shell.c      |   49 +++++++++++++++++++++++++++----------------------
>  src/util.c       |    5 +++--
>  4 files changed, 60 insertions(+), 39 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 24ae6e3..1533cbc 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -293,9 +293,12 @@ weston_surface_create(struct weston_compositor
> *compositor)
>         wl_list_init(&surface->frame_callback_list);
>
>         wl_list_init(&surface->geometry.transformation_list);
> -       wl_list_insert(&surface->geometry.transformation_list,
> -                      &surface->transform.position.link);
> +
>         weston_matrix_init(&surface->transform.position.matrix);
> +       weston_transform_init(&surface->transform.position);
> +       wl_list_insert(&surface->geometry.transformation_list,
> +                      &surface->transform.position.ptr.link);
> +
>         pixman_region32_init(&surface->transform.boundingbox);
>         surface->transform.dirty = 1;
>
> @@ -539,7 +542,7 @@ weston_surface_update_transform_enable(struct
> weston_surface *surface)
>  {
>         struct weston_matrix *matrix = &surface->transform.matrix;
>         struct weston_matrix *inverse = &surface->transform.inverse;
> -       struct weston_transform *tform;
> +       struct weston_matrix_pointer *ptr;
>
>         surface->transform.enabled = 1;
>
> @@ -548,8 +551,9 @@ weston_surface_update_transform_enable(struct
> weston_surface *surface)
>         surface->transform.position.matrix.d[13] = surface->geometry.y;
>
>         weston_matrix_init(matrix);
> -       wl_list_for_each(tform, &surface->geometry.transformation_list,
> link)
> -               weston_matrix_multiply(matrix, &tform->matrix);
> +       wl_list_for_each(ptr, &surface->geometry.transformation_list,
> link) {
> +               weston_matrix_multiply(matrix, ptr->matrix);
> +       }
>
>         if (weston_matrix_invert(inverse, matrix) < 0) {
>                 /* Oops, bad total transformation, not invertible */
> @@ -581,9 +585,9 @@ weston_surface_update_transform(struct weston_surface
> *surface)
>
>         /* transform.position is always in transformation_list */
>         if (surface->geometry.transformation_list.next ==
> -           &surface->transform.position.link &&
> +           &surface->transform.position.ptr.link &&
>             surface->geometry.transformation_list.prev ==
> -           &surface->transform.position.link) {
> +           &surface->transform.position.ptr.link) {
>                 weston_surface_update_transform_disable(surface);
>         } else {
>                 if (weston_surface_update_transform_enable(surface) < 0)
> diff --git a/src/compositor.h b/src/compositor.h
> index 3a3580a..b681481 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -37,11 +37,6 @@
>         const __typeof__( ((type *)0)->member ) *__mptr = (ptr);        \
>         (type *)( (char *)__mptr - offsetof(type,member) );})
>
> -struct weston_transform {
> -       struct weston_matrix matrix;
> -       struct wl_list link;
> -};
> -
>  struct weston_surface;
>  struct shell_surface;
>  struct weston_seat;
> @@ -345,6 +340,16 @@ struct weston_compositor {
>         struct weston_xkb_info xkb_info;
>  };
>
> +struct weston_matrix_pointer {
> +       struct weston_matrix *matrix;
> +       struct wl_list link;
> +};
> +
> +struct weston_transform {
> +       struct weston_matrix matrix;
> +       struct weston_matrix_pointer ptr;
> +};
> +
>  struct weston_buffer_reference {
>         struct wl_buffer *buffer;
>         struct wl_listener destroy_listener;
> @@ -357,8 +362,8 @@ struct weston_region {
>
>  /* Using weston_surface transformations
>   *
> - * To add a transformation to a surface, create a struct
> weston_transform, and
> - * add it to the list surface->geometry.transformation_list. Whenever you
> + * To add a transformation to a surface, create a struct
> weston_matrix_pointer,
> + * 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 call
>   * weston_surface_geometry_dirty().
> @@ -402,7 +407,7 @@ struct weston_surface {
>                 float x, y; /* surface translation on display */
>                 int32_t width, height;
>
> -               /* struct weston_transform */
> +               /* struct weston_matrix_pointer::link */
>                 struct wl_list transformation_list;
>         } geometry;
>
> @@ -845,4 +850,10 @@ weston_transformed_rect(int width, int height,
>                         enum wl_output_transform transform,
>                         pixman_box32_t rect);
>
> +static inline void
> +weston_transform_init(struct weston_transform *tform)
> +{
> +       tform->ptr.matrix = &tform->matrix;
> +}
> +
>  #endif
> diff --git a/src/shell.c b/src/shell.c
> index 5b9acd7..e25140d 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -587,9 +587,9 @@ surface_translate(struct weston_surface *surface,
> double d)
>         struct weston_transform *transform;
>
>         transform = &shsurf->workspace_transform;
> -       if (wl_list_empty(&transform->link))
> +       if (wl_list_empty(&transform->ptr.link))
>                 wl_list_insert(surface->geometry.transformation_list.prev,
> -                              &shsurf->workspace_transform.link);
> +                              &shsurf->workspace_transform.ptr.link);
>
>         weston_matrix_init(&shsurf->workspace_transform.matrix);
>         weston_matrix_translate(&shsurf->workspace_transform.matrix,
> @@ -666,9 +666,9 @@ workspace_deactivate_transforms(struct workspace *ws)
>
>         wl_list_for_each(surface, &ws->layer.surface_list, layer_link) {
>                 shsurf = get_shell_surface(surface);
> -               if (!wl_list_empty(&shsurf->workspace_transform.link)) {
> -                       wl_list_remove(&shsurf->workspace_transform.link);
> -                       wl_list_init(&shsurf->workspace_transform.link);
> +               if (!wl_list_empty(&shsurf->workspace_transform.ptr.link))
> {
> +
> wl_list_remove(&shsurf->workspace_transform.ptr.link);
> +
> wl_list_init(&shsurf->workspace_transform.ptr.link);
>                 }
>                 weston_surface_geometry_dirty(surface);
>         }
> @@ -919,9 +919,9 @@ take_surface_to_workspace_by_seat(struct desktop_shell
> *shell,
>                 update_workspace(shell, index, from, to);
>         else {
>                 shsurf = get_shell_surface(surface);
> -               if (wl_list_empty(&shsurf->workspace_transform.link))
> +               if (wl_list_empty(&shsurf->workspace_transform.ptr.link))
>                         wl_list_insert(&shell->workspaces.anim_sticky_list,
> -                                      &shsurf->workspace_transform.link);
> +
>  &shsurf->workspace_transform.ptr.link);
>
>                 animate_workspace_change(shell, index, from, to);
>         }
> @@ -1434,8 +1434,8 @@ shell_unset_fullscreen(struct shell_surface *shsurf)
>         }
>         shsurf->fullscreen.type =
> WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT;
>         shsurf->fullscreen.framerate = 0;
> -       wl_list_remove(&shsurf->fullscreen.transform.link);
> -       wl_list_init(&shsurf->fullscreen.transform.link);
> +       wl_list_remove(&shsurf->fullscreen.transform.ptr.link);
> +       wl_list_init(&shsurf->fullscreen.transform.ptr.link);
>         if (shsurf->fullscreen.black_surface)
>                 weston_surface_destroy(shsurf->fullscreen.black_surface);
>         shsurf->fullscreen.black_surface = NULL;
> @@ -1444,7 +1444,7 @@ shell_unset_fullscreen(struct shell_surface *shsurf)
>                                     shsurf->saved_x, shsurf->saved_y);
>         if (shsurf->saved_rotation_valid) {
>
> wl_list_insert(&shsurf->surface->geometry.transformation_list,
> -                              &shsurf->rotation.transform.link);
> +                              &shsurf->rotation.transform.ptr.link);
>                 shsurf->saved_rotation_valid = false;
>         }
>
> @@ -1508,9 +1508,9 @@ set_surface_type(struct shell_surface *shsurf)
>                 shsurf->saved_y = surface->geometry.y;
>                 shsurf->saved_position_valid = true;
>
> -               if (!wl_list_empty(&shsurf->rotation.transform.link)) {
> -                       wl_list_remove(&shsurf->rotation.transform.link);
> -                       wl_list_init(&shsurf->rotation.transform.link);
> +               if (!wl_list_empty(&shsurf->rotation.transform.ptr.link)) {
> +
> wl_list_remove(&shsurf->rotation.transform.ptr.link);
> +                       wl_list_init(&shsurf->rotation.transform.ptr.link);
>                         weston_surface_geometry_dirty(shsurf->surface);
>                         shsurf->saved_rotation_valid = true;
>                 }
> @@ -1686,9 +1686,9 @@ shell_configure_fullscreen(struct shell_surface
> *shsurf)
>                                 (float) surface->geometry.height;
>
>                 weston_matrix_scale(matrix, scale, scale, 1);
> -               wl_list_remove(&shsurf->fullscreen.transform.link);
> +               wl_list_remove(&shsurf->fullscreen.transform.ptr.link);
>                 wl_list_insert(&surface->geometry.transformation_list,
> -                              &shsurf->fullscreen.transform.link);
> +                              &shsurf->fullscreen.transform.ptr.link);
>                 x = output->x + (output->width - surface->geometry.width *
> scale) / 2;
>                 y = output->y + (output->height - surface->geometry.height
> * scale) / 2;
>                 weston_surface_set_position(surface, x, y);
> @@ -1881,7 +1881,7 @@ shell_map_popup(struct shell_surface *shsurf)
>                         parent->geometry.y;
>         }
>         wl_list_insert(es->geometry.transformation_list.prev,
> -                      &shsurf->popup.parent_transform.link);
> +                      &shsurf->popup.parent_transform.ptr.link);
>
>         shsurf->popup.initial_up = 0;
>         weston_surface_set_position(es, shsurf->popup.x, shsurf->popup.y);
> @@ -2018,7 +2018,7 @@ create_shell_surface(void *shell, struct
> weston_surface *surface,
>         shsurf->fullscreen.framerate = 0;
>         shsurf->fullscreen.black_surface = NULL;
>         shsurf->ping_timer = NULL;
> -       wl_list_init(&shsurf->fullscreen.transform.link);
> +       wl_list_init(&shsurf->fullscreen.transform.ptr.link);
>
>         wl_signal_init(&shsurf->resource.destroy_signal);
>         shsurf->surface_destroy_listener.notify =
> shell_handle_surface_destroy;
> @@ -2029,10 +2029,15 @@ create_shell_surface(void *shell, struct
> weston_surface *surface,
>         wl_list_init(&shsurf->link);
>
>         /* empty when not in use */
> -       wl_list_init(&shsurf->rotation.transform.link);
> +       wl_list_init(&shsurf->rotation.transform.ptr.link);
> +       weston_transform_init(&shsurf->rotation.transform);
>         weston_matrix_init(&shsurf->rotation.rotation);
>
> -       wl_list_init(&shsurf->workspace_transform.link);
> +       weston_transform_init(&shsurf->popup.parent_transform);
> +       weston_transform_init(&shsurf->fullscreen.transform);
> +
> +       wl_list_init(&shsurf->workspace_transform.ptr.link);
> +       weston_transform_init(&shsurf->workspace_transform);
>
>         shsurf->type = SHELL_SURFACE_NONE;
>         shsurf->next_type = SHELL_SURFACE_NONE;
> @@ -2497,7 +2502,7 @@ rotate_grab_motion(struct wl_pointer_grab *grab,
>         dy = wl_fixed_to_double(pointer->y) - rotate->center.y;
>         r = sqrtf(dx * dx + dy * dy);
>
> -       wl_list_remove(&shsurf->rotation.transform.link);
> +       wl_list_remove(&shsurf->rotation.transform.ptr.link);
>         weston_surface_geometry_dirty(shsurf->surface);
>
>         if (r > 20.0f) {
> @@ -2518,9 +2523,9 @@ rotate_grab_motion(struct wl_pointer_grab *grab,
>
>                 wl_list_insert(
>                         &shsurf->surface->geometry.transformation_list,
> -                       &shsurf->rotation.transform.link);
> +                       &shsurf->rotation.transform.ptr.link);
>         } else {
> -               wl_list_init(&shsurf->rotation.transform.link);
> +               wl_list_init(&shsurf->rotation.transform.ptr.link);
>                 weston_matrix_init(&shsurf->rotation.rotation);
>                 weston_matrix_init(&rotate->rotation);
>         }
> diff --git a/src/util.c b/src/util.c
> index bae1bb9..91c83a6 100644
> --- a/src/util.c
> +++ b/src/util.c
> @@ -115,7 +115,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);
> +       wl_list_remove(&animation->transform.ptr.link);
>         weston_surface_geometry_dirty(animation->surface);
>         if (animation->done)
>                 animation->done(animation, animation->data);
> @@ -177,8 +177,9 @@ weston_surface_animation_run(struct weston_surface
> *surface,
>         animation->start = start;
>         animation->stop = stop;
>         weston_matrix_init(&animation->transform.matrix);
> +       weston_transform_init(&animation->transform);
>         wl_list_insert(&surface->geometry.transformation_list,
> -                      &animation->transform.link);
> +                      &animation->transform.ptr.link);
>         weston_spring_init(&animation->spring, 200.0, 0.0, 1.0);
>         animation->spring.friction = 700;
>         animation->animation.frame_counter = 0;
> --
> 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/99faafb0/attachment-0001.html>


More information about the wayland-devel mailing list