Index: glib-2.56.1/gio/glib-compile-schemas.c =================================================================== --- glib-2.56.1.orig/gio/glib-compile-schemas.c 2018-04-07 16:53:59.188856969 +0200 +++ glib-2.56.1/gio/glib-compile-schemas.c 2018-04-07 16:53:59.228857214 +0200 @@ -179,6 +179,8 @@ typedef struct GString *unparsed_default_value; GVariant *default_value; + GVariantDict *desktop_overrides; + GString *strinfo; gboolean is_enum; gboolean is_flags; @@ -731,6 +733,11 @@ key_state_serialise (KeyState *state) g_variant_builder_add (&builder, "(y(**))", 'r', state->minimum, state->maximum); + /* per-desktop overrides */ + if (state->desktop_overrides) + g_variant_builder_add (&builder, "(y@a{sv})", 'd', + g_variant_dict_end (state->desktop_overrides)); + state->serialised = g_variant_builder_end (&builder); } @@ -768,6 +775,9 @@ key_state_free (gpointer data) if (state->serialised) g_variant_unref (state->serialised); + if (state->desktop_overrides) + g_variant_dict_unref (state->desktop_overrides); + g_slice_free (KeyState, state); } @@ -1880,6 +1890,8 @@ set_overrides (GHashTable *schema_table gchar **groups; gint i; + g_debug ("Processing override file '%s'", filename); + key_file = g_key_file_new (); if (!g_key_file_load_from_file (key_file, filename, 0, &error)) { @@ -1902,18 +1914,31 @@ set_overrides (GHashTable *schema_table for (i = 0; groups[i]; i++) { const gchar *group = groups[i]; + const gchar *schema_name; + const gchar *desktop_id; SchemaState *schema; + gchar **pieces; gchar **keys; gint j; - schema = g_hash_table_lookup (schema_table, group); + pieces = g_strsplit (group, ":", 2); + schema_name = pieces[0]; + desktop_id = pieces[1]; + + g_debug ("Processing group '%s' (schema '%s', %s)", + group, schema_name, desktop_id ? desktop_id : "all desktops"); + + schema = g_hash_table_lookup (schema_table, schema_name); if (schema == NULL) - /* Having the schema not be installed is expected to be a - * common case. Don't even emit an error message about - * that. - */ - continue; + { + /* Having the schema not be installed is expected to be a + * common case. Don't even emit an error message about + * that. + */ + g_strfreev (pieces); + continue; + } keys = g_key_file_get_keys (key_file, group, NULL, NULL); g_assert (keys != NULL); @@ -1941,6 +1966,32 @@ set_overrides (GHashTable *schema_table fprintf (stderr, _(" and --strict was specified; exiting.\n")); g_key_file_free (key_file); + g_strfreev (pieces); + g_strfreev (groups); + g_strfreev (keys); + + return FALSE; + } + + if (desktop_id != NULL && state->l10n) + { + /* Let's avoid the n*m case of per-desktop localised + * default values, and just forbid it. + */ + fprintf (stderr, + _("cannot provide per-desktop overrides for localised " + "key '%s' in schema '%s' (override file '%s')"), + key, group, filename); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); + g_strfreev (pieces); g_strfreev (groups); g_strfreev (keys); @@ -1971,6 +2022,7 @@ set_overrides (GHashTable *schema_table fprintf (stderr, _("--strict was specified; exiting.\n")); g_key_file_free (key_file); + g_strfreev (pieces); g_strfreev (groups); g_strfreev (keys); @@ -1999,6 +2051,7 @@ set_overrides (GHashTable *schema_table fprintf (stderr, _(" and --strict was specified; exiting.\n")); g_key_file_free (key_file); + g_strfreev (pieces); g_strfreev (groups); g_strfreev (keys); @@ -2027,6 +2080,7 @@ set_overrides (GHashTable *schema_table fprintf (stderr, _(" and --strict was specified; exiting.\n")); g_key_file_free (key_file); + g_strfreev (pieces); g_strfreev (groups); g_strfreev (keys); @@ -2034,11 +2088,24 @@ set_overrides (GHashTable *schema_table } } - g_variant_unref (state->default_value); - state->default_value = value; + if (desktop_id != NULL) + { + if (state->desktop_overrides == NULL) + state->desktop_overrides = g_variant_dict_new (NULL); + + g_variant_dict_insert_value (state->desktop_overrides, desktop_id, value); + g_variant_unref (value); + } + else + { + g_variant_unref (state->default_value); + state->default_value = value; + } + g_free (string); } + g_strfreev (pieces); g_strfreev (keys); } Index: glib-2.56.1/gio/gsettings.c =================================================================== --- glib-2.56.1.orig/gio/gsettings.c 2018-03-12 17:23:37.000000000 +0100 +++ glib-2.56.1/gio/gsettings.c 2018-04-07 16:53:59.232857239 +0200 @@ -1204,10 +1204,7 @@ g_settings_get_value (GSettings *setti value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE); if (value == NULL) - value = g_settings_schema_key_get_translated_default (&skey); - - if (value == NULL) - value = g_variant_ref (skey.default_value); + value = g_settings_schema_key_get_default_value (&skey); g_settings_schema_key_clear (&skey); @@ -1304,10 +1301,7 @@ g_settings_get_default_value (GSettings value = g_settings_read_from_backend (settings, &skey, FALSE, TRUE); if (value == NULL) - value = g_settings_schema_key_get_translated_default (&skey); - - if (value == NULL) - value = g_variant_ref (skey.default_value); + value = g_settings_schema_key_get_default_value (&skey); g_settings_schema_key_clear (&skey); @@ -1360,10 +1354,7 @@ g_settings_get_enum (GSettings *settin value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE); if (value == NULL) - value = g_settings_schema_key_get_translated_default (&skey); - - if (value == NULL) - value = g_variant_ref (skey.default_value); + value = g_settings_schema_key_get_default_value (&skey); result = g_settings_schema_key_to_enum (&skey, value); g_settings_schema_key_clear (&skey); @@ -1473,10 +1464,7 @@ g_settings_get_flags (GSettings *setti value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE); if (value == NULL) - value = g_settings_schema_key_get_translated_default (&skey); - - if (value == NULL) - value = g_variant_ref (skey.default_value); + value = g_settings_schema_key_get_default_value (&skey); result = g_settings_schema_key_to_flags (&skey, value); g_settings_schema_key_clear (&skey); @@ -1751,6 +1739,13 @@ g_settings_get_mapped (GSettings 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; @@ -2657,6 +2652,20 @@ g_settings_binding_key_changed (GSetting g_variant_unref (variant); variant = NULL; } + } + + 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) Index: glib-2.56.1/gio/gsettingsschema-internal.h =================================================================== --- glib-2.56.1.orig/gio/gsettingsschema-internal.h 2017-07-14 01:03:39.000000000 +0200 +++ glib-2.56.1/gio/gsettingsschema-internal.h 2018-04-07 16:53:59.232857239 +0200 @@ -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_schem 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); Index: glib-2.56.1/gio/gsettingsschema.c =================================================================== --- glib-2.56.1.orig/gio/gsettingsschema.c 2018-01-22 21:28:02.000000000 +0100 +++ glib-2.56.1/gio/gsettingsschema.c 2018-04-07 16:53:59.232857239 +0200 @@ -27,6 +27,7 @@ #include #include #include +#include /** * SECTION:gsettingsschema @@ -1283,6 +1284,11 @@ g_settings_schema_key_init (GSettingsSch 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 (GSettingsSc 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_def 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 = getenv ("XDG_CURRENT_DESKTOP"); + gchar **tmp; + + if (xdg_current_desktop != NULL && xdg_current_desktop[0] != '\0') + tmp = g_strsplit (xdg_current_desktop, ":", -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) @@ -1699,6 +1737,9 @@ g_settings_schema_key_get_default_value 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); return value;