FIXME: do not work - gtk_label_set_ellipsize
[geeqie.git] / src / metadata.cc
index 53fb0c5..388a49e 100644 (file)
@@ -19,7 +19,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include <locale.h>
+#include <clocale>
 
 #include "main.h"
 #include "metadata.h"
 #include "layout-util.h"
 #include "rcfile.h"
 
-typedef enum {
+enum MetadataKey {
        MK_NONE,
        MK_KEYWORDS,
        MK_COMMENT
-} MetadataKey;
+};
 
 /* If contents change, keep GuideOptionsMetadata.xml up to date */
 /**
@@ -66,7 +66,7 @@ static const gchar *group_keys[] = {
        "Xmp.dc.rights",
        "Xmp.dc.description",
        "Xmp.photoshop.CaptionWriter",
-       NULL};
+       nullptr};
 
 static gboolean metadata_write_queue_idle_cb(gpointer data);
 static gboolean metadata_legacy_write(FileData *fd);
@@ -91,16 +91,16 @@ static void metadata_cache_update(FileData *fd, const gchar *key, const GList *v
        work = fd->cached_metadata;
        while (work)
                {
-               GList *entry = static_cast<GList *>(work->data);
-               gchar *entry_key = static_cast<gchar *>(entry->data);
+               auto entry = static_cast<GList *>(work->data);
+               auto entry_key = static_cast<gchar *>(entry->data);
 
                if (strcmp(entry_key, key) == 0)
                        {
                        /* 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;
@@ -122,8 +122,8 @@ static const GList *metadata_cache_get(FileData *fd, const gchar *key)
        work = fd->cached_metadata;
        while (work)
                {
-               GList *entry = static_cast<GList *>(work->data);
-               gchar *entry_key = static_cast<gchar *>(entry->data);
+               auto entry = static_cast<GList *>(work->data);
+               auto entry_key = static_cast<gchar *>(entry->data);
 
                if (strcmp(entry_key, key) == 0)
                        {
@@ -133,7 +133,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);
 }
 
@@ -144,13 +144,13 @@ static void metadata_cache_remove(FileData *fd, const gchar *key)
        work = fd->cached_metadata;
        while (work)
                {
-               GList *entry = static_cast<GList *>(work->data);
-               gchar *entry_key = static_cast<gchar *>(entry->data);
+               auto entry = static_cast<GList *>(work->data);
+               auto entry_key = static_cast<gchar *>(entry->data);
 
                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 +162,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)
                {
-               GList *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 +183,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 +204,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 +212,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 +225,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)
+               {
+               FileData *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,12 +264,12 @@ 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)
                {
-               FileData *fd = static_cast<FileData *>(work->data);
+               auto fd = static_cast<FileData *>(work->data);
                work = work->next;
 
                if (!isname(fd->path))
@@ -286,14 +284,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,7 +338,7 @@ gboolean metadata_write_perform(FileData *fd)
        return success;
 }
 
-gint metadata_queue_length(void)
+gint metadata_queue_length()
 {
        return g_list_length(metadata_write_queue);
 }
@@ -380,9 +378,9 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values
 {
        if (!fd->modified_xmp)
                {
-               fd->modified_xmp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)string_list_free);
+               fd->modified_xmp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, reinterpret_cast<GDestroyNotify>(string_list_free));
                }
-       g_hash_table_insert(fd->modified_xmp, g_strdup(key), string_list_copy((GList *)values));
+       g_hash_table_insert(fd->modified_xmp, g_strdup(key), string_list_copy(const_cast<GList *>(values)));
 
        metadata_cache_remove(fd, key);
 
@@ -400,7 +398,7 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values
 
                while (work)
                        {
-                       FileData *sfd = static_cast<FileData *>(work->data);
+                       auto sfd = static_cast<FileData *>(work->data);
                        work = work->next;
 
                        if (sfd->format_class == FORMAT_CLASS_META) continue;
@@ -415,9 +413,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;
 }
 
@@ -425,7 +423,7 @@ gboolean metadata_write_int(FileData *fd, const gchar *key, guint64 value)
 {
        gchar string[50];
 
-       g_snprintf(string, sizeof(string), "%llu", (unsigned long long) value);
+       g_snprintf(string, sizeof(string), "%llu", static_cast<unsigned long long>(value));
        return metadata_write_string(fd, key, string);
 }
 
@@ -447,7 +445,7 @@ static gboolean metadata_file_write(gchar *path, const GList *keywords, const gc
        secure_fprintf(ssi, "[keywords]\n");
        while (keywords && secsave_errno == SS_ERR_NONE)
                {
-               const gchar *word = static_cast<const gchar *>(keywords->data);
+               auto word = static_cast<const gchar *>(keywords->data);
                keywords = keywords->next;
 
                secure_fprintf(ssi, "%s\n", word);
@@ -471,8 +469,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,19 +480,19 @@ 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) ? ((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);
 
        success = metadata_file_write(metadata_pathl,
-                                     have_keywords ? (GList *)keywords : orig_keywords,
+                                     have_keywords ? static_cast<GList *>(keywords) : orig_keywords,
                                      have_comment ? comment : orig_comment);
 
        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 +502,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 +562,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)
@@ -647,15 +645,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)
                {
-               gchar *key = static_cast<gchar *>(work->data);
+               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 +668,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 +695,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 +706,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
        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);
 
@@ -740,12 +738,12 @@ gchar *metadata_read_string(FileData *fd, const gchar *key, MetadataFormat forma
        GList *string_list = metadata_read_list(fd, key, format);
        if (string_list)
                {
-               gchar *str = static_cast<gchar *>(string_list->data);
-               string_list->data = NULL;
-               string_list_free(string_list);
+               auto str = static_cast<gchar *>(string_list->data);
+               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)
@@ -863,7 +861,7 @@ gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value)
        gdouble min;
        gdouble param;
        char *coordinate;
-       char *ref;
+       const char *ref;
        gboolean ok = TRUE;
        char *old_locale, *saved_locale;
 
@@ -891,9 +889,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;
                        }
@@ -925,7 +923,7 @@ gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *value
                list = remove_duplicate_strings_from_list(list);
 
                ret = metadata_write_list(fd, key, list);
-               string_list_free(list);
+               g_list_free_full(list, g_free);
                return ret;
                }
 }
@@ -939,7 +937,7 @@ gchar *find_string_in_list_utf8nocase(GList *list, const gchar *string)
 
        while (list)
                {
-               gchar *haystack = static_cast<gchar *>(list->data);
+               auto haystack = static_cast<gchar *>(list->data);
 
                if (haystack)
                        {
@@ -960,7 +958,7 @@ gchar *find_string_in_list_utf8nocase(GList *list, const gchar *string)
                }
 
        g_free(string_casefold);
-       return NULL;
+       return nullptr;
 }
 
 /**
@@ -970,7 +968,7 @@ gchar *find_string_in_list_utf8case(GList *list, const gchar *string)
 {
        while (list)
                {
-               gchar *haystack = static_cast<gchar *>(list->data);
+               auto haystack = static_cast<gchar *>(list->data);
 
                if (haystack && strcmp(haystack, string) == 0)
                        return haystack;
@@ -978,7 +976,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...
 
 /**
@@ -1007,7 +1005,7 @@ gchar *find_string_in_list(GList *list, const gchar *string)
 
 GList *string_to_keywords_list(const gchar *text)
 {
-       GList *list = NULL;
+       GList *list = nullptr;
        const gchar *ptr = text;
 
        while (*ptr != '\0')
@@ -1047,10 +1045,10 @@ 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 */
-       GList *path = static_cast<GList *>(data);
+       auto path = static_cast<GList *>(data);
        GList *keywords;
        gboolean found = FALSE;
        keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
