summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2016-07-27 09:40:29 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2016-10-18 11:49:09 +0100
commitcd0de3f87cd40ec4ce150976d85e0491dbccf374 (patch)
treee6877bce95ad81ddbedafd2459fada20ed4b70a3
parent43904892bc00d0cce98e30932aa77b10a47b5cd1 (diff)
downloadgtk+-cd0de3f87cd40ec4ce150976d85e0491dbccf374.tar.gz
gtk: Add GtkContainer API to gather render nodes
We cannot implement GtkWidgetClass.get_render_node() in GtkContainer without breaking the fallback path that renders a widget to a single render node rasterization. For GtkContainer subclasses we should provide a simple API, similar to gtk_container_propagate_draw(), that gathers all the render nodes for each child.
-rw-r--r--gtk/gtkcontainer.c37
-rw-r--r--gtk/gtkcontainerprivate.h5
2 files changed, 41 insertions, 1 deletions
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index 7e549c4496..26fc804456 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -24,7 +24,6 @@
#include "config.h"
-#include "gtkcontainer.h"
#include "gtkcontainerprivate.h"
#include <stdarg.h>
@@ -54,6 +53,7 @@
#include "gtkpopovermenu.h"
#include "gtkshortcutswindow.h"
+
/* A handful of containers inside GTK+ are cheating and widgets
* inside internal structure as direct children for the purpose
* of forall().
@@ -3397,3 +3397,38 @@ gtk_container_get_path_for_child (GtkContainer *container,
return path;
}
+
+typedef struct {
+ GtkContainer *container;
+ GskRenderer *renderer;
+ GskRenderNode *parent;
+} RenderData;
+
+static void
+propagate_render_node (GtkWidget *widget,
+ gpointer data_)
+{
+ RenderData *data = data_;
+ GskRenderNode *node;
+
+ node = gtk_widget_get_render_node (widget, data->renderer);
+ if (node != NULL)
+ {
+ gsk_render_node_append_child (data->parent, node);
+ gsk_render_node_unref (node);
+ }
+}
+
+void
+gtk_container_propagate_render_node (GtkContainer *container,
+ GskRenderer *renderer,
+ GskRenderNode *parent_node)
+{
+ RenderData data = {
+ container,
+ renderer,
+ parent_node
+ };
+
+ gtk_container_forall (container, propagate_render_node, &data);
+}
diff --git a/gtk/gtkcontainerprivate.h b/gtk/gtkcontainerprivate.h
index e581df958b..203059106e 100644
--- a/gtk/gtkcontainerprivate.h
+++ b/gtk/gtkcontainerprivate.h
@@ -21,6 +21,7 @@
#define __GTK_CONTAINER_PRIVATE_H__
#include "gtkcontainer.h"
+#include <gsk/gsk.h>
G_BEGIN_DECLS
@@ -42,6 +43,10 @@ void _gtk_container_maybe_start_idle_sizer (GtkContainer *container);
void gtk_container_get_children_clip (GtkContainer *container,
GtkAllocation *out_clip);
+void gtk_container_propagate_render_node (GtkContainer *container,
+ GskRenderer *renderer,
+ GskRenderNode *parent_node);
+
G_END_DECLS
#endif /* __GTK_CONTAINER_PRIVATE_H__ */