summaryrefslogtreecommitdiffstats
path: root/server/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/tree.c')
-rw-r--r--server/tree.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/server/tree.c b/server/tree.c
index bf50edfc..ad31f09b 100644
--- a/server/tree.c
+++ b/server/tree.c
@@ -223,3 +223,30 @@ Container* container_new(DrawItem *item)
return container;
}
+
+void container_free(Container *container)
+{
+ spice_return_if_fail(ring_is_empty(&container->items));
+
+ ring_remove(&container->base.siblings_link);
+ region_destroy(&container->base.rgn);
+ free(container);
+}
+
+void container_cleanup(Container *container)
+{
+ /* visit upward, removing containers */
+ /* non-empty container get its element moving up ?? */
+ while (container && container->items.next == container->items.prev) {
+ Container *next = container->base.container;
+ if (container->items.next != &container->items) {
+ TreeItem *item = (TreeItem *)ring_get_head(&container->items);
+ spice_assert(item);
+ ring_remove(&item->siblings_link);
+ ring_add_after(&item->siblings_link, &container->base.siblings_link);
+ item->container = container->base.container;
+ }
+ container_free(container);
+ container = next;
+ }
+}