summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <ppaalanen@gmail.com>2013-05-17 16:46:05 +0300
committerKristian Høgsberg <krh@bitplanet.net>2013-05-17 16:21:50 -0400
commit16abf6a4d42b9b9b4ab9fe3b537aa8914e989274 (patch)
treef6681b278d6f6d4126cb416c3c374bf7be63b753
parentbeb080ed858f35608cdaed1f9741d121067da42a (diff)
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>
-rw-r--r--protocol/subsurface.xml3
-rw-r--r--src/compositor.c33
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.
</description>
</request>
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