comparison src/slideshow.c @ 1:b3e0e515fabf

Initial revision
author gqview
date Mon, 03 Apr 2000 18:24:05 +0000
parents
children c0e337a01cb7
comparison
equal deleted inserted replaced
0:513c7c01b50c 1:b3e0e515fabf
1 /*
2 * GQview image viewer
3 * (C)1999 John Ellis
4 *
5 * Author: John Ellis
6 *
7 */
8
9 #include "gqview.h"
10
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;
18
19 static void slideshow_free_all()
20 {
21 slide_active = FALSE;
22
23 g_list_free(slide_list);
24 slide_list = NULL;
25
26 g_free(slide_path);
27 slide_path = NULL;
28
29 g_free(slide_img);
30 slide_img = NULL;
31
32 slide_count = 0;
33 slide_sel_list = FALSE;
34 }
35
36 static GList *generate_list()
37 {
38 GList *list = NULL;
39
40 if (file_selection_count() < 2)
41 {
42 gint i;
43 gint c = file_count();
44 for(i = 0; i < c; i++)
45 {
46 list = g_list_prepend(list, GINT_TO_POINTER(i));
47 }
48 slide_sel_list = FALSE;
49 }
50 else
51 {
52 GList *work = GTK_CLIST(file_clist)->selection;
53 while(work)
54 {
55 list = g_list_prepend(list, work->data);
56 work = work->next;
57 }
58 slide_sel_list = TRUE;
59 }
60 list = g_list_reverse(list);
61
62 return list;
63 }
64
65 static GList *generate_random_list()
66 {
67 GList *src_list = NULL;
68 GList *list = NULL;
69 GList *work;
70
71 src_list = generate_list();
72
73 while(src_list)
74 {
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);
79 }
80
81 return list;
82 }
83
84 static void slideshow_init_list()
85 {
86 if (slide_list)
87 {
88 g_list_free(slide_list);
89 }
90
91 if (slideshow_random)
92 {
93 slide_list = generate_random_list();
94 }
95 else
96 {
97 slide_list = generate_list();
98 }
99 }
100
101 static gint slideshow_should_continue()
102 {
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)
108 {
109 return FALSE;
110 }
111
112 return TRUE;
113 }
114
115 static gint slideshow_loop_cb(gpointer data)
116 {
117 gint row;
118 gchar *buf;
119
120 if (!slideshow_should_continue())
121 {
122 slideshow_free_all();
123 slide_timeout_id = -1;
124 return FALSE;
125 }
126
127 row = GPOINTER_TO_INT(slide_list->data);
128
129 g_free(slide_img);
130 slide_img = NULL;
131 buf = file_get_path(row);
132 slide_list = g_list_remove(slide_list, slide_list->data);
133
134 if (!slide_list && slideshow_repeat)
135 {
136 slideshow_init_list();
137 }
138
139 if (slide_sel_list)
140 {
141 image_change_to(buf);
142 update_status_label(NULL);
143 }
144 else
145 {
146 file_image_change_to(row);
147 }
148
149 slide_img = buf;
150
151 if (!slide_list)
152 {
153 slideshow_free_all();
154 slide_timeout_id = -1;
155 return FALSE;
156 }
157
158 return TRUE;
159 }
160
161 void slideshow_start()
162 {
163 gint row;
164 gchar *buf;
165
166 if (slide_active) return;
167
168 if (file_count() < 2) return;
169
170 slideshow_init_list();
171 if (!slide_list) return;
172
173 row = GPOINTER_TO_INT(slide_list->data);
174
175 slide_active = TRUE;
176 slide_path = g_strdup(current_path);
177 slide_count = file_count();
178 g_free(slide_img);
179 slide_img = NULL;
180 buf = file_get_path(row);
181 slide_list = g_list_remove(slide_list, slide_list->data);
182
183 if (slide_sel_list)
184 {
185 image_change_to(buf);
186 update_status_label(NULL);
187 }
188 else
189 {
190 file_image_change_to(row);
191 }
192
193 slide_img = buf;
194
195 slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
196 }
197
198 void slideshow_stop()
199 {
200 if (!slide_active) return;
201
202 slideshow_free_all();
203 if (slide_timeout_id != -1)
204 {
205 gtk_timeout_remove(slide_timeout_id);
206 slide_timeout_id = -1;
207 }
208 update_status_label(NULL);
209 }
210
211 void slideshow_toggle()
212 {
213 if (!slide_active)
214 {
215 slideshow_start();
216 }
217 else
218 {
219 slideshow_stop();
220 }
221 }
222
223 gint slideshow_is_running()
224 {
225 if (!slide_active) return FALSE;
226
227 if (!slideshow_should_continue())
228 {
229 slideshow_free_all();
230 if (slide_timeout_id != -1)
231 {
232 gtk_timeout_remove(slide_timeout_id);
233 slide_timeout_id = -1;
234 }
235 return FALSE;
236 }
237
238 return TRUE;
239 }
240