* 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",
"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);
{
/* 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;
}
work = work->next;
}
- return NULL;
+ return nullptr;
DEBUG_1("not found %s %s\n", key, fd->path);
}
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;
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;
}
*-------------------------------------------------------------------
*/
-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)
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);
}
}
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);
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))
{
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)
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;
}
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;
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;
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;
}
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);
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);
g_free(metadata_pathl);
g_free(orig_comment);
- string_list_free(orig_keywords);
+ g_list_free_full(orig_keywords, g_free);
return success;
}
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;
}
else
{
- string_list_free(list);
+ g_list_free_full(list, g_free);
}
if (comment_build)
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);
{
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;
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)
*/
if (strcmp(key, KEYWORD_KEY) == 0)
{
- if (metadata_legacy_read(fd, &list, NULL))
+ if (metadata_legacy_read(fd, &list, nullptr))
{
if (format == METADATA_PLAIN)
{
}
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);
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)
{
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;
{
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)
char *coordinate;
const char *ref;
gboolean ok = TRUE;
- char *old_locale, *saved_locale;
+ char *old_locale;
+ char *saved_locale;
param = value;
if (param < 0)
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;
}
{
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;
}
/**
}
g_free(string_casefold);
- return NULL;
+ return nullptr;
}
/**
list = list->next;
} // while (list)
- return NULL;
+ return nullptr;
} // gchar *find_string_in_list_utf...
/**
{
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')
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++;
*/
-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);
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;
metadata_write_list(fd, KEYWORD_KEY, keywords);
}
- string_list_free(keywords);
+ g_list_free_full(keywords, g_free);
return TRUE;
}
(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);
}
}
{
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)
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)
{
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 */
GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
{
- GList *path = NULL;
+ GList *path = nullptr;
GtkTreeIter iter = *iter_ptr;
while (TRUE)
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)
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;
GList *keyword_tree_get(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
{
GtkTreeIter iter = *iter_ptr;
- GList *kw_list = NULL;
+ GList *kw_list = nullptr;
while (TRUE)
{
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;
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))
{
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);
}
-void keyword_tree_new(void)
+void keyword_tree_new()
{
if (keyword_tree) return;
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);
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);
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);
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);
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)
{
{
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);
}
return gtk_tree_iter_copy(&iter);
}
g_free(name);
- return NULL;
+ return nullptr;
}
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */