Mercurial > geeqie
diff src/slideshow.c @ 1:b3e0e515fabf
Initial revision
author | gqview |
---|---|
date | Mon, 03 Apr 2000 18:24:05 +0000 |
parents | |
children | c0e337a01cb7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/slideshow.c Mon Apr 03 18:24:05 2000 +0000 @@ -0,0 +1,240 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static GList *slide_list = NULL; +static gchar *slide_img = NULL; +static gchar *slide_path = NULL; +static gint slide_count = 0; +static gint slide_active = FALSE; +static gint slide_sel_list = FALSE; +static gint slide_timeout_id = -1; + +static void slideshow_free_all() +{ + slide_active = FALSE; + + g_list_free(slide_list); + slide_list = NULL; + + g_free(slide_path); + slide_path = NULL; + + g_free(slide_img); + slide_img = NULL; + + slide_count = 0; + slide_sel_list = FALSE; +} + +static GList *generate_list() +{ + GList *list = NULL; + + if (file_selection_count() < 2) + { + gint i; + gint c = file_count(); + for(i = 0; i < c; i++) + { + list = g_list_prepend(list, GINT_TO_POINTER(i)); + } + slide_sel_list = FALSE; + } + else + { + GList *work = GTK_CLIST(file_clist)->selection; + while(work) + { + list = g_list_prepend(list, work->data); + work = work->next; + } + slide_sel_list = TRUE; + } + list = g_list_reverse(list); + + return list; +} + +static GList *generate_random_list() +{ + GList *src_list = NULL; + GList *list = NULL; + GList *work; + + src_list = generate_list(); + + while(src_list) + { + gint p = (float)rand() / RAND_MAX * g_list_length(src_list); + work = g_list_nth(src_list, p); + list = g_list_prepend(list, work->data); + src_list = g_list_remove(src_list, work->data); + } + + return list; +} + +static void slideshow_init_list() +{ + if (slide_list) + { + g_list_free(slide_list); + } + + if (slideshow_random) + { + slide_list = generate_random_list(); + } + else + { + slide_list = generate_list(); + } +} + +static gint slideshow_should_continue() +{ + if (!slide_active || !slide_list || !slide_path || + slide_count != file_count() || + (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) || + current_path == NULL || + strcmp(current_path, slide_path) != 0) + { + return FALSE; + } + + return TRUE; +} + +static gint slideshow_loop_cb(gpointer data) +{ + gint row; + gchar *buf; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + row = GPOINTER_TO_INT(slide_list->data); + + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (!slide_list && slideshow_repeat) + { + slideshow_init_list(); + } + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + if (!slide_list) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + return TRUE; +} + +void slideshow_start() +{ + gint row; + gchar *buf; + + if (slide_active) return; + + if (file_count() < 2) return; + + slideshow_init_list(); + if (!slide_list) return; + + row = GPOINTER_TO_INT(slide_list->data); + + slide_active = TRUE; + slide_path = g_strdup(current_path); + slide_count = file_count(); + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL); +} + +void slideshow_stop() +{ + if (!slide_active) return; + + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + update_status_label(NULL); +} + +void slideshow_toggle() +{ + if (!slide_active) + { + slideshow_start(); + } + else + { + slideshow_stop(); + } +} + +gint slideshow_is_running() +{ + if (!slide_active) return FALSE; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + return FALSE; + } + + return TRUE; +} +