[devhelp] Introspect window GSettings



commit 22da937a6574378cc44eb349647159e82b01291e
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Dec 15 07:53:39 2017 +0100

    Introspect window GSettings
    
    - To make the utils functions easier to use, by removing the
    has_maximize parameters.
    - Make the code more robust, avoid a crash if trying to access a
    non-existent GSettings key.

 src/dh-assistant.c |    7 ++-----
 src/dh-util.c      |   45 +++++++++++++++++++++++++++++++++++++++------
 src/dh-util.h      |    6 ++----
 src/dh-window.c    |    9 +++------
 4 files changed, 46 insertions(+), 21 deletions(-)
---
diff --git a/src/dh-assistant.c b/src/dh-assistant.c
index f9a1a2c..d049974 100644
--- a/src/dh-assistant.c
+++ b/src/dh-assistant.c
@@ -64,8 +64,7 @@ dh_assistant_configure_event (GtkWidget         *widget,
         settings = dh_settings_get_singleton ();
 
         dh_util_window_settings_save (GTK_WINDOW (widget),
-                                      dh_settings_peek_assistant_settings (settings),
-                                      FALSE);
+                                      dh_settings_peek_assistant_settings (settings));
 
         return GTK_WIDGET_CLASS (dh_assistant_parent_class)->configure_event (widget, event);
 }
@@ -97,10 +96,8 @@ dh_assistant_init (DhAssistant *assistant)
                           assistant);
 
         settings = dh_settings_get_singleton ();
-
         dh_util_window_settings_restore (GTK_WINDOW (assistant),
-                                         dh_settings_peek_assistant_settings (settings),
-                                         FALSE);
+                                         dh_settings_peek_assistant_settings (settings));
 }
 
 GtkWidget *
diff --git a/src/dh-util.c b/src/dh-util.c
index 24e217c..8b46c1b 100644
--- a/src/dh-util.c
+++ b/src/dh-util.c
@@ -138,15 +138,41 @@ dh_util_view_set_font (WebKitWebView *view, const gchar *font_name_fixed, const
                  font_name_fixed, font_size_fixed_px, font_name_variable, font_size_variable_px);
 }
 
+static void
+introspect_window_gsettings (GSettings *window_settings,
+                             gboolean  *has_required_keys,
+                             gboolean  *has_maximized_key)
+{
+        GSettingsSchema *schema = NULL;
+
+        g_object_get (window_settings,
+                      "settings-schema", &schema,
+                      NULL);
+
+        *has_required_keys = (g_settings_schema_has_key (schema, "width") &&
+                              g_settings_schema_has_key (schema, "height"));
+
+        *has_maximized_key = g_settings_schema_has_key (schema, "maximized");
+
+        g_settings_schema_unref (schema);
+}
+
 void
 dh_util_window_settings_save (GtkWindow *window,
-                              GSettings *settings,
-                              gboolean   has_maximize)
+                              GSettings *settings)
 {
+        gboolean has_required_keys;
+        gboolean has_maximized_key;
         gint width;
         gint height;
 
-        if (has_maximize) {
+        g_return_if_fail (GTK_IS_WINDOW (window));
+        g_return_if_fail (G_IS_SETTINGS (settings));
+
+        introspect_window_gsettings (settings, &has_required_keys, &has_maximized_key);
+        g_return_if_fail (has_required_keys);
+
+        if (has_maximized_key) {
                 GdkWindowState state;
                 gboolean maximized;
 
@@ -168,12 +194,19 @@ dh_util_window_settings_save (GtkWindow *window,
 
 void
 dh_util_window_settings_restore (GtkWindow *window,
-                                 GSettings *settings,
-                                 gboolean   has_maximize)
+                                 GSettings *settings)
 {
+        gboolean has_required_keys;
+        gboolean has_maximized_key;
         gint width;
         gint height;
 
+        g_return_if_fail (GTK_IS_WINDOW (window));
+        g_return_if_fail (G_IS_SETTINGS (settings));
+
+        introspect_window_gsettings (settings, &has_required_keys, &has_maximized_key);
+        g_return_if_fail (has_required_keys);
+
         width = g_settings_get_int (settings, "width");
         height = g_settings_get_int (settings, "height");
 
@@ -192,7 +225,7 @@ dh_util_window_settings_restore (GtkWindow *window,
                 gtk_window_set_default_size (window, width, height);
         }
 
-        if (has_maximize && g_settings_get_boolean (settings, "maximized"))
+        if (has_maximized_key && g_settings_get_boolean (settings, "maximized"))
                 gtk_window_maximize (window);
 }
 
diff --git a/src/dh-util.h b/src/dh-util.h
index 7f29956..ef0e75e 100644
--- a/src/dh-util.h
+++ b/src/dh-util.h
@@ -39,12 +39,10 @@ void         dh_util_view_set_font                (WebKitWebView *view,
                                                    const gchar *font_name_variable);
 
 void         dh_util_window_settings_save         (GtkWindow *window,
-                                                   GSettings *settings,
-                                                   gboolean has_maximize);
+                                                   GSettings *settings);
 
 void         dh_util_window_settings_restore      (GtkWindow *window,
-                                                   GSettings *settings,
-                                                   gboolean has_maximize);
+                                                   GSettings *settings);
 
 void         dh_util_queue_concat                 (GQueue *q1,
                                                    GQueue *q2);
diff --git a/src/dh-window.c b/src/dh-window.c
index f28249a..36228e5 100644
--- a/src/dh-window.c
+++ b/src/dh-window.c
@@ -595,8 +595,7 @@ window_settings_save_cb (gpointer user_data)
 
         settings = dh_settings_get_singleton ();
         dh_util_window_settings_save (GTK_WINDOW (window),
-                                      dh_settings_peek_window_settings (settings),
-                                      TRUE);
+                                      dh_settings_peek_window_settings (settings));
 
         return G_SOURCE_REMOVE;
 }
@@ -642,8 +641,7 @@ dh_window_delete_event (GtkWidget   *widget,
 
         settings = dh_settings_get_singleton ();
         dh_util_window_settings_save (GTK_WINDOW (window),
-                                      dh_settings_peek_window_settings (settings),
-                                      TRUE);
+                                      dh_settings_peek_window_settings (settings));
 
         if (GTK_WIDGET_CLASS (dh_window_parent_class)->delete_event == NULL)
                 return GDK_EVENT_PROPAGATE;
@@ -1558,8 +1556,7 @@ dh_window_new (DhApp *application)
 
         settings = dh_settings_get_singleton ();
         dh_util_window_settings_restore (GTK_WINDOW (window),
-                                         dh_settings_peek_window_settings (settings),
-                                         TRUE);
+                                         dh_settings_peek_window_settings (settings));
 
         g_settings_bind (dh_settings_peek_paned_settings (settings), "position",
                          priv->hpaned, "position",


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