diff --git a/capplets/default-applications/ChangeLog b/capplets/default-applications/ChangeLog index 2ffc092c1..4f53cf1ee 100644 --- a/capplets/default-applications/ChangeLog +++ b/capplets/default-applications/ChangeLog @@ -1,3 +1,10 @@ +2007-02-03 Jens Granseuer + + * gnome-da-capplet.c: (fill_combo_box), (show_dialog), (main): + * gnome-da-xml.c: (gnome_da_xml_load_xml), + (gnome_da_xml_load_list), (gnome_da_xml_free): + * gnome-da-xml.h: plug memory leaks. Closes bug #395212. + 2007-02-02 Christian Persch * gnome-da-capplet.c: (main): Use specific string as app ID in diff --git a/capplets/default-applications/gnome-da-capplet.c b/capplets/default-applications/gnome-da-capplet.c index 452f91bfa..33e61126f 100644 --- a/capplets/default-applications/gnome-da-capplet.c +++ b/capplets/default-applications/gnome-da-capplet.c @@ -215,7 +215,7 @@ web_combo_changed_cb (GtkComboBox *combo, GnomeDACapplet *capplet) gtk_widget_set_sensitive (capplet->web_browser_command_label, is_custom_active); gtk_widget_set_sensitive (capplet->web_browser_terminal_checkbutton, is_custom_active); } - + static void mail_combo_changed_cb (GtkComboBox *combo, GnomeDACapplet *capplet) { @@ -688,7 +688,6 @@ fill_combo_box (GtkIconTheme *theme, GtkComboBox *combo_box, GList *app_list) GtkCellRenderer *renderer; GtkTreeIter iter; GdkPixbuf *pixbuf; - gchar *label; if (theme == NULL) { theme = gtk_icon_theme_get_default (); @@ -720,19 +719,17 @@ fill_combo_box (GtkIconTheme *theme, GtkComboBox *combo_box, GList *app_list) item = (GnomeDAItem *) entry->data; pixbuf = gtk_icon_theme_load_icon (theme, item->icon_name, 22, 0, NULL); - label = g_strdup (item->name); gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, PIXBUF_COL, pixbuf, - TEXT_COL, label, + TEXT_COL, item->name, -1); item->icon_path = gtk_tree_model_get_string_from_iter (model, &iter); if (pixbuf) g_object_unref (pixbuf); - g_free (label); } gtk_list_store_append (GTK_LIST_STORE (model), &iter); @@ -802,26 +799,50 @@ show_dialog (GnomeDACapplet *capplet) /* update ui to gconf content */ value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_HTTP_EXEC, NULL); - web_browser_update_combo_box (capplet, gconf_value_get_string (value)); - web_browser_update_radio_buttons (capplet, gconf_value_get_string (value)); + if (value) + { + web_browser_update_combo_box (capplet, gconf_value_get_string (value)); + web_browser_update_radio_buttons (capplet, gconf_value_get_string (value)); + gconf_value_free (value); + } value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_HTTP_NEEDS_TERM, NULL); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (capplet->web_browser_terminal_checkbutton), - gconf_value_get_bool (value)); + if (value) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (capplet->web_browser_terminal_checkbutton), + gconf_value_get_bool (value)); + gconf_value_free (value); + } value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_MAILER_EXEC, NULL); - mail_reader_update_combo_box (capplet, gconf_value_get_string (value)); + if (value) + { + mail_reader_update_combo_box (capplet, gconf_value_get_string (value)); + gconf_value_free (value); + } value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_MAILER_NEEDS_TERM, NULL); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (capplet->mail_reader_terminal_checkbutton), - gconf_value_get_bool (value)); + if (value) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (capplet->mail_reader_terminal_checkbutton), + gconf_value_get_bool (value)); + gconf_value_free (value); + } - value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_TERMINAL_EXEC, NULL); - terminal_update_combo_box (capplet, gconf_value_get_string (value)); + if (value) + { + value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_TERMINAL_EXEC, NULL); + terminal_update_combo_box (capplet, gconf_value_get_string (value)); + gconf_value_free (value); + } value = gconf_client_get (capplet->gconf, DEFAULT_APPS_KEY_TERMINAL_EXEC_ARG, NULL); - gtk_entry_set_text (GTK_ENTRY (capplet->terminal_exec_flag_entry), - gconf_value_get_string (value)); + if (value) + { + gtk_entry_set_text (GTK_ENTRY (capplet->terminal_exec_flag_entry), + gconf_value_get_string (value)); + gconf_value_free (value); + } g_signal_connect (capplet->web_combo_box, "changed", G_CALLBACK (web_combo_changed_cb), capplet); g_signal_connect (capplet->mail_combo_box, "changed", G_CALLBACK (mail_combo_changed_cb), capplet); @@ -853,21 +874,22 @@ show_dialog (GnomeDACapplet *capplet) int main (int argc, char **argv) { + GnomeProgram *program; GnomeDACapplet *capplet; - capplet = g_new0 (GnomeDACapplet, 1); - #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif - gnome_program_init ("gnome-default-applications-properties", VERSION, LIBGNOMEUI_MODULE, argc, argv, - GNOME_PARAM_NONE); + program = gnome_program_init ("gnome-default-applications-properties", + VERSION, LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_NONE); glade_init (); + capplet = g_new0 (GnomeDACapplet, 1); capplet->gconf = gconf_client_get_default (); gconf_client_add_dir (capplet->gconf, "/desktop/gnome/applications/browser", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); @@ -891,7 +913,9 @@ main (int argc, char **argv) gtk_main (); g_object_unref (capplet->gconf); - g_object_unref (capplet->xml); + + gnome_da_xml_free (capplet); + g_object_unref (program); return 0; } diff --git a/capplets/default-applications/gnome-da-xml.c b/capplets/default-applications/gnome-da-xml.c index 87f315b78..ec3936871 100644 --- a/capplets/default-applications/gnome-da-xml.c +++ b/capplets/default-applications/gnome-da-xml.c @@ -128,6 +128,7 @@ gnome_da_xml_load_xml (GnomeDACapplet *capplet, const gchar * filename) { xmlDoc *xml_doc; xmlNode *root, *section, *element; + gchar *executable; GnomeDAWebItem *web_item; GnomeDAMailItem *mail_item; GnomeDATermItem *term_item; @@ -143,11 +144,12 @@ gnome_da_xml_load_xml (GnomeDACapplet *capplet, const gchar * filename) if (!xmlStrncmp (section->name, "web-browsers", 12)) { for (element = section->children; element != NULL; element = element->next) { if (!xmlStrncmp (element->name, "web-browser", 11)) { - if (is_executable_valid (gnome_da_xml_get_string (element, "executable"))) { + executable = gnome_da_xml_get_string (element, "executable"); + if (is_executable_valid (executable)) { web_item = gnome_da_web_item_new (); web_item->generic.name = gnome_da_xml_get_string (element, "name"); - web_item->generic.executable = gnome_da_xml_get_string (element, "executable"); + web_item->generic.executable = executable; web_item->generic.command = gnome_da_xml_get_string (element, "command"); web_item->generic.icon_name = gnome_da_xml_get_string (element, "icon-name"); @@ -160,17 +162,20 @@ gnome_da_xml_load_xml (GnomeDACapplet *capplet, const gchar * filename) capplet->web_browsers = g_list_append (capplet->web_browsers, web_item); } + else + g_free (executable); } } } else if (!xmlStrncmp (section->name, "mail-readers", 12)) { for (element = section->children; element != NULL; element = element->next) { if (!xmlStrncmp (element->name, "mail-reader", 11)) { - if (is_executable_valid (gnome_da_xml_get_string (element, "executable"))) { + executable = gnome_da_xml_get_string (element, "executable"); + if (is_executable_valid (executable)) { mail_item = gnome_da_mail_item_new (); mail_item->generic.name = gnome_da_xml_get_string (element, "name"); - mail_item->generic.executable = gnome_da_xml_get_string (element, "executable"); + mail_item->generic.executable = executable; mail_item->generic.command = gnome_da_xml_get_string (element, "command"); mail_item->generic.icon_name = gnome_da_xml_get_string (element, "icon-name"); @@ -178,17 +183,20 @@ gnome_da_xml_load_xml (GnomeDACapplet *capplet, const gchar * filename) capplet->mail_readers = g_list_append (capplet->mail_readers, mail_item); } + else + g_free (executable); } } } else if (!xmlStrncmp (section->name, "terminals", 9)) { for (element = section->children; element != NULL; element = element->next) { if (!xmlStrncmp (element->name, "terminal", 8)) { - if (is_executable_valid (gnome_da_xml_get_string (element, "executable"))) { + executable = gnome_da_xml_get_string (element, "executable"); + if (is_executable_valid (executable)) { term_item = gnome_da_term_item_new (); term_item->generic.name = gnome_da_xml_get_string (element, "name"); - term_item->generic.executable = gnome_da_xml_get_string (element, "executable"); + term_item->generic.executable = executable; term_item->generic.command = gnome_da_xml_get_string (element, "command"); term_item->generic.icon_name = gnome_da_xml_get_string (element, "icon-name"); @@ -196,6 +204,8 @@ gnome_da_xml_load_xml (GnomeDACapplet *capplet, const gchar * filename) capplet->terminals = g_list_append (capplet->terminals, term_item); } + else + g_free (executable); } } } @@ -222,3 +232,17 @@ gnome_da_xml_load_list (GnomeDACapplet *capplet) if (capplet->web_browsers == NULL) gnome_da_xml_load_xml (capplet, "./gnome-default-applications.xml"); } + +void +gnome_da_xml_free (GnomeDACapplet *capplet) +{ + g_list_foreach (capplet->web_browsers, (GFunc) gnome_da_web_item_free, NULL); + g_list_foreach (capplet->mail_readers, (GFunc) gnome_da_mail_item_free, NULL); + g_list_foreach (capplet->terminals, (GFunc) gnome_da_term_item_free, NULL); + g_list_free (capplet->web_browsers); + g_list_free (capplet->mail_readers); + g_list_free (capplet->terminals); + + g_object_unref (capplet->xml); + g_free (capplet); +} diff --git a/capplets/default-applications/gnome-da-xml.h b/capplets/default-applications/gnome-da-xml.h index ff8d16574..f45a18923 100644 --- a/capplets/default-applications/gnome-da-xml.h +++ b/capplets/default-applications/gnome-da-xml.h @@ -22,5 +22,6 @@ #define _GNOME_DA_XML_H_ void gnome_da_xml_load_list (GnomeDACapplet *capplet); +void gnome_da_xml_free (GnomeDACapplet *capplet); #endif