summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaël Bonithon <gael@xfce.org>2021-12-28 19:28:10 +0100
committerGaël Bonithon <gael@xfce.org>2021-12-29 13:09:43 +0100
commit270289b3a3f2f9ac7891f26135bae6d5e574c868 (patch)
tree71122e3d253cbfdaa9279ef7165d1bf796190727
parentcd30208a015032a17df7e5038be357ef5acc1de2 (diff)
downloadtumbler-270289b3a3f2f9ac7891f26135bae6d5e574c868.tar.gz
desktop-thumbnailer: Allow for thumbnailer override
By the usual rule: for a given thumbnailer name, the one placed in the highest priority directory overrides the others of the same name. Closes #53.
-rw-r--r--plugins/desktop-thumbnailer/desktop-thumbnailer-provider.c25
-rw-r--r--plugins/desktop-thumbnailer/desktop-thumbnailer.c2
2 files changed, 18 insertions, 9 deletions
diff --git a/plugins/desktop-thumbnailer/desktop-thumbnailer-provider.c b/plugins/desktop-thumbnailer/desktop-thumbnailer-provider.c
index a7d7bea..69297a0 100644
--- a/plugins/desktop-thumbnailer/desktop-thumbnailer-provider.c
+++ b/plugins/desktop-thumbnailer/desktop-thumbnailer-provider.c
@@ -167,11 +167,13 @@ desktop_thumbnailer_get_from_desktop_file (GFile *file,
static GList *
desktop_thumbnailer_get_thumbnailers_from_dir (GList *thumbnailers,
- GFile *directory,
- GStrv uri_schemes)
+ GFile *directory,
+ GStrv uri_schemes,
+ GHashTable **single_name)
{
const gchar *base_name;
- GDir *dir;
+ gchar *name;
+ GDir *dir;
/* try to open the directory for reading */
dir = g_dir_open (g_file_peek_path (directory), 0, NULL);
@@ -187,8 +189,9 @@ desktop_thumbnailer_get_thumbnailers_from_dir (GList *thumbnailers,
GFile *file;
DesktopThumbnailer *thumbnailer = NULL;
- /* skip files that don't end with the .thumbnailer extension */
- if (!g_str_has_suffix (base_name, ".thumbnailer"))
+ /* skip files that don't end with the .thumbnailer extension or already added */
+ if (! g_str_has_suffix (base_name, ".thumbnailer")
+ || g_hash_table_lookup (*single_name, base_name))
continue;
file = g_file_get_child (directory, base_name);
@@ -203,6 +206,8 @@ desktop_thumbnailer_get_thumbnailers_from_dir (GList *thumbnailers,
if (thumbnailer)
{
thumbnailers = g_list_prepend (thumbnailers, thumbnailer);
+ name = g_strdup (base_name);
+ g_hash_table_insert (*single_name, name, name);
}
}
@@ -214,6 +219,7 @@ desktop_thumbnailer_get_thumbnailers_from_dir (GList *thumbnailers,
static GList *
desktop_thumbnailer_provider_get_thumbnailers (TumblerThumbnailerProvider *provider)
{
+ GHashTable *single_name;
GList *directories, *iter, *thumbnailers = NULL;
GStrv uri_schemes;
@@ -223,15 +229,18 @@ desktop_thumbnailer_provider_get_thumbnailers (TumblerThumbnailerProvider *provi
tumbler_util_dump_strv (G_LOG_DOMAIN, "Supported URI schemes",
(const gchar *const *) uri_schemes);
+ /* use a ghash table to avoid duplication and allow for thumbnailer override */
+ single_name = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
/* thumbnailers end up in reverse order here, since they are prepended, but the list must
* not be reversed: this will happen during sorted insertion in tumbler_registry_add() */
for (iter = directories; iter != NULL; iter = iter->next)
- {
- thumbnailers = desktop_thumbnailer_get_thumbnailers_from_dir (thumbnailers, iter->data, uri_schemes);
- }
+ thumbnailers = desktop_thumbnailer_get_thumbnailers_from_dir (thumbnailers, iter->data,
+ uri_schemes, &single_name);
g_strfreev (uri_schemes);
g_list_free_full (directories, g_object_unref);
+ g_hash_table_destroy (single_name);
return thumbnailers;
}
diff --git a/plugins/desktop-thumbnailer/desktop-thumbnailer.c b/plugins/desktop-thumbnailer/desktop-thumbnailer.c
index 05c4433..4e53459 100644
--- a/plugins/desktop-thumbnailer/desktop-thumbnailer.c
+++ b/plugins/desktop-thumbnailer/desktop-thumbnailer.c
@@ -368,7 +368,7 @@ desktop_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
uri = tumbler_file_info_get_uri (info);
file = g_file_new_for_uri (uri);
- g_debug ("Handling URI '%s'", uri);
+ g_debug ("'Exec=%s': Handling URI '%s'", DESKTOP_THUMBNAILER (thumbnailer)->exec, uri);
thumbnail = tumbler_file_info_get_thumbnail (info);
g_assert (thumbnail != NULL);