[gtk/builder-treestore-data: 4/6] builder: Allow checking for multiple parents




commit f880d24f2a74d6b6a14d178deeb2b0e94f8e5f65
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri May 6 09:23:31 2022 -0400

    builder: Allow checking for multiple parents

 gtk/gtkbuilder.c        | 32 +++++++++++++++++++++++++++++---
 gtk/gtkbuilderprivate.h |  4 ++++
 2 files changed, 33 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 545699c45c..ec9fa6f913 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -2996,21 +2996,47 @@ _gtk_builder_check_parent (GtkBuilder                *builder,
                            GtkBuildableParseContext  *context,
                            const char                *parent_name,
                            GError                   **error)
+{
+  return _gtk_builder_check_parents (builder, context, error, parent_name, NULL);
+}
+
+gboolean
+_gtk_builder_check_parents (GtkBuilder                *builder,
+                            GtkBuildableParseContext  *context,
+                            GError                   **error,
+                            ...)
 {
   GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
   GPtrArray *stack;
   int line, col;
   const char *parent;
   const char *element;
+  va_list args;
+  gboolean in_template;
 
   stack = gtk_buildable_parse_context_get_element_stack (context);
 
   element = g_ptr_array_index (stack, stack->len - 1);
   parent = stack->len > 1 ? g_ptr_array_index (stack, stack->len - 2) : "";
 
-  if (g_str_equal (parent_name, parent) ||
-      (g_str_equal (parent_name, "object") && g_str_equal (parent, "template")))
-    return TRUE;
+  in_template = g_str_equal (parent, "template");
+
+  va_start (args, error);
+
+  while (1) {
+    char *parent_name = va_arg (args, char *);
+
+    if (parent_name == NULL)
+      break;
+
+    if (g_str_equal (parent_name, parent) || (in_template && g_str_equal (parent_name, "object")))
+      {
+        va_end (args);
+        return TRUE;
+      }
+  }
+
+  va_end (args);
 
   gtk_buildable_parse_context_get_position (context, &line, &col);
   g_set_error (error,
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index e99b7163e6..21ceca77c0 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -278,6 +278,10 @@ gboolean _gtk_builder_check_parent        (GtkBuilder                *builder,
                                            GtkBuildableParseContext  *context,
                                            const char                *parent_name,
                                            GError                   **error);
+gboolean _gtk_builder_check_parents       (GtkBuilder                *builder,
+                                           GtkBuildableParseContext  *context,
+                                           GError                   **error,
+                                           ...);
 GObject *gtk_builder_lookup_object        (GtkBuilder                *builder,
                                            const char                *name,
                                            int                        line,


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