diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2016-07-27 09:40:29 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2016-10-18 11:49:09 +0100 |
commit | cd0de3f87cd40ec4ce150976d85e0491dbccf374 (patch) | |
tree | e6877bce95ad81ddbedafd2459fada20ed4b70a3 | |
parent | 43904892bc00d0cce98e30932aa77b10a47b5cd1 (diff) | |
download | gtk+-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.c | 37 | ||||
-rw-r--r-- | gtk/gtkcontainerprivate.h | 5 |
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__ */ |