Convert group_keys to std::array
[geeqie.git] / src / metadata.cc
index 94b0fe2..2c4f2a3 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include <locale.h>
-
-#include "main.h"
 #include "metadata.h"
 
+#include <unistd.h>
+
+#include <algorithm>
+#include <array>
+#include <clocale>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <glib-object.h>
+
+#include <config.h>
+
 #include "cache.h"
+#include "debug.h"
 #include "exif.h"
 #include "filedata.h"
+#include "intl.h"
+#include "layout-util.h"
+#include "main-defines.h"
 #include "misc.h"
+#include "options.h"
+#include "rcfile.h"
 #include "secure-save.h"
 #include "ui-fileops.h"
 #include "utilops.h"
-#include "layout-util.h"
-#include "rcfile.h"
 
-typedef enum {
+struct ExifData;
+
+namespace
+{
+
+enum MetadataKey {
        MK_NONE,
        MK_KEYWORDS,
        MK_COMMENT
-} MetadataKey;
+};
 
 /* If contents change, keep GuideOptionsMetadata.xml up to date */
 /**
  *  @brief Tags that will be written to all files in a group - selected by: options->metadata.sync_grouped_files, Preferences/Metadata/Write The Same Description Tags To All Grouped Sidecars
  */
-static const gchar *group_keys[] = {
+constexpr std::array<const gchar *, 21> group_keys{
        "Xmp.dc.title",
        "Xmp.photoshop.Urgency",
        "Xmp.photoshop.Category",
@@ -66,7 +85,18 @@ static const gchar *group_keys[] = {
        "Xmp.dc.rights",
        "Xmp.dc.description",
        "Xmp.photoshop.CaptionWriter",
-       NULL};
+};
+
+inline gboolean is_keywords_separator(gchar c)
+{
+       return c == ','
+           || c == ';'
+           || c == '\n'
+           || c == '\r'
+           || c == '\b';
+}
+
+} // namespace
 
 static gboolean metadata_write_queue_idle_cb(gpointer data);
 static gboolean metadata_legacy_write(FileData *fd);
@@ -98,9 +128,9 @@ static void metadata_cache_update(FileData *fd, const gchar *key, const GList *v
                        {
                        /* key found - just replace values */
                        GList *old_values = entry->next;
-                       entry->next = NULL;
-                       old_values->prev = NULL;
-                       string_list_free(old_values);
+                       entry->next = nullptr;
+                       old_values->prev = nullptr;
+                       g_list_free_full(old_values, g_free);
                        work->data = g_list_append(entry, string_list_copy(values));
                        DEBUG_1("updated %s %s\n", key, fd->path);
                        return;
@@ -133,7 +163,7 @@ static const GList *metadata_cache_get(FileData *fd, const gchar *key)
                        }
                work = work->next;
                }
-       return NULL;
+       return nullptr;
        DEBUG_1("not found %s %s\n", key, fd->path);
 }
 
@@ -150,7 +180,7 @@ static void metadata_cache_remove(FileData *fd, const gchar *key)
                if (strcmp(entry_key, key) == 0)
                        {
                        /* key found */
-                       string_list_free(entry);
+                       g_list_free_full(entry, g_free);
                        fd->cached_metadata = g_list_delete_link(fd->cached_metadata, work);
                        DEBUG_1("removed %s %s\n", key, fd->path);
                        return;
@@ -162,19 +192,14 @@ static void metadata_cache_remove(FileData *fd, const gchar *key)
 
 void metadata_cache_free(FileData *fd)
 {
-       GList *work;
        if (fd->cached_metadata) DEBUG_1("freed %s\n", fd->path);
 
-       work = fd->cached_metadata;
-       while (work)
+       g_list_free_full(fd->cached_metadata, [](gpointer data)
                {
-               auto entry = static_cast<GList *>(work->data);
-               string_list_free(entry);
-
-               work = work->next;
-               }
-       g_list_free(fd->cached_metadata);
-       fd->cached_metadata = NULL;
+               auto entry = static_cast<GList *>(data);
+               g_list_free_full(entry, g_free);
+               });
+       fd->cached_metadata = nullptr;
 }
 
 
