SF.net SVN: geany: [1129] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Wed Dec 20 10:47:02 UTC 2006
Revision: 1129
http://svn.sourceforge.net/geany/?rev=1129&view=rev
Author: ntrel
Date: 2006-12-20 02:47:01 -0800 (Wed, 20 Dec 2006)
Log Message:
-----------
Fix tag treeview not being freed (because of g_object_ref).
Separate recreate_tag_list() from ui_update_tag_list().
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/treeviews.c
trunk/src/ui_utils.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-12-20 10:42:12 UTC (rev 1128)
+++ trunk/ChangeLog 2006-12-20 10:47:01 UTC (rev 1129)
@@ -2,6 +2,9 @@
* src/keyfile.c:
Fix strv leak in configuration_open_files().
+ * src/treeviews.c, src/ui_utils.c:
+ Fix tag treeview not being freed (because of g_object_ref).
+ Separate recreate_tag_list() from ui_update_tag_list().
2006-12-18 Enrico Tröger <enrico.troeger at uvena.de>
Modified: trunk/src/treeviews.c
===================================================================
--- trunk/src/treeviews.c 2006-12-20 10:42:12 UTC (rev 1128)
+++ trunk/src/treeviews.c 2006-12-20 10:47:01 UTC (rev 1129)
@@ -372,6 +372,12 @@
if (GTK_IS_WIDGET(doc_list[idx].tag_tree))
{
gtk_widget_destroy(doc_list[idx].tag_tree);
+ if (GTK_IS_TREE_VIEW(doc_list[idx].tag_tree))
+ {
+ // Because it was ref'd in ui_update_tag_list, it needs unref'ing
+ g_object_unref((gpointer)doc_list[idx].tag_tree);
+ }
+ doc_list[idx].tag_tree = NULL;
}
}
Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c 2006-12-20 10:42:12 UTC (rev 1128)
+++ trunk/src/ui_utils.c 2006-12-20 10:47:01 UTC (rev 1129)
@@ -198,12 +198,104 @@
}
-// update = rescan the tags for document[idx].filename
-void ui_update_tag_list(gint idx, gboolean update)
+static gboolean recreate_tag_list(gint idx)
{
GList *tmp;
const GList *tags;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ tags = symbols_get_tag_list(idx, tm_tag_max_t);
+ if (doc_list[idx].tm_file == NULL || tags == NULL) return FALSE;
+
+ doc_list[idx].has_tags = TRUE;
+ gtk_tree_store_clear(doc_list[idx].tag_store);
+ // unref the store to speed up the filling(from TreeView Tutorial)
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(doc_list[idx].tag_tree));
+ g_object_ref(model); // Make sure the model stays with us after the tree view unrefs it
+ gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), NULL); // Detach model from view
+
+ treeviews_init_tag_list(idx);
+ for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp))
+ {
+ switch (((GeanySymbol*)tmp->data)->type)
+ {
+ case tm_tag_prototype_t:
+ case tm_tag_method_t:
+ case tm_tag_function_t:
+ {
+ if (tv.tag_function.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_function));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_macro_t:
+ case tm_tag_macro_with_arg_t:
+ {
+ if (tv.tag_macro.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_macro));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_class_t:
+ {
+ if (tv.tag_class.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_class));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_member_t:
+ case tm_tag_field_t:
+ {
+ if (tv.tag_member.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_member));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_typedef_t:
+ case tm_tag_enum_t:
+ case tm_tag_union_t:
+ case tm_tag_struct_t:
+ case tm_tag_interface_t:
+ {
+ if (tv.tag_struct.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_struct));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_variable_t:
+ {
+ if (tv.tag_variable.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_variable));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ case tm_tag_namespace_t:
+ case tm_tag_package_t:
+ {
+ if (tv.tag_namespace.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_namespace));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ break;
+ }
+ default:
+ {
+ if (tv.tag_other.stamp == -1) break;
+ gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_other));
+ gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
+ }
+ }
+ }
+ gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), model); // Re-attach model to view
+ g_object_unref(model);
+ gtk_tree_view_expand_all(GTK_TREE_VIEW(doc_list[idx].tag_tree));
+ return TRUE;
+}
+
+
+// update = rescan the tags for document[idx].filename
+void ui_update_tag_list(gint idx, gboolean update)
+{
if (gtk_bin_get_child(GTK_BIN(app->tagbar)))
gtk_container_remove(GTK_CONTAINER(app->tagbar), gtk_bin_get_child(GTK_BIN(app->tagbar)));
@@ -238,101 +330,13 @@
g_object_ref((gpointer)doc_list[idx].tag_tree); // to hold it after removing
}
- tags = symbols_get_tag_list(idx, tm_tag_max_t);
- if (doc_list[idx].tm_file != NULL && tags != NULL)
+ if (recreate_tag_list(idx))
{
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- doc_list[idx].has_tags = TRUE;
- gtk_tree_store_clear(doc_list[idx].tag_store);
- // unref the store to speed up the filling(from TreeView Tutorial)
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(doc_list[idx].tag_tree));
- g_object_ref(model); // Make sure the model stays with us after the tree view unrefs it
- gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), NULL); // Detach model from view
-
- treeviews_init_tag_list(idx);
- for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp))
- {
- switch (((GeanySymbol*)tmp->data)->type)
- {
- case tm_tag_prototype_t:
- case tm_tag_method_t:
- case tm_tag_function_t:
- {
- if (tv.tag_function.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_function));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_macro_t:
- case tm_tag_macro_with_arg_t:
- {
- if (tv.tag_macro.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_macro));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_class_t:
- {
- if (tv.tag_class.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_class));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_member_t:
- case tm_tag_field_t:
- {
- if (tv.tag_member.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_member));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_typedef_t:
- case tm_tag_enum_t:
- case tm_tag_union_t:
- case tm_tag_struct_t:
- case tm_tag_interface_t:
- {
- if (tv.tag_struct.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_struct));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_variable_t:
- {
- if (tv.tag_variable.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_variable));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- case tm_tag_namespace_t:
- case tm_tag_package_t:
- {
- if (tv.tag_namespace.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_namespace));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- break;
- }
- default:
- {
- if (tv.tag_other.stamp == -1) break;
- gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_other));
- gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1);
- }
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), model); // Re-attach model to view
- g_object_unref(model);
- gtk_tree_view_expand_all(GTK_TREE_VIEW(doc_list[idx].tag_tree));
-
gtk_widget_set_sensitive(app->tagbar, TRUE);
gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree);
- /// TODO why I have to do this here?
- g_object_ref((gpointer)doc_list[idx].tag_tree);
}
else
- { // tags == NULL
+ { // no tags
gtk_widget_set_sensitive(app->tagbar, FALSE);
gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list