diff --git a/gio/gsettings.c b/gio/gsettings.c index ab60fdf71..194a73778 100644 --- a/gio/gsettings.c +++ b/gio/gsettings.c @@ -1739,6 +1739,13 @@ g_settings_get_mapped (GSettings *settings, if (okay) goto okay; } + if ((value = g_settings_schema_key_get_per_desktop_default (&skey))) + { + okay = mapping (value, &result, user_data); + g_variant_unref (value); + if (okay) goto okay; + } + if (mapping (skey.default_value, &result, user_data)) goto okay; @@ -2646,6 +2653,20 @@ g_settings_binding_key_changed (GSettings *settings, } } + if (variant == NULL) + { + variant = g_settings_schema_key_get_per_desktop_default (&binding->key); + if (variant && + !binding->get_mapping (&value, variant, binding->user_data)) + { + g_error ("Per-desktop default value for key '%s' in schema '%s' " + "was rejected by the binding mapping function.", + binding->key.name, g_settings_schema_get_id (binding->key.schema)); + g_variant_unref (variant); + variant = NULL; + } + } + if (variant == NULL) { variant = g_variant_ref (binding->key.default_value); diff --git a/gio/gsettingsschema-internal.h b/gio/gsettingsschema-internal.h index f54de3b34..5f996b4bc 100644 --- a/gio/gsettingsschema-internal.h +++ b/gio/gsettingsschema-internal.h @@ -37,6 +37,7 @@ struct _GSettingsSchemaKey const GVariantType *type; GVariant *minimum, *maximum; GVariant *default_value; + GVariant *desktop_overrides; gint ref_count; }; @@ -58,6 +59,7 @@ gboolean g_settings_schema_key_type_check (GSettin GVariant * g_settings_schema_key_range_fixup (GSettingsSchemaKey *key, GVariant *value); GVariant * g_settings_schema_key_get_translated_default (GSettingsSchemaKey *key); +GVariant * g_settings_schema_key_get_per_desktop_default (GSettingsSchemaKey *key); gint g_settings_schema_key_to_enum (GSettingsSchemaKey *key, GVariant *value); diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c index f1274a369..17b7e3b01 100644 --- a/gio/gsettingsschema.c +++ b/gio/gsettingsschema.c @@ -27,6 +27,7 @@ #include #include #include +#include /** * SECTION:gsettingsschema @@ -1283,6 +1284,11 @@ g_settings_schema_key_init (GSettingsSchemaKey *key, endian_fixup (&key->maximum); break; + case 'd': + g_variant_get (data, "@a{sv}", &key->desktop_overrides); + endian_fixup (&key->desktop_overrides); + break; + default: g_warning ("unknown schema extension '%c'", code); break; @@ -1303,6 +1309,9 @@ g_settings_schema_key_clear (GSettingsSchemaKey *key) if (key->maximum) g_variant_unref (key->maximum); + if (key->desktop_overrides) + g_variant_unref (key->desktop_overrides); + g_variant_unref (key->default_value); g_settings_schema_unref (key->schema); @@ -1410,6 +1419,35 @@ g_settings_schema_key_get_translated_default (GSettingsSchemaKey *key) return value; } +GVariant * +g_settings_schema_key_get_per_desktop_default (GSettingsSchemaKey *key) +{ + static const gchar * const *current_desktops; + GVariant *value = NULL; + gint i; + + if (!key->desktop_overrides) + return NULL; + + if (g_once_init_enter (¤t_desktops)) + { + const gchar *xdg_current_desktop = g_getenv ("XDG_CURRENT_DESKTOP"); + gchar **tmp; + + if (xdg_current_desktop != NULL && xdg_current_desktop[0] != '\0') + tmp = g_strsplit (xdg_current_desktop, G_SEARCHPATH_SEPARATOR_S, -1); + else + tmp = g_new0 (gchar *, 0 + 1); + + g_once_init_leave (¤t_desktops, (const gchar **) tmp); + } + + for (i = 0; value == NULL && current_desktops[i] != NULL; i++) + value = g_variant_lookup_value (key->desktop_overrides, current_desktops[i], NULL); + + return value; +} + gint g_settings_schema_key_to_enum (GSettingsSchemaKey *key, GVariant *value) @@ -1698,6 +1736,9 @@ g_settings_schema_key_get_default_value (GSettingsSchemaKey *key) value = g_settings_schema_key_get_translated_default (key); + if (!value) + value = g_settings_schema_key_get_per_desktop_default (key); + if (!value) value = g_variant_ref (key->default_value);