@@ -188,7 +213,7 @@ void metadata_cache_free(FileData *fd)
  *-------------------------------------------------------------------
  */
 
-static GList *metadata_write_queue = NULL;
+static GList *metadata_write_queue = nullptr;
 static guint metadata_write_idle_id = 0; /* event source id */
 
 static void metadata_write_queue_add(FileData *fd)
@@ -209,7 +234,7 @@ static void metadata_write_queue_add(FileData *fd)
 
        if (options->metadata.confirm_after_timeout)
                {
-               metadata_write_idle_id = g_timeout_add(options->metadata.confirm_timeout * 1000, metadata_write_queue_idle_cb, NULL);
+               metadata_write_idle_id = g_timeout_add(options->metadata.confirm_timeout * 1000, metadata_write_queue_idle_cb, nullptr);
                }
 }
 
@@ -217,7 +242,7 @@ static void metadata_write_queue_add(FileData *fd)
 gboolean metadata_write_queue_remove(FileData *fd)
 {
        g_hash_table_destroy(fd->modified_xmp);
-       fd->modified_xmp = NULL;
+       fd->modified_xmp = nullptr;
 
        metadata_write_queue = g_list_remove(metadata_write_queue, fd);
 
@@ -230,22 +255,25 @@ gboolean metadata_write_queue_remove(FileData *fd)
        return TRUE;
 }
 
-//gboolean metadata_write_queue_remove_list(GList *list)
-//{
-       //GList *work;
-       //gboolean ret = TRUE;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+gboolean metadata_write_queue_remove_list_unused(GList *list)
+{
+       GList *work;
+       gboolean ret = TRUE;
 
-       //work = list;
-       //while (work)
-               //{
-               //FileData *fd = static_cast<//FileData *>(work->data);
-               //work = work->next;
-               //ret = ret && metadata_write_queue_remove(fd);
-               //}
-       //return ret;
-//}
+       work = list;
+       while (work)
+               {
+               auto *fd = static_cast<FileData *>(work->data);
+               work = work->next;
+               ret = ret && metadata_write_queue_remove(fd);
+               }
+       return ret;
+}
+#pragma GCC diagnostic pop
 
