diff src/image.c @ 1012:fe82830ab8fd

converted image loader to a GObject and use signals for notification
author nadvornik
date Fri, 29 Aug 2008 20:53:53 +0000
parents 4fe8f9656107
children b0db0bd74dba
line wrap: on
line diff
--- a/src/image.c	Fri Aug 29 12:35:13 2008 +0000
+++ b/src/image.c	Fri Aug 29 20:53:53 2008 +0000
@@ -451,8 +451,10 @@
 
 	imd->read_ahead_il = image_loader_new(imd->read_ahead_fd);
 
-	image_loader_set_error_func(imd->read_ahead_il, image_read_ahead_error_cb, imd);
-	if (!image_loader_start(imd->read_ahead_il, image_read_ahead_done_cb, imd))
+	g_signal_connect (G_OBJECT(imd->read_ahead_il), "error", (GCallback)image_read_ahead_error_cb, imd);
+	g_signal_connect (G_OBJECT(imd->read_ahead_il), "error", (GCallback)image_read_ahead_done_cb, imd);
+
+	if (!image_loader_start(imd->read_ahead_il))
 		{
 		image_read_ahead_cancel(imd);
 		image_complete_util(imd, TRUE);
@@ -618,9 +620,10 @@
 		imd->read_ahead_il = NULL;
 
 		/* override the old signals */
-		image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
-		image_loader_set_error_func(imd->il, image_load_error_cb, imd);
-		image_loader_set_done_func(imd->il, image_load_done_cb, imd);
+		g_signal_handlers_disconnect_matched(G_OBJECT(imd->il), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, imd);
+		g_signal_connect (G_OBJECT(imd->il), "area_ready", (GCallback)image_load_area_cb, imd);
+		g_signal_connect (G_OBJECT(imd->il), "error", (GCallback)image_load_error_cb, imd);
+		g_signal_connect (G_OBJECT(imd->il), "done", (GCallback)image_load_done_cb, imd);
 		image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
 
 #ifdef IMAGE_THROTTLE_LARGER_IMAGES
@@ -688,11 +691,12 @@
 
 	imd->il = image_loader_new(fd);
 
-	image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
-	image_loader_set_error_func(imd->il, image_load_error_cb, imd);
+	g_signal_connect (G_OBJECT(imd->il), "area_ready", (GCallback)image_load_area_cb, imd);
+	g_signal_connect (G_OBJECT(imd->il), "error", (GCallback)image_load_error_cb, imd);
+	g_signal_connect (G_OBJECT(imd->il), "done", (GCallback)image_load_done_cb, imd);
 	image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
 
-	if (!image_loader_start(imd->il, image_load_done_cb, imd))
+	if (!image_loader_start(imd->il))
 		{
 		DEBUG_1("image start error");
 
@@ -1098,14 +1102,25 @@
 	return NULL;
 }
 
-static void image_loader_sync_data(ImageLoader *il, gpointer data)
+static void image_loader_sync_read_ahead_data(ImageLoader *il, gpointer old_data, gpointer data)
 {
-	/* change data for the callbacks directly */
+	if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_read_ahead_error_cb, old_data))
+		g_signal_connect (G_OBJECT(il), "error", (GCallback)image_read_ahead_error_cb, data);
+
+	if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_read_ahead_done_cb, old_data))
+		g_signal_connect (G_OBJECT(il), "done", (GCallback)image_read_ahead_done_cb, data);
+}
 
-	il->data_area_ready = data;
-	il->data_error = data;
-	il->data_done = data;
-	il->data_percent = data;
+static void image_loader_sync_data(ImageLoader *il, gpointer old_data, gpointer data)
+{		
+	if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_area_cb, old_data))
+		g_signal_connect (G_OBJECT(il), "area_ready", (GCallback)image_load_area_cb, data);
+
+	if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_error_cb, old_data))
+		g_signal_connect (G_OBJECT(il), "error", (GCallback)image_load_error_cb, data);
+
+	if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_done_cb, old_data))
+		g_signal_connect (G_OBJECT(il), "done", (GCallback)image_load_done_cb, data);
 }
 
 /* this is more like a move function
@@ -1131,7 +1146,7 @@
 		imd->il = source->il;
 		source->il = NULL;
 
-		image_loader_sync_data(imd->il, imd);
+		image_loader_sync_data(imd->il, source, imd);
 
 		imd->delay_alter_type = source->delay_alter_type;
 		source->delay_alter_type = ALTER_NONE;
@@ -1158,7 +1173,7 @@
 	image_loader_free(imd->read_ahead_il);
 	imd->read_ahead_il = source->read_ahead_il;
 	source->read_ahead_il = NULL;
-	if (imd->read_ahead_il) image_loader_sync_data(imd->read_ahead_il, imd);
+	if (imd->read_ahead_il) image_loader_sync_read_ahead_data(imd->read_ahead_il, source, imd);
 
 	file_data_unref(imd->read_ahead_fd);
 	imd->read_ahead_fd = source->read_ahead_fd;