mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-26 07:26:15 +01:00
Update to use both mimeapps.list and defaults.list as discussed on xdg
2008-02-06 Alexander Larsson <alexl@redhat.com> * gdesktopappinfo.c: Update to use both mimeapps.list and defaults.list as discussed on xdg list. svn path=/trunk/; revision=6461
This commit is contained in:
parent
f428a1b44a
commit
b4a7d48aad
@ -1,3 +1,9 @@
|
|||||||
|
2008-02-06 Alexander Larsson <alexl@redhat.com>
|
||||||
|
|
||||||
|
* gdesktopappinfo.c:
|
||||||
|
Update to use both mimeapps.list and
|
||||||
|
defaults.list as discussed on xdg list.
|
||||||
|
|
||||||
2008-02-06 Benjamin Otte <otte@gnome.org>
|
2008-02-06 Benjamin Otte <otte@gnome.org>
|
||||||
|
|
||||||
* gasyncresult.c:
|
* gasyncresult.c:
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
#define DEFAULT_APPLICATIONS_GROUP "Default Applications"
|
#define DEFAULT_APPLICATIONS_GROUP "Default Applications"
|
||||||
|
#define ADDED_ASSOCIATIONS_GROUP "Added Associations"
|
||||||
#define REMOVED_ASSOCIATIONS_GROUP "Removed Associations"
|
#define REMOVED_ASSOCIATIONS_GROUP "Removed Associations"
|
||||||
#define MIME_CACHE_GROUP "MIME Cache"
|
#define MIME_CACHE_GROUP "MIME Cache"
|
||||||
|
|
||||||
@ -1124,12 +1125,12 @@ ensure_dir (DirType type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
update_default_list (const char *desktop_id,
|
update_mimeapps_list (const char *desktop_id,
|
||||||
const char *content_type,
|
const char *content_type,
|
||||||
gboolean add_at_start,
|
gboolean add_at_start,
|
||||||
gboolean add_at_end,
|
gboolean add_at_end,
|
||||||
gboolean remove,
|
gboolean remove,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
char *dirname, *filename;
|
char *dirname, *filename;
|
||||||
GKeyFile *key_file;
|
GKeyFile *key_file;
|
||||||
@ -1147,12 +1148,12 @@ update_default_list (const char *desktop_id,
|
|||||||
if (!dirname)
|
if (!dirname)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
filename = g_build_filename (dirname, "defaults.list", NULL);
|
filename = g_build_filename (dirname, "mimeapps.list", NULL);
|
||||||
g_free (dirname);
|
g_free (dirname);
|
||||||
|
|
||||||
key_file = g_key_file_new ();
|
key_file = g_key_file_new ();
|
||||||
load_succeeded = g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL);
|
load_succeeded = g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL);
|
||||||
if (!load_succeeded || !g_key_file_has_group (key_file, DEFAULT_APPLICATIONS_GROUP))
|
if (!load_succeeded || !g_key_file_has_group (key_file, ADDED_ASSOCIATIONS_GROUP))
|
||||||
{
|
{
|
||||||
g_key_file_free (key_file);
|
g_key_file_free (key_file);
|
||||||
key_file = g_key_file_new ();
|
key_file = g_key_file_new ();
|
||||||
@ -1161,7 +1162,7 @@ update_default_list (const char *desktop_id,
|
|||||||
/* Add to the right place in the list */
|
/* Add to the right place in the list */
|
||||||
|
|
||||||
length = 0;
|
length = 0;
|
||||||
old_list = g_key_file_get_string_list (key_file, DEFAULT_APPLICATIONS_GROUP,
|
old_list = g_key_file_get_string_list (key_file, ADDED_ASSOCIATIONS_GROUP,
|
||||||
content_type, &length, NULL);
|
content_type, &length, NULL);
|
||||||
|
|
||||||
list = g_new (char *, 1 + length + 1);
|
list = g_new (char *, 1 + length + 1);
|
||||||
@ -1184,7 +1185,7 @@ update_default_list (const char *desktop_id,
|
|||||||
g_strfreev (old_list);
|
g_strfreev (old_list);
|
||||||
|
|
||||||
g_key_file_set_string_list (key_file,
|
g_key_file_set_string_list (key_file,
|
||||||
DEFAULT_APPLICATIONS_GROUP,
|
ADDED_ASSOCIATIONS_GROUP,
|
||||||
content_type,
|
content_type,
|
||||||
(const char * const *)list, i);
|
(const char * const *)list, i);
|
||||||
|
|
||||||
@ -1250,7 +1251,7 @@ g_desktop_app_info_set_as_default_for_type (GAppInfo *appinfo,
|
|||||||
if (!g_desktop_app_info_ensure_saved (info, error))
|
if (!g_desktop_app_info_ensure_saved (info, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return update_default_list (info->desktop_id, content_type, TRUE, FALSE, FALSE, error);
|
return update_mimeapps_list (info->desktop_id, content_type, TRUE, FALSE, FALSE, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1367,7 +1368,7 @@ g_desktop_app_info_add_supports_type (GAppInfo *appinfo,
|
|||||||
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
|
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return update_default_list (info->desktop_id, content_type, FALSE, TRUE, FALSE, error);
|
return update_mimeapps_list (info->desktop_id, content_type, FALSE, TRUE, FALSE, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -1386,7 +1387,7 @@ g_desktop_app_info_remove_supports_type (GAppInfo *appinfo,
|
|||||||
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
|
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return update_default_list (info->desktop_id, content_type, FALSE, FALSE, TRUE, error);
|
return update_mimeapps_list (info->desktop_id, content_type, FALSE, FALSE, TRUE, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -1836,9 +1837,11 @@ typedef struct {
|
|||||||
char *path;
|
char *path;
|
||||||
GHashTable *mime_info_cache_map;
|
GHashTable *mime_info_cache_map;
|
||||||
GHashTable *defaults_list_map;
|
GHashTable *defaults_list_map;
|
||||||
GHashTable *defaults_list_removed_map;
|
GHashTable *mimeapps_list_added_map;
|
||||||
|
GHashTable *mimeapps_list_removed_map;
|
||||||
time_t mime_info_cache_timestamp;
|
time_t mime_info_cache_timestamp;
|
||||||
time_t defaults_list_timestamp;
|
time_t defaults_list_timestamp;
|
||||||
|
time_t mimeapps_list_timestamp;
|
||||||
} MimeInfoCacheDir;
|
} MimeInfoCacheDir;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -2024,10 +2027,6 @@ mime_info_cache_dir_init_defaults_list (MimeInfoCacheDir *dir)
|
|||||||
dir->defaults_list_map = g_hash_table_new_full (g_str_hash, g_str_equal,
|
dir->defaults_list_map = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free, (GDestroyNotify)g_strfreev);
|
g_free, (GDestroyNotify)g_strfreev);
|
||||||
|
|
||||||
if (dir->defaults_list_removed_map != NULL)
|
|
||||||
g_hash_table_destroy (dir->defaults_list_removed_map);
|
|
||||||
dir->defaults_list_removed_map = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
||||||
g_free, (GDestroyNotify)g_strfreev);
|
|
||||||
|
|
||||||
key_file = g_key_file_new ();
|
key_file = g_key_file_new ();
|
||||||
|
|
||||||
@ -2070,6 +2069,90 @@ mime_info_cache_dir_init_defaults_list (MimeInfoCacheDir *dir)
|
|||||||
g_strfreev (mime_types);
|
g_strfreev (mime_types);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_key_file_free (key_file);
|
||||||
|
return;
|
||||||
|
|
||||||
|
error:
|
||||||
|
g_free (filename);
|
||||||
|
g_key_file_free (key_file);
|
||||||
|
|
||||||
|
if (mime_types != NULL)
|
||||||
|
g_strfreev (mime_types);
|
||||||
|
|
||||||
|
if (load_error)
|
||||||
|
g_error_free (load_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mime_info_cache_dir_init_mimeapps_list (MimeInfoCacheDir *dir)
|
||||||
|
{
|
||||||
|
GKeyFile *key_file;
|
||||||
|
GError *load_error;
|
||||||
|
gchar *filename, **mime_types;
|
||||||
|
char *unaliased_type;
|
||||||
|
char **desktop_file_ids;
|
||||||
|
int i;
|
||||||
|
struct stat buf;
|
||||||
|
|
||||||
|
load_error = NULL;
|
||||||
|
mime_types = NULL;
|
||||||
|
|
||||||
|
if (dir->mimeapps_list_added_map != NULL &&
|
||||||
|
!mime_info_cache_dir_out_of_date (dir, "mimeapps.list",
|
||||||
|
&dir->mimeapps_list_timestamp))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (dir->mimeapps_list_added_map != NULL)
|
||||||
|
g_hash_table_destroy (dir->mimeapps_list_added_map);
|
||||||
|
dir->mimeapps_list_added_map = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
|
g_free, (GDestroyNotify)g_strfreev);
|
||||||
|
|
||||||
|
if (dir->mimeapps_list_removed_map != NULL)
|
||||||
|
g_hash_table_destroy (dir->mimeapps_list_removed_map);
|
||||||
|
dir->mimeapps_list_removed_map = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
|
g_free, (GDestroyNotify)g_strfreev);
|
||||||
|
|
||||||
|
key_file = g_key_file_new ();
|
||||||
|
|
||||||
|
filename = g_build_filename (dir->path, "mimeapps.list", NULL);
|
||||||
|
if (g_stat (filename, &buf) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (dir->mimeapps_list_timestamp > 0)
|
||||||
|
mime_info_cache->should_ping_mime_monitor = TRUE;
|
||||||
|
|
||||||
|
dir->mimeapps_list_timestamp = buf.st_mtime;
|
||||||
|
|
||||||
|
g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &load_error);
|
||||||
|
g_free (filename);
|
||||||
|
filename = NULL;
|
||||||
|
|
||||||
|
if (load_error != NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
mime_types = g_key_file_get_keys (key_file, ADDED_ASSOCIATIONS_GROUP,
|
||||||
|
NULL, NULL);
|
||||||
|
if (mime_types != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; mime_types[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
desktop_file_ids = g_key_file_get_string_list (key_file,
|
||||||
|
ADDED_ASSOCIATIONS_GROUP,
|
||||||
|
mime_types[i],
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (desktop_file_ids == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
unaliased_type = _g_unix_content_type_unalias (mime_types[i]);
|
||||||
|
g_hash_table_replace (dir->mimeapps_list_added_map,
|
||||||
|
unaliased_type,
|
||||||
|
desktop_file_ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (mime_types);
|
||||||
|
}
|
||||||
|
|
||||||
mime_types = g_key_file_get_keys (key_file, REMOVED_ASSOCIATIONS_GROUP,
|
mime_types = g_key_file_get_keys (key_file, REMOVED_ASSOCIATIONS_GROUP,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
if (mime_types != NULL)
|
if (mime_types != NULL)
|
||||||
@ -2085,7 +2168,7 @@ mime_info_cache_dir_init_defaults_list (MimeInfoCacheDir *dir)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
unaliased_type = _g_unix_content_type_unalias (mime_types[i]);
|
unaliased_type = _g_unix_content_type_unalias (mime_types[i]);
|
||||||
g_hash_table_replace (dir->defaults_list_removed_map,
|
g_hash_table_replace (dir->mimeapps_list_removed_map,
|
||||||
unaliased_type,
|
unaliased_type,
|
||||||
desktop_file_ids);
|
desktop_file_ids);
|
||||||
}
|
}
|
||||||
@ -2137,10 +2220,16 @@ mime_info_cache_dir_free (MimeInfoCacheDir *dir)
|
|||||||
dir->defaults_list_map = NULL;
|
dir->defaults_list_map = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir->defaults_list_removed_map != NULL)
|
if (dir->mimeapps_list_added_map != NULL)
|
||||||
{
|
{
|
||||||
g_hash_table_destroy (dir->defaults_list_removed_map);
|
g_hash_table_destroy (dir->mimeapps_list_added_map);
|
||||||
dir->defaults_list_removed_map = NULL;
|
dir->mimeapps_list_added_map = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir->mimeapps_list_removed_map != NULL)
|
||||||
|
{
|
||||||
|
g_hash_table_destroy (dir->mimeapps_list_removed_map);
|
||||||
|
dir->mimeapps_list_removed_map = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (dir);
|
g_free (dir);
|
||||||
@ -2187,6 +2276,7 @@ mime_info_cache_init_dir_lists (void)
|
|||||||
{
|
{
|
||||||
mime_info_cache_dir_init (dir);
|
mime_info_cache_dir_init (dir);
|
||||||
mime_info_cache_dir_init_defaults_list (dir);
|
mime_info_cache_dir_init_defaults_list (dir);
|
||||||
|
mime_info_cache_dir_init_mimeapps_list (dir);
|
||||||
|
|
||||||
mime_info_cache->dirs = g_list_append (mime_info_cache->dirs, dir);
|
mime_info_cache->dirs = g_list_append (mime_info_cache->dirs, dir);
|
||||||
}
|
}
|
||||||
@ -2208,6 +2298,7 @@ mime_info_cache_update_dir_lists (void)
|
|||||||
mime_info_cache_blow_global_cache ();
|
mime_info_cache_blow_global_cache ();
|
||||||
mime_info_cache_dir_init (dir);
|
mime_info_cache_dir_init (dir);
|
||||||
mime_info_cache_dir_init_defaults_list (dir);
|
mime_info_cache_dir_init_defaults_list (dir);
|
||||||
|
mime_info_cache_dir_init_mimeapps_list (dir);
|
||||||
|
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
@ -2216,28 +2307,28 @@ mime_info_cache_update_dir_lists (void)
|
|||||||
static void
|
static void
|
||||||
mime_info_cache_init (void)
|
mime_info_cache_init (void)
|
||||||
{
|
{
|
||||||
G_LOCK (mime_info_cache);
|
G_LOCK (mime_info_cache);
|
||||||
if (mime_info_cache == NULL)
|
if (mime_info_cache == NULL)
|
||||||
mime_info_cache_init_dir_lists ();
|
mime_info_cache_init_dir_lists ();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
time (&now);
|
time (&now);
|
||||||
if (now >= mime_info_cache->last_stat_time + 10)
|
if (now >= mime_info_cache->last_stat_time + 10)
|
||||||
{
|
{
|
||||||
mime_info_cache_update_dir_lists ();
|
mime_info_cache_update_dir_lists ();
|
||||||
mime_info_cache->last_stat_time = now;
|
mime_info_cache->last_stat_time = now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mime_info_cache->should_ping_mime_monitor)
|
if (mime_info_cache->should_ping_mime_monitor)
|
||||||
{
|
{
|
||||||
/* g_idle_add (emit_mime_changed, NULL); */
|
/* g_idle_add (emit_mime_changed, NULL); */
|
||||||
mime_info_cache->should_ping_mime_monitor = FALSE;
|
mime_info_cache->should_ping_mime_monitor = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_UNLOCK (mime_info_cache);
|
G_UNLOCK (mime_info_cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MimeInfoCache *
|
static MimeInfoCache *
|
||||||
@ -2341,13 +2432,21 @@ get_all_desktop_entries_for_mime_type (const char *base_mime_type)
|
|||||||
dir_list = dir_list->next)
|
dir_list = dir_list->next)
|
||||||
{
|
{
|
||||||
dir = dir_list->data;
|
dir = dir_list->data;
|
||||||
default_entries = g_hash_table_lookup (dir->defaults_list_map, mime_type);
|
|
||||||
|
/* First added associations from mimeapps.list */
|
||||||
|
default_entries = g_hash_table_lookup (dir->mimeapps_list_added_map, mime_type);
|
||||||
for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
|
for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
|
||||||
desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);
|
desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);
|
||||||
|
|
||||||
removed_associations = g_hash_table_lookup (dir->defaults_list_removed_map, mime_type);
|
/* Then removed assiciations from mimeapps.list */
|
||||||
|
removed_associations = g_hash_table_lookup (dir->mimeapps_list_removed_map, mime_type);
|
||||||
for (j = 0; removed_associations != NULL && removed_associations[j] != NULL; j++)
|
for (j = 0; removed_associations != NULL && removed_associations[j] != NULL; j++)
|
||||||
removed_entries = append_desktop_entry (removed_entries, removed_associations[j], NULL);
|
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) */
|
||||||
|
default_entries = g_hash_table_lookup (dir->defaults_list_map, 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go through all entries that support the mimetype */
|
/* Go through all entries that support the mimetype */
|
||||||
|
Loading…
Reference in New Issue
Block a user