[gimp] app: don't leak all cached GtkTreeIters in container views
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: don't leak all cached GtkTreeIters in container views
- Date: Tue, 22 Jun 2010 22:27:16 +0000 (UTC)
commit ea050b267e8e5647d6edfbfdee9f8e1e9749ea79
Author: Michael Natterer <mitch gimp org>
Date: Wed Jun 23 00:20:21 2010 +0200
app: don't leak all cached GtkTreeIters in container views
This is evil: the hash table of "insert_data" is created on demand
when GimpContainerView API is used, using a value_free_func that is
set in the interface_init functions of its implementors. Therefore, no
GimpContainerView API must be called from any init() function, because
the interface_init() function of a subclass that sets the right
value_free_func might not have been called yet, leaving the
insert_data hash table without memory management.
Call GimpContainerView API from GObject::constructed() instead, which
runs after everything is set up correctly.
app/widgets/gimpcontainerbox.c | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
---
diff --git a/app/widgets/gimpcontainerbox.c b/app/widgets/gimpcontainerbox.c
index 38691ff..4a520cb 100644
--- a/app/widgets/gimpcontainerbox.c
+++ b/app/widgets/gimpcontainerbox.c
@@ -43,6 +43,8 @@
static void gimp_container_box_view_iface_init (GimpContainerViewInterface *iface);
static void gimp_container_box_docked_iface_init (GimpDockedInterface *iface);
+static void gimp_container_box_constructed (GObject *object);
+
static GtkWidget * gimp_container_box_get_preview (GimpDocked *docked,
GimpContext *context,
GtkIconSize size);
@@ -65,6 +67,7 @@ gimp_container_box_class_init (GimpContainerBoxClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ object_class->constructed = gimp_container_box_constructed;
object_class->set_property = gimp_container_view_set_property;
object_class->get_property = gimp_container_view_get_property;
@@ -74,8 +77,7 @@ gimp_container_box_class_init (GimpContainerBoxClass *klass)
static void
gimp_container_box_init (GimpContainerBox *box)
{
- GimpContainerView *view = GIMP_CONTAINER_VIEW (box);
- GtkWidget *sb;
+ GtkWidget *sb;
box->scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_box_pack_start (GTK_BOX (box), box->scrolled_win, TRUE, TRUE, 0);
@@ -84,8 +86,6 @@ gimp_container_box_init (GimpContainerBox *box)
sb = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (box->scrolled_win));
gtk_widget_set_can_focus (sb, FALSE);
-
- gimp_container_view_set_dnd_widget (view, box->scrolled_win);
}
static void
@@ -100,6 +100,18 @@ gimp_container_box_docked_iface_init (GimpDockedInterface *iface)
iface->set_context = gimp_container_box_set_context;
}
+static void
+gimp_container_box_constructed (GObject *object)
+{
+ GimpContainerBox *box = GIMP_CONTAINER_BOX (object);
+
+ gimp_container_view_set_dnd_widget (GIMP_CONTAINER_VIEW (box),
+ box->scrolled_win);
+
+ if (G_OBJECT_CLASS (parent_class)->constructed)
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+}
+
void
gimp_container_box_set_size_request (GimpContainerBox *box,
gint width,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]