HI, :-) Memory leak and reference counts are very confused. I am using GtkTreeView with GtkCellRendererCombo and GtkCellRenderSpin. So, I use Adjustment for GtkCellRendererSpin and GtkListStore(or GtkTreeStore) for GtkCellRenderCombo.
Some of columns uses same Adj, and TreeModel, so saved them in renderer. Rest of columns uses different so I saved them in GtkTreeModel and set attributes. Anyway, I'm very confusing about memory management. I have understood I have to decrease reference count to avoid memory leak when I use following API because they increase reference count: g_object_set() gtk_tree_store_set() Now I have some question about those API, and GtkCellRenderer{Combo|Spin}. 1. If I use GtkCellRenderSpin and make new GtkAdjustment which is saved in the **Renderer**, then do I have to do g_object_unref(adj) ? 2. If I use GtkCellRenderSpin and make new GtkAdjustment which is saved in the **GtkTreeModel** with setting attribute, then do I have to do g_object_unref(adj) ? 3. If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store which is saved in the **Renderer**, then do I have to do g_object_unref(model) ? 4. If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store which is saved in the **GtkTreeModel** with setting attribute, then do I have to do g_object_unref(adj) ? 5. Is there any connection with floating issues? When I save GtkAdjustment in Renderer before saving, floating value is true and after saving floating value is false, But I save GtkAdjustment in GtkTreeModel, before saving, and after saving floating value is still true. And here is some code snippets for asking this issues. * code snippet which saves GtkAdjustment in Renderer code: > { > GtkAdjustment *adj; > GtkCellRenderer *renderer; > GtkTreeViewColumn *column; > > adj = GTK_ADJUSTMENT (gtk_adjustment_new (50.0, 0.0, 100.0, 5.0, 10.0, 0.0)); > renderer = gtk_cell_renderer_spin_new (); > > { > gboolean colorness_float; > colorness_float = g_object_is_floating (adj); > g_debug ("=========> float: colorness(%d)\n", colorness_float); > } > > g_object_set (renderer, "editable", TRUE, "adjustment", adj, "digits", 0, NULL); > > { > gboolean colorness_float; > colorness_float = g_object_is_floating (adj); > g_debug ("=========> float: colorness(%d)\n", colorness_float); > } > > g_object_unref (adj); <----- /* DO I NEED THIS? */ > > g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (brightness_edited), window); > > column = gtk_tree_view_column_new_with_attributes (_(column_titles[VIEW_CAMERA_BRIGHTNESS]), > renderer, > "text", MODEL_CAMERA_BRIGHTNESS, > "visible", MODEL_SUPPORT_CAMERA_PROPERTY, > "sensitive", MODEL_ONLINE, > NULL); > gtk_tree_view_column_set_resizable (column, FALSE); > gtk_tree_view_column_set_clickable (column, FALSE); > gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); > } result: > =========> float: colorness(1) > =========> float: colorness(0) * code snippet which saves GtkAdjustment and GtkListStore in GtkTreeModel. code: > { > GtkAdjustment *bitrate_adj, *gop_size_adj; > GtkListStore *quality_model; > gchar quality_str[1024]; > > bitrate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 10.0, 100.0, 10.0, 20.0, 0.0)); > gop_size_adj = GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 10.0, 100.0, 10.0, 20.0, 0.0)); > > quality_model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); > { > GtkTreeIter combo_iter; > gchar str[1024]; > gint value; > > value = 1; > g_snprintf (str, 1024, _("%d (Highest)"), value); > g_strlcpy (quality_str, str, 1024); > gtk_list_store_append (quality_model, &combo_iter); > gtk_list_store_set (quality_model, &combo_iter, 0, str, 1, value, -1); > > value = 2; > g_snprintf (str, 1024, "%d", value); > gtk_list_store_append (quality_model, &combo_iter); > gtk_list_store_set (quality_model, &combo_iter, 0, str, 1, value, -1); > > value = 3; > g_snprintf (str, 1024, _("%d (Lowest)"), value); > gtk_list_store_append (quality_model, &combo_iter); > gtk_list_store_set (quality_model, &combo_iter, 0, str, 1, value, -1); > } > > { > gboolean bitrate_float, gop_size_float, quality_float; > > bitrate_float = g_object_is_floating (bitrate_adj); > gop_size_float = g_object_is_floating (gop_size_adj); > quality_float = g_object_is_floating (quality_model); > > g_debug ("=========> float: bitrate(%d), gop_size(%d), quality(%d)\n", bitrate_float, gop_size_float, quality_float); > } > > g_object_ref_sink (bitrate_adj); > g_object_ref_sink (gop_size_adj); > > gtk_tree_store_set (GTK_TREE_STORE (model), iter, > MODEL_VIDEO_FRAME_RATE, 1, > MODEL_VIDEO_BITRATE, 10, > MODEL_VIDEO_GOP_SIZE, 10, > MODEL_VIDEO_QUALITY, 1, > MODEL_VIDEO_QUALITY_STRING, quality_str, > MODEL_VIDEO_BITRATE_ADJ, bitrate_adj, > MODEL_VIDEO_GOP_SIZE_ADJ, gop_size_adj, > MODEL_VIDEO_QUALITY_MODEL, quality_model, > -1); > { > gboolean bitrate_float, gop_size_float, quality_float; > > bitrate_float = g_object_is_floating (bitrate_adj); > gop_size_float = g_object_is_floating (gop_size_adj); > quality_float = g_object_is_floating (quality_model); > > g_debug ("=========> float: bitrate(%d), gop_size(%d), quality(%d)\n", bitrate_float, gop_size_float, quality_float); > } > > g_object_unref (bitrate_adj); <----- /* DO I NEED THIS? */ > g_object_unref (gop_size_adj); <----- /* DO I NEED THIS? */ > g_object_unref (quality_model); <----- /* DO I NEED THIS? */ > } result: > =========> float: bitrate(1), gop_size(1), quality(0) > =========> float: bitrate(0), gop_size(0), quality(0) Any suggestions and help will be appreciated. Thanks, :-) P.S. If there are documentations for this issues. Could you please recommand the url please? -- Best regards, Keedi Kim _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list