[devhelp] DhSettings: have a real singleton



commit 6603ea3334222e08525d40b9bda8274331bfebf7
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Apr 28 14:41:09 2017 +0200

    DhSettings: have a real singleton
    
    DhSettings was not a real singleton, nothing prevented DhSettings from
    being destroyed and re-created several times.
    
    Also, it was less convenient because the DhSettings object needed to be
    stored, to be able to unref it.

 src/dh-assistant.c    |   32 ++++++++++----------------------
 src/dh-book-manager.c |   23 ++++++++++++-----------
 src/dh-preferences.c  |   33 +++++++++++++++------------------
 src/dh-settings.c     |    6 +-----
 src/dh-window.c       |   36 +++++++++++++++++++++---------------
 5 files changed, 59 insertions(+), 71 deletions(-)
---
diff --git a/src/dh-assistant.c b/src/dh-assistant.c
index 1f541b0..197cbd5 100644
--- a/src/dh-assistant.c
+++ b/src/dh-assistant.c
@@ -24,8 +24,7 @@
 #include "dh-settings.h"
 
 typedef struct {
-        GtkWidget     *view;
-        DhSettings    *settings;
+        GtkWidget *view;
 } DhAssistantPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (DhAssistant, dh_assistant, GTK_TYPE_APPLICATION_WINDOW);
@@ -60,34 +59,22 @@ static gboolean
 dh_assistant_configure_event (GtkWidget         *widget,
                               GdkEventConfigure *event)
 {
-        DhAssistant *assistant = DH_ASSISTANT (widget);
-        DhAssistantPrivate *priv = dh_assistant_get_instance_private (assistant);
+        DhSettings *settings;
+
+        settings = dh_settings_get_instance ();
 
         dh_util_window_settings_save (GTK_WINDOW (widget),
-                                      dh_settings_peek_assistant_settings (priv->settings),
+                                      dh_settings_peek_assistant_settings (settings),
                                       FALSE);
-        return GTK_WIDGET_CLASS (dh_assistant_parent_class)->configure_event (widget, event);
-}
 
-static void
-dh_assistant_dispose (GObject *object)
-{
-        DhAssistant *assistant = DH_ASSISTANT (object);
-        DhAssistantPrivate *priv = dh_assistant_get_instance_private (assistant);
-
-        g_clear_object (&priv->settings);
-
-        G_OBJECT_CLASS (dh_assistant_parent_class)->dispose (object);
+        return GTK_WIDGET_CLASS (dh_assistant_parent_class)->configure_event (widget, event);
 }
 
 static void
 dh_assistant_class_init (DhAssistantClass *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
         GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-        object_class->dispose = dh_assistant_dispose;
-
         widget_class->key_press_event = dh_assistant_key_press_event;
         widget_class->configure_event = dh_assistant_configure_event;
 
@@ -101,17 +88,18 @@ static void
 dh_assistant_init (DhAssistant *assistant)
 {
         DhAssistantPrivate *priv = dh_assistant_get_instance_private (assistant);
+        DhSettings *settings;
 
         gtk_widget_init_template (GTK_WIDGET (assistant));
 
-        priv->settings = dh_settings_get_instance ();
-
         g_signal_connect (priv->view, "open-uri",
                           G_CALLBACK (assistant_view_open_uri_cb),
                           assistant);
 
+        settings = dh_settings_get_instance ();
+
         dh_util_window_settings_restore (GTK_WINDOW (assistant),
-                                         dh_settings_peek_assistant_settings (priv->settings),
+                                         dh_settings_peek_assistant_settings (settings),
                                          FALSE);
 }
 
diff --git a/src/dh-book-manager.c b/src/dh-book-manager.c
index 040b18f..c74f600 100644
--- a/src/dh-book-manager.c
+++ b/src/dh-book-manager.c
@@ -47,8 +47,6 @@ typedef struct {
         /* List of DhLanguage* with at least one book enabled */
         GList      *languages;
 
-        DhSettings *settings;
-
         /* Whether books should be grouped by language */
         guint       group_by_language : 1;
 } DhBookManagerPrivate;
@@ -106,8 +104,6 @@ dh_book_manager_dispose (GObject *object)
                 priv->monitors = NULL;
         }
 
