Mercurial > geeqie
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 |