Mercurial > hg > forks > geeqie
changeset 1935:5fab16d12a54
recognize all registered extensions, even if they contain dots
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Sun, 02 Oct 2011 11:55:34 +0200 |
parents | 95a788b9dc1c |
children | ed6aa14b66c9 |
files | src/filedata.c src/filefilter.c src/filefilter.h |
diffstat | 3 files changed, 30 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/filedata.c Sun Oct 02 11:16:03 2011 +0200 +++ b/src/filedata.c Sun Oct 02 11:55:34 2011 +0200 @@ -294,7 +294,7 @@ return; } - fd->extension = extension_from_path(fd->path); + fd->extension = registered_extension_from_path(fd->path); if (fd->extension == NULL) { fd->extension = fd->name + strlen(fd->name);
--- a/src/filefilter.c Sun Oct 02 11:16:03 2011 +0200 +++ b/src/filefilter.c Sun Oct 02 11:55:34 2011 +0200 @@ -314,6 +314,20 @@ return list; } +static gint filter_sort_ext_len_cb(gconstpointer a, gconstpointer b) +{ + gchar *sa = (gchar *)a; + gchar *sb = (gchar *)b; + + gint len_a = strlen(sa); + gint len_b = strlen(sb); + + if (len_a > len_b) return -1; + if (len_a < len_b) return 1; + return 0; +} + + void filter_rebuild(void) { GList *work; @@ -374,10 +388,13 @@ } } + /* make sure registered_extension_from_path finds the longer match first */ + extension_list = g_list_sort(extension_list, filter_sort_ext_len_cb); sidecar_ext_parse(options->sidecar.ext); /* this must be updated after changed file extensions */ } -static gboolean filter_name_find(GList *filter, const gchar *name) +/* return the extension part of the name or NULL */ +static const gchar *filter_name_find(GList *filter, const gchar *name) { GList *work; guint ln; @@ -392,20 +409,23 @@ if (ln >= lf) { /* FIXME: utf8 */ - if (g_ascii_strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE; + if (g_ascii_strncasecmp(name + ln - lf, filter, lf) == 0) return name + ln - lf; } work = work->next; } - return FALSE; + return NULL; } - +const gchar *registered_extension_from_path(const gchar *name) +{ + return filter_name_find(extension_list, name); +} gboolean filter_name_exists(const gchar *name) { if (!extension_list || options->file_filter.disable) return TRUE; - return filter_name_find(extension_list, name); + return !!filter_name_find(extension_list, name); } gboolean filter_file_class(const gchar *name, FileFormatClass file_class) @@ -416,17 +436,17 @@ return FALSE; } - return filter_name_find(file_class_extension_list[file_class], name); + return !!filter_name_find(file_class_extension_list[file_class], name); } gboolean filter_name_is_writable(const gchar *name) { - return filter_name_find(file_writable_list, name); + return !!filter_name_find(file_writable_list, name); } gboolean filter_name_allow_sidecar(const gchar *name) { - return filter_name_find(file_sidecar_list, name); + return !!filter_name_find(file_sidecar_list, name); } void filter_write_list(GString *outstr, gint indent)
--- a/src/filefilter.h Sun Oct 02 11:16:03 2011 +0200 +++ b/src/filefilter.h Sun Oct 02 11:55:34 2011 +0200 @@ -37,6 +37,7 @@ void filter_rebuild(void); GList *filter_to_list(const gchar *extensions); +const gchar *registered_extension_from_path(const gchar *name); gboolean filter_name_exists(const gchar *name); gboolean filter_file_class(const gchar *name, FileFormatClass file_class); gboolean filter_name_is_writable(const gchar *name);