-        g_clear_object (&priv->settings);
-
         G_OBJECT_CLASS (dh_book_manager_parent_class)->dispose (object);
 }
 
@@ -243,15 +239,17 @@ static void
 dh_book_manager_init (DhBookManager *book_manager)
 {
         DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
+        DhSettings *settings;
 
         priv->books = NULL;
         priv->monitors = NULL;
         priv->languages = NULL;
         priv->books_disabled = NULL;
-        priv->settings = dh_settings_get_instance ();
 
         book_manager_load_books_disabled (book_manager);
-        g_settings_bind (dh_settings_peek_contents_settings (priv->settings),
+
+        settings = dh_settings_get_instance ();
+        g_settings_bind (dh_settings_peek_contents_settings (settings),
                          "group-books-by-language",
                          book_manager,
                          "group-by-language",
@@ -302,11 +300,13 @@ static void
 book_manager_load_books_disabled (DhBookManager *book_manager)
 {
         DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
+        DhSettings *settings;
         gchar **books_disabled_strv;
         gchar **i;
 
+        settings = dh_settings_get_instance ();
         books_disabled_strv = g_settings_get_strv (
-                dh_settings_peek_contents_settings (priv->settings),
+                dh_settings_peek_contents_settings (settings),
                 "books-disabled");
 
         for (i = books_disabled_strv; *i != NULL; i++) {
@@ -323,6 +323,7 @@ static void
 book_manager_store_books_disabled (DhBookManager *book_manager)
 {
         DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
+        DhSettings *settings;
         GVariantBuilder *builder;
         GVariant *variant;
         GSList *l;
@@ -337,10 +338,10 @@ book_manager_store_books_disabled (DhBookManager *book_manager)
         variant = g_variant_builder_end (builder);
         g_variant_builder_unref (builder);
 
-        g_settings_set_value (
-                dh_settings_peek_contents_settings (priv->settings),
-                "books-disabled",
-                variant);
+        settings = dh_settings_get_instance ();
+        g_settings_set_value (dh_settings_peek_contents_settings (settings),
+                              "books-disabled",
+                              variant);
 }
 
 static gboolean
diff --git a/src/dh-preferences.c b/src/dh-preferences.c
index 5359459..92781f1 100644
--- a/src/dh-preferences.c
+++ b/src/dh-preferences.c
@@ -41,7 +41,6 @@ enum {
 
 typedef struct {
         DhBookManager *book_manager;
-        DhSettings    *settings;
 
         /* signals */
         gulong book_created_id;
@@ -74,8 +73,6 @@ dh_preferences_finalize (GObject *object)
 
         priv = dh_preferences_get_instance_private (DH_PREFERENCES (object));
 
-        g_clear_object (&priv->settings);
-
         g_signal_handler_disconnect (priv->book_manager, priv->book_created_id);
         g_signal_handler_disconnect (priv->book_manager, priv->book_deleted_id);
         g_signal_handler_disconnect (priv->book_manager, priv->group_by_language_id);
@@ -617,6 +614,7 @@ dh_preferences_init (DhPreferences *prefs)
 {
         DhPreferencesPrivate *priv;
         GApplication *app;
+        DhSettings *settings;
         GSettings *settings_fonts;
         GSettings *settings_contents;
 
@@ -626,7 +624,6 @@ dh_preferences_init (DhPreferences *prefs)
 
         app = g_application_get_default ();
 
-        priv->settings = dh_settings_get_instance ();
         priv->book_manager = g_object_ref (dh_app_peek_book_manager (DH_APP (app)));
         priv->book_created_id = g_signal_connect (priv->book_manager,
                                                   "book-created",
@@ -642,25 +639,25 @@ dh_preferences_init (DhPreferences *prefs)
                                                        prefs);
 
         /* setup GSettings bindings */
-        settings_fonts = dh_settings_peek_fonts_settings (priv->settings);
-        settings_contents = dh_settings_peek_contents_settings (priv->settings);
+        settings = dh_settings_get_instance ();
+        settings_fonts = dh_settings_peek_fonts_settings (settings);
+        settings_contents = dh_settings_peek_contents_settings (settings);
         g_settings_bind (settings_fonts, "use-system-fonts",
-                         priv->system_fonts_button,
-                         "active", G_SETTINGS_BIND_DEFAULT);
+                         priv->system_fonts_button, "active",
+                         G_SETTINGS_BIND_DEFAULT);
         g_settings_bind (settings_fonts, "use-system-fonts",
-                         priv->fonts_grid,
-                         "sensitive", G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN);
+                         priv->fonts_grid, "sensitive",
+                         G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN);
         g_settings_bind (settings_fonts, "fixed-font",
-                         priv->fixed_font_button,
-                         "font-name", G_SETTINGS_BIND_DEFAULT);
+                         priv->fixed_font_button, "font-name",
+                         G_SETTINGS_BIND_DEFAULT);
         g_settings_bind (settings_fonts, "variable-font",
-                         priv->variable_font_button,
-                         "font-name", G_SETTINGS_BIND_DEFAULT);
+                         priv->variable_font_button, "font-name",
+                         G_SETTINGS_BIND_DEFAULT);
 
-        g_settings_bind (settings_contents,
-                         "group-books-by-language",
-                         priv->bookshelf_group_by_language_button,
-                         "active", G_SETTINGS_BIND_DEFAULT);
+        g_settings_bind (settings_contents, "group-books-by-language",
+                         priv->bookshelf_group_by_language_button, "active",
+                         G_SETTINGS_BIND_DEFAULT);
 
         g_signal_connect (priv->bookshelf_enabled_toggle,
                           "toggled",
diff --git a/src/dh-settings.c b/src/dh-settings.c
index b001310..fecba64 100644
--- a/src/dh-settings.c
+++ b/src/dh-settings.c
@@ -132,13 +132,9 @@ dh_settings_init (DhSettings *self)
 DhSettings *
 dh_settings_get_instance (void)
 {
-        if (singleton == NULL) {
+        if (singleton == NULL)
                 singleton = g_object_new (DH_TYPE_SETTINGS, NULL);
-        } else {
-                g_object_ref (singleton);
-        }
 
-        g_return_val_if_fail (DH_IS_SETTINGS (singleton), NULL);
         return singleton;
 }
 
diff --git a/src/dh-window.c b/src/dh-window.c
index 06bc15f..311cfa7 100644
--- a/src/dh-window.c
+++ b/src/dh-window.c
@@ -48,7 +48,6 @@ typedef struct {
         GtkButton      *go_down_button;
 
         DhLink         *selected_search_link;
-        DhSettings     *settings;
         GtkSettings    *gtk_settings;
         gulong          xft_dpi_changed_id;
 } DhWindowPrivate;
@@ -560,13 +559,17 @@ static void
 update_fonts_on_dpi_change (DhWindow *window)
 {
         DhWindowPrivate *priv;
+        DhSettings *settings;
         gchar *font_fixed = NULL;
         gchar *font_variable = NULL;
         WebKitWebView *view;
         gint i;
 
         priv = dh_window_get_instance_private (window);
-        dh_settings_get_selected_fonts (priv->settings, &font_fixed, &font_variable);
+
+        settings = dh_settings_get_instance ();
+        dh_settings_get_selected_fonts (settings, &font_fixed, &font_variable);
+
         if (font_fixed != NULL && font_variable != NULL) {
                 /* change font for all pages */
                 for (i = 0; i < gtk_notebook_get_n_pages (priv->notebook); i++) {
@@ -636,12 +639,11 @@ static gboolean
 dh_window_configure_event (GtkWidget         *window,
                            GdkEventConfigure *event)
 {
-        DhWindowPrivate *priv;
-
-        priv = dh_window_get_instance_private (DH_WINDOW (window));
+        DhSettings *settings;
 
+        settings = dh_settings_get_instance ();
         dh_util_window_settings_save (GTK_WINDOW (window),
-                                      dh_settings_peek_window_settings (priv->settings),
+                                      dh_settings_peek_window_settings (settings),
                                       TRUE);
 
         if (GTK_WIDGET_CLASS (dh_window_parent_class)->configure_event == NULL)
@@ -653,7 +655,8 @@ dh_window_configure_event (GtkWidget         *window,
 static void
 dh_window_init (DhWindow *window)
 {
-        DhWindowPrivate  *priv;
+        DhWindowPrivate *priv;
+        DhSettings    *settings;
         GtkAccelGroup *accel_group;
         GClosure      *closure;
         guint          i;
@@ -668,8 +671,8 @@ dh_window_init (DhWindow *window)
         }
 
         /* handle settings */
-        priv->settings = dh_settings_get_instance ();
-        g_signal_connect_object (priv->settings,
+        settings = dh_settings_get_instance ();
+        g_signal_connect_object (settings,
                                  "fonts-changed",
                                  G_CALLBACK (settings_fonts_changed_cb),
                                  window,
@@ -715,8 +718,6 @@ dh_window_dispose (GObject *object)
                 priv->xft_dpi_changed_id = 0;
         }
 
-        g_clear_object (&priv->settings);
-
         G_OBJECT_CLASS (dh_window_parent_class)->dispose (object);
 }
 
@@ -1315,6 +1316,7 @@ window_open_new_tab (DhWindow    *window,
                      gboolean     switch_focus)
 {
         DhWindowPrivate *priv;
+        DhSettings   *settings;
         GtkWidget    *view;
         GtkWidget    *vbox;
         GtkWidget    *label;
@@ -1329,8 +1331,10 @@ window_open_new_tab (DhWindow    *window,
         view = webkit_web_view_new ();
         apply_webview_settings (WEBKIT_WEB_VIEW (view));
         gtk_widget_show (view);
+
         /* get the current fonts and set them on the new view */
-        dh_settings_get_selected_fonts (priv->settings, &font_fixed, &font_variable);
+        settings = dh_settings_get_instance ();
+        dh_settings_get_selected_fonts (settings, &font_fixed, &font_variable);
         dh_util_view_set_font (WEBKIT_WEB_VIEW (view), font_fixed, font_variable);
         g_free (font_fixed);
         g_free (font_variable);
@@ -1567,8 +1571,9 @@ window_tab_set_title (DhWindow      *window,
 GtkWidget *
 dh_window_new (DhApp *application)
 {
-        DhWindow     *window;
+        DhWindow *window;
         DhWindowPrivate *priv;
+        DhSettings *settings;
 
         window = g_object_new (DH_TYPE_WINDOW,
                                "application", application,
@@ -1578,11 +1583,12 @@ dh_window_new (DhApp *application)
 
         window_populate (window);
 
+        settings = dh_settings_get_instance ();
         dh_util_window_settings_restore (GTK_WINDOW (window),
-                                         dh_settings_peek_window_settings (priv->settings),
+                                         dh_settings_peek_window_settings (settings),
                                          TRUE);
 
-        g_settings_bind (dh_settings_peek_paned_settings (priv->settings), "position",
+        g_settings_bind (dh_settings_peek_paned_settings (settings), "position",
                          priv->hpaned, "position",
                          G_SETTINGS_BIND_DEFAULT);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]