Commit 179ca6c9415f4753f3a6d89b97eaf116f79d954c
1 parent
73a17cbd
Exists in
master
and in
5 other branches
Incluindo liberação correta das janelas popup criadas pelo parser.
Showing
3 changed files
with
23 additions
and
6 deletions
Show diff stats
src/gtk/uiparser/parser.c
| ... | ... | @@ -206,6 +206,19 @@ void parser_build(struct parser *p, GtkWidget *widget) |
| 206 | 206 | |
| 207 | 207 | } |
| 208 | 208 | |
| 209 | +static void release_popups(GtkWidget **popup) | |
| 210 | +{ | |
| 211 | + int f; | |
| 212 | + for(f=0;popup[f] != ((GtkWidget *) -1);f++) | |
| 213 | + { | |
| 214 | + trace("%s[%d]=%p",__FUNCTION__,f,popup[f]); | |
| 215 | + if(popup[f]) | |
| 216 | + g_object_unref(popup[f]); | |
| 217 | + } | |
| 218 | + | |
| 219 | + g_free(popup); | |
| 220 | +} | |
| 221 | + | |
| 209 | 222 | GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *setup) |
| 210 | 223 | { |
| 211 | 224 | struct parser p; |
| ... | ... | @@ -214,6 +227,7 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con |
| 214 | 227 | gchar * ptr; |
| 215 | 228 | GList * file = NULL; |
| 216 | 229 | GList * current; |
| 230 | + size_t sz; | |
| 217 | 231 | |
| 218 | 232 | dir = g_dir_open(path,0,&error); |
| 219 | 233 | |
| ... | ... | @@ -257,10 +271,12 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con |
| 257 | 271 | p.group = groupname; |
| 258 | 272 | p.popupname = popupname; |
| 259 | 273 | p.strings = g_string_chunk_new(0); |
| 260 | - p.popup = g_new0(GtkWidget *,(g_strv_length((gchar **) p.popupname)+1)); | |
| 261 | 274 | p.setup = setup; |
| 262 | 275 | |
| 263 | - g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, g_free); | |
| 276 | + sz = (g_strv_length((gchar **) p.popupname)); | |
| 277 | + p.popup = g_new0(GtkWidget *,sz+1); | |
| 278 | + p.popup[sz] = (GtkWidget *) -1; | |
| 279 | + g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, (GDestroyNotify) release_popups); | |
| 264 | 280 | |
| 265 | 281 | for(current = g_list_first(file);current;current = g_list_next(current)) |
| 266 | 282 | { | ... | ... |
src/gtk/uiparser/popup.c
src/gtk/uiparser/testprogram.c
| ... | ... | @@ -85,12 +85,12 @@ int main (int argc, char *argv[]) |
| 85 | 85 | |
| 86 | 86 | for(f=0;popupname[f];f++) |
| 87 | 87 | { |
| 88 | + GtkWidget *button = gtk_button_new_with_label(popupname[f]); | |
| 89 | + gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5); | |
| 88 | 90 | if(popup[f]) |
| 89 | - { | |
| 90 | - GtkWidget *button = gtk_button_new_with_label(popupname[f]); | |
| 91 | - gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5); | |
| 92 | 91 | g_signal_connect(button,"clicked",G_CALLBACK(show_popup),popup[f]); |
| 93 | - } | |
| 92 | + else | |
| 93 | + gtk_widget_set_sensitive(button,FALSE); | |
| 94 | 94 | } |
| 95 | 95 | |
| 96 | 96 | gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5); | ... | ... |