[glade/composite-templates-new: 1/6] Added GladeWidgetAdaptor destroy_object method.
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade/composite-templates-new: 1/6] Added GladeWidgetAdaptor destroy_object method.
- Date: Sat, 6 Apr 2013 06:45:18 +0000 (UTC)
commit af4ff2a61ff6f3c70dffd91e4b37dc2d326851ec
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Sat Apr 6 15:37:22 2013 +0900
Added GladeWidgetAdaptor destroy_object method.
The destroy_object method gives the chance to plugins to undo
anything which might have added a reference to the object.
gladeui/glade-widget-adaptor.c | 29 +++++++++++++++++++++++++++++
gladeui/glade-widget-adaptor.h | 26 +++++++++++++++++++++++++-
gladeui/glade-widget.c | 6 +++---
gladeui/glade-xml-utils.h | 1 +
plugins/gtk+/glade-gtk.c | 9 +++++++++
plugins/gtk+/gtk+.xml.in | 2 +-
6 files changed, 68 insertions(+), 5 deletions(-)
---
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index 1d7d172..1443763 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -898,6 +898,13 @@ glade_widget_adaptor_object_construct_object (GladeWidgetAdaptor *adaptor,
return g_object_newv (adaptor->priv->type, n_parameters, parameters);
}
+static void
+glade_widget_adaptor_object_destroy_object (GladeWidgetAdaptor *adaptor,
+ GObject *object)
+{
+ /* Do nothing, just have a method here incase classes chain up */
+}
+
static GObject *
glade_widget_adaptor_object_get_internal_child (GladeWidgetAdaptor *adaptor,
@@ -1369,6 +1376,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass *adaptor_class)
/* Class methods */
adaptor_class->create_widget = glade_widget_adaptor_object_create_widget;
adaptor_class->construct_object = glade_widget_adaptor_object_construct_object;
+ adaptor_class->destroy_object = glade_widget_adaptor_object_destroy_object;
adaptor_class->deep_post_create = NULL;
adaptor_class->post_create = NULL;
adaptor_class->get_internal_child = glade_widget_adaptor_object_get_internal_child;
@@ -1530,6 +1538,11 @@ gwa_extend_with_node_load_sym (GladeWidgetAdaptorClass *klass,
klass->construct_object = symbol;
if (glade_xml_load_sym_from_node (node, module,
+ GLADE_TAG_DESTROY_OBJECT_FUNCTION,
+ &symbol))
+ klass->destroy_object = symbol;
+
+ if (glade_xml_load_sym_from_node (node, module,
GLADE_TAG_DEEP_POST_CREATE_FUNCTION,
&symbol))
klass->deep_post_create = symbol;
@@ -3238,6 +3251,22 @@ glade_widget_adaptor_construct_object (GladeWidgetAdaptor *adaptor,
parameters);
}
+/**
+ * glade_widget_adaptor_destroy_object:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @object: The object to destroy
+ *
+ * This function is called to destroy a GObject instance.
+ */
+void
+glade_widget_adaptor_destroy_object (GladeWidgetAdaptor *adaptor,
+ GObject *object)
+{
+ g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor));
+
+ GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->destroy_object (adaptor, object);
+}
+
static void
gwa_internal_children_create (GladeWidgetAdaptor *adaptor,
GObject *parent_object,
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index 6b7e357..33a4866 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -385,6 +385,27 @@ typedef GObject *(* GladeConstructObjectFunc) (GladeWidgetAdaptor *adaptor,
guint n_parameters,
GParameter *parameters);
+/**
+ * GladeDestroyObjectFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @object: The #GObject to destroy
+ *
+ * This function is called to break any additional references to
+ * a GObject instance. Note that this function is not responsible
+ * for calling g_object_unref() on @object, the reference count
+ * of @object belongs to it's #GladeWidget wrapper.
+ *
+ * The #GtkWidget adaptor will call gtk_widget_destroy() before
+ * chaining up in this function.
+ *
+ * If your adaptor adds any references in any way at
+ * #GladePostCreateFunc time or #GladeConstructObjectFunc
+ * time, then this function must be implemented to also
+ * remove that reference.
+ *
+ */
+typedef void (* GladeDestroyObjectFunc) (GladeWidgetAdaptor *adaptor,
+ GObject *object);
/**
@@ -590,6 +611,8 @@ struct _GladeWidgetAdaptorClass
GladeConstructObjectFunc construct_object; /* Object constructor
*/
+ GladeDestroyObjectFunc destroy_object; /* Object destructor */
+
GladePostCreateFunc deep_post_create; /* Executed after widget creation:
* plugins use this to setup various
* support codes (adaptors must always
@@ -667,7 +690,6 @@ struct _GladeWidgetAdaptorClass
void (* glade_reserved5) (void);
void (* glade_reserved6) (void);
void (* glade_reserved7) (void);
- void (* glade_reserved8) (void);
};
#define glade_widget_adaptor_create_widget(adaptor, query, ...) \
@@ -724,6 +746,8 @@ GParameter *glade_widget_adaptor_default_params (GladeWidgetAdapto
GObject *glade_widget_adaptor_construct_object (GladeWidgetAdaptor *adaptor,
guint n_parameters,
GParameter *parameters);
+void glade_widget_adaptor_destroy_object (GladeWidgetAdaptor *adaptor,
+ GObject *object);
void glade_widget_adaptor_post_create (GladeWidgetAdaptor *adaptor,
GObject *object,
GladeCreateReason reason);
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index 946392d..fc9f26a 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -3375,11 +3375,11 @@ glade_widget_set_object (GladeWidget * gwidget, GObject * new_object)
gwidget->priv->name ? gwidget->priv->name : "(unknown)",
old_object->ref_count);
#endif
- if (GTK_IS_WIDGET (old_object))
- gtk_widget_destroy (GTK_WIDGET (old_object));
- g_object_unref (old_object);
+ /* Have the adaptor for this widget break any additional references */
+ glade_widget_adaptor_destroy_object (gwidget->priv->adaptor, old_object);
+ g_object_unref (old_object);
}
}
g_object_notify_by_pspec (G_OBJECT (gwidget), properties[PROP_OBJECT]);
diff --git a/gladeui/glade-xml-utils.h b/gladeui/glade-xml-utils.h
index c7b116f..ede8054 100644
--- a/gladeui/glade-xml-utils.h
+++ b/gladeui/glade-xml-utils.h
@@ -91,6 +91,7 @@ typedef struct _GladeProject GladeProject;
#define GLADE_TAG_REPLACE_CHILD_FUNCTION "replace-child-function"
#define GLADE_TAG_CREATE_WIDGET_FUNCTION "create-widget-function"
#define GLADE_TAG_CONSTRUCT_OBJECT_FUNCTION "construct-object-function"
+#define GLADE_TAG_DESTROY_OBJECT_FUNCTION "destroy-object-function"
#define GLADE_TAG_DEEP_POST_CREATE_FUNCTION "deep-post-create-function"
#define GLADE_TAG_POST_CREATE_FUNCTION "post-create-function"
#define GLADE_TAG_GET_INTERNAL_CHILD_FUNCTION "get-internal-child-function"
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index bd6f174..e729df5 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -94,6 +94,15 @@ glade_gtk_init (const gchar * name)
}
/* ----------------------------- GtkWidget ------------------------------ */
+void
+glade_gtk_widget_destroy_object (GladeWidgetAdaptor * adaptor,
+ GObject *object)
+{
+ gtk_widget_destroy (GTK_WIDGET (object));
+
+ GWA_GET_CLASS (G_TYPE_OBJECT)->destroy_object (adaptor, object);
+}
+
gboolean
glade_gtk_widget_depends (GladeWidgetAdaptor * adaptor,
GladeWidget * widget, GladeWidget * another)
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index 4282b98..1db8985 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -9,6 +9,7 @@
<glade-widget-class name="GtkWidget" _title="Widget" default-width="100" default-height="60">
+ <destroy-object-function>glade_gtk_widget_destroy_object</destroy-object-function>
<deep-post-create-function>glade_gtk_widget_deep_post_create</deep-post-create-function>
<set-property-function>glade_gtk_widget_set_property</set-property-function>
<get-property-function>glade_gtk_widget_get_property</get-property-function>
@@ -19,7 +20,6 @@
<write-widget-function>glade_gtk_widget_write_widget</write-widget-function>
<create-editor-property-function>glade_gtk_widget_create_eprop</create-editor-property-function>
<string-from-value-function>glade_gtk_widget_string_from_value</string-from-value-function>
- <destroy-object-function>glade_gtk_widget_destroy_widget</destroy-object-function>
<signals>
<signal id="drag-failed" since="2.12"/>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]