File glib-desktop-specific-defaults2.patch of Package glib2.openSUSE_Factory
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
index 0caf24f..d6e85da 100644
--- a/gio/gdesktopappinfo.c
+++ b/gio/gdesktopappinfo.c
@@ -2459,6 +2459,10 @@ typedef struct {
MimeInfoCacheDirItem defaults_list_diritem;
/* map key = MIME Type, value = desktop file name */
MimeInfoCacheDirItemMapPad _defaults_list_diritem_pad[1];
+ /* {enviro-}defaults.list: dir item with single map of defaults */
+ MimeInfoCacheDirItem env_defaults_list_diritem;
+ /* map key = MIME Type, value = desktop file name */
+ MimeInfoCacheDirItemMapPad _env_defaults_list_diritem_pad[1];
/* mimeapps.list: dir item with three maps: default, added and removed apps */
MimeInfoCacheDirItem mimeapps_list_diritem;
/* map key = MIME Type, value = desktop file name */
@@ -2479,6 +2483,8 @@ typedef struct {
static MimeInfoCache *mime_info_cache = NULL;
G_LOCK_DEFINE_STATIC (mime_info_cache);
+static MimeInfoCacheDirItemSpec *mime_info_cache_dir_item_spec_env_defaults_list_ptr = NULL;
+
static MimeInfoCache * mime_info_cache_new (void);
@@ -2653,6 +2659,13 @@ mime_info_cache_dir_free (MimeInfoCacheDir *dir)
}
+ if (mime_info_cache_dir_item_spec_env_defaults_list_ptr)
+ if (dir->env_defaults_list_diritem.map[0] != NULL)
+ {
+ g_hash_table_destroy (dir->env_defaults_list_diritem.map[0]);
+ dir->env_defaults_list_diritem.map[0] = NULL;
+ }
+
if (dir->defaults_list_diritem.map[0] != NULL)
{
g_hash_table_destroy (dir->defaults_list_diritem.map[0]);
@@ -2730,6 +2743,34 @@ destroy_info_cache_value (GList *value)
}
static void
+mime_info_cache_init_desktop_defaults (void)
+{
+ if (!mime_info_cache_dir_item_spec_env_defaults_list_ptr)
+ {
+ const gchar *env;
+ gchar *filename;
+ env = g_getenv ("XDG_DESKTOP_PREFIX");
+ if (env)
+ {
+ filename = g_strdup_printf ("%sdefaults.list", env);
+ goto set_env;
+ }
+ else
+ {
+ env = g_getenv ("DESKTOP_SESSION");
+ if (!env)
+ return;
+ filename = g_strdup_printf ("%s-defaults.list", env);
+ }
+ set_env:
+ mime_info_cache_dir_item_spec_env_defaults_list_ptr =
+ g_memdup (&mime_info_cache_dir_item_spec_defaults_list,
+ sizeof (MimeInfoCacheDirItemSpec) + 2 * sizeof (gchar*));
+ mime_info_cache_dir_item_spec_env_defaults_list_ptr->filename = filename;
+ }
+}
+
+static void
mime_info_cache_init_dir_lists (void)
{
const char * const *dirs;
@@ -2751,6 +2792,10 @@ mime_info_cache_init_dir_lists (void)
&mime_info_cache_dir_item_spec_mimeinfo_cache);
mime_info_cache_dir_build_cache (dir, &dir->defaults_list_diritem,
&mime_info_cache_dir_item_spec_defaults_list);
+ mime_info_cache_init_desktop_defaults ();
+ if (mime_info_cache_dir_item_spec_env_defaults_list_ptr)
+ mime_info_cache_dir_build_cache (dir, &dir->env_defaults_list_diritem,
+ mime_info_cache_dir_item_spec_env_defaults_list_ptr);
mime_info_cache_dir_build_cache (dir, &dir->mimeapps_list_diritem,
&mime_info_cache_dir_item_spec_mimeapps_list);
mime_info_cache->dirs = g_list_append (mime_info_cache->dirs, dir);
@@ -2775,6 +2820,9 @@ mime_info_cache_update_dir_lists (void)
&mime_info_cache_dir_item_spec_mimeinfo_cache);
mime_info_cache_dir_build_cache (dir, &dir->defaults_list_diritem,
&mime_info_cache_dir_item_spec_defaults_list);
+ if (mime_info_cache_dir_item_spec_env_defaults_list_ptr)
+ mime_info_cache_dir_build_cache (dir, &dir->env_defaults_list_diritem,
+ mime_info_cache_dir_item_spec_env_defaults_list_ptr);
mime_info_cache_dir_build_cache (dir, &dir->mimeapps_list_diritem,
&mime_info_cache_dir_item_spec_mimeapps_list);
@@ -2977,6 +3025,12 @@ get_all_desktop_entries_for_mime_type (const char *base_mime_type,
removed_entries = append_desktop_entry (removed_entries, removed_associations[j], NULL);
/* Then system defaults (or old per-user config) (using removed associations from this dir or earlier) */
+ if (mime_info_cache_dir_item_spec_env_defaults_list_ptr)
+ {
+ default_entries = g_hash_table_lookup (dir->env_defaults_list_diritem.map[0], mime_type);
+ for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
+ desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);
+ }
default_entries = g_hash_table_lookup (dir->defaults_list_diritem.map[0], mime_type);
for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);