diff --git a/configure.ac b/configure.ac index b7aa9a8950..433c039f3b 100644 --- a/configure.ac +++ b/configure.ac @@ -334,8 +334,15 @@ AM_BINRELOC ### Glib checks. # We require glib >= 2.40 -PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.40 gthread-2.0 - gobject-2.0 gmodule-2.0) +# 2.46 deprecates g_settings_list_keys +PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.46 gio-2.0 gthread-2.0 gobject-2.0 gmodule-2.0, + [ + AC_DEFINE([HAVE_GLIB_2_46], [1], [Configure g_settings_list_keys deprecation]) + ], + [ + PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.40 gio-2.0 gthread-2.0 + gobject-2.0 gmodule-2.0) + ]) AC_CHECK_HEADERS(dirent.h dlfcn.h dl.h utmp.h locale.h mcheck.h unistd.h wctype.h) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb169b02cc..d081548c55 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -100,6 +100,10 @@ IF (APPLE) ENDIF(APPLE) +IF(GLIB2_VERSION VERSION_GREATER 2.46.0 OR GLIB2_VERSION VERSION_EQUAL 2.46.0) + SET(HAVE_GLIB_2_46 1) +ENDIF() + IF(DISABLE_DEPRECATED_GNOME) SET(GNOME_DISABLE_DEPRECATED 1) ENDIF(DISABLE_DEPRECATED_GNOME) diff --git a/src/app-utils/gnc-gsettings.c b/src/app-utils/gnc-gsettings.c index b663a2c014..aa6a5ea575 100644 --- a/src/app-utils/gnc-gsettings.c +++ b/src/app-utils/gnc-gsettings.c @@ -64,13 +64,27 @@ static gboolean gnc_gsettings_is_valid_key(GSettings *settings, const gchar *key gchar **keys = NULL; gint i = 0; gboolean found = FALSE; +#ifdef HAVE_GLIB_2_46 + GSettingsSchema *schema; +#endif // Check if the key is valid key within settings if (!G_IS_SETTINGS(settings)) return FALSE; +#ifdef HAVE_GLIB_2_46 + g_object_get (settings, "settings-schema", &schema, NULL); + + if (!schema) + return FALSE; +#endif + // Get list of keys +#ifdef HAVE_GLIB_2_46 + keys = g_settings_schema_list_keys(schema); +#else keys = g_settings_list_keys(settings); +#endif while (keys && keys[i]) { @@ -88,7 +102,7 @@ static gboolean gnc_gsettings_is_valid_key(GSettings *settings, const gchar *key return found; } -static GSettings * gnc_gsettings_get_schema_ptr (const gchar *schema_str) +static GSettings * gnc_gsettings_get_settings_ptr (const gchar *schema_str) { GSettings *gset = NULL; gchar *full_name = gnc_gsettings_normalize_schema_name (schema_str); @@ -173,21 +187,21 @@ gnc_gsettings_register_cb (const gchar *schema, gulong retval = 0; gchar *signal = NULL; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); ENTER(""); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), retval); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), retval); g_return_val_if_fail (func, retval); if ((!key) || (*key == '\0')) signal = g_strdup ("changed"); else { - if (gnc_gsettings_is_valid_key(schema_ptr, key)) + if (gnc_gsettings_is_valid_key(settings_ptr, key)) signal = g_strconcat ("changed::", key, NULL); } - retval = g_signal_connect (schema_ptr, signal, G_CALLBACK (func), user_data); + retval = g_signal_connect (settings_ptr, signal, G_CALLBACK (func), user_data); g_free (signal); @@ -205,17 +219,17 @@ gnc_gsettings_remove_cb_by_func (const gchar *schema, gint matched = 0; GQuark quark = 0; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_if_fail (G_IS_SETTINGS (schema_ptr)); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_if_fail (G_IS_SETTINGS (settings_ptr)); g_return_if_fail (func); ENTER (); - if ((key) && (gnc_gsettings_is_valid_key(schema_ptr, key))) + if ((key) && (gnc_gsettings_is_valid_key(settings_ptr, key))) quark = g_quark_from_string (key); matched = g_signal_handlers_disconnect_matched ( - schema_ptr, + settings_ptr, G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, g_signal_lookup ("changed", G_TYPE_SETTINGS), /* signal_id */ quark, /* signal_detail */ @@ -230,10 +244,10 @@ void gnc_gsettings_remove_cb_by_id (const gchar *schema, guint handlerid) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_if_fail (G_IS_SETTINGS (schema_ptr)); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_if_fail (G_IS_SETTINGS (settings_ptr)); - g_signal_handler_disconnect (schema_ptr, handlerid); + g_signal_handler_disconnect (settings_ptr, handlerid); } @@ -260,11 +274,11 @@ void gnc_gsettings_bind (const gchar *schema, gpointer object, const gchar *property) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_if_fail (G_IS_SETTINGS (schema_ptr)); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_if_fail (G_IS_SETTINGS (settings_ptr)); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - g_settings_bind (schema_ptr, key, object, property, 0); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + g_settings_bind (settings_ptr, key, object, property, 0); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -279,11 +293,11 @@ gboolean gnc_gsettings_get_bool (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_boolean (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_boolean (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -297,13 +311,13 @@ gnc_gsettings_set_bool (const gchar *schema, gboolean value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); ENTER("schema: %s, key: %s", schema, key); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_boolean (schema_ptr, key, value); + result = g_settings_set_boolean (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -318,11 +332,11 @@ gint gnc_gsettings_get_int (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), 0); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), 0); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_int (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_int (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -336,12 +350,12 @@ gnc_gsettings_set_int (const gchar *schema, gint value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_int (schema_ptr, key, value); + result = g_settings_set_int (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -355,11 +369,11 @@ gdouble gnc_gsettings_get_float (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), 0); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), 0); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_double (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_double (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -373,12 +387,12 @@ gnc_gsettings_set_float (const gchar *schema, gdouble value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_double (schema_ptr, key, value); + result = g_settings_set_double (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -392,11 +406,11 @@ gchar * gnc_gsettings_get_string (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), NULL); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), NULL); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_string (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_string (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -410,13 +424,13 @@ gnc_gsettings_set_string (const gchar *schema, const gchar *value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); ENTER("schema: %s, key: %s", schema, key); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_string (schema_ptr, key, value); + result = g_settings_set_string (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -431,11 +445,11 @@ gint gnc_gsettings_get_enum (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), 0); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), 0); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_enum (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_enum (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -449,12 +463,12 @@ gnc_gsettings_set_enum (const gchar *schema, gint value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_enum (schema_ptr, key, value); + result = g_settings_set_enum (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -468,11 +482,11 @@ GVariant * gnc_gsettings_get_value (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), NULL); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), NULL); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - return g_settings_get_value (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + return g_settings_get_value (settings_ptr, key); else { PERR ("Invalid key %s for schema %s", key, schema); @@ -486,12 +500,12 @@ gnc_gsettings_set_value (const gchar *schema, GVariant *value) { gboolean result = FALSE; - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), FALSE); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_val_if_fail (G_IS_SETTINGS (settings_ptr), FALSE); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) + if (gnc_gsettings_is_valid_key (settings_ptr, key)) { - result = g_settings_set_value (schema_ptr, key, value); + result = g_settings_set_value (settings_ptr, key, value); if (!result) PERR ("Unable to set value for key %s in schema %s", key, schema); } @@ -505,29 +519,47 @@ void gnc_gsettings_reset (const gchar *schema, const gchar *key) { - GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema); - g_return_if_fail (G_IS_SETTINGS (schema_ptr)); + GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema); + g_return_if_fail (G_IS_SETTINGS (settings_ptr)); - if (gnc_gsettings_is_valid_key (schema_ptr, key)) - g_settings_reset (schema_ptr, key); + if (gnc_gsettings_is_valid_key (settings_ptr, key)) + g_settings_reset (settings_ptr, key); else PERR ("Invalid key %s for schema %s", key, schema); } void -gnc_gsettings_reset_schema (const gchar *schema) +gnc_gsettings_reset_schema (const gchar *schema_str) { gchar **keys; gint counter = 0; - keys = g_settings_list_keys (gnc_gsettings_get_schema_ptr (schema)); +#ifdef HAVE_GLIB_2_46 + GSettingsSchema *schema; +#endif + GSettings *settings = gnc_gsettings_get_settings_ptr (schema_str); + + if (!settings) + return; + +#ifdef HAVE_GLIB_2_46 + g_object_get (settings, "settings-schema", &schema, NULL); + + if (!schema) + return; + + keys = g_settings_schema_list_keys (schema); +#else + keys = g_settings_list_keys (settings); +#endif + if (!keys) return; while (keys[counter]) { - gnc_gsettings_reset (schema, keys[counter]); + gnc_gsettings_reset (schema_str, keys[counter]); counter++; } diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index eca10bddb0..56dcef4240 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -122,6 +122,9 @@ /* Define to 1 if you have the `getuid' function. */ #cmakedefine HAVE_GETUID 1 +/* Configure g_settings_list_keys deprecation */ +#cmakedefine HAVE_GLIB_2_46 1 + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_GLOB_H 1