From: phantomjinx <pha...@us...> - 2012-04-25 08:19:13
|
commit f9db5210ef6d0b90635168ead7dcde87b6b0152c Author: phantomjinx <p.g...@ph...> Date: Tue Apr 24 23:07:34 2012 +0100 Fix sjcd preference dialog * Sound juicer dialog opening one but failing to open correctly on subsquent occasions. * Ensures that the dialog is fully constructed from scratch and fully destroyed when closed, inclusing unbinding and disconnecting the g_settings plugins/sjcd/plugin.c | 4 + plugins/sjcd/plugin.h | 2 + plugins/sjcd/sj-main.c | 10 ++-- plugins/sjcd/sj-prefs.c | 169 ++++++++++++++++++++++++++++++---------------- plugins/sjcd/sj-prefs.h | 2 + plugins/sjcd/sjcd.xml | 1 + 6 files changed, 124 insertions(+), 64 deletions(-) --- diff --git a/plugins/sjcd/plugin.c b/plugins/sjcd/plugin.c index 0d03f36..41bcb31 100644 --- a/plugins/sjcd/plugin.c +++ b/plugins/sjcd/plugin.c @@ -140,6 +140,10 @@ static void ipreferences_iface_init(IAnjutaPreferencesIface* iface) { iface->unmerge = ipreferences_unmerge; } +gchar* sjcd_plugin_get_builder_file() { + return g_build_filename(get_glade_dir(), "sjcd.xml", NULL); +} + ANJUTA_PLUGIN_BEGIN (SJCDPlugin, sjcd_plugin); ANJUTA_PLUGIN_ADD_INTERFACE(ipreferences, IANJUTA_TYPE_PREFERENCES); ANJUTA_PLUGIN_END; diff --git a/plugins/sjcd/plugin.h b/plugins/sjcd/plugin.h index 978b150..7811ac4 100644 --- a/plugins/sjcd/plugin.h +++ b/plugins/sjcd/plugin.h @@ -61,4 +61,6 @@ struct _SJCDPluginClass { SJCDPlugin *sjcd_plugin; +gchar* sjcd_plugin_get_builder_file(); + #endif /* PLUGIN_H_ */ diff --git a/plugins/sjcd/sj-main.c b/plugins/sjcd/sj-main.c index dd042b8..8ad0cc8 100644 --- a/plugins/sjcd/sj-main.c +++ b/plugins/sjcd/sj-main.c @@ -26,8 +26,8 @@ #endif #include "libgtkpod/gtkpod_app_iface.h" -#include "libgtkpod/directories.h" #include "libgtkpod/misc.h" +#include "plugin.h" #include "sound-juicer.h" @@ -1418,7 +1418,7 @@ static void set_duplication(gboolean enabled) GtkWidget *sj_create_sound_juicer() { - gchar *glade_path; + gchar *builderXML; GtkWidget *w; GError *error = NULL; GtkTreeSelection *selection; @@ -1469,9 +1469,9 @@ GtkWidget *sj_create_sound_juicer() g_signal_connect (http_settings, "changed::"SJ_SETTINGS_HTTP_PROXY_PORT, (GCallback)http_proxy_port_changed_cb, NULL); - glade_path = g_build_filename(get_glade_dir(), "sjcd.xml", NULL); - builder = gtkpod_builder_xml_new(glade_path); - g_free(glade_path); + builderXML = sjcd_plugin_get_builder_file(); + builder = gtkpod_builder_xml_new(builderXML); + g_free(builderXML); gtk_builder_connect_signals (builder, NULL); diff --git a/plugins/sjcd/sj-prefs.c b/plugins/sjcd/sj-prefs.c index 296392f..064721b 100644 --- a/plugins/sjcd/sj-prefs.c +++ b/plugins/sjcd/sj-prefs.c @@ -26,7 +26,8 @@ // TODO need to remove when replacing the prefs to gtkpod prefs #include "libgtkpod/gtkpod_app_iface.h" - +#include "libgtkpod/misc.h" +#include "plugin.h" #include "sound-juicer.h" #include <string.h> @@ -39,9 +40,18 @@ #include "sj-extracting.h" #include "sj-prefs.h" -static GtkWidget *audio_profile; -static GtkWidget *cd_option, *path_option, *file_option, *basepath_fcb, *check_strip, *check_eject, *check_open; -static GtkWidget *path_example_label; +#define GET_BUILDER_WIDGET(x, a) gtkpod_builder_xml_get_widget (x, a) + +GtkWidget *dialog = NULL; +GtkWidget *audio_profile = NULL; +GtkWidget *cd_option = NULL; +GtkWidget *path_option = NULL; +GtkWidget *file_option = NULL; +GtkWidget *basepath_fcb = NULL; +GtkWidget *check_strip = NULL; +GtkWidget *check_eject = NULL; +GtkWidget *check_open = NULL; +GtkWidget *path_example_label = NULL; typedef struct { char* name; @@ -194,8 +204,10 @@ static void audio_profile_changed_cb (GSettings *settings, gchar *key, gpointer { char *value; g_return_if_fail (strcmp (key, SJ_SETTINGS_AUDIO_PROFILE) == 0); + g_return_if_fail (GTK_IS_WIDGET(user_data)); + value = g_settings_get_string (settings, key); - sj_audio_profile_chooser_set_active (audio_profile, value); + sj_audio_profile_chooser_set_active (GTK_WIDGET(user_data), value); g_free (value); } @@ -210,6 +222,7 @@ static void baseuri_changed_cb (GSettings *settings, gchar *key, gpointer user_ */ const char* base_uri, *current_uri; g_return_if_fail (strcmp (key, SJ_SETTINGS_BASEURI) == 0); + g_return_if_fail (GTK_IS_FILE_CHOOSER(user_data)); base_uri = g_settings_get_string (settings, key); @@ -219,13 +232,13 @@ static void baseuri_changed_cb (GSettings *settings, gchar *key, gpointer user_ dir = sj_get_default_music_directory (); dir_uri = g_file_get_uri (dir); - gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (basepath_fcb), dir_uri); + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (user_data), dir_uri); g_free (dir_uri); g_object_unref (dir); } else { - current_uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (basepath_fcb)); + current_uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (user_data)); if (current_uri == NULL || strcmp (current_uri, base_uri) != 0) - gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (basepath_fcb), base_uri); + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (user_data), base_uri); } } @@ -305,14 +318,16 @@ static void path_pattern_changed_cb (GSettings *settings, gchar *key, gpointer u { char *value; int i = 0; - g_return_if_fail (strcmp (key, SJ_SETTINGS_PATH_PATTERN) == 0); + g_return_if_fail (strcmp (key, SJ_SETTINGS_PATH_PATTERN) == 0); + g_return_if_fail (GTK_IS_COMBO_BOX(user_data)); - value = g_settings_get_string (settings, key); + value = g_settings_get_string (settings, key); while (path_patterns[i].pattern && strcmp(path_patterns[i].pattern, value) != 0) { i++; } g_free (value); - gtk_combo_box_set_active (GTK_COMBO_BOX (path_option), i); + + gtk_combo_box_set_active (GTK_COMBO_BOX (user_data), i); pattern_label_update (); } @@ -322,13 +337,15 @@ static void file_pattern_changed_cb (GSettings *settings, gchar *key, gpointer u int i = 0; g_return_if_fail (strcmp (key, SJ_SETTINGS_FILE_PATTERN) == 0); + g_return_if_fail (GTK_IS_COMBO_BOX(user_data)); value = g_settings_get_string (settings, key); while (file_patterns[i].pattern && strcmp(file_patterns[i].pattern, value) != 0) { i++; } g_free (value); - gtk_combo_box_set_active (GTK_COMBO_BOX (file_option), i); + + gtk_combo_box_set_active (GTK_COMBO_BOX (user_data), i); pattern_label_update (); } @@ -342,20 +359,17 @@ static void device_changed_cb (GSettings *settings, gchar *key, gpointer user_da char *value; g_return_if_fail (strcmp (key, SJ_SETTINGS_DEVICE) == 0); + g_return_if_fail (BRASERO_IS_DRIVE_SELECTION(user_data)); value = g_settings_get_string (settings, key); if ((value != NULL) && (*value != '\0')) { monitor = brasero_medium_monitor_get_default (); drive = brasero_medium_monitor_get_drive (monitor, value); - brasero_drive_selection_set_active (BRASERO_DRIVE_SELECTION (cd_option), drive); + brasero_drive_selection_set_active (BRASERO_DRIVE_SELECTION (user_data), drive); g_object_unref (drive); g_object_unref (monitor); - } else { - /* FIXME: see the FIXME in sj-main.c around one of the - * device_changed_cb calls for a way to fix this - */ - g_warn_if_reached(); } + g_free (value); } @@ -404,7 +418,7 @@ on_response (GtkDialog *dialog, gint response, gpointer user_data) if (response == GTK_RESPONSE_HELP) { show_help (GTK_WINDOW (dialog)); } else { - gtk_widget_hide (GTK_WIDGET (dialog)); + gtk_widget_destroy(GTK_WIDGET (dialog)); } } @@ -443,42 +457,63 @@ static GtkWidget *sj_audio_profile_chooser_new(void) return GTK_WIDGET (combo_box); } -static GtkWidget *create_preferences_dialog() { - GtkWidget *prefs_dialog; +G_MODULE_EXPORT void on_destroy_dialog_content_cb(GtkWidget *widget, gpointer user_data) { + + g_settings_unbind (sj_settings, SJ_SETTINGS_EJECT); + g_settings_unbind (sj_settings, SJ_SETTINGS_OPEN); + g_settings_unbind (sj_settings, SJ_SETTINGS_STRIP); + + g_signal_handlers_disconnect_by_func(G_OBJECT (sj_settings), + (GCallback)device_changed_cb, cd_option); + g_signal_handlers_disconnect_by_func (G_OBJECT (sj_settings), + (GCallback)baseuri_changed_cb, basepath_fcb); + g_signal_handlers_disconnect_by_func (G_OBJECT (sj_settings), + (GCallback)audio_profile_changed_cb, audio_profile); + g_signal_handlers_disconnect_by_func (G_OBJECT (sj_settings), + (GCallback)path_pattern_changed_cb, path_option); + g_signal_handlers_disconnect_by_func (G_OBJECT (sj_settings), + (GCallback)file_pattern_changed_cb, file_option); + g_signal_handlers_disconnect_by_func (G_OBJECT (sj_settings), + (GCallback)strip_changed_cb, NULL); + + g_signal_handlers_disconnect_by_func (extractor, pattern_label_update, NULL); +} + +static GtkWidget *create_preferences_dialog(GtkBuilder *builder) { const char *labels[] = { "cd_label", "path_label", "folder_label", "file_label", "profile_label" }; guint i; GtkSizeGroup *group; GtkWidget *box; - prefs_dialog = GET_WIDGET ("prefs_dialog"); - box = GET_WIDGET ("hack_hbox"); - g_assert (prefs_dialog != NULL); - g_object_add_weak_pointer (G_OBJECT (prefs_dialog), (gpointer)&prefs_dialog); + dialog = GET_BUILDER_WIDGET (builder, "prefs_dialog"); + box = GET_BUILDER_WIDGET (builder, "hack_hbox"); + g_return_val_if_fail(dialog, NULL); + g_object_add_weak_pointer (G_OBJECT (dialog), (gpointer) &(dialog)); - gtk_window_set_transient_for (GTK_WINDOW (prefs_dialog), GTK_WINDOW (gtkpod_app)); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gtkpod_app)); group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); for (i = 0; i < G_N_ELEMENTS (labels); i++) { GtkWidget *widget; - widget = GET_WIDGET (labels[i]); + widget = GET_BUILDER_WIDGET (builder, labels[i]); if (widget) { - gtk_size_group_add_widget (group, widget); + gtk_size_group_add_widget (group, widget); } else { - g_warning ("Widget %s not found", labels[i]); + g_warning ("Widget %s not found", labels[i]); } } g_object_unref (group); - cd_option = GET_WIDGET ("cd_option"); - basepath_fcb = GET_WIDGET ("path_chooser"); - path_option = GET_WIDGET ("path_option"); - file_option = GET_WIDGET ("file_option"); + cd_option = GET_BUILDER_WIDGET (builder, "cd_option"); + basepath_fcb = GET_BUILDER_WIDGET (builder, "path_chooser"); + path_option = GET_BUILDER_WIDGET (builder, "path_option"); + file_option = GET_BUILDER_WIDGET (builder, "file_option"); #if 0 /* FIXME: This cannot be currently used, because aufio profile selector * from gnome-media-profiles package is not fully qualified widget. * Once gnome-media package is updated, this widget can be created * using GtkBuilder. */ - audio_profile = GET_WIDGET ("audio_profile"); + audio_profile = GET_BUILDER_WIDGET (builder, "audio_profile"); #else audio_profile = sj_audio_profile_chooser_new(); g_signal_connect (G_OBJECT (audio_profile), "changed", @@ -486,17 +521,18 @@ static GtkWidget *create_preferences_dialog() { gtk_box_pack_start (GTK_BOX (box), audio_profile, TRUE, TRUE, 0); gtk_widget_show (audio_profile); #endif - check_strip = GET_WIDGET ("check_strip"); - check_eject = GET_WIDGET ("check_eject"); - check_open = GET_WIDGET ("check_open"); - path_example_label = GET_WIDGET ("path_example_label"); + check_strip = GET_BUILDER_WIDGET (builder, "check_strip"); + check_eject = GET_BUILDER_WIDGET (builder, "check_eject"); + check_open = GET_BUILDER_WIDGET (builder, "check_open"); + path_example_label = GET_BUILDER_WIDGET (builder, "path_example_label"); sj_add_default_dirs (GTK_FILE_CHOOSER (basepath_fcb)); + populate_pattern_combo (GTK_COMBO_BOX (path_option), path_patterns); g_signal_connect (path_option, "changed", G_CALLBACK (prefs_path_option_changed), NULL); + populate_pattern_combo (GTK_COMBO_BOX (file_option), file_patterns); g_signal_connect (file_option, "changed", G_CALLBACK (prefs_file_option_changed), NULL); - g_signal_connect (cd_option, "drive-changed", G_CALLBACK (prefs_drive_changed), NULL); /* Connect to GSettings to update the UI */ @@ -504,27 +540,27 @@ static GtkWidget *create_preferences_dialog() { g_settings_bind (sj_settings, SJ_SETTINGS_OPEN, G_OBJECT (check_open), "active", G_SETTINGS_BIND_DEFAULT); g_settings_bind (sj_settings, SJ_SETTINGS_STRIP, G_OBJECT (check_strip), "active", G_SETTINGS_BIND_DEFAULT); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_DEVICE, - (GCallback)device_changed_cb, NULL); + (GCallback)device_changed_cb, cd_option); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_BASEURI, - (GCallback)baseuri_changed_cb, NULL); + (GCallback)baseuri_changed_cb, basepath_fcb); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_AUDIO_PROFILE, - (GCallback)audio_profile_changed_cb, NULL); + (GCallback)audio_profile_changed_cb, audio_profile); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_PATH_PATTERN, - (GCallback)path_pattern_changed_cb, NULL); + (GCallback)path_pattern_changed_cb, path_option); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_FILE_PATTERN, - (GCallback)file_pattern_changed_cb, NULL); + (GCallback)file_pattern_changed_cb, file_option); g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_STRIP, (GCallback)strip_changed_cb, NULL); g_signal_connect (extractor, "notify::profile", pattern_label_update, NULL); - baseuri_changed_cb (sj_settings, SJ_SETTINGS_BASEURI, NULL); - audio_profile_changed_cb (sj_settings, SJ_SETTINGS_AUDIO_PROFILE, NULL); - file_pattern_changed_cb (sj_settings, SJ_SETTINGS_FILE_PATTERN, NULL); - path_pattern_changed_cb (sj_settings, SJ_SETTINGS_PATH_PATTERN, NULL); - device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, NULL); + baseuri_changed_cb (sj_settings, SJ_SETTINGS_BASEURI, basepath_fcb); + audio_profile_changed_cb (sj_settings, SJ_SETTINGS_AUDIO_PROFILE, audio_profile); + file_pattern_changed_cb (sj_settings, SJ_SETTINGS_FILE_PATTERN, file_option); + path_pattern_changed_cb (sj_settings, SJ_SETTINGS_PATH_PATTERN, path_option); + device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, cd_option); - return prefs_dialog; + return dialog; } /** @@ -532,24 +568,36 @@ static GtkWidget *create_preferences_dialog() { */ G_MODULE_EXPORT void on_edit_preferences_cb (GtkMenuItem *item, gpointer user_data) { - static GtkWidget *prefs_dialog = NULL; - if (prefs_dialog) { - gtk_window_present (GTK_WINDOW (prefs_dialog)); - } else { - prefs_dialog = create_preferences_dialog(); - g_signal_connect (GTK_DIALOG (prefs_dialog), "response", G_CALLBACK (on_response), NULL); - gtk_widget_show_all (prefs_dialog); - } + GtkBuilder *prefBuilder; + gchar *builderXML; + GtkWidget *prefs_dialog; + + builderXML = sjcd_plugin_get_builder_file(); + prefBuilder = gtkpod_builder_xml_new(builderXML); + gtk_builder_connect_signals(prefBuilder, NULL); + + prefs_dialog = create_preferences_dialog(prefBuilder); + g_signal_connect (GTK_DIALOG (prefs_dialog), "response", G_CALLBACK (on_response), NULL); + gtk_widget_show_all (prefs_dialog); + + g_free(builderXML); + g_object_unref(prefBuilder); } GtkWidget *init_sjcd_preferences() { + GtkBuilder *prefBuilder; + gchar *builderXML; GtkWidget *prefs_dialog; GtkWidget *container; GtkWidget *vbox; GList *children = NULL; - prefs_dialog = create_preferences_dialog(); + builderXML = sjcd_plugin_get_builder_file(); + prefBuilder = gtkpod_builder_xml_new(builderXML); + gtk_builder_connect_signals(prefBuilder, NULL); + + prefs_dialog = create_preferences_dialog(prefBuilder); container = gtk_dialog_get_content_area(GTK_DIALOG(prefs_dialog)); children = gtk_container_get_children(GTK_CONTAINER(container)); g_return_val_if_fail(children, NULL); @@ -558,5 +606,8 @@ GtkWidget *init_sjcd_preferences() g_object_ref(vbox); gtk_container_remove(GTK_CONTAINER(container), vbox); + g_free(builderXML); + g_object_unref(prefBuilder); + return vbox; } diff --git a/plugins/sjcd/sj-prefs.h b/plugins/sjcd/sj-prefs.h index 7aaa97d..3b8fd7a 100644 --- a/plugins/sjcd/sj-prefs.h +++ b/plugins/sjcd/sj-prefs.h @@ -36,4 +36,6 @@ void prefs_path_option_changed (GtkComboBox *combo, gpointer user_data); void prefs_file_option_changed (GtkComboBox *combo, gpointer user_data); G_MODULE_EXPORT void on_edit_preferences_cb (GtkMenuItem *item, gpointer user_data); +G_MODULE_EXPORT void on_destroy_dialog_content_cb(GtkWidget *widget, gpointer user_data); + #endif /* SJ_PREFS_H */ diff --git a/plugins/sjcd/sjcd.xml b/plugins/sjcd/sjcd.xml index de9e027..e3ac5b2 100644 --- a/plugins/sjcd/sjcd.xml +++ b/plugins/sjcd/sjcd.xml @@ -736,6 +736,7 @@ <property name="can_focus">False</property> <property name="border_width">5</property> <property name="spacing">18</property> + <signal name="destroy" handler="on_destroy_dialog_content_cb" swapped="no"/> <child> <object class="GtkVBox" id="frame_device"> <property name="visible">True</property> |