Mercurial > geeqie
diff src/slideshow.c @ 3:c0e337a01cb7
0.8.0
author | gqview |
---|---|
date | Thu, 13 Apr 2000 12:55:19 +0000 |
parents | b3e0e515fabf |
children | d907d608745f |
line wrap: on
line diff
--- a/src/slideshow.c Thu Apr 13 12:53:03 2000 +0000 +++ b/src/slideshow.c Thu Apr 13 12:55:19 2000 +0000 @@ -1,6 +1,6 @@ /* * GQview image viewer - * (C)1999 John Ellis + * (C)2000 John Ellis * * Author: John Ellis * @@ -9,6 +9,7 @@ #include "gqview.h" static GList *slide_list = NULL; +static GList *past_slide_list = NULL; static gchar *slide_img = NULL; static gchar *slide_path = NULL; static gint slide_count = 0; @@ -23,6 +24,9 @@ g_list_free(slide_list); slide_list = NULL; + g_list_free(past_slide_list); + past_slide_list = NULL; + g_free(slide_path); slide_path = NULL; @@ -88,6 +92,12 @@ g_list_free(slide_list); } + if (past_slide_list) + { + g_list_free(past_slide_list); + past_slide_list = NULL; + } + if (slideshow_random) { slide_list = generate_random_list(); @@ -98,6 +108,26 @@ } } +static void slideshow_move_list(gint forward) +{ + if (forward) + { + if (slide_list) + { + past_slide_list = g_list_prepend (past_slide_list, slide_list->data); + slide_list = g_list_remove(slide_list, slide_list->data); + } + } + else + { + if (past_slide_list) + { + slide_list = g_list_prepend(slide_list, past_slide_list->data); + past_slide_list = g_list_remove(past_slide_list, past_slide_list->data); + } + } +} + static gint slideshow_should_continue() { if (!slide_active || !slide_list || !slide_path || @@ -112,11 +142,52 @@ return TRUE; } -static gint slideshow_loop_cb(gpointer data) +static gint real_slideshow_prev() { gint row; gchar *buf; + if (!slide_active) return FALSE; + if (!past_slide_list || !past_slide_list->next) return TRUE; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + slideshow_move_list(FALSE); + + row = GPOINTER_TO_INT(past_slide_list->data); + + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + return TRUE; +} + +/* the return is TRUE if slideshow should continue */ +static gint real_slideshow_next() +{ + gint row; + gchar *buf; + + if (!slide_active) return FALSE; + if (!slideshow_should_continue()) { slideshow_free_all(); @@ -129,7 +200,7 @@ g_free(slide_img); slide_img = NULL; buf = file_get_path(row); - slide_list = g_list_remove(slide_list, slide_list->data); + slideshow_move_list(TRUE); if (!slide_list && slideshow_repeat) { @@ -158,6 +229,11 @@ return TRUE; } +static gint slideshow_loop_cb(gpointer data) +{ + return real_slideshow_next(); +} + void slideshow_start() { gint row; @@ -178,7 +254,7 @@ g_free(slide_img); slide_img = NULL; buf = file_get_path(row); - slide_list = g_list_remove(slide_list, slide_list->data); + slideshow_move_list(TRUE); if (slide_sel_list) { @@ -208,6 +284,35 @@ update_status_label(NULL); } +static void slideshow_reset_timeout(gint reset) +{ + if (reset) + { + if (slide_timeout_id != -1) gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL); + } + else + { + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + } +} + +void slideshow_next() +{ + if (!slide_active) return; + slideshow_reset_timeout(real_slideshow_next()); +} + +void slideshow_prev() +{ + if (!slide_active) return; + slideshow_reset_timeout(real_slideshow_prev()); +} + void slideshow_toggle() { if (!slide_active)