mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-10-14 22:32:22 +00:00
compositor: introduce weston_surface_geometry_dirty()
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 <ppaalanen@gmail.com>
This commit is contained in:
parent
f1f48cfa35
commit
c3ce738653
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
@ -684,6 +684,12 @@ weston_surface_update_transform(struct weston_surface *surface)
|
|||
weston_surface_assign_output(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,
|
||||
|
@ -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
|
||||
|
@ -1441,7 +1447,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);
|
||||
|
|
|
@ -370,8 +370,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
|
||||
|
@ -395,17 +395,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 {
|
||||
|
@ -414,14 +414,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;
|
||||
|
||||
|
@ -499,6 +499,9 @@ weston_version(int *major, int *minor, int *micro);
|
|||
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,
|
||||
|
|
24
src/shell.c
24
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;
|
||||
|
@ -2480,7 +2480,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);
|
||||
}
|
||||
|
||||
|
@ -2574,7 +2574,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 =
|
||||
|
@ -2939,7 +2939,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);
|
||||
|
@ -3056,7 +3056,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) {
|
||||
|
@ -3150,11 +3150,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:
|
||||
|
@ -3586,7 +3582,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:
|
||||
|
@ -3595,7 +3591,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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue