annotate src/slideshow.c @ 1:b3e0e515fabf

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