file_data_set_collate_keys(fd);
}
-static void file_data_check_changed_files(FileData *fd, struct stat *st)
+static gboolean file_data_check_changed_files_recursive(FileData *fd, struct stat *st)
{
+ gboolean ret = FALSE;
GList *work;
if (fd->size != st->st_size ||
fd->date != st->st_mtime)
fd->pixbuf = NULL;
file_data_increment_version(fd);
file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
+ ret = TRUE;
}
work = fd->sidecar_files;
{
FileData *sfd = work->data;
struct stat st;
+ work = work->next;
if (!stat_utf8(sfd->path, &st))
{
+ fd->size = 0;
+ fd->date = 0;
file_data_disconnect_sidecar_file(fd, sfd);
+ ret = TRUE;
+ continue;
}
- file_data_check_changed_files(sfd, &st);
- work = work->next;
+ ret |= file_data_check_changed_files_recursive(sfd, &st);
}
+ return ret;
+}
+
+
+static gboolean file_data_check_changed_files(FileData *fd)
+{
+ gboolean ret = FALSE;
+ struct stat st;
+ if (fd->parent) fd = fd->parent;
+
+ if (!stat_utf8(fd->path, &st))
+ {
+ /* parent is missing, we have to rebuild whole group */
+ ret = TRUE;
+ fd->size = 0;
+ fd->date = 0;
+ GList *work = fd->sidecar_files;
+ FileData *sfd = NULL;
+ while (work)
+ {
+ sfd = work->data;
+ work = work->next;
+
+ file_data_disconnect_sidecar_file(fd, sfd);
+ }
+ if (sfd) file_data_check_sidecars(sfd); /* this will group the sidecars back together */
+ file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
+ }
+ else
+ ret |= file_data_check_changed_files_recursive(fd, &st);
+ return ret;
}
static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars)
fd = g_hash_table_lookup(file_data_pool, path_utf8);
if (fd)
{
- file_data_check_changed_files(fd, st);
- DEBUG_2("file_data_pool hit: '%s'", fd->path);
+ gboolean changed;
+ if (fd->parent)
+ changed = file_data_check_changed_files(fd);
+ else
+ changed = file_data_check_changed_files_recursive(fd, st);
+ if (changed && check_sidecars && sidecar_file_priority(fd->extension))
+ file_data_check_sidecars(fd);
+ DEBUG_2("file_data_pool hit: '%s' %s", fd->path, changed ? "(changed)" : "");
return file_data_ref(fd);
}
sfd->parent = target;
if(!g_list_find(target->sidecar_files, sfd))
target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
+ file_data_increment_version(sfd); /* increments both sfd and target */
return target;
}
{
sfd->parent = target;
g_assert(g_list_find(target->sidecar_files, sfd));
+
+ file_data_increment_version(sfd); /* increments both sfd and target */
target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
sfd->parent = NULL;
static void realtime_monitor_check_cb(gpointer key, gpointer value, gpointer data)
{
FileData *fd = key;
- struct stat st;
- if (stat_utf8(fd->path, &st))
- file_data_check_changed_files(fd, &st);
- else
- file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
+ file_data_check_changed_files(fd);
DEBUG_1("monitor %s", fd->path);
}
return i;
}
+static gboolean vflist_store_clear_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+ FileData *fd;
+ gtk_tree_model_get(model, iter, FILE_COLUMN_POINTER, &fd, -1);
+ file_data_unref(fd);
+ return FALSE;
+}
+
+static void vflist_store_clear(ViewFile *vf)
+{
+ GtkTreeModel *store;
+ store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+ gtk_tree_model_foreach(store, vflist_store_clear_cb, NULL);
+ gtk_tree_store_clear(GTK_TREE_STORE(store));
+}
void vflist_color_set(ViewFile *vf, FileData *fd, gint color_set)
{
gtk_tree_store_append(store, &new, parent_iter);
}
- vflist_setup_iter(vf, store, &new, fd);
+ vflist_setup_iter(vf, store, &new, file_data_ref(fd));
vflist_setup_iter_recursive(vf, store, &new, fd->sidecar_files, selected);
if (g_list_find(selected, fd))
}
else if (match > 0)
{
+ file_data_unref(old_fd);
valid = gtk_tree_store_remove(store, &iter);
}
else
while (valid)
{
+ FileData *old_fd;
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
+ file_data_unref(old_fd);
+
valid = gtk_tree_store_remove(store, &iter);
}
}
if (!vf->list)
{
- gtk_tree_store_clear(store);
+ vflist_store_clear(vf);
vf_send_update(vf);
return;
}
gint vflist_set_fd(ViewFile *vf, FileData *dir_fd)
{
- GtkTreeStore *store;
-
if (!dir_fd) return FALSE;
if (vf->dir_fd == dir_fd) return TRUE;
vf->dir_fd = file_data_ref(dir_fd);
/* force complete reload */
- store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
- gtk_tree_store_clear(store);
+ vflist_store_clear(vf);
filelist_free(vf->list);
vf->list = NULL;