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]>
---
 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