Re: slideshow RFEs

Richard Black <[email protected]> Mon, 26 Jan 2004 16:03:14 -0600
Newsgroups gmane.comp.gnome.apps.gqview.devel
Message-ID <[email protected]>
Thanks, that patch is great.  That is just the main
piece I'm needing.  I'll see about adding the calls
to it to give it a test run.

As far as the milliseconds timing, once the timer
starts from the time the image displays completely,
that I would use anywhere from 0 to 20 milliseconds.
So tenths (0.1) of a second is better than nothing, but
hundredths (0.01) would be much better (and thousandths
might still add value, but probably not much if I can
choose between 0, 0.01, and 0.02).  The lower the usable
time value really speeds up flipping through a bunch of
images quickly.

Thanks again!

Sincerely,
Richard Black

John Ellis wrote:

>[email protected] wrote:
>  
>
>>For slideshow view I am looking for 3 related enhancements.  I have a lot
>>of pictures to sift through and 1 second flip time
>>will take forever...
>>
>>I would like to see some option toggle boxes for the following ideas:
>>
>>During slideshow,
>>1) don't flip until previous picture completely displays
>>2) don't flip until next image has finished preloading
>>3) once the current image displays, specify the amount of time (in
>>milliseconds) the current image should be displayed before being allowed
>>to flip to next image
>>    
>>
>
>It will be a bit late for this to make it into 1.4 in entirety, but a few steps
>can be made for this now.
>
>  
>
>>Probably there would need to be a toggle box to select between
>>milliseconds and seconds.
>>    
>>
>
>Will tenths of a second (down to 0.1) be okay? If so, refer to how the 'zoom
>increment' is adjusted on the 'image' tab. Should be very simple to convert this
>way, and could be included before the next _stable_ release 1.4.0
>
>  
>
>>The current issues is that I can now specify the slideshow speed in
>>milliseconds; however, this method isn't perfect for me,
>>if I set it too fast then the images don't display completely.  Setting it
>>slow enough for all my images to display completely causes a large time
>>waste across all the other pictures where I don't need such a slow speed.
>>If I could start the slideshow counter to just after the image completely
>>displays, that would be a great alternative until someone (maybe me) can
>>implement the above 3 RFE's.
>>    
>>
>
>Diving into coding this:
>
>I am attaching a patch (this will be included with 1.3.8) that adds a
>image_set_complete_func() to set a image completed function.
>
>The set function will be called when the current image is finished rendering to
>the screen, and when the next image is finished preloading (assuming preloading
>is enabled).
>
>
>slideshow.c can be changed to take advantage of this, and wait until the
>complete function is called to change the image and/or update/start the timeout
>for the next image.
>
>I can do this too, if you are willing to wait until I get around to it - but
>that may not be for a few weeks or so... probably after 1.4.0. This little
>change to image.c is less involved, and since I know it very well, can help you
>avoid possible problems finding the points where an image is 'completed'.
>
>
>Greetings,
>John
>
>  
>
>------------------------------------------------------------------------
>
>Index: image.c
>===================================================================
>RCS file: /devel/cvs/gqview/src/image.c,v
>retrieving revision 1.78.2.18
>diff -u -r1.78.2.18 image.c
>--- image.c	22 Dec 2003 02:27:19 -0000	1.78.2.18
>+++ image.c	18 Jan 2004 07:23:59 -0000
>@@ -110,6 +110,7 @@
> 
> static void image_update_title(ImageWindow *imd);
> static void image_update_util(ImageWindow *imd);
>+static void image_complete_util(ImageWindow *imd, gint preload);
> 
> static void image_button_do(ImageWindow *imd, GdkEvent *event, gint button);
> 
>@@ -497,6 +498,8 @@
> 
> 	if (!imd->pixbuf || (!imd->draw_queue && !imd->draw_queue_2pass) || imd->draw_idle_id == -1)
> 		{
>+		if (!imd->completed) image_complete_util(imd, FALSE);
>+
> 		imd->draw_idle_id = -1;
> 		return FALSE;
> 		}
>@@ -558,6 +561,8 @@
> 
> 	if (!imd->draw_queue && !imd->draw_queue_2pass)
> 		{
>+		if (!imd->completed) image_complete_util(imd, FALSE);
>+
> 		imd->draw_idle_id = -1;
> 		return FALSE;
> 		}
>@@ -1072,7 +1077,17 @@
> 
> static void image_update_util(ImageWindow *imd)
> {
>-	if (imd->update_func) imd->update_func(imd, imd->update_data);
>+	if (imd->func_update) imd->func_update(imd, imd->data_update);
>+}
>+
>+static void image_complete_util(ImageWindow *imd, gint preload)
>+{
>+	if (debug) printf("image load completed \"%s\" (%s)\n",
>+			  (preload) ? imd->read_ahead_path : imd->image_path,
>+			  (preload) ? "preload" : "current");
>+
>+	if (!preload) imd->completed = TRUE;
>+	if (imd->func_complete) imd->func_complete(imd, preload, imd->data_complete);
> }
> 
> static void image_scroll_real(ImageWindow *imd, gint x, gint y)
>@@ -1459,6 +1474,8 @@
> 		}
> 	image_loader_free(imd->read_ahead_il);
> 	imd->read_ahead_il = NULL;
>+
>+	image_complete_util(imd, TRUE);
> }
> 
> static void image_read_ahead_error_cb(ImageLoader *il, gpointer data)
>@@ -1483,6 +1500,7 @@
> 	if (!image_loader_start(imd->read_ahead_il, image_read_ahead_done_cb, imd))
> 		{
> 		image_read_ahead_cancel(imd);
>+		image_complete_util(imd, TRUE);
> 		}
> }
> 
>@@ -1693,6 +1711,8 @@
> 
> 	if (imd->il) return FALSE;
> 
>+	imd->completed = FALSE;
>+
> 	if (image_post_buffer_get(imd))
> 		{
> 		if (debug) printf("from post buffer: %s\n", imd->image_path);
>@@ -1721,6 +1741,9 @@
> 
> 		image_loader_free(imd->il);
> 		imd->il = NULL;
>+
>+		image_complete_util(imd, FALSE);
>+
> 		return FALSE;
> 		}
> 
>@@ -2083,13 +2106,22 @@
> }
> 
> void image_set_update_func(ImageWindow *imd,
>-			   void (*update_func)(ImageWindow *imd, gpointer data),
>+			   void (*func)(ImageWindow *imd, gpointer data),
> 			   gpointer data)
> {
>-	imd->update_func = update_func;
>-	imd->update_data = data;
>+	imd->func_update = func;
>+	imd->data_update = data;
> }
> 
>+void image_set_complete_func(ImageWindow *imd,
>+			     void (*func)(ImageWindow *, gint preload, gpointer),
>+			     gpointer data)
>+{
>+	imd->func_complete = func;
>+	imd->data_complete = data;
>+}
>+
>+
> static void image_button_do(ImageWindow *imd, GdkEvent *event, gint button)
> {
> 	void (*func)(ImageWindow *, guint32 time, gdouble x, gdouble y, guint state, gpointer);
>@@ -2663,6 +2695,8 @@
> 	imd->read_ahead_il = NULL;
> 	imd->read_ahead_pixbuf = NULL;
> 	imd->read_ahead_path = NULL;
>+
>+	imd->completed = FALSE;
> 
> 	imd->auto_refresh_id = -1;
> 	imd->auto_refresh_interval = -1;
>Index: image.h
>===================================================================
>RCS file: /devel/cvs/gqview/src/image.h,v
>retrieving revision 1.19.2.2
>diff -u -r1.19.2.2 image.h
>--- image.h	9 May 2003 19:36:41 -0000	1.19.2.2
>+++ image.h	18 Jan 2004 06:48:33 -0000
>@@ -20,11 +20,14 @@
> void image_attach_window(ImageWindow *imd, GtkWidget *window,
> 			 const gchar *title, const gchar *title_right, gint show_zoom);
> void image_set_update_func(ImageWindow *imd,
>-			   void (*update_func)(ImageWindow *imd, gpointer data),
>+			   void (*func)(ImageWindow *imd, gpointer data),
> 			   gpointer data);
> void image_set_button_func(ImageWindow *imd, gint button,
> 			   void (*func)(ImageWindow *, guint32 time, gdouble x, gdouble y, guint state, gpointer),
> 			   gpointer data);
>+void image_set_complete_func(ImageWindow *imd,
>+			     void (*func)(ImageWindow *, gint preload, gpointer),
>+			     gpointer data);
> 
> /* path, name */
> const gchar *image_get_path(ImageWindow *imd);
>Index: typedefs.h
>===================================================================
>RCS file: /devel/cvs/gqview/src/typedefs.h,v
>retrieving revision 1.44.2.18
>diff -u -r1.44.2.18 typedefs.h
>--- typedefs.h	10 Jan 2004 12:33:23 -0000	1.44.2.18
>+++ typedefs.h	18 Jan 2004 07:14:48 -0000
>@@ -267,8 +267,13 @@
> 	gchar *title_right;	/* window title to display right of file name */
> 	gint title_show_zoom;	/* option to include zoom in window title */
> 
>-	void (*update_func)(ImageWindow *, gpointer);
>-	gpointer update_data;
>+	gint completed;
>+
>+	void (*func_update)(ImageWindow *, gpointer);
>+	void (*func_complete)(ImageWindow *, gint preload, gpointer);
>+
>+	gpointer data_update;
>+	gpointer data_complete;
> 
> 	/* button functions */
> 	void (*func_btn1)(ImageWindow *, guint32 time, gdouble x, gdouble y, guint state, gpointer);
>  
>


-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn