improved notification system
authorVladimir Nadvornik <nadvornik@suse.cz>
Sat, 14 Mar 2009 17:21:35 +0000 (17:21 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sat, 14 Mar 2009 17:21:35 +0000 (17:21 +0000)
16 files changed:
src/cache_maint.c
src/collect-io.c
src/collect.c
src/dupe.c
src/filecache.c
src/filedata.c
src/histogram.c
src/image.c
src/img-view.c
src/layout_image.c
src/metadata.c
src/search.c
src/thumb.c
src/typedefs.h
src/view_dir.c
src/view_file.c

index 7e5bb90..e317230 100644 (file)
@@ -621,7 +621,7 @@ static void cache_maint_copied(FileData *fd)
 
 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)
                {
index c5ecabe..669dabf 100644 (file)
@@ -934,7 +934,7 @@ void collect_manager_flush(void)
 
 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)
                {
index 84f9b64..41300a2 100644 (file)
@@ -749,7 +749,7 @@ static void collection_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        CollectionData *cd = data;
 
-       if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
        
        switch (fd->change->type)
                {
index 79ab514..b6614b1 100644 (file)
@@ -3571,7 +3571,7 @@ static void dupe_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        DupeWindow *dw = data;
 
-       if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
        
        switch (fd->change->type)
                {
index d212ada..33df6a4 100644 (file)
@@ -181,7 +181,7 @@ static void file_cache_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        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);
                }
index f8f7a85..ea9748a 100644 (file)
@@ -243,7 +243,7 @@ static gboolean file_data_check_changed_files_recursive(FileData *fd, struct sta
                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;
                }
 
@@ -295,7 +295,7 @@ gboolean file_data_check_changed_files(FileData *fd)
                        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
                {
@@ -601,8 +601,8 @@ void file_data_disable_grouping(FileData *fd, gboolean disable)
                        {
                        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)
@@ -614,9 +614,9 @@ void file_data_disable_grouping(FileData *fd, gboolean disable)
                                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);
                        }
@@ -624,7 +624,7 @@ void file_data_disable_grouping(FileData *fd, gboolean disable)
        else
                {
                file_data_check_sidecars(fd);
-               file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+               file_data_send_notification(fd, NOTIFY_GROUPING);
                }
 }
 
@@ -1151,7 +1151,7 @@ void file_data_set_mark(FileData *fd, gint n, gboolean value)
                }
        
        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)
@@ -1187,7 +1187,7 @@ static void file_data_notify_mark_func(gpointer key, gpointer value, gpointer us
 {
        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)
@@ -1228,7 +1228,7 @@ void file_data_set_user_orientation(FileData *fd, gint value)
 
        fd->user_orientation = value;
        file_data_increment_version(fd);
-       file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+       file_data_send_notification(fd, NOTIFY_ORIENTATION);
 }
 
 
@@ -2213,7 +2213,7 @@ gboolean file_data_apply_ci(FileData *fd)
                        }
                }
        file_data_increment_version(fd);
-       file_data_send_notification(fd, NOTIFY_TYPE_CHANGE);
+       file_data_send_notification(fd, NOTIFY_CHANGE);
        
        return TRUE;
 }
index 9278288..b35488a 100644 (file)
@@ -320,7 +320,7 @@ gboolean histogram_draw(Histogram *histogram, const HistMap *histmap, GdkPixbuf
 
 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;
index 5bdcfe9..497ce96 100644 (file)
@@ -514,7 +514,7 @@ static void image_cache_set(ImageWindow *imd, FileData *fd)
        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)
@@ -1379,7 +1379,7 @@ static void image_notify_cb(FileData *fd, NotifyType type, gpointer data)
            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);
                }
index 2842e61..540f0f7 100644 (file)
@@ -1702,7 +1702,7 @@ static void view_window_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        ViewWindow *vw = data;
 
-       if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
        
        switch (fd->change->type)
                {
index 23f53be..5ac3bce 100644 (file)
@@ -1879,7 +1879,7 @@ void layout_image_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        LayoutWindow *lw = data;
 
-       if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
        
        switch (fd->change->type)
                {
index 22bc8fc..be75d64 100644 (file)
@@ -80,7 +80,7 @@ gboolean metadata_write_queue_remove(FileData *fd)
        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);
 
@@ -202,7 +202,7 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values
                }
        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))
                {
index b8ac9b0..8e39eba 100644 (file)
@@ -2945,7 +2945,7 @@ static void search_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
        SearchData *sd = data;
 
-       if (type != NOTIFY_TYPE_CHANGE || !fd->change) return;
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
        
        switch (fd->change->type)
                {
index 12c7a0f..0b9dede 100644 (file)
@@ -534,7 +534,7 @@ gint thumb_from_xpm_d(const gchar **data, gint max_w, gint max_h, GdkPixmap **pi
 /* 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;
index 8f38470..b19ae04 100644 (file)
@@ -142,9 +142,14 @@ typedef enum {
 } 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 {
index 9afbbc4..9756449 100644 (file)
@@ -1038,7 +1038,7 @@ static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data)
                        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)
                                {
index f0d059b..5fe1d4b 100644 (file)
@@ -824,10 +824,12 @@ void vf_notify_cb(FileData *fd, NotifyType type, gpointer data)
        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)
@@ -837,7 +839,7 @@ void vf_notify_cb(FileData *fd, NotifyType type, gpointer data)
                g_free(base);
                }
 
-       if (type == NOTIFY_TYPE_CHANGE && fd->change)
+       if ((type & NOTIFY_CHANGE) && fd->change)
                {
                if (!refresh && fd->change->dest)
                        {