-void metadata_notify_cb(FileData *fd, NotifyType type, gpointer UNUSED(data))
+void metadata_notify_cb(FileData *fd, NotifyType type, gpointer)
 {
        if (type & (NOTIFY_REREAD | NOTIFY_CHANGE))
                {
@@ -266,7 +294,7 @@ void metadata_notify_cb(FileData *fd, NotifyType type, gpointer UNUSED(data))
 gboolean metadata_write_queue_confirm(gboolean force_dialog, FileUtilDoneFunc done_func, gpointer done_data)
 {
        GList *work;
-       GList *to_approve = NULL;
+       GList *to_approve = nullptr;
 
        work = metadata_write_queue;
        while (work)
@@ -286,14 +314,14 @@ gboolean metadata_write_queue_confirm(gboolean force_dialog, FileUtilDoneFunc do
                to_approve = g_list_prepend(to_approve, file_data_ref(fd));
                }
 
-       file_util_write_metadata(NULL, to_approve, NULL, force_dialog, done_func, done_data);
+       file_util_write_metadata(nullptr, to_approve, nullptr, force_dialog, done_func, done_data);
 
-       return (metadata_write_queue != NULL);
+       return (metadata_write_queue != nullptr);
 }
 
-static gboolean metadata_write_queue_idle_cb(gpointer UNUSED(data))
+static gboolean metadata_write_queue_idle_cb(gpointer)
 {
-       metadata_write_queue_confirm(FALSE, NULL, NULL);
+       metadata_write_queue_confirm(FALSE, nullptr, nullptr);
        metadata_write_idle_id = 0;
        return FALSE;
 }
@@ -340,23 +368,11 @@ gboolean metadata_write_perform(FileData *fd)
        return success;
 }
 
-gint metadata_queue_length(void)
+gint metadata_queue_length()
 {
        return g_list_length(metadata_write_queue);
 }
 
-static gboolean metadata_check_key(const gchar *keys[], const gchar *key)
-{
-       const gchar **k = keys;
-
-       while (*k)
-               {
-               if (strcmp(key, *k) == 0) return TRUE;
-               k++;
-               }
-       return FALSE;
-}
-
 gboolean metadata_write_revert(FileData *fd, const gchar *key)
 {
        if (!fd->modified_xmp) return FALSE;
@@ -394,7 +410,8 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values
        file_data_increment_version(fd);
        file_data_send_notification(fd, NOTIFY_METADATA);
 
-       if (options->metadata.sync_grouped_files && metadata_check_key(group_keys, key))
+       auto metadata_check_key = [key](const gchar *k) { return strcmp(key, k) == 0; };
+       if (options->metadata.sync_grouped_files && std::any_of(group_keys.cbegin(), group_keys.cend(), metadata_check_key))
                {
                GList *work = fd->sidecar_files;
 
@@ -415,9 +432,9 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values
 
 gboolean metadata_write_string(FileData *fd, const gchar *key, const char *value)
 {
-       GList *list = g_list_append(NULL, g_strdup(value));
+       GList *list = g_list_append(nullptr, g_strdup(value));
        gboolean ret = metadata_write_list(fd, key, list);
-       string_list_free(list);
+       g_list_free_full(list, g_free);
        return ret;
 }
 
@@ -471,8 +488,8 @@ static gboolean metadata_legacy_write(FileData *fd)
        gboolean have_keywords;
        gboolean have_comment;
        const gchar *comment;
-       GList *orig_keywords = NULL;
-       gchar *orig_comment = NULL;
+       GList *orig_keywords = nullptr;
+       gchar *orig_comment = nullptr;
 
        g_assert(fd->change && fd->change->dest);
 
@@ -482,9 +499,9 @@ static gboolean metadata_legacy_write(FileData *fd)
 
        metadata_pathl = path_from_utf8(fd->change->dest);
 
-       have_keywords = g_hash_table_lookup_extended(fd->modified_xmp, KEYWORD_KEY, NULL, &keywords);
-       have_comment = g_hash_table_lookup_extended(fd->modified_xmp, COMMENT_KEY, NULL, &comment_l);
-       comment = static_cast<const gchar *>((have_comment && comment_l) ? (static_cast<GList *>(comment_l))->data : NULL);
+       have_keywords = g_hash_table_lookup_extended(fd->modified_xmp, KEYWORD_KEY, nullptr, &keywords);
+       have_comment = g_hash_table_lookup_extended(fd->modified_xmp, COMMENT_KEY, nullptr, &comment_l);
+       comment = static_cast<const gchar *>((have_comment && comment_l) ? (static_cast<GList *>(comment_l))->data : nullptr);
 
        if (!have_keywords || !have_comment) metadata_file_read(metadata_pathl, &orig_keywords, &orig_comment);
 
@@ -494,7 +511,7 @@ static gboolean metadata_legacy_write(FileData *fd)
 
        g_free(metadata_pathl);
        g_free(orig_comment);
-       string_list_free(orig_keywords);
+       g_list_free_full(orig_keywords, g_free);
 
        return success;
 }
@@ -504,8 +521,8 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen
        FILE *f;
        gchar s_buf[1024];
        MetadataKey key = MK_NONE;
-       GList *list = NULL;
-       GString *comment_build = NULL;
+       GList *list = nullptr;
+       GString *comment_build = nullptr;
 
        f = fopen(path, "r");
        if (!f) return FALSE;
@@ -564,7 +581,7 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen
                }
        else
                {
-               string_list_free(list);
+               g_list_free_full(list, g_free);
                }
 
        if (comment_build)
@@ -608,7 +625,7 @@ static void metadata_legacy_delete(FileData *fd, const gchar *except)
                g_free(metadata_path);
                }
 
-#ifdef HAVE_EXIV2
+#if HAVE_EXIV2
        /* without exiv2: do not delete xmp metadata because we are not able to convert it,
           just ignore it */
        metadata_path = cache_find_location(CACHE_TYPE_XMP_METADATA, fd->path);
