[gtk/wip/otte/builder: 1/10] builder: Carry the module as part of the GtkBuilder object



commit 80acc8f296c1c69903c5982c5e9eb0e88fe8beb2
Author: Benjamin Otte <otte redhat com>
Date:   Mon Nov 18 04:52:35 2019 +0100

    builder: Carry the module as part of the GtkBuilder object
    
    This way, we don't open the module in every place we want to look up
    functions.

 gtk/gtkbuilder.c        | 57 +++++++++++++++++++++++++++----------------------
 gtk/gtkbuilderprivate.h |  1 +
 2 files changed, 32 insertions(+), 26 deletions(-)
---
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 9277628a95..80ffb2d665 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -245,6 +245,7 @@ typedef struct
   GSList *delayed_properties;
   GSList *signals;
   GSList *bindings;
+  GModule *module;
   gchar *filename;
   gchar *resource_prefix;
   GType template_type;
@@ -304,6 +305,8 @@ gtk_builder_finalize (GObject *object)
 {
   GtkBuilderPrivate *priv = gtk_builder_get_instance_private (GTK_BUILDER (object));
 
+  g_clear_pointer (&priv->module, g_module_close);
+
   g_free (priv->domain);
   g_free (priv->filename);
   g_free (priv->resource_prefix);
@@ -390,16 +393,34 @@ type_name_mangle (const gchar *name)
   return g_string_free (symbol_name, FALSE);
 }
 
+GModule *
+gtk_builder_get_module (GtkBuilder *builder)
+{
+  GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
+
+  if (priv->module == NULL)
+    {
+      if (!g_module_supported ())
+        return NULL;
+
+      priv->module = g_module_open (NULL, G_MODULE_BIND_LAZY);
+    }
+
+  return priv->module;
+}
+
 static GType
-_gtk_builder_resolve_type_lazily (const gchar *name)
+gtk_builder_resolve_type_lazily (GtkBuilder  *builder,
+                                 const gchar *name)
 {
-  static GModule *module = NULL;
+  GModule *module;
   GTypeGetFunc func;
   gchar *symbol;
   GType gtype = G_TYPE_INVALID;
 
+  module = gtk_builder_get_module (builder);
   if (!module)
-    module = g_module_open (NULL, 0);
+    return G_TYPE_INVALID;
 
   symbol = type_name_mangle (name);
 
@@ -425,7 +446,7 @@ gtk_builder_real_get_type_from_name (GtkBuilder  *builder,
   if (gtype != G_TYPE_INVALID)
     return gtype;
 
-  gtype = _gtk_builder_resolve_type_lazily (type_name);
+  gtype = gtk_builder_resolve_type_lazily (builder, type_name);
   if (gtype != G_TYPE_INVALID)
     return gtype;
 
@@ -1629,12 +1650,6 @@ gtk_builder_expose_object (GtkBuilder    *builder,
                        g_object_ref (object));
 }
 
-
-typedef struct {
-  GModule *module;
-  gpointer data;
-} ConnectArgs;
-
 static void
 gtk_builder_connect_signals_default (GtkBuilder    *builder,
                                      GObject       *object,
@@ -1645,19 +1660,20 @@ gtk_builder_connect_signals_default (GtkBuilder    *builder,
                                      gpointer       user_data)
 {
   GCallback func;
-  ConnectArgs *args = (ConnectArgs*) user_data;
 
   func = gtk_builder_lookup_callback_symbol (builder, handler_name);
 
   if (!func)
     {
+      GModule *module = gtk_builder_get_module (builder);
+
       /* Only error out for missing GModule support if we've not
        * found the symbols explicitly added with gtk_builder_add_callback_symbol()
        */
-      if (args->module == NULL)
+      if (module == NULL)
         g_error ("gtk_builder_connect_signals() requires working GModule");
 
-      if (!g_module_symbol (args->module, handler_name, (gpointer)&func))
+      if (!g_module_symbol (module, handler_name, (gpointer)&func))
         {
           g_warning ("Could not find signal handler '%s'.  Did you compile with -rdynamic?", handler_name);
           return;
@@ -1667,7 +1683,7 @@ gtk_builder_connect_signals_default (GtkBuilder    *builder,
   if (connect_object)
     g_signal_connect_object (object, signal_name, func, connect_object, flags);
   else
-    g_signal_connect_data (object, signal_name, func, args->data, NULL, flags);
+    g_signal_connect_data (object, signal_name, func, user_data, NULL, flags);
 }
 
 
@@ -1702,22 +1718,11 @@ void
 gtk_builder_connect_signals (GtkBuilder *builder,
                              gpointer    user_data)
 {
-  ConnectArgs args;
-
   g_return_if_fail (GTK_IS_BUILDER (builder));
 
-  args.data = user_data;
-
-  if (g_module_supported ())
-    args.module = g_module_open (NULL, G_MODULE_BIND_LAZY);
-  else
-    args.module = NULL;
-
   gtk_builder_connect_signals_full (builder,
                                     gtk_builder_connect_signals_default,
-                                    &args);
-  if (args.module)
-    g_module_close (args.module);
+                                    user_data);
 }
 
 /**
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index 0846efa378..e0352cd5cf 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -227,6 +227,7 @@ GObject *_gtk_builder_lookup_object       (GtkBuilder                *builder,
                                            gint                       col);
 gboolean _gtk_builder_lookup_failed       (GtkBuilder                *builder,
                                            GError                   **error);
+GModule *gtk_builder_get_module           (GtkBuilder                *builder);
 
 
 


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