11 static GList *slide_list = NULL;
12 static GList *past_slide_list = NULL;
13 static gchar *slide_img = NULL;
14 static gchar *slide_path = NULL;
15 static gint slide_count = 0;
16 static gint slide_active = FALSE;
17 static gint slide_sel_list = FALSE;
18 static gint slide_timeout_id = -1;
20 static void slideshow_free_all()
24 g_list_free(slide_list);
27 g_list_free(past_slide_list);
28 past_slide_list = NULL;
37 slide_sel_list = FALSE;
40 static GList *generate_list()
44 if (file_selection_count() < 2)
47 gint c = file_count();
48 for(i = 0; i < c; i++)
50 list = g_list_prepend(list, GINT_TO_POINTER(i));
52 slide_sel_list = FALSE;
56 GList *work = GTK_CLIST(file_clist)->selection;
59 list = g_list_prepend(list, work->data);
62 slide_sel_list = TRUE;
64 list = g_list_reverse(list);
69 static GList *generate_random_list()
71 GList *src_list = NULL;
75 src_list = generate_list();
79 gint p = (float)rand() / RAND_MAX * g_list_length(src_list);
80 work = g_list_nth(src_list, p);
81 list = g_list_prepend(list, work->data);
82 src_list = g_list_remove(src_list, work->data);
88 static void slideshow_init_list()
92 g_list_free(slide_list);
97 g_list_free(past_slide_list);
98 past_slide_list = NULL;
101 if (slideshow_random)
103 slide_list = generate_random_list();
107 slide_list = generate_list();
111 static void slideshow_move_list(gint forward)
117 past_slide_list = g_list_prepend (past_slide_list, slide_list->data);
118 slide_list = g_list_remove(slide_list, slide_list->data);
125 slide_list = g_list_prepend(slide_list, past_slide_list->data);
126 past_slide_list = g_list_remove(past_slide_list, past_slide_list->data);
131 static gint slideshow_should_continue()
133 if (!slide_active || !slide_list || !slide_path ||
134 slide_count != file_count() ||
135 (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) ||
136 current_path == NULL ||
137 strcmp(current_path, slide_path) != 0)
145 static gint real_slideshow_prev()
150 if (!slide_active) return FALSE;
151 if (!past_slide_list || !past_slide_list->next) return TRUE;
153 if (!slideshow_should_continue())
155 slideshow_free_all();
156 slide_timeout_id = -1;
160 slideshow_move_list(FALSE);
162 row = GPOINTER_TO_INT(past_slide_list->data);
166 buf = file_get_path(row);
170 image_change_to(buf);
171 update_status_label(NULL);
175 file_image_change_to(row);
183 /* the return is TRUE if slideshow should continue */
184 static gint real_slideshow_next()
189 if (!slide_active) return FALSE;
191 if (!slideshow_should_continue())
193 slideshow_free_all();
194 slide_timeout_id = -1;
198 row = GPOINTER_TO_INT(slide_list->data);
202 buf = file_get_path(row);
203 slideshow_move_list(TRUE);
205 if (!slide_list && slideshow_repeat)
207 slideshow_init_list();
212 image_change_to(buf);
213 update_status_label(NULL);
217 file_image_change_to(row);
224 slideshow_free_all();
225 slide_timeout_id = -1;
232 static gint slideshow_loop_cb(gpointer data)
234 return real_slideshow_next();
237 void slideshow_start()
242 if (slide_active) return;
244 if (file_count() < 2) return;
246 slideshow_init_list();
247 if (!slide_list) return;
249 row = GPOINTER_TO_INT(slide_list->data);
252 slide_path = g_strdup(current_path);
253 slide_count = file_count();
256 buf = file_get_path(row);
257 slideshow_move_list(TRUE);
261 image_change_to(buf);
262 update_status_label(NULL);
266 file_image_change_to(row);
271 slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
274 void slideshow_stop()
276 if (!slide_active) return;
278 slideshow_free_all();
279 if (slide_timeout_id != -1)
281 gtk_timeout_remove(slide_timeout_id);
282 slide_timeout_id = -1;
284 update_status_label(NULL);
287 static void slideshow_reset_timeout(gint reset)
291 if (slide_timeout_id != -1) gtk_timeout_remove(slide_timeout_id);
292 slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
296 if (slide_timeout_id != -1)
298 gtk_timeout_remove(slide_timeout_id);
299 slide_timeout_id = -1;
304 void slideshow_next()
306 if (!slide_active) return;
307 slideshow_reset_timeout(real_slideshow_next());
310 void slideshow_prev()
312 if (!slide_active) return;
313 slideshow_reset_timeout(real_slideshow_prev());
316 void slideshow_toggle()
328 gint slideshow_is_running()
330 if (!slide_active) return FALSE;
332 if (!slideshow_should_continue())
334 slideshow_free_all();
335 if (slide_timeout_id != -1)
337 gtk_timeout_remove(slide_timeout_id);
338 slide_timeout_id = -1;