@@ -647,15 +664,15 @@ static GList *remove_duplicate_strings_from_list(GList *list)
 {
        GList *work = list;
        GHashTable *hashtable = g_hash_table_new(g_str_hash, g_str_equal);
-       GList *newlist = NULL;
+       GList *newlist = nullptr;
 
        while (work)
                {
                auto key = static_cast<gchar *>(work->data);
 
-               if (g_hash_table_lookup(hashtable, key) == NULL)
+               if (g_hash_table_lookup(hashtable, key) == nullptr)
                        {
-                       g_hash_table_insert(hashtable, (gpointer) key, GINT_TO_POINTER(1));
+                       g_hash_table_insert(hashtable, key, GINT_TO_POINTER(1));
                        newlist = g_list_prepend(newlist, key);
                        }
                work = work->next;
@@ -670,9 +687,9 @@ static GList *remove_duplicate_strings_from_list(GList *list)
 GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format)
 {
        ExifData *exif;
-       GList *list = NULL;
+       GList *list = nullptr;
        const GList *cache_entry;
-       if (!fd) return NULL;
+       if (!fd) return nullptr;
 
        /* unwritten data override everything */
        if (fd->modified_xmp && format == METADATA_PLAIN)
@@ -697,7 +714,7 @@ GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format)
        */
        if (strcmp(key, KEYWORD_KEY) == 0)
                {
-               if (metadata_legacy_read(fd, &list, NULL))
+               if (metadata_legacy_read(fd, &list, nullptr))
                        {
                        if (format == METADATA_PLAIN)
                                {
@@ -708,22 +725,22 @@ GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format)
                }
        else if (strcmp(key, COMMENT_KEY) == 0)
                {
-               gchar *comment = NULL;
-               if (metadata_legacy_read(fd, NULL, &comment)) return g_list_append(NULL, comment);
+               gchar *comment = nullptr;
+               if (metadata_legacy_read(fd, nullptr, &comment)) return g_list_append(nullptr, comment);
                }
        else if (strncmp(key, "file.", 5) == 0)
                {
-               return g_list_append(NULL, metadata_file_info(fd, key, format));
+               return g_list_append(nullptr, metadata_file_info(fd, key, format));
                }
-#ifdef HAVE_LUA
+#if HAVE_LUA
        else if (strncmp(key, "lua.", 4) == 0)
                {
-               return g_list_append(NULL, metadata_lua_info(fd, key, format));
+               return g_list_append(nullptr, metadata_lua_info(fd, key, format));
                }
 #endif
 
        exif = exif_read_fd(fd); /* this is cached, thus inexpensive */
-       if (!exif) return NULL;
+       if (!exif) return nullptr;
        list = exif_get_metadata(exif, key, format);
        exif_free_fd(fd, exif);
 
@@ -741,11 +758,11 @@ gchar *metadata_read_string(FileData *fd, const gchar *key, MetadataFormat forma
        if (string_list)
                {
                auto str = static_cast<gchar *>(string_list->data);
-               string_list->data = NULL;
-               string_list_free(string_list);
+               string_list->data = nullptr;
+               g_list_free_full(string_list, g_free);
                return str;
                }
-       return NULL;
+       return nullptr;
 }
 
 guint64 metadata_read_int(FileData *fd, const gchar *key, guint64 fallback)
@@ -775,7 +792,9 @@ gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback
 {
        gdouble coord;
        gchar *endptr;
-       gdouble deg, min, sec;
+       gdouble deg;
+       gdouble min;
+       gdouble sec;
        gboolean ok = FALSE;
        gchar *string = metadata_read_string(fd, key, METADATA_PLAIN);
        if (!string) return fallback;
@@ -847,14 +866,12 @@ gboolean metadata_append_string(FileData *fd, const gchar *key, const char *valu
                {
                return metadata_write_string(fd, key, value);
                }
-       else
-               {
-               gchar *new_string = g_strconcat(str, value, NULL);
-               gboolean ret = metadata_write_string(fd, key, new_string);
-               g_free(str);
-               g_free(new_string);
-               return ret;
-               }
+
+       gchar *new_string = g_strconcat(str, value, NULL);
+       gboolean ret = metadata_write_string(fd, key, new_string);
+       g_free(str);
+       g_free(new_string);
+       return ret;
 }
 
 gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value)
@@ -865,7 +882,8 @@ gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value)
        char *coordinate;
        const char *ref;
        gboolean ok = TRUE;
-       char *old_locale, *saved_locale;
+       char *old_locale;
+       char *saved_locale;
 
        param = value;
        if (param < 0)
@@ -891,9 +909,9 @@ gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value)
        if (ok)
                {
                /* Avoid locale problems with commas and decimal points in numbers */
-               old_locale = setlocale(LC_ALL, NULL);
+               old_locale = setlocale(LC_ALL, nullptr);
                saved_locale = strdup(old_locale);
-               if (saved_locale == NULL)
+               if (saved_locale == nullptr)
                        {
                        return FALSE;
                        }
@@ -918,16 +936,14 @@ gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *value
                {
                return metadata_write_list(fd, key, values);
                }
-       else
-               {
-               gboolean ret;
-               list = g_list_concat(list, string_list_copy(values));
-               list = remove_duplicate_strings_from_list(list);
 
-               ret = metadata_write_list(fd, key, list);
-               string_list_free(list);
-               return ret;
-               }
+       gboolean ret;
+       list = g_list_concat(list, string_list_copy(values));
+       list = remove_duplicate_strings_from_list(list);
+
+       ret = metadata_write_list(fd, key, list);
+       g_list_free_full(list, g_free);
+       return ret;
 }
 
 /**
@@ -960,7 +976,7 @@ gchar *find_string_in_list_utf8nocase(GList *list, const gchar *string)
                }
 
        g_free(string_casefold);
-       return NULL;
+       return nullptr;
 }
 
 /**
@@ -978,7 +994,7 @@ gchar *find_string_in_list_utf8case(GList *list, const gchar *string)
                list = list->next;
                } // while (list)
 
-       return NULL;
+       return nullptr;
 } // gchar *find_string_in_list_utf...
 
 /**
@@ -999,15 +1015,13 @@ gchar *find_string_in_list(GList *list, const gchar *string)
 {
        if (options->metadata.keywords_case_sensitive)
                return find_string_in_list_utf8case(list, string);
-       else
-               return find_string_in_list_utf8nocase(list, string);
-}
 
-#define KEYWORDS_SEPARATOR(c) ((c) == ',' || (c) == ';' || (c) == '\n' || (c) == '\r' || (c) == '\b')
+       return find_string_in_list_utf8nocase(list, string);
+}
 
 GList *string_to_keywords_list(const gchar *text)
 {
-       GList *list = NULL;
+       GList *list = nullptr;
        const gchar *ptr = text;
 
        while (*ptr != '\0')
@@ -1015,9 +1029,9 @@ GList *string_to_keywords_list(const gchar *text)
                const gchar *begin;
                gint l = 0;
 
-               while (KEYWORDS_SEPARATOR(*ptr)) ptr++;
+               while (is_keywords_separator(*ptr)) ptr++;
                begin = ptr;
-               while (*ptr != '\0' && !KEYWORDS_SEPARATOR(*ptr))
+               while (*ptr != '\0' && !is_keywords_separator(*ptr))
                        {
                        ptr++;
                        l++;
@@ -1047,7 +1061,7 @@ GList *string_to_keywords_list(const gchar *text)
  */
 
 
