From 0082fb2a99b306a7d7b995cd6ca3d087c3bca7cd Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Thu, 16 May 2019 15:55:36 +0100 Subject: [PATCH 1/2] Kill filetypes_find(), rename static function It's not worth abstracting finding through filetypes_array, it's not bug prone, and it may even cause bugs with non-type-safe predicate signature. It was only used once anyway. --- src/filetypes.c | 33 +++++++++++---------------------- src/filetypes.h | 3 --- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/filetypes.c b/src/filetypes.c index b8420cba6f..305f0b9c5d 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -463,26 +463,8 @@ void filetypes_init(void) } -/* Find a filetype that predicate returns TRUE for, otherwise return NULL. */ -GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data) +static gboolean match_basename(const GeanyFiletype *ft, const gchar *base_filename) { - guint i; - - for (i = 0; i < filetypes_array->len; i++) - { - GeanyFiletype *ft = filetypes[i]; - - if (predicate(ft, user_data)) - return ft; - } - return NULL; -} - - -static gboolean match_basename(gconstpointer pft, gconstpointer user_data) -{ - const GeanyFiletype *ft = pft; - const gchar *base_filename = user_data; gint j; gboolean ret = FALSE; @@ -505,7 +487,7 @@ static gboolean match_basename(gconstpointer pft, gconstpointer user_data) } -static GeanyFiletype *check_builtin_filenames(const gchar *utf8_filename) +static GeanyFiletype *detect_filetype_conf_file(const gchar *utf8_filename) { gchar *lfn = NULL; gchar *path; @@ -540,7 +522,7 @@ GeanyFiletype *filetypes_detect_from_extension(const gchar *utf8_filename) gchar *base_filename; GeanyFiletype *ft; - ft = check_builtin_filenames(utf8_filename); + ft = detect_filetype_conf_file(utf8_filename); if (ft) return ft; @@ -551,7 +533,14 @@ GeanyFiletype *filetypes_detect_from_extension(const gchar *utf8_filename) SETPTR(base_filename, g_utf8_strdown(base_filename, -1)); #endif - ft = filetypes_find(match_basename, base_filename); + for (guint i = 0; i < filetypes_array->len; i++) + { + if (match_basename(filetypes[i], base_filename)) + { + ft = filetypes[i]; + break; + } + } if (ft == NULL) ft = filetypes[GEANY_FILETYPES_NONE]; diff --git a/src/filetypes.h b/src/filetypes.h index 6d3455658f..debd618dad 100644 --- a/src/filetypes.h +++ b/src/filetypes.h @@ -196,9 +196,6 @@ extern GPtrArray *filetypes_array; extern GSList *filetypes_by_title; -GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data); - - void filetypes_init(void); void filetypes_init_types(void); From 41122c07bca2a45cd3750311398d42da404c85fa Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Thu, 16 May 2019 16:01:53 +0100 Subject: [PATCH 2/2] Always allow user filetype extensions to override system config file Before the user would sometimes have to override 'UnwantedFiletype=' in the user config file to remove an extension written in the system file. Geany would ignore an overridden filetype in the user config file that also matches the extension. This happened when the wanted filetype had a higher index than the unwanted one in filetypes_array. --- src/filetypes.c | 17 ++++++++++++++++- src/filetypesprivate.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/filetypes.c b/src/filetypes.c index 305f0b9c5d..dfcdc2b643 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -521,6 +521,7 @@ GeanyFiletype *filetypes_detect_from_extension(const gchar *utf8_filename) { gchar *base_filename; GeanyFiletype *ft; + guint i; ft = detect_filetype_conf_file(utf8_filename); if (ft) @@ -533,7 +534,7 @@ GeanyFiletype *filetypes_detect_from_extension(const gchar *utf8_filename) SETPTR(base_filename, g_utf8_strdown(base_filename, -1)); #endif - for (guint i = 0; i < filetypes_array->len; i++) + for (i = 0; i < filetypes_array->len; i++) { if (match_basename(filetypes[i], base_filename)) { @@ -541,6 +542,19 @@ GeanyFiletype *filetypes_detect_from_extension(const gchar *utf8_filename) break; } } + // check if user config overrides found ft + if (ft && !ft->priv->user_extensions) + { + for (i++; i < filetypes_array->len; i++) + { + if (filetypes[i]->priv->user_extensions && + match_basename(filetypes[i], base_filename)) + { + ft = filetypes[i]; + break; + } + } + } if (ft == NULL) ft = filetypes[GEANY_FILETYPES_NONE]; @@ -1386,6 +1400,7 @@ static void read_extensions(GKeyFile *sysconfig, GKeyFile *userconfig) gchar **list = g_key_file_get_string_list( (userset) ? userconfig : sysconfig, "Extensions", filetypes[i]->name, &len, NULL); + filetypes[i]->priv->user_extensions = userset; g_strfreev(filetypes[i]->pattern); /* Note: we allow 'Foo=' to remove all patterns */ if (!list) diff --git a/src/filetypesprivate.h b/src/filetypesprivate.h index 0243427d31..107a6392ce 100644 --- a/src/filetypesprivate.h +++ b/src/filetypesprivate.h @@ -40,6 +40,7 @@ typedef struct GeanyFiletypePrivate gboolean xml_indent_tags; /* XML tag autoindentation, for HTML and XML filetypes */ GSList *tag_files; gboolean warn_color_scheme; + gboolean user_extensions; // true if extensions were read from user config file /* TODO: move to structure in build.h and only put a pointer here */ GeanyBuildCommand *filecmds;