}
}
+/* This recursively adds the sub-surfaces for a view, relying on the
+ * sub-surface order. Thus, if a client restacks the sub-surfaces, that
+ * change first happens to the sub-surface list, and then automatically
+ * propagates here. See weston_surface_damage_subsurfaces() for how the
+ * sub-surfaces receive damage when the client changes the state.
+ */
static void
view_list_add(struct weston_compositor *compositor,
struct weston_view *view)
}
}
+/* Cause damage to this sub-surface and all its children.
+ *
+ * This is useful when there are state changes that need an implicit
+ * damage, e.g. a z-order change.
+ */
+static void
+weston_surface_damage_subsurfaces(struct weston_subsurface *sub)
+{
+ struct weston_subsurface *child;
+
+ weston_surface_damage(sub->surface);
+ sub->reordered = false;
+
+ wl_list_for_each(child, &sub->surface->subsurface_list, parent_link)
+ if (child != sub)
+ weston_surface_damage_subsurfaces(child);
+}
+
static void
weston_surface_commit_subsurface_order(struct weston_surface *surface)
{
parent_link_pending) {
wl_list_remove(&sub->parent_link);
wl_list_insert(&surface->subsurface_list, &sub->parent_link);
+
+ if (sub->reordered)
+ weston_surface_damage_subsurfaces(sub);
}
}
wl_list_remove(&sub->parent_link_pending);
wl_list_insert(sibling->parent_link_pending.prev,
&sub->parent_link_pending);
+
+ sub->reordered = true;
}
static void
wl_list_remove(&sub->parent_link_pending);
wl_list_insert(&sibling->parent_link_pending,
&sub->parent_link_pending);
+
+ sub->reordered = true;
}
static void