diff src/image.c @ 888:d8e1e820cee7

reload changed images
author nadvornik
date Thu, 17 Jul 2008 21:51:21 +0000
parents ad420f2eb789
children bc9df0fecdc1
line wrap: on
line diff
--- a/src/image.c	Tue Jul 15 15:37:14 2008 +0000
+++ b/src/image.c	Thu Jul 17 21:51:21 2008 +0000
@@ -45,9 +45,6 @@
 /* the file size at which throttling take place */
 #define IMAGE_THROTTLE_THRESHOLD 1048576
 
-#define IMAGE_AUTO_REFRESH_TIME 3000
-
-
 static GList *image_list = NULL;
 
 
@@ -773,8 +770,6 @@
 
 			imd->unknown = TRUE;
 			}
-		imd->size = filesize(imd->image_fd->path);
-		imd->mtime = filetime(imd->image_fd->path);
 		}
 	else
 		{
@@ -785,15 +780,12 @@
 			pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
 			image_change_pixbuf(imd, pixbuf, zoom);
 			g_object_unref(pixbuf);
-			imd->mtime = filetime(imd->image_fd->path);
 			}
 		else
 			{
 			image_change_pixbuf(imd, NULL, zoom);
-			imd->mtime = 0;
 			}
 		imd->unknown = TRUE;
-		imd->size = 0;
 		}
 
 	image_update_util(imd);
@@ -806,13 +798,20 @@
 	imd->collection = cd;
 	imd->collection_info = info;
 
+	if (imd->auto_refresh && imd->image_fd)
+		file_data_unregister_real_time_monitor(imd->image_fd);
+
 	file_data_unref(imd->image_fd);
 	imd->image_fd = file_data_ref(fd);
 
+
 	image_change_complete(imd, zoom, TRUE);
 
 	image_update_title(imd);
 	image_state_set(imd, IMAGE_STATE_IMAGE);
+
+	if (imd->auto_refresh && imd->image_fd)
+		file_data_register_real_time_monitor(imd->image_fd);
 }
 
 /*
@@ -988,11 +987,17 @@
 /* merely changes path string, does not change the image! */
 void image_set_fd(ImageWindow *imd, FileData *fd)
 {
+	if (imd->auto_refresh && imd->image_fd)
+		file_data_unregister_real_time_monitor(imd->image_fd);
+
 	file_data_unref(imd->image_fd);
 	imd->image_fd = file_data_ref(fd);
 
 	image_update_title(imd);
 	image_state_set(imd, IMAGE_STATE_IMAGE);
+
+	if (imd->auto_refresh && imd->image_fd)
+		file_data_register_real_time_monitor(imd->image_fd);
 }
 
 /* load a new image */
@@ -1116,8 +1121,6 @@
 
 	imd->collection = source->collection;
 	imd->collection_info = source->collection_info;
-	imd->size = source->size;
-	imd->mtime = source->mtime;
 
 	image_loader_free(imd->il);
 	imd->il = NULL;
@@ -1350,45 +1353,29 @@
 		}
 }
 
-static gint image_auto_refresh_cb(gpointer data)
+static void image_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
 	ImageWindow *imd = data;
-	time_t newtime;
 
 	if (!imd || !image_get_pixbuf(imd) ||
 	    imd->il || !imd->image_fd ||
-	    !options->update_on_time_change) return TRUE;
+	    !options->update_on_time_change) return;
 
-	newtime = filetime(imd->image_fd->path);
-	if (newtime > 0 && newtime != imd->mtime)
+	if (type == NOTIFY_TYPE_REREAD && fd == imd->image_fd)
 		{
-		imd->mtime = newtime;
 		image_reload(imd);
 		}
-
-	return TRUE;
 }
 
-/* image auto refresh on time stamp change, in 1/1000's second, -1 disables */
-
-void image_auto_refresh(ImageWindow *imd, gint interval)
+void image_auto_refresh_enable(ImageWindow *imd, gboolean enable)
 {
-	if (!imd) return;
-	if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return;
+	if (!enable && imd->auto_refresh && imd->image_fd)
+		file_data_unregister_real_time_monitor(imd->image_fd);
 
-	if (imd->auto_refresh_id > -1)
-		{
-		g_source_remove(imd->auto_refresh_id);
-		imd->auto_refresh_id = -1;
-		imd->auto_refresh_interval = -1;
-		}
+	if (enable && !imd->auto_refresh && imd->image_fd)
+		file_data_register_real_time_monitor(imd->image_fd);
 
-	if (interval < 0) return;
-
-	if (interval == 0) interval = IMAGE_AUTO_REFRESH_TIME;
-
-	imd->auto_refresh_id = g_timeout_add((guint32)interval, image_auto_refresh_cb, imd);
-	imd->auto_refresh_interval = interval;
+	imd->auto_refresh = enable;
 }
 
 void image_top_window_set_sync(ImageWindow *imd, gint allow_sync)
@@ -1600,10 +1587,14 @@
 {
 	image_list = g_list_remove(image_list, imd);
 
+	if (imd->auto_refresh && imd->image_fd)
+		file_data_unregister_real_time_monitor(imd->image_fd);
+
+	file_data_unregister_notify_func(image_notify_cb, imd);
+
 	image_reset(imd);
 
 	image_read_ahead_cancel(imd);
-	image_auto_refresh(imd, -1);
 
 	file_data_unref(imd->image_fd);
 	g_free(imd->title);
@@ -1713,8 +1704,7 @@
 	imd->color_profile_use_image = FALSE;
 	imd->color_profile_from_image = COLOR_PROFILE_NONE;
 
-	imd->auto_refresh_id = -1;
-	imd->auto_refresh_interval = -1;
+	imd->auto_refresh = FALSE;
 
 	imd->delay_flip = FALSE;
 
@@ -1757,6 +1747,8 @@
 	g_signal_connect(G_OBJECT(imd->pr), "drag",
 			 G_CALLBACK(image_drag_cb), imd);
 
+	file_data_register_notify_func(image_notify_cb, imd, NOTIFY_PRIORITY_LOW);
+
 	image_list = g_list_append(image_list, imd);
 
 	return imd;