summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2015-02-09 18:38:57 +0100
committerBenjamin Otte <otte@redhat.com>2015-03-18 15:23:31 +0100
commit310f9f40dac12471197e33d745ae46dd0d8aeb22 (patch)
treeedd1da00cb474ac92cd3f1af65a2f6518c829c67 /gtk
parentee6d081ed905bf2b561341353a1a88bf433a6c23 (diff)
downloadgtk+-310f9f40dac12471197e33d745ae46dd0d8aeb22.tar.gz
cssnode: Add hackery to allow bypassing widget paths
If we know the parent's get_path_for_child() implementation is safe to be used with GtkCssNode because it doesn't do anything special, we do that. Unfortunately that requires whitelisting vfuncs because the vfunc is public API so anyone can override it.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcsswidgetnode.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/gtk/gtkcsswidgetnode.c b/gtk/gtkcsswidgetnode.c
index 3a05b1d606..e18cdc3127 100644
--- a/gtk/gtkcsswidgetnode.c
+++ b/gtk/gtkcsswidgetnode.c
@@ -168,6 +168,38 @@ gtk_css_widget_node_validate (GtkCssNode *node,
return changes;
}
+typedef GtkWidgetPath * (* GetPathForChildFunc) (GtkContainer *, GtkWidget *);
+
+static gboolean
+widget_needs_widget_path (GtkWidget *widget)
+{
+ static GetPathForChildFunc funcs[1];
+ GtkWidget *parent;
+ GetPathForChildFunc parent_func;
+ guint i;
+
+ if (G_UNLIKELY (funcs[0] == NULL))
+ {
+ i = 0;
+ funcs[i++] = GTK_CONTAINER_CLASS (g_type_class_ref (GTK_TYPE_CONTAINER))->get_path_for_child;
+
+ g_assert (i == G_N_ELEMENTS (funcs));
+ }
+
+ parent = gtk_widget_get_parent (widget);
+ if (parent == NULL)
+ return FALSE;
+
+ parent_func = GTK_CONTAINER_GET_CLASS (GTK_CONTAINER (parent))->get_path_for_child;
+ for (i = 0; i < G_N_ELEMENTS (funcs); i++)
+ {
+ if (funcs[i] == parent_func)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
gboolean
gtk_css_widget_node_init_matcher (GtkCssNode *node,
GtkCssMatcher *matcher)
@@ -177,6 +209,9 @@ gtk_css_widget_node_init_matcher (GtkCssNode *node,
if (widget_node->widget == NULL)
return FALSE;
+ if (!widget_needs_widget_path (widget_node->widget))
+ return GTK_CSS_NODE_CLASS (gtk_css_widget_node_parent_class)->init_matcher (node, matcher);
+
return _gtk_css_matcher_init (matcher,
gtk_widget_get_path (widget_node->widget),
gtk_css_node_get_declaration (node));