Merge branch 'bugfix/gsettings-schema-has-key' into 'main'

Fix g_settings_schema_has_key() to work with extended schemas

Closes #3548

See merge request GNOME/glib!4420
This commit is contained in:
Philip Withnall 2024-12-08 23:09:13 +00:00
commit f5941d3284
2 changed files with 27 additions and 2 deletions

View File

@ -1055,7 +1055,16 @@ gboolean
g_settings_schema_has_key (GSettingsSchema *schema, g_settings_schema_has_key (GSettingsSchema *schema,
const gchar *key) const gchar *key)
{ {
return gvdb_table_has_value (schema->table, key); GSettingsSchema *s;
if (gvdb_table_has_value (schema->table, key))
return TRUE;
for (s = schema; s; s = s->extends)
if (gvdb_table_has_value (s->table, key))
return TRUE;
return FALSE;
} }
/** /**

View File

@ -3239,7 +3239,7 @@ test_extended_schema (void)
GSettings *settings; GSettings *settings;
gchar **keys; gchar **keys;
settings = g_settings_new_with_path ("org.gtk.test.extends.extended", "/test/extendes/"); settings = g_settings_new_with_path ("org.gtk.test.extends.extended", "/test/extends/");
g_object_get (settings, "settings-schema", &schema, NULL); g_object_get (settings, "settings-schema", &schema, NULL);
keys = g_settings_schema_list_keys (schema); keys = g_settings_schema_list_keys (schema);
g_assert_true (strv_set_equal ((const gchar * const *) keys, "int32", "string", "another-int32", NULL)); g_assert_true (strv_set_equal ((const gchar * const *) keys, "int32", "string", "another-int32", NULL));
@ -3248,6 +3248,21 @@ test_extended_schema (void)
g_settings_schema_unref (schema); g_settings_schema_unref (schema);
} }
static void
test_extended_schema_has_key (void)
{
GSettingsSchema *schema;
GSettings *settings;
settings = g_settings_new_with_path ("org.gtk.test.extends.extended", "/test/extends/");
g_object_get (settings, "settings-schema", &schema, NULL);
g_assert_true (g_settings_schema_has_key (schema, "int32"));
g_assert_true (g_settings_schema_has_key (schema, "string"));
g_assert_true (g_settings_schema_has_key (schema, "another-int32"));
g_object_unref (settings);
g_settings_schema_unref (schema);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -3429,6 +3444,7 @@ main (int argc, char *argv[])
g_test_add_func ("/gsettings/memory-backend", test_memory_backend); g_test_add_func ("/gsettings/memory-backend", test_memory_backend);
g_test_add_func ("/gsettings/read-descriptions", test_read_descriptions); g_test_add_func ("/gsettings/read-descriptions", test_read_descriptions);
g_test_add_func ("/gsettings/test-extended-schema", test_extended_schema); g_test_add_func ("/gsettings/test-extended-schema", test_extended_schema);
g_test_add_func ("/gsettings/test-extended-schema-has-key", test_extended_schema_has_key);
g_test_add_func ("/gsettings/default-value", test_default_value); g_test_add_func ("/gsettings/default-value", test_default_value);
g_test_add_func ("/gsettings/per-desktop", test_per_desktop); g_test_add_func ("/gsettings/per-desktop", test_per_desktop);
g_test_add_func ("/gsettings/per-desktop/subprocess", test_per_desktop_subprocess); g_test_add_func ("/gsettings/per-desktop/subprocess", test_per_desktop_subprocess);