[gnome-builder] libide/tweaks: add API to register callbacks



commit d6b6e7ae202d892162f2914c6ab450a7a75be532
Author: Christian Hergert <chergert redhat com>
Date:   Wed Aug 10 16:15:16 2022 -0700

    libide/tweaks: add API to register callbacks
    
    This is helpful so that addins can register their callbacks before their
    UI files are merged into the IdeTweaks template.

 src/libide/tweaks/ide-tweaks.c | 39 ++++++++++++++++++++++++++++++++-------
 src/libide/tweaks/ide-tweaks.h |  4 ++++
 2 files changed, 36 insertions(+), 7 deletions(-)
---
diff --git a/src/libide/tweaks/ide-tweaks.c b/src/libide/tweaks/ide-tweaks.c
index f199ea7b4..0c37e9333 100644
--- a/src/libide/tweaks/ide-tweaks.c
+++ b/src/libide/tweaks/ide-tweaks.c
@@ -29,9 +29,10 @@
 
 struct _IdeTweaks
 {
-  IdeTweaksItem  parent_instance;
-  GtkBuilder    *builder;
-  char          *project_id;
+  IdeTweaksItem    parent_instance;
+  GtkBuilder      *builder;
+  GtkBuilderScope *scope;
+  char            *project_id;
 };
 
 G_DEFINE_FINAL_TYPE (IdeTweaks, ide_tweaks, IDE_TYPE_TWEAKS_ITEM)
@@ -78,6 +79,7 @@ ide_tweaks_dispose (GObject *object)
   IdeTweaks *self = (IdeTweaks *)object;
 
   g_clear_object (&self->builder);
+  g_clear_object (&self->scope);
   g_clear_pointer (&self->project_id, g_free);
 
   G_OBJECT_CLASS (ide_tweaks_parent_class)->dispose (object);
@@ -144,13 +146,14 @@ ide_tweaks_class_init (IdeTweaksClass *klass)
 static void
 ide_tweaks_init (IdeTweaks *self)
 {
-  g_autoptr(GtkBuilderCScope) scope = (GtkBuilderCScope *)gtk_builder_cscope_new ();
-
+  self->scope = g_object_new (GTK_TYPE_BUILDER_CSCOPE, NULL);
   self->builder = gtk_builder_new ();
   gtk_builder_set_current_object (self->builder, G_OBJECT (self));
+  gtk_builder_set_scope (self->builder, self->scope);
 
-  gtk_builder_cscope_add_callback_symbol (scope, "format", (gpointer)ide_tweaks_format);
-  gtk_builder_set_scope (self->builder, GTK_BUILDER_SCOPE (scope));
+  gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (self->scope),
+                                          "format",
+                                          G_CALLBACK (ide_tweaks_format));
 }
 
 IdeTweaks *
@@ -193,6 +196,28 @@ ide_tweaks_expose_object (IdeTweaks  *self,
   gtk_builder_expose_object (self->builder, name, object);
 }
 
+/**
+ * ide_tweaks_add_callback:
+ * @self: a #IdeTweaks
+ * @name: the name of the callback
+ * @callback: (scope forever): the callback represented by @name
+ *
+ * Adds @callback to the scope used when expanding future templates
+ * from @self.
+ */
+void
+ide_tweaks_add_callback (IdeTweaks  *self,
+                         const char *name,
+                         GCallback   callback)
+{
+  g_return_if_fail (IDE_IS_TWEAKS (self));
+  g_return_if_fail (GTK_IS_BUILDER_CSCOPE (self->scope));
+  g_return_if_fail (name != NULL);
+  g_return_if_fail (callback != NULL);
+
+  gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (self->scope), name, callback);
+}
+
 const char *
 ide_tweaks_get_project_id (IdeTweaks *self)
 {
diff --git a/src/libide/tweaks/ide-tweaks.h b/src/libide/tweaks/ide-tweaks.h
index 52d7cfa02..ae99a2020 100644
--- a/src/libide/tweaks/ide-tweaks.h
+++ b/src/libide/tweaks/ide-tweaks.h
@@ -45,6 +45,10 @@ void       ide_tweaks_expose_object   (IdeTweaks     *self,
                                        const char    *name,
                                        GObject       *object);
 IDE_AVAILABLE_IN_ALL
+void       ide_tweaks_add_callback    (IdeTweaks     *self,
+                                       const char    *name,
+                                       GCallback      callback);
+IDE_AVAILABLE_IN_ALL
 gboolean   ide_tweaks_load_from_file  (IdeTweaks     *self,
                                        GFile         *file,
                                        GCancellable  *cancellable,


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