From 179ca6c9415f4753f3a6d89b97eaf116f79d954c Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Mon, 12 Mar 2012 07:49:31 +0000 Subject: [PATCH] Incluindo liberação correta das janelas popup criadas pelo parser. --- src/gtk/uiparser/parser.c | 20 ++++++++++++++++++-- src/gtk/uiparser/popup.c | 1 + src/gtk/uiparser/testprogram.c | 8 ++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/gtk/uiparser/parser.c b/src/gtk/uiparser/parser.c index 063e11c..a9cbd20 100644 --- a/src/gtk/uiparser/parser.c +++ b/src/gtk/uiparser/parser.c @@ -206,6 +206,19 @@ void parser_build(struct parser *p, GtkWidget *widget) } +static void release_popups(GtkWidget **popup) +{ + int f; + for(f=0;popup[f] != ((GtkWidget *) -1);f++) + { + trace("%s[%d]=%p",__FUNCTION__,f,popup[f]); + if(popup[f]) + g_object_unref(popup[f]); + } + + g_free(popup); +} + GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *setup) { struct parser p; @@ -214,6 +227,7 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con gchar * ptr; GList * file = NULL; GList * current; + size_t sz; dir = g_dir_open(path,0,&error); @@ -257,10 +271,12 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con p.group = groupname; p.popupname = popupname; p.strings = g_string_chunk_new(0); - p.popup = g_new0(GtkWidget *,(g_strv_length((gchar **) p.popupname)+1)); p.setup = setup; - g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, g_free); + sz = (g_strv_length((gchar **) p.popupname)); + p.popup = g_new0(GtkWidget *,sz+1); + p.popup[sz] = (GtkWidget *) -1; + g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, (GDestroyNotify) release_popups); for(current = g_list_first(file);current;current = g_list_next(current)) { diff --git a/src/gtk/uiparser/popup.c b/src/gtk/uiparser/popup.c index 563ed87..dca7d97 100644 --- a/src/gtk/uiparser/popup.c +++ b/src/gtk/uiparser/popup.c @@ -84,6 +84,7 @@ if(!widget) { info->popup[pos] = widget = gtk_menu_new(); + g_object_ref(widget); gtk_widget_show_all(widget); } diff --git a/src/gtk/uiparser/testprogram.c b/src/gtk/uiparser/testprogram.c index 725c4f8..02ae7fe 100644 --- a/src/gtk/uiparser/testprogram.c +++ b/src/gtk/uiparser/testprogram.c @@ -85,12 +85,12 @@ int main (int argc, char *argv[]) for(f=0;popupname[f];f++) { + GtkWidget *button = gtk_button_new_with_label(popupname[f]); + gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5); if(popup[f]) - { - GtkWidget *button = gtk_button_new_with_label(popupname[f]); - gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5); g_signal_connect(button,"clicked",G_CALLBACK(show_popup),popup[f]); - } + else + gtk_widget_set_sensitive(button,FALSE); } gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5); -- libgit2 0.21.2