@@ -1065,10 +1063,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)
 {
-       GList *path = static_cast<GList *>(data);
-       GList *keywords = NULL;
+       auto path = static_cast<GList *>(data);
+       GList *keywords = nullptr;
        GtkTreeIter iter;
 
        if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) return FALSE;
@@ -1088,7 +1086,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;
 }
 
@@ -1109,13 +1107,13 @@ void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter
                if (get_mark_func == meta_data_get_keyword_mark)
                        {
                        GtkTreeIter old_kw_iter;
-                       GList *old_path = static_cast<GList *>(mark_func_data);
+                       auto old_path = static_cast<GList *>(mark_func_data);
 
                        if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) &&
                            (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);
                                }
                        }
@@ -1127,7 +1125,7 @@ void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter
                GList *path;
                gchar *mark_str;
                path = keyword_tree_get_path(keyword_tree, kw_iter);
-               file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free);
+               file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, reinterpret_cast<GDestroyNotify>(string_list_free));
 
                mark_str = g_strdup_printf("%d", (mark < 9 ? mark : -1) + 1);
                gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1);
@@ -1234,14 +1232,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)
                                {
@@ -1314,7 +1312,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)
@@ -1385,7 +1383,7 @@ static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTree
                        gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
                        while (work)
                                {
-                               const gchar *casefold = static_cast<const gchar *>(work->data);
+                               auto casefold = static_cast<const gchar *>(work->data);
                                work = work->next;
 
                                if (strcmp(iter_casefold, casefold) == 0)
@@ -1432,7 +1430,7 @@ static gboolean keyword_tree_is_set_casefull(GtkTreeModel *keyword_tree, GtkTree
                        gchar *iter_name = keyword_get_name(keyword_tree, &iter);
                        while (work)
                                {
-                               const gchar *name = static_cast<const gchar *>(work->data);
+                               auto name = static_cast<const gchar *>(work->data);
                                work = work->next;
 
                                if (strcmp(iter_name, name) == 0)
@@ -1453,7 +1451,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)
@@ -1465,7 +1463,7 @@ gboolean keyword_tree_is_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GLis
                work = kw_list;
                while (work)
                        {
-                       const gchar *kw = static_cast<const gchar *>(work->data);
+                       auto kw = static_cast<const gchar *>(work->data);
                        work = work->next;
 
                        casefold_list = g_list_prepend(casefold_list, g_utf8_casefold(kw, -1));
@@ -1473,7 +1471,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 +1505,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 +1629,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 +1640,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,10 +1683,10 @@ 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;
-       GList *keywords = static_cast<GList *>(data);
+       auto keywords = static_cast<GList *>(data);
        gpointer id = keywords->data;
        keywords = keywords->next; /* hack */
        if (keyword_tree_is_set(model, &iter, keywords))
@@ -1713,7 +1711,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 +1726,20 @@ 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;
 
        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 +1754,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 +1773,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 +1785,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 +1876,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 +1895,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);
                        }
@@ -1905,7 +1903,7 @@ GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *pa
 
                if (mark_str)
                        {
-                       gint i = (gint)atoi(mark_str);
+                       gint i = static_cast<gint>(atoi(mark_str));
                        if (i == 0) i = 10;
 
                        meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree),
@@ -1916,7 +1914,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: */