mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 19:42:05 +00:00
wayland/surface: Process damage also for non-actor surfaces
The texture still needs to be updated with damaged content. https://gitlab.gnome.org/GNOME/mutter/issues/199
This commit is contained in:
parent
944a4763f6
commit
d2f1edd6c6
@ -283,7 +283,7 @@ surface_process_damage (MetaWaylandSurface *surface,
|
|||||||
cairo_region_t *transformed_region;
|
cairo_region_t *transformed_region;
|
||||||
cairo_region_t *viewport_region;
|
cairo_region_t *viewport_region;
|
||||||
ClutterRect src_rect;
|
ClutterRect src_rect;
|
||||||
int i, n_rectangles;
|
MetaSurfaceActor *actor;
|
||||||
|
|
||||||
/* If the client destroyed the buffer it attached before committing, but
|
/* If the client destroyed the buffer it attached before committing, but
|
||||||
* still posted damage, or posted damage without any buffer, don't try to
|
* still posted damage, or posted damage without any buffer, don't try to
|
||||||
@ -345,19 +345,22 @@ surface_process_damage (MetaWaylandSurface *surface,
|
|||||||
/* First update the buffer. */
|
/* First update the buffer. */
|
||||||
meta_wayland_buffer_process_damage (buffer, buffer_region);
|
meta_wayland_buffer_process_damage (buffer, buffer_region);
|
||||||
|
|
||||||
/* Now damage the actor. The actor expects damage in the unscaled texture
|
actor = meta_wayland_surface_get_actor (surface);
|
||||||
* coordinate space, i.e. same as the buffer. */
|
if (actor)
|
||||||
/* XXX: Should this be a signal / callback on MetaWaylandBuffer instead? */
|
{
|
||||||
|
int i, n_rectangles;
|
||||||
|
|
||||||
n_rectangles = cairo_region_num_rectangles (buffer_region);
|
n_rectangles = cairo_region_num_rectangles (buffer_region);
|
||||||
for (i = 0; i < n_rectangles; i++)
|
for (i = 0; i < n_rectangles; i++)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t rect;
|
cairo_rectangle_int_t rect;
|
||||||
cairo_region_get_rectangle (buffer_region, i, &rect);
|
cairo_region_get_rectangle (buffer_region, i, &rect);
|
||||||
|
|
||||||
meta_surface_actor_process_damage (meta_wayland_surface_get_actor (surface),
|
meta_surface_actor_process_damage (actor,
|
||||||
rect.x, rect.y,
|
rect.x, rect.y,
|
||||||
rect.width, rect.height);
|
rect.width, rect.height);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cairo_region_destroy (viewport_region);
|
cairo_region_destroy (viewport_region);
|
||||||
cairo_region_destroy (scaled_region);
|
cairo_region_destroy (scaled_region);
|
||||||
@ -774,9 +777,8 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
|||||||
surface->viewport.has_dst_size = surface->viewport.dst_width > 0;
|
surface->viewport.has_dst_size = surface->viewport.dst_width > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meta_wayland_surface_get_actor (surface) &&
|
if (!cairo_region_is_empty (pending->surface_damage) ||
|
||||||
(!cairo_region_is_empty (pending->surface_damage) ||
|
!cairo_region_is_empty (pending->buffer_damage))
|
||||||
!cairo_region_is_empty (pending->buffer_damage)))
|
|
||||||
surface_process_damage (surface,
|
surface_process_damage (surface,
|
||||||
pending->surface_damage,
|
pending->surface_damage,
|
||||||
pending->buffer_damage);
|
pending->buffer_damage);
|
||||||
|
Loading…
Reference in New Issue
Block a user