protocol: set_desync should flush

wl_subsurface.set_desync should apply the cached wl_surface state.
Otherwise, the sub-surface may be stuck: a commit on the parent surface,
if desynchronized, will not commit the sub-surface because it is
desynchronized, too. A commit on the sub-surface may not happen, if it
is waiting for the frame callback from the previous commit.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
dev
Pekka Paalanen 12 years ago committed by Kristian Høgsberg
parent beb080ed85
commit 16abf6a4d4
  1. 3
      protocol/subsurface.xml
  2. 33
      src/compositor.c

@ -229,6 +229,9 @@
Note: even if a sub-surface is set to desynchronized, a parent
sub-surface may override it to behave as synchronized. For details,
see wl_subsurface.
If a surface's parent surface behaves as desynchronized, then
the cached state is applied on set_desync.
</description>
</request>

@ -1851,21 +1851,11 @@ weston_subsurface_commit(struct weston_subsurface *sub)
}
static void
weston_subsurface_parent_commit(struct weston_subsurface *sub,
int parent_is_synchronized)
weston_subsurface_synchronized_commit(struct weston_subsurface *sub)
{
struct weston_surface *surface = sub->surface;
struct weston_subsurface *tmp;
if (sub->position.set) {
weston_surface_set_position(sub->surface,
sub->position.x, sub->position.y);
sub->position.set = 0;
}
if (!parent_is_synchronized && !sub->synchronized)
return;
/* From now on, commit_from_cache the whole sub-tree, regardless of
* the synchronized mode of each child. This sub-surface or some
* of its ancestors were synchronized, so we are synchronized
@ -1881,6 +1871,20 @@ weston_subsurface_parent_commit(struct weston_subsurface *sub,
}
}
static void
weston_subsurface_parent_commit(struct weston_subsurface *sub,
int parent_is_synchronized)
{
if (sub->position.set) {
weston_surface_set_position(sub->surface,
sub->position.x, sub->position.y);
sub->position.set = 0;
}
if (parent_is_synchronized || sub->synchronized)
weston_subsurface_synchronized_commit(sub);
}
static void
subsurface_configure(struct weston_surface *surface, int32_t dx, int32_t dy,
int32_t width, int32_t height)
@ -2050,8 +2054,13 @@ subsurface_set_desync(struct wl_client *client, struct wl_resource *resource)
{
struct weston_subsurface *sub = resource->data;
if (sub)
if (sub && sub->synchronized) {
sub->synchronized = 0;
/* If sub became effectively desynchronized, flush. */
if (!weston_subsurface_is_synchronized(sub))
weston_subsurface_synchronized_commit(sub);
}
}
static void

Loading…
Cancel
Save