[gtk/builder-binding-ordering] builder: Fix handling of <binding>




commit c4069fdcee22cdd481c5f71955447a151c8158e0
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Sep 28 13:47:15 2021 -0400

    builder: Fix handling of <binding>
    
    We were only applying <binding> elements when the
    object is constructed, which can be triggered by
    various things (e.g. a <style> element). Defer
    this until we reach </object>, so we can be sure
    that we pick up all the bindings.
    
    Testcase included.
    
    Fixes: #4147

 gtk/gtkbuilder.c                       |  5 +----
 gtk/gtkbuilderparser.c                 |  6 ++++++
 gtk/gtkbuilderprivate.h                |  4 ++++
 testsuite/reftests/late-binding.ref.ui | 18 ++++++++++++++++++
 testsuite/reftests/late-binding.ui     | 18 ++++++++++++++++++
 testsuite/reftests/meson.build         |  2 ++
 6 files changed, 49 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 47af4df1fe..fef468e8bb 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -699,7 +699,7 @@ _gtk_builder_add_object (GtkBuilder  *builder,
   g_hash_table_insert (priv->objects, g_strdup (id), g_object_ref (object));
 }
 
-static void
+void
 gtk_builder_take_bindings (GtkBuilder *builder,
                            GObject    *target,
                            GSList     *bindings)
@@ -926,9 +926,6 @@ _gtk_builder_construct (GtkBuilder  *builder,
 
   object_properties_destroy (&parameters);
 
-  if (info->bindings)
-    gtk_builder_take_bindings (builder, obj, info->bindings);
-
   /* put it in the hash table. */
   _gtk_builder_add_object (builder, info->id, obj);
 
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index f91523d598..ccfb1cbc56 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -1962,6 +1962,12 @@ end_element (GtkBuildableParseContext  *context,
           object_info->signals = NULL;
         }
 
+      if (object_info->bindings)
+        {
+          gtk_builder_take_bindings (data->builder, object_info->object, object_info->bindings);
+          object_info->bindings = NULL;
+        }
+
       free_object_info (object_info);
     }
   else if (strcmp (element_name, "child") == 0)
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index 32cb470f4b..e99b7163e6 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -221,6 +221,10 @@ void      _gtk_builder_add (GtkBuilder *builder,
                             ChildInfo *child_info);
 void      _gtk_builder_add_signals (GtkBuilder *builder,
                                     GPtrArray  *signals);
+void       gtk_builder_take_bindings (GtkBuilder *builder,
+                                      GObject    *target,
+                                      GSList     *bindings);
+
 gboolean  _gtk_builder_finish (GtkBuilder  *builder,
                                GError     **error);
 void _free_signal_info (SignalInfo *info,
diff --git a/testsuite/reftests/late-binding.ref.ui b/testsuite/reftests/late-binding.ref.ui
new file mode 100644
index 0000000000..bcd504386a
--- /dev/null
+++ b/testsuite/reftests/late-binding.ref.ui
@@ -0,0 +1,18 @@
+<interface>
+  <object class="GtkWindow" id="window">
+    <child>
+      <object class="GtkLabel">
+        <property name="xalign">0.0</property>
+        <binding name="label">
+          <lookup name="label">label2</lookup>
+        </binding>
+        <style>
+          <class name="bold" />
+        </style>
+      </object>
+    </child>
+  </object>
+  <object class="GtkLabel" id="label2">
+    <property name="label">Bla</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/late-binding.ui b/testsuite/reftests/late-binding.ui
new file mode 100644
index 0000000000..f710d56349
--- /dev/null
+++ b/testsuite/reftests/late-binding.ui
@@ -0,0 +1,18 @@
+<interface>
+  <object class="GtkWindow" id="window">
+    <child>
+      <object class="GtkLabel">
+        <style>
+          <class name="bold" />
+        </style>
+        <property name="xalign">0.0</property>
+        <binding name="label">
+          <lookup name="label">label2</lookup>
+        </binding>
+      </object>
+    </child>
+  </object>
+  <object class="GtkLabel" id="label2">
+    <property name="label">Bla</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/meson.build b/testsuite/reftests/meson.build
index e4e860fc9f..6806ece031 100644
--- a/testsuite/reftests/meson.build
+++ b/testsuite/reftests/meson.build
@@ -331,6 +331,8 @@ testdata = [
   # that are not valid with subpixel positioning
   #'label-wrap-justify.ref.ui',
   #'label-wrap-justify.ui',
+  'late-binding.ui',
+  'late-binding.ref.ui',
   'late-property.ui',
   'late-property.ref.ui',
   'letter-spacing.css',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]