[balsa/gtk4] fix crash on systems without GNOME schema files



commit 51428da3956f9e9d5ed5d53e1df2ff85c7002384
Author: Albrecht Dreß <albrecht dress netcologne de>
Date:   Sat Apr 10 18:48:11 2021 +0200

    fix crash on systems without GNOME schema files
    
    On minimalistic systems (e.g. macOS w/jhbuild) the 'org.gnome.desktop.interface'
    schema may not be available, resulting in a crash.  The fix first checks for it
    before attempting to call g_settings_new().
    
    Signed-off-by: Albrecht Dreß <albrecht dress arcor de>

 src/toolbar-factory.c | 62 ++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 18 deletions(-)
---
diff --git a/src/toolbar-factory.c b/src/toolbar-factory.c
index d8cd0f9a4..0f889f4b8 100644
--- a/src/toolbar-factory.c
+++ b/src/toolbar-factory.c
@@ -267,6 +267,31 @@ tm_gsettings_change_cb(GSettings   * settings,
         balsa_toolbar_model_changed(model);
 }
 
+static GSettings *
+tm_get_settings(void)
+{
+    GSettingsSchemaSource *schema_source;
+    GSettings *settings = NULL;
+
+    schema_source = g_settings_schema_source_get_default();
+    if (schema_source != NULL) {
+       GSettingsSchema *schema;
+
+       schema = g_settings_schema_source_lookup(schema_source, "org.gnome.desktop.interface", TRUE);
+       if (schema != NULL) {
+               settings = g_settings_new("org.gnome.desktop.interface");
+               g_debug("settings schema 'org.gnome.desktop.interface' loaded");
+               g_settings_schema_unref(schema);
+       } else {
+               g_info("the settings schema 'org.gnome.desktop.interface' does not exist");
+       }
+    } else {
+       g_warning("cannot get default settings schema source");
+    }
+
+    return settings;
+}
+
 /* Create a BalsaToolbarModel structure.
  */
 BalsaToolbarModel *
@@ -293,9 +318,10 @@ balsa_toolbar_model_new(BalsaToolbarType          type,
     balsa_toolbar_model_add_entries(model, entries, n_entries);
     tm_load_model(model);
 
-    model->settings = g_settings_new("org.gnome.desktop.interface");
-    g_signal_connect(model->settings, "changed",
-                     G_CALLBACK(tm_gsettings_change_cb), model);
+    model->settings = tm_get_settings();
+    if (model->settings != NULL) {
+       g_signal_connect(model->settings, "changed", G_CALLBACK(tm_gsettings_change_cb), model);
+    }
 
     return model;
 }
@@ -460,25 +486,25 @@ tm_default_style(void)
 {
     BalsaToolbarStyle default_style = BALSA_TOOLBAR_BOTH;
     GSettings *settings;
-    gchar *str;
 
     /* Get global setting */
-    settings = g_settings_new("org.gnome.desktop.interface");
-    str  = g_settings_get_string(settings, "toolbar-style");
-    if (str) {
-        guint i;
-
-        for (i = 0; i < G_N_ELEMENTS(tm_toolbar_options); i++) {
-            const ToolbarOption *option = &tm_toolbar_options[i];
-
-            if (strcmp(option->config_name, str) == 0) {
-                default_style = option->style;
-                break;
-            }
+    settings = tm_get_settings();
+    if (settings != NULL) {
+        gchar *str;
+
+        str = g_settings_get_string(settings, "toolbar-style");
+        if (str != NULL) {
+               guint i;
+
+               for (i = 0; i < G_N_ELEMENTS(tm_toolbar_options); i++)
+                       if (strcmp(tm_toolbar_options[i].config_name, str) == 0) {
+                               default_style = tm_toolbar_options[i].style;
+                               break;
+                       }
+               g_free(str);
         }
-        g_free(str);
+        g_object_unref(settings);
     }
-    g_object_unref(settings);
 
     return default_style;
 }


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