void cache_notify_cb(FileData *fd, NotifyType type, gpointer data)
{
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
void collect_manager_notify_cb(FileData *fd, NotifyType type, gpointer data)
{
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
{
CollectionData *cd = data;
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
{
DupeWindow *dw = data;
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
{
FileCacheData *fc = data;
- if (type != NOTIFY_TYPE_INTERNAL) /* invalidate the entry on each file change */
+ if (type & (NOTIFY_REREAD | NOTIFY_CHANGE)) /* invalidate the entry on each file change */
{
file_cache_remove_fd(fc, fd);
}
if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
fd->thumb_pixbuf = NULL;
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
+ file_data_send_notification(fd, NOTIFY_REREAD);
ret = TRUE;
}
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);
+ file_data_send_notification(fd, NOTIFY_REREAD);
}
else
{
{
FileData *parent = file_data_ref(fd->parent);
file_data_disconnect_sidecar_file(parent, fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
- file_data_send_notification(parent, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_GROUPING);
+ file_data_send_notification(parent, NOTIFY_GROUPING);
file_data_unref(parent);
}
else if (fd->sidecar_files)
FileData *sfd = work->data;
work = work->next;
file_data_disconnect_sidecar_file(fd, sfd);
- file_data_send_notification(sfd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(sfd, NOTIFY_GROUPING);
}
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_GROUPING);
file_data_check_sidecars((FileData *)sidecar_files->data); /* this will group the sidecars back together */
filelist_free(sidecar_files);
}
else
{
file_data_check_sidecars(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_GROUPING);
}
}
}
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_MARKS);
}
gboolean file_data_filter_marks(FileData *fd, guint filter)
{
FileData *fd = value;
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_MARKS);
}
gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data, GDestroyNotify notify)
fd->user_orientation = value;
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_ORIENTATION);
}
}
}
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_CHANGE);
+ file_data_send_notification(fd, NOTIFY_CHANGE);
return TRUE;
}
void histogram_notify_cb(FileData *fd, NotifyType type, gpointer data)
{
- if (type != NOTIFY_TYPE_INTERNAL && fd->histmap)
+ if ((type & (NOTIFY_CHANGE || NOTIFY_REREAD)) && fd->histmap)
{
g_free(fd->histmap);
fd->histmap = NULL;
g_assert(fd->pixbuf);
file_cache_put(image_get_cache(), fd, (gulong)gdk_pixbuf_get_rowstride(fd->pixbuf) * (gulong)gdk_pixbuf_get_height(fd->pixbuf));
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL); /* to update histogram */
+ file_data_send_notification(fd, NOTIFY_PIXBUF); /* to update histogram */
}
static gint image_cache_get(ImageWindow *imd)
imd->state == IMAGE_STATE_NONE /* loading not started, no need to reload */
) return;
- if (type == NOTIFY_TYPE_REREAD && fd == imd->image_fd)
+ if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE)) && fd == imd->image_fd)
{
image_reload(imd);
}
{
ViewWindow *vw = data;
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
{
LayoutWindow *lw = data;
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
metadata_write_queue = g_list_remove(metadata_write_queue, fd);
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
+ file_data_send_notification(fd, NOTIFY_REREAD);
file_data_unref(fd);
}
metadata_write_queue_add(fd);
file_data_increment_version(fd);
- file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+ file_data_send_notification(fd, NOTIFY_METADATA);
if (options->metadata.sync_grouped_files && metadata_check_key(group_keys, key))
{
{
SearchData *sd = data;
- if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+ if (!(type & NOTIFY_CHANGE) || !fd->change) return;
switch (fd->change->type)
{
/* release thumb_pixbuf on file change - this forces reload. */
void thumb_notify_cb(FileData *fd, NotifyType type, gpointer data)
{
- if (type != NOTIFY_TYPE_INTERNAL && fd->thumb_pixbuf)
+ if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE)) && fd->thumb_pixbuf)
{
g_object_unref(fd->thumb_pixbuf);
fd->thumb_pixbuf = NULL;
} NotifyPriority;
typedef enum {
- NOTIFY_TYPE_INTERNAL = 0, /* changed internal data only, like marks */
- NOTIFY_TYPE_REREAD, /* changed file size, date, etc., file name remains unchanged */
- NOTIFY_TYPE_CHANGE /* generic change described by fd->change */
+ NOTIFY_MARKS = 1 << 1, /* changed marks */
+ NOTIFY_PIXBUF = 1 << 2, /* image was read into fd->pixbuf */
+ NOTIFY_HISTMAP = 1 << 3, /* histmap was read into fd->histmap */
+ NOTIFY_ORIENTATION = 1 << 4, /* image was rotated */
+ NOTIFY_METADATA = 1 << 5, /* changed image metadata, not yet written */
+ NOTIFY_GROUPING = 1 << 6, /* change in fd->sidecar_files or fd->parent */
+ NOTIFY_REREAD = 1 << 7, /* changed file size, date, etc., file name remains unchanged */
+ NOTIFY_CHANGE = 1 << 8 /* generic change described by fd->change */
} NotifyType;
typedef enum {
refresh = (strcmp(base, vd->dir_fd->path) == 0);
}
- if (type == NOTIFY_TYPE_CHANGE && fd->change)
+ if ((type & NOTIFY_CHANGE) && fd->change)
{
if (!refresh && fd->change->dest)
{
ViewFile *vf = data;
gboolean refresh;
- if (vf->refresh_idle_id != -1) return;
-
- if (!vf->dir_fd) return;
+ NotifyType interested = NOTIFY_CHANGE | NOTIFY_REREAD | NOTIFY_GROUPING;
+ if (vf->marks_enabled) interested |= NOTIFY_MARKS | NOTIFY_METADATA;
+ /* FIXME: NOTIFY_METADATA should be checked by the keyword-to-mark functions and converted to NOTIFY_MARKS only if there was a change */
+ if (!(type & interested) || vf->refresh_idle_id != -1 || !vf->dir_fd) return;
+
refresh = (fd == vf->dir_fd);
if (!refresh)
g_free(base);
}
- if (type == NOTIFY_TYPE_CHANGE && fd->change)
+ if ((type & NOTIFY_CHANGE) && fd->change)
{
if (!refresh && fd->change->dest)
{