-gboolean meta_data_get_keyword_mark(FileData *fd, gint UNUSED(n), gpointer data)
+gboolean meta_data_get_keyword_mark(FileData *fd, gint, gpointer data)
 {
        /** @FIXME do not use global keyword_tree */
        auto path = static_cast<GList *>(data);
@@ -1065,10 +1079,10 @@ gboolean meta_data_get_keyword_mark(FileData *fd, gint UNUSED(n), gpointer data)
        return found;
 }
 
-gboolean meta_data_set_keyword_mark(FileData *fd, gint UNUSED(n), gboolean value, gpointer data)
+gboolean meta_data_set_keyword_mark(FileData *fd, gint, gboolean value, gpointer data)
 {
        auto path = static_cast<GList *>(data);
-       GList *keywords = NULL;
+       GList *keywords = nullptr;
        GtkTreeIter iter;
 
        if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) return FALSE;
@@ -1088,7 +1102,7 @@ gboolean meta_data_set_keyword_mark(FileData *fd, gint UNUSED(n), gboolean value
                metadata_write_list(fd, KEYWORD_KEY, keywords);
                }
 
-       string_list_free(keywords);
+       g_list_free_full(keywords, g_free);
        return TRUE;
 }
 
@@ -1115,7 +1129,7 @@ void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter
                            (i == mark || /* release any previous connection of given mark */
                             keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */
                                {
-                               file_data_register_mark_func(i, NULL, NULL, NULL, NULL);
+                               file_data_register_mark_func(i, nullptr, nullptr, nullptr, nullptr);
                                gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), &old_kw_iter, KEYWORD_COLUMN_MARK, "", -1);
                                }
                        }
