commit f9db5210ef6d0b90635168ead7dcde87b6b0152c
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
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>

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to