From 16abf6a4d42b9b9b4ab9fe3b537aa8914e989274 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Fri, 17 May 2013 16:46:05 +0300 Subject: [PATCH] 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 --- protocol/subsurface.xml | 3 +++ src/compositor.c | 33 +++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/protocol/subsurface.xml b/protocol/subsurface.xml index 60b4002..8db0495 100644 --- a/protocol/subsurface.xml +++ b/protocol/subsurface.xml @@ -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. diff --git a/src/compositor.c b/src/compositor.c index 89b9cef..ed250ba 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -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 @@ -1882,6 +1872,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 -- 2.7.4