@@ -1207,10 +1221,8 @@ gboolean keyword_same_parent(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTree
                {
                return keyword_compare(keyword_tree, &parent_a, &parent_b) == 0;
                }
-       else
-               {
-               return (!valid_pa && !valid_pb); /* both are toplevel */
-               }
+
+       return (!valid_pa && !valid_pb); /* both are toplevel */
 }
 
 gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, GtkTreeIter *sibling, const gchar *name, gboolean exclude_sibling, GtkTreeIter *result)
@@ -1234,14 +1246,14 @@ gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, Gtk
                toplevel = TRUE;
                }
 
-       if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &iter, toplevel ? NULL : &parent)) return FALSE;
+       if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &iter, toplevel ? nullptr : &parent)) return FALSE;
 
        casefold = g_utf8_casefold(name, -1);
        ret = FALSE;
 
        while (TRUE)
                {
-               if (!(exclude_sibling && sibling && keyword_compare(keyword_tree, &iter, sibling) == 0))
+               if (!exclude_sibling || !sibling || keyword_compare(keyword_tree, &iter, sibling) != 0)
                        {
                        if (options->metadata.keywords_case_sensitive)
                                {
@@ -1271,7 +1283,9 @@ gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, Gtk
 void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
 {
 
-       gchar *mark, *name, *casefold;
+       gchar *mark;
+       gchar *name;
+       gchar *casefold;
        gboolean is_keyword;
 
        /* do not copy KEYWORD_COLUMN_HIDE_IN, it fully shows the new subtree */
@@ -1314,7 +1328,7 @@ void keyword_move_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTree
 
 GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
 {
-       GList *path = NULL;
+       GList *path = nullptr;
        GtkTreeIter iter = *iter_ptr;
 
        while (TRUE)
@@ -1453,7 +1467,7 @@ static gboolean keyword_tree_is_set_casefull(GtkTreeModel *keyword_tree, GtkTree
 gboolean keyword_tree_is_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GList *kw_list)
 {
        gboolean ret;
-       GList *casefold_list = NULL;
+       GList *casefold_list = nullptr;
        GList *work;
 
        if (options->metadata.keywords_case_sensitive)
@@ -1473,7 +1487,7 @@ gboolean keyword_tree_is_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GLis
 
                ret = keyword_tree_is_set_casefold(keyword_tree, *iter, casefold_list);
 
-               string_list_free(casefold_list);
+               g_list_free_full(casefold_list, g_free);
                }
 
        return ret;
@@ -1507,7 +1521,7 @@ void keyword_tree_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList *
 GList *keyword_tree_get(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
 {
        GtkTreeIter iter = *iter_ptr;
-       GList *kw_list = NULL;
+       GList *kw_list = nullptr;
 
        while (TRUE)
                {
@@ -1631,7 +1645,7 @@ gboolean keyword_is_hidden_in(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpo
        return !!g_list_find(list, id);
 }
 
-static gboolean keyword_show_all_in_cb(GtkTreeModel *model, GtkTreePath *UNUSED(path), GtkTreeIter *iter, gpointer data)
+static gboolean keyword_show_all_in_cb(GtkTreeModel *model, GtkTreePath *, GtkTreeIter *iter, gpointer data)
 {
        keyword_show_in(GTK_TREE_STORE(model), iter, data);
        return FALSE;
@@ -1642,7 +1656,7 @@ void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id)
        gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_show_all_in_cb, id);
 }
 
-static gboolean keyword_revert_hidden_in_cb(GtkTreeModel *model, GtkTreePath *UNUSED(path), GtkTreeIter *iter, gpointer data)
+static gboolean keyword_revert_hidden_in_cb(GtkTreeModel *model, GtkTreePath *, GtkTreeIter *iter, gpointer data)
 {
        if (keyword_is_hidden_in(GTK_TREE_MODEL(keyword_tree), iter, data))
                {
@@ -1685,7 +1699,7 @@ void keyword_hide_unset_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywo
        keyword_hide_unset_in_recursive(keyword_tree, &iter, id, keywords);
 }
 
-static gboolean keyword_show_set_in_cb(GtkTreeModel *model, GtkTreePath *UNUSED(path), GtkTreeIter *iter_ptr, gpointer data)
+static gboolean keyword_show_set_in_cb(GtkTreeModel *model, GtkTreePath *, GtkTreeIter *iter_ptr, gpointer data)
 {
        GtkTreeIter iter = *iter_ptr;
        auto keywords = static_cast<GList *>(data);
@@ -1713,7 +1727,7 @@ void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keyword
 }
 
 
-void keyword_tree_new(void)
+void keyword_tree_new()
 {
        if (keyword_tree) return;
 
@@ -1728,20 +1742,21 @@ static GtkTreeIter keyword_tree_default_append(GtkTreeStore *keyword_tree, GtkTr
        return iter;
 }
 
-void keyword_tree_new_default(void)
+void keyword_tree_new_default()
 {
-       GtkTreeIter i1, i2;
+       GtkTreeIter i1;
+       GtkTreeIter i2;
 
        if (!keyword_tree) keyword_tree_new();
 
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("People"), TRUE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("People"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Family"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Free time"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Children"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Sport"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Culture"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Festival"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Nature"), TRUE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Nature"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Animal"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Bird"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Insect"), TRUE);
@@ -1756,16 +1771,16 @@ void keyword_tree_new_default(void)
                        keyword_tree_default_append(keyword_tree, &i2, _("Lake"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Sea"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Landscape"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Art"), TRUE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Art"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Statue"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Painting"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("City"), TRUE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("City"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Park"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Street"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Square"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Architecture"), TRUE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Architecture"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Buildings"), FALSE);
                        keyword_tree_default_append(keyword_tree, &i2, _("House"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Cathedral"), TRUE);
@@ -1775,8 +1790,8 @@ void keyword_tree_new_default(void)
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Interior"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Places"), FALSE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Conditions"), FALSE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Places"), FALSE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Conditions"), FALSE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Night"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Lights"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Reflections"), TRUE);
@@ -1787,7 +1802,7 @@ void keyword_tree_new_default(void)
                        keyword_tree_default_append(keyword_tree, &i2, _("Clouds"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Snow"), TRUE);
                        keyword_tree_default_append(keyword_tree, &i2, _("Sunny weather"), TRUE);
-       i1 = keyword_tree_default_append(keyword_tree, NULL, _("Photo"), FALSE);
+       i1 = keyword_tree_default_append(keyword_tree, nullptr, _("Photo"), FALSE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Edited"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Detail"), TRUE);
                i2 = keyword_tree_default_append(keyword_tree, &i1, _("Macro"), TRUE);
@@ -1878,9 +1893,9 @@ void keyword_tree_disconnect_marks()
 
 GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values)
 {
-       gchar *name = NULL;
+       gchar *name = nullptr;
        gboolean is_kw = TRUE;
-       gchar *mark_str = NULL;
+       gchar *mark_str = nullptr;
 
        while (*attribute_names)
                {
@@ -1897,7 +1912,7 @@ GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *pa
                {
                GtkTreeIter iter;
                /* re-use existing keyword if any */
-               if (!keyword_exists(GTK_TREE_MODEL(keyword_tree), parent, NULL, name, FALSE, &iter))
+               if (!keyword_exists(GTK_TREE_MODEL(keyword_tree), parent, nullptr, name, FALSE, &iter))
                        {
                        gtk_tree_store_append(keyword_tree, &iter, parent);
                        }
@@ -1916,7 +1931,7 @@ GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *pa
                return gtk_tree_iter_copy(&iter);
                }
        g_free(name);
-       return NULL;
+       return nullptr;
 }
 
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */