11 static GList *slide_list = NULL;
12 static gchar *slide_img = NULL;
13 static gchar *slide_path = NULL;
14 static gint slide_count = 0;
15 static gint slide_active = FALSE;
16 static gint slide_sel_list = FALSE;
17 static gint slide_timeout_id = -1;
19 static void slideshow_free_all()
23 g_list_free(slide_list);
33 slide_sel_list = FALSE;
36 static GList *generate_list()
40 if (file_selection_count() < 2)
43 gint c = file_count();
44 for(i = 0; i < c; i++)
46 list = g_list_prepend(list, GINT_TO_POINTER(i));
48 slide_sel_list = FALSE;
52 GList *work = GTK_CLIST(file_clist)->selection;
55 list = g_list_prepend(list, work->data);
58 slide_sel_list = TRUE;
60 list = g_list_reverse(list);
65 static GList *generate_random_list()
67 GList *src_list = NULL;
71 src_list = generate_list();
75 gint p = (float)rand() / RAND_MAX * g_list_length(src_list);
76 work = g_list_nth(src_list, p);
77 list = g_list_prepend(list, work->data);
78 src_list = g_list_remove(src_list, work->data);
84 static void slideshow_init_list()
88 g_list_free(slide_list);
93 slide_list = generate_random_list();
97 slide_list = generate_list();
101 static gint slideshow_should_continue()
103 if (!slide_active || !slide_list || !slide_path ||
104 slide_count != file_count() ||
105 (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) ||
106 current_path == NULL ||
107 strcmp(current_path, slide_path) != 0)
115 static gint slideshow_loop_cb(gpointer data)
120 if (!slideshow_should_continue())
122 slideshow_free_all();
123 slide_timeout_id = -1;
127 row = GPOINTER_TO_INT(slide_list->data);
131 buf = file_get_path(row);
132 slide_list = g_list_remove(slide_list, slide_list->data);
134 if (!slide_list && slideshow_repeat)
136 slideshow_init_list();
141 image_change_to(buf);
142 update_status_label(NULL);
146 file_image_change_to(row);
153 slideshow_free_all();
154 slide_timeout_id = -1;
161 void slideshow_start()
166 if (slide_active) return;
168 if (file_count() < 2) return;
170 slideshow_init_list();
171 if (!slide_list) return;
173 row = GPOINTER_TO_INT(slide_list->data);
176 slide_path = g_strdup(current_path);
177 slide_count = file_count();
180 buf = file_get_path(row);
181 slide_list = g_list_remove(slide_list, slide_list->data);
185 image_change_to(buf);
186 update_status_label(NULL);
190 file_image_change_to(row);
195 slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
198 void slideshow_stop()
200 if (!slide_active) return;
202 slideshow_free_all();
203 if (slide_timeout_id != -1)
205 gtk_timeout_remove(slide_timeout_id);
206 slide_timeout_id = -1;
208 update_status_label(NULL);
211 void slideshow_toggle()
223 gint slideshow_is_running()
225 if (!slide_active) return FALSE;
227 if (!slideshow_should_continue())
229 slideshow_free_all();
230 if (slide_timeout_id != -1)
232 gtk_timeout_remove(slide_timeout_id);
233 slide_timeout_id = -1;