annotate src/filelist.c @ 277:9de0f88b2b91

Add support for some Samsung raw files (.pef). Samsung raw not strongly differ from Pentax raw. The only difference in header (manufacturer, camera name and etc). Tested on Samsung GX-1S and Pentax *ist DS. Patch by Max Lushnikov.
author zas_
date Tue, 08 Apr 2008 22:05:04 +0000
parents 4f526d436873
children 9995c5fb202a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
196
f6e307c7bad6 rename GQview -> Geeqie over the code
nadvornik
parents: 188
diff changeset
2 * Geeqie
79
528e3432e0c0 Thu Oct 19 07:23:37 2006 John Ellis <johne@verizon.net>
gqview
parents: 53
diff changeset
3 * (C) 2006 John Ellis
1
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 *
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
7 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
8 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
9 * This software comes with no warranty of any kind, use at your own risk!
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
12
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
13 #include "gqview.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
14 #include "filelist.h"
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
16 #include "cache.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
17 #include "rcfile.h"
79
528e3432e0c0 Thu Oct 19 07:23:37 2006 John Ellis <johne@verizon.net>
gqview
parents: 53
diff changeset
18 #include "thumb_standard.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
19 #include "ui_fileops.h"
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 * file filtering
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
28 static GList *filter_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
29 static GList *extension_list = NULL;
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
30 static GList *sidecar_ext_list = NULL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
31
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
32 static GList *file_class_extension_list[FILE_FORMAT_CLASSES];
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
33
240
cce347409480 Fix two more gcc warnings related to function declarations.
zas_
parents: 217
diff changeset
34 static gint sidecar_file_priority(const gchar *path);
cce347409480 Fix two more gcc warnings related to function declarations.
zas_
parents: 217
diff changeset
35
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
36
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
37 gint ishidden(const gchar *name)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 if (name[0] != '.') return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
44 static FilterEntry *filter_entry_new(const gchar *key, const gchar *description,
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
45 const gchar *extensions, FileFormatClass file_class, gint enabled)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
46 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
47 FilterEntry *fe;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
48
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
49 fe = g_new0(FilterEntry, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
50 fe->key = g_strdup(key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
51 fe->description = g_strdup(description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
52 fe->extensions = g_strdup(extensions);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
53 fe->enabled = enabled;
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
54 fe->file_class = file_class;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
55
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
56 return fe;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
57 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
58
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
59 static void filter_entry_free(FilterEntry *fe)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
60 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
61 if (!fe) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
62
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
63 g_free(fe->key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
64 g_free(fe->description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
65 g_free(fe->extensions);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
66 g_free(fe);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
67 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
68
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
69 GList *filter_get_list(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
70 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
71 return filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
72 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
73
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
74 void filter_remove_entry(FilterEntry *fe)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
75 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
76 if (!g_list_find(filter_list, fe)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
77
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
78 filter_list = g_list_remove(filter_list, fe);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
79 filter_entry_free(fe);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
80 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
81
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
82 static gint filter_key_exists(const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
83 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
84 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
85
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
86 if (!key) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
87
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
88 work = filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
89 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
90 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
91 FilterEntry *fe = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
92 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
93
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
94 if (strcmp(fe->key, key) == 0) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
95 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
96
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
97 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
98 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
99
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
100 void filter_add(const gchar *key, const gchar *description, const gchar *extensions, FileFormatClass file_class, gint enabled)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
101 {
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
102 filter_list = g_list_append(filter_list, filter_entry_new(key, description, extensions, file_class, enabled));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
103 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
104
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
105 void filter_add_unique(const gchar *description, const gchar *extensions, FileFormatClass file_class, gint enabled)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
106 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
107 gchar *key;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
108 gint n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
109
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
110 key = g_strdup("user0");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
111 n = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
112 while (filter_key_exists(key))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
113 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
114 g_free(key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
115 if (n > 999) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
116 key = g_strdup_printf("user%d", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
117 n++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
118 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
119
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
120 filter_add(key, description, extensions, file_class, enabled);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
121 g_free(key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
122 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
123
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
124 static void filter_add_if_missing(const gchar *key, const gchar *description, const gchar *extensions, FileFormatClass file_class, gint enabled)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
125 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
126 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
127
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
128 if (!key) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
129
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
130 work = filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
131 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
132 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
133 FilterEntry *fe = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
134 work = work->next;
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
135 if (fe->key && strcmp(fe->key, key) == 0)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
136 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
137 if (fe->file_class == FORMAT_CLASS_UNKNOWN)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
138 fe->file_class = file_class; /* for compatibility */
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
139 return;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
140 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
141 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
142
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
143 filter_add(key, description, extensions, file_class, enabled);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
144 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
145
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
146 void filter_reset(void)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148 GList *work;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
149
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
150 work = filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
151 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
152 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
153 FilterEntry *fe = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
154 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
155 filter_entry_free(fe);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
156 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
157
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
158 g_list_free(filter_list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
159 filter_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
160 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
161
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
162 void filter_add_defaults(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
163 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
164 GSList *list, *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
165
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
166 list = gdk_pixbuf_get_formats();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
167 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
168 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
169 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
170 GdkPixbufFormat *format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
171 gchar *name;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
172 gchar *desc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
173 gchar **extensions;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
174 GString *filter = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
175 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
176
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
177 format = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
178 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
179
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
180 name = gdk_pixbuf_format_get_name(format);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
181 desc = gdk_pixbuf_format_get_description(format);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
182 extensions = gdk_pixbuf_format_get_extensions(format);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
183
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
184 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
185 while (extensions[i])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
186 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
187 if (!filter)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
188 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
189 filter = g_string_new(".");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
190 filter = g_string_append(filter, extensions[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
191 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
192 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
193 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
194 filter = g_string_append(filter, ";.");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
195 filter = g_string_append(filter, extensions[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
196 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
197 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
198 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
199
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
200 if (debug) printf("loader reported [%s] [%s] [%s]\n", name, desc, filter->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
201
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
202 filter_add_if_missing(name, desc, filter->str, FORMAT_CLASS_IMAGE, TRUE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
203
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
204 g_free(name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
205 g_free(desc);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
206 g_strfreev(extensions);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
207 g_string_free(filter, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
208 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
209 g_slist_free(list);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
211 /* add defaults even if gdk-pixbuf does not have them, but disabled */
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
212 filter_add_if_missing("jpeg", "JPEG group", ".jpg;.jpeg;.jpe", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
213 filter_add_if_missing("png", "Portable Network Graphic", ".png", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
214 filter_add_if_missing("tiff", "Tiff", ".tif;.tiff", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
215 filter_add_if_missing("pnm", "Packed Pixel formats", ".pbm;.pgm;.pnm;.ppm", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
216 filter_add_if_missing("gif", "Graphics Interchange Format", ".gif", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
217 filter_add_if_missing("xbm", "X bitmap", ".xbm", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
218 filter_add_if_missing("xpm", "X pixmap", ".xpm", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
219 filter_add_if_missing("bmp", "Bitmap", ".bmp", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
220 filter_add_if_missing("ico", "Icon file", ".ico;.cur", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
221 filter_add_if_missing("ras", "Raster", ".ras", FORMAT_CLASS_IMAGE, FALSE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
222 filter_add_if_missing("svg", "Scalable Vector Graphics", ".svg", FORMAT_CLASS_IMAGE, FALSE);
202
f95654aeec4b added all possible raw extensions that I could find
nadvornik
parents: 196
diff changeset
223
f95654aeec4b added all possible raw extensions that I could find
nadvornik
parents: 196
diff changeset
224 /* non-image files that might be desirable to show */
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
225 filter_add_if_missing("xmp", "XMP sidecar", ".xmp", FORMAT_CLASS_META, TRUE);
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 15
diff changeset
226
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 15
diff changeset
227 /* These are the raw camera formats with embedded jpeg/exif.
202
f95654aeec4b added all possible raw extensions that I could find
nadvornik
parents: 196
diff changeset
228 * (see format_raw.c and/or exiv2.cc)
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 15
diff changeset
229 */
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
230 filter_add_if_missing("arw", "Sony raw format", ".arw;.srf;.sr2", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
231 filter_add_if_missing("crw", "Canon raw format", ".crw;.cr2", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
232 filter_add_if_missing("kdc", "Kodak raw format", ".kdc;.dcr", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
233 filter_add_if_missing("raf", "Fujifilm raw format", ".raf", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
234 filter_add_if_missing("mef", "Mamiya raw format", ".mef;.mos", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
235 filter_add_if_missing("mrw", "Minolta raw format", ".mrw", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
236 filter_add_if_missing("nef", "Nikon raw format", ".nef", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
237 filter_add_if_missing("orf", "Olympus raw format", ".orf", FORMAT_CLASS_RAWIMAGE, TRUE);
277
9de0f88b2b91 Add support for some Samsung raw files (.pef).
zas_
parents: 276
diff changeset
238 filter_add_if_missing("pef", "Pentax or Samsung raw format", ".pef;.ptx", FORMAT_CLASS_RAWIMAGE, TRUE);
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
239 filter_add_if_missing("dng", "Adobe Digital Negative raw format", ".dng", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
240 filter_add_if_missing("x3f", "Sigma raw format", ".x3f", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
241 filter_add_if_missing("raw", "Panasonic raw format", ".raw", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
242 filter_add_if_missing("r3d", "Red raw format", ".r3d", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
243 filter_add_if_missing("3fr", "Hasselblad raw format", ".3fr", FORMAT_CLASS_RAWIMAGE, TRUE);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
244 filter_add_if_missing("erf", "Epson raw format", ".erf", FORMAT_CLASS_RAWIMAGE, TRUE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
245 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
246
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 146
diff changeset
247 GList *filter_to_list(const gchar *extensions)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
248 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
249 GList *list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
250 const gchar *p;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
251
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
252 if (!extensions) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
253
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
254 p = extensions;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
255 while (*p != '\0')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
256 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
257 const gchar *b;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
258 gint l = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
259
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
260 b = p;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
261 while (*p != '\0' && *p != ';')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
262 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
263 p++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
264 l++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
265 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
266 list = g_list_append(list, g_strndup(b, l));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
267 if (*p == ';') p++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
268 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
269
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
270 return list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
271 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
272
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
273 void filter_rebuild(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
274 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
275 GList *work;
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
276 gint i;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
277
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
278 string_list_free(extension_list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
279 extension_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
280
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
281 for (i = 0; i < FILE_FORMAT_CLASSES; i++)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
282 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
283 string_list_free(file_class_extension_list[i]);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
284 file_class_extension_list[i] = NULL;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
285 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
286
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
287 work = filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
288 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
289 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
290 FilterEntry *fe;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
291
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
292 fe = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
293 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
294
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
295 if (fe->enabled)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
296 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
297 GList *ext;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
298
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
299 ext = filter_to_list(fe->extensions);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
300 if (ext) extension_list = g_list_concat(extension_list, ext);
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
301
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
302 if (fe->file_class >= 0 && fe->file_class < FILE_FORMAT_CLASSES)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
303 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
304 ext = filter_to_list(fe->extensions);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
305 if (ext) file_class_extension_list[fe->file_class] = g_list_concat(file_class_extension_list[fe->file_class], ext);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
306 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
307 else
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
308 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
309 printf("WARNING: invalid file class %d\n", fe->file_class);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
310 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
311 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
312 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
313 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
314
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
315 gint filter_name_exists(const gchar *name)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
316 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
317 GList *work;
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
318 gint ln;
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
319
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
320 if (!extension_list || file_filter_disable) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
321
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
322 ln = strlen(name);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
323 work = extension_list;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326 gchar *filter = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 gint lf = strlen(filter);
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
328
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 if (ln >= lf)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331 if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
339 gint filter_file_class(const gchar *name, FileFormatClass file_class)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
340 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
341 GList *work;
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
342 gint ln;
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
343
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
344 if (file_class < 0 || file_class >= FILE_FORMAT_CLASSES)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
345 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
346 printf("WARNING: invalid file class %d\n", file_class);
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
347 return FALSE;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
348 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
349
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
350 ln = strlen(name);
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
351 work = file_class_extension_list[file_class];
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
352 while (work)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
353 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
354 gchar *filter = work->data;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
355 gint lf = strlen(filter);
215
f2b439c7f973 Move strlen() calls outside the while loop.
zas_
parents: 212
diff changeset
356
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
357 if (ln >= lf)
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
358 {
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
359 if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
360 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
361 work = work->next;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
362 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
363
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
364 return FALSE;
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
365 }
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
366
276
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
367 void filter_write_list(SecureSaveInfo *ssi)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
368 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
369 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
370
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
371 work = filter_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
372 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
373 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
374 FilterEntry *fe = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
375 work = work->next;
217
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
376
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
377 gchar *extensions = escquote_value(fe->extensions);
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
378 gchar *description = escquote_value(fe->description);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
379
276
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
380 secure_fprintf(ssi, "filter_ext: \"%s%s\" %s %s\n",
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
381 (fe->enabled) ? "" : "#",
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
382 fe->key, extensions, description);
217
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
383 g_free(extensions);
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
384 g_free(description);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
385 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
386 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
387
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
388 void filter_parse(const gchar *text)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
389 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
390 const gchar *p;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
391 gchar *key;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
392 gchar *ext;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
393 gchar *desc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
394 gint enabled = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
395
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
396 if (!text || text[0] != '"') return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
397
217
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
398 key = quoted_value(text, &p);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
399 if (!key) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
400
217
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
401 ext = quoted_value(p, &p);
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
402 desc = quoted_value(p, &p);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
403
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
404 if (key && key[0] == '#')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
405 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
406 gchar *tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
407 tmp = g_strdup(key + 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
408 g_free(key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
409 key = tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
410
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
411 enabled = FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
412 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 202
diff changeset
414 if (key && strlen(key) > 0 && ext) filter_add(key, desc, ext, FORMAT_CLASS_UNKNOWN, enabled);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
415
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
416 g_free(key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
417 g_free(ext);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
418 g_free(desc);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
419 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
420
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
421 GList *path_list_filter(GList *list, gint is_dir_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
422 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
423 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
424
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
425 if (!is_dir_list && file_filter_disable && show_dot_files) return list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
426
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
427 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
428 while (work)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
429 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
430 gchar *name = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
431 const gchar *base;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
432
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
433 base = filename_from_path(name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
434
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
435 if ((!show_dot_files && ishidden(base)) ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
436 (!is_dir_list && !filter_name_exists(base)) ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
437 (is_dir_list && base[0] == '.' && (strcmp(base, GQVIEW_CACHE_LOCAL_THUMB) == 0 ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
438 strcmp(base, GQVIEW_CACHE_LOCAL_METADATA) == 0)) )
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
439 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
440 GList *link = work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
441 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
442 list = g_list_remove_link(list, link);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
443 g_free(name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
444 g_list_free(link);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
445 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
446 else
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
447 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
448 work = work->next;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
449 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
450 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
451
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
452 return list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
453 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
454
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
455
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
456 /*
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
457 *-----------------------------------------------------------------------------
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
458 * sidecar extension list
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
459 *-----------------------------------------------------------------------------
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
460 */
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
461
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
462 static GList *sidecar_ext_get_list(void)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
463 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
464 return sidecar_ext_list;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
465 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
466
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
467 void sidecar_ext_parse(const gchar *text, gint quoted)
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
468 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
469 GList *work;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
470 gchar *value;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
471
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
472 work = sidecar_ext_list;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
473 while (work)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
474 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
475 gchar *ext = work->data;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
476 work = work->next;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
477 g_free(ext);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
478 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
479 g_list_free(sidecar_ext_list);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
480 sidecar_ext_list = NULL;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
481
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
482 if (quoted)
217
5bdab7ed4bcd use quoted_value everywhere
nadvornik
parents: 215
diff changeset
483 value = quoted_value(text, NULL);
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
484 else
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
485 value = g_strdup(text);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
486
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
487 if (value == NULL) return;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
488
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
489 sidecar_ext_list = filter_to_list(value);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
490
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
491 g_free(value);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
492 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
493
276
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
494 void sidecar_ext_write(SecureSaveInfo *ssi)
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
495 {
276
4f526d436873 Implement secure rc file saving.
zas_
parents: 248
diff changeset
496 secure_fprintf(ssi, "\nsidecar_ext: \"%s\"\n", sidecar_ext_to_string());
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
497 }
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
498
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
499 char *sidecar_ext_to_string()
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
500 {
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
501 GList *work;
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
502 GString *str = g_string_new("");
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
503
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
504 work = sidecar_ext_list;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
505 while (work)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
506 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
507 gchar *ext = work->data;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
508 work = work->next;
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
509 g_string_append(str, ext);
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
510 if (work) g_string_append(str, ";");
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
511 }
170
9a56e3d13e67 basic sidecar files configuration via preferences dialog
nadvornik
parents: 167
diff changeset
512 return g_string_free(str, FALSE);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
513 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
514
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
515 void sidecar_ext_add_defaults()
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
516 {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 172
diff changeset
517 sidecar_ext_parse(".jpg;.cr2;.nef;.crw;.xmp", FALSE);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
518 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
519
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
520 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
521 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
522 * path list recursive
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
523 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
524 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
525
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
526 static gint path_list_sort_cb(gconstpointer a, gconstpointer b)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
527 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
528 return CASE_SORT((gchar *)a, (gchar *)b);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
529 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
530
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
531 GList *path_list_sort(GList *list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
532 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
533 return g_list_sort(list, path_list_sort_cb);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
534 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
535
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
536 static void path_list_recursive_append(GList **list, GList *dirs)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
537 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
538 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
539
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
540 work = dirs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
541 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
542 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
543 const gchar *path = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
544 GList *f = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
545 GList *d = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
546
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
547 if (path_list(path, &f, &d))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
548 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
549 f = path_list_filter(f, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
550 f = path_list_sort(f);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
551 *list = g_list_concat(*list, f);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
552
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
553 d = path_list_filter(d, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
554 d = path_list_sort(d);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
555 path_list_recursive_append(list, d);
52
a210a19f26da Sun Jun 5 03:05:39 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
556 path_list_free(d);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
557 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
558
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
559 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
560 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
561 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
562
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
563 GList *path_list_recursive(const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
564 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
565 GList *list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
566 GList *d = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
567
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
568 if (!path_list(path, &list, &d)) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
569 list = path_list_filter(list, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
570 list = path_list_sort(list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
571
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
572 d = path_list_filter(d, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
573 d = path_list_sort(d);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
574 path_list_recursive_append(&list, d);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
575 path_list_free(d);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
576
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
577 return list;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
578 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
579
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
580 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
581 *-----------------------------------------------------------------------------
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
582 * text conversion utils
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
583 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
584 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
585
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
586 gchar *text_from_size(gint64 size)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
587 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
588 gchar *a, *b;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
589 gchar *s, *d;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
590 gint l, n, i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
591
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
592 /* what I would like to use is printf("%'d", size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
593 * BUT: not supported on every libc :(
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
594 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
595 if (size > G_MAXUINT)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
596 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
597 /* the %lld conversion is not valid in all libcs, so use a simple work-around */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
598 a = g_strdup_printf("%d%09d", (guint)(size / 1000000000), (guint)(size % 1000000000));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
599 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
600 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
601 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
602 a = g_strdup_printf("%d", (guint)size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
603 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
604 l = strlen(a);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
605 n = (l - 1)/ 3;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
606 if (n < 1) return a;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
607
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
608 b = g_new(gchar, l + n + 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
609
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
610 s = a;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
611 d = b;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
612 i = l - n * 3;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
613 while (*s != '\0')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
614 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
615 if (i < 1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
616 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
617 i = 3;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
618 *d = ',';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
619 d++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
620 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
621
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
622 *d = *s;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
623 s++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
624 d++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
625 i--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
626 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
627 *d = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
628
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
629 g_free(a);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
630 return b;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
631 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
632
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
633 gchar *text_from_size_abrev(gint64 size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
634 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
635 if (size < (gint64)1024)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
636 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
637 return g_strdup_printf(_("%d bytes"), (gint)size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
638 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
639 if (size < (gint64)1048576)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
640 {
15
3263965d5f9e ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
641 return g_strdup_printf(_("%.1f K"), (double)size / 1024.0);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
642 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
643 if (size < (gint64)1073741824)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
644 {
15
3263965d5f9e ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
645 return g_strdup_printf(_("%.1f MB"), (double)size / 1048576.0);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
646 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
647
15
3263965d5f9e ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
648 /* to avoid overflowing the double, do division in two steps */
3263965d5f9e ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
649 size /= 1048576;
3263965d5f9e ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
650 return g_strdup_printf(_("%.1f GB"), (double)size / 1024.0);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
651 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
652
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
653 /* note: returned string is valid until next call to text_from_time() */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
654 const gchar *text_from_time(time_t t)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
655 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
656 static gchar *ret = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
657 gchar buf[128];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
658 gint buflen;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
659 struct tm *btime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
660 GError *error = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
661
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
662 btime = localtime(&t);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
663
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
664 /* the %x warning about 2 digit years is not an error */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
665 buflen = strftime(buf, sizeof(buf), "%x %H:%M", btime);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
666 if (buflen < 1) return "";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
667
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
668 g_free(ret);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
669 ret = g_locale_to_utf8(buf, buflen, NULL, NULL, &error);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
670 if (error)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
671 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
672 printf("Error converting locale strftime to UTF-8: %s\n", error->message);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
673 g_error_free(error);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
674 return "";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
675 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
676
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
677 return ret;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
678 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
679
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
680 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
681 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
682 * file info struct
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
683 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
684 */
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
685
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
686 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source);
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
687 static void file_data_check_sidecars(FileData *fd);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
688 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
689
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
690
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
691 static void file_data_set_path(FileData *fd, const gchar *path)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
692 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
693
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
694 if (strcmp(path, "/") == 0)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
695 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
696 fd->path = g_strdup(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
697 fd->name = fd->path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
698 fd->extension = fd->name + 1;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
699 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
700 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
701
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
702 fd->path = g_strdup(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
703 fd->name = filename_from_path(fd->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
704
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
705 if (strcmp(fd->name, "..") == 0)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
706 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
707 gchar *dir = remove_level_from_path(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
708 g_free(fd->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
709 fd->path = remove_level_from_path(dir);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
710 g_free(dir);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
711 fd->name = "..";
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
712 fd->extension = fd->name + 2;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
713 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
714 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
715 else if (strcmp(fd->name, ".") == 0)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
716 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
717 g_free(fd->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
718 fd->path = remove_level_from_path(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
719 fd->name = ".";
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
720 fd->extension = fd->name + 1;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
721 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
722 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
723
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
724 fd->extension = extension_from_path(fd->path);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
725 if (fd->extension == NULL)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
726 fd->extension = fd->name + strlen(fd->name);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
727 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
728
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
729 static void file_data_check_changed_files(FileData *fd, struct stat *st)
164
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
730 {
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
731 GList *work;
164
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
732 if (fd->size != st->st_size ||
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
733 fd->date != st->st_mtime)
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
734 {
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
735 fd->size = st->st_size;
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
736 fd->date = st->st_mtime;
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
737 if (fd->pixbuf) g_object_unref(fd->pixbuf);
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
738 fd->pixbuf = NULL;
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
739 }
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
740
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
741 work = fd->sidecar_files;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
742 while (work)
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
743 {
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
744 FileData *sfd = work->data;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
745 struct stat st;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
746
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
747 if (!stat_utf8(sfd->path, &st))
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
748 {
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
749 file_data_disconnect_sidecar_file(fd, sfd);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
750 }
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
751
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
752 file_data_check_changed_files(sfd, &st);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
753 work = work->next;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
754 }
164
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
755 }
f8bd5d49eed8 update FileData on file change
nadvornik
parents: 148
diff changeset
756
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
757 static GHashTable *file_data_pool = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
758
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
759 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
760 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
761 FileData *fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
762
172
d18b94f1ca80 debug messages cleanup
nadvornik
parents: 170
diff changeset
763 if (debug) printf("file_data_new: '%s' %d\n", path_utf8, check_sidecars);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
764
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
765 if (!file_data_pool)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
766 file_data_pool = g_hash_table_new (g_str_hash, g_str_equal);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
767
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
768 fd = g_hash_table_lookup(file_data_pool, path_utf8);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
769 if (fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
770 {
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
771 file_data_check_changed_files(fd, st);
172
d18b94f1ca80 debug messages cleanup
nadvornik
parents: 170
diff changeset
772 if (debug) printf("file_data_pool hit: '%s'\n", fd->path);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
773 return file_data_ref(fd);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
774 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
775
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
776 fd = g_new0(FileData, 1);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
777
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
778 file_data_set_path(fd, path_utf8);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
779
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
780 fd->original_path = g_strdup(path_utf8);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
781 fd->size = st->st_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
782 fd->date = st->st_mtime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
783 fd->pixbuf = NULL;
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
784 fd->sidecar_files = NULL;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
785 fd->ref = 1;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
786 fd->magick = 0x12345678;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
787
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
788 g_hash_table_insert(file_data_pool, fd->original_path, fd);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
789
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
790 if (check_sidecars && sidecar_file_priority(fd->extension))
146
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
791 file_data_check_sidecars(fd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
792 return fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
793 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
794
146
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
795 static void file_data_check_sidecars(FileData *fd)
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
796 {
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
797 int base_len = fd->extension - fd->path;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
798 GString *fname = g_string_new_len(fd->path, base_len);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
799 FileData *parent_fd = NULL;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
800 GList *work = sidecar_ext_get_list();
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
801 while (work)
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
802 {
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
803 /* check for possible sidecar files;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
804 the sidecar files created here are referenced only via fd->sidecar_files or fd->parent,
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
805 they have fd->ref set to 0 and file_data unref must chack and free them all together
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
806 (using fd->ref would cause loops and leaks)
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
807 */
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
808
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
809 FileData *new_fd;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
810
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
811 gchar *ext = work->data;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
812 work = work->next;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
813
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
814 if (strcmp(ext, fd->extension) == 0)
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
815 {
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
816 new_fd = fd; /* processing the original file */
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
817 }
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
818 else
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
819 {
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
820 struct stat nst;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
821 g_string_truncate(fname, base_len);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
822 g_string_append(fname, ext);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
823
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
824 if (!stat_utf8(fname->str, &nst))
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
825 continue;
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
826
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
827 new_fd = file_data_new(fname->str, &nst, FALSE);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
828 new_fd->ref--; /* do not use ref here */
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
829 }
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
830
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
831 if (!parent_fd)
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
832 parent_fd = new_fd; /* parent is the one with the highest prio, found first */
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
833 else
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
834 file_data_merge_sidecar_files(parent_fd, new_fd);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
835 }
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
836 g_string_free(fname, TRUE);
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
837 }
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
838
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
839
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
840 static FileData *file_data_new_local(const gchar *path, struct stat *st, gboolean check_sidecars)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
841 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
842 gchar *path_utf8 = path_to_utf8(path);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
843 FileData *ret = file_data_new(path_utf8, st, check_sidecars);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
844 g_free(path_utf8);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
845 return ret;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
846 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
847
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
848 FileData *file_data_new_simple(const gchar *path_utf8)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
849 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
850 struct stat st;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
851
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
852 if (!stat_utf8(path_utf8, &st))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
853 {
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
854 st.st_size = 0;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
855 st.st_mtime = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
856 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
857
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
858 return file_data_new(path_utf8, &st, TRUE);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
859 }
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
860
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
861 FileData *file_data_add_sidecar_file(FileData *target, FileData *sfd)
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
862 {
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
863 sfd->parent = target;
146
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
864 if(!g_list_find(target->sidecar_files, sfd))
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
865 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
866 return target;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
867 }
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
868
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
869
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
870 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
871 {
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
872 GList *work;
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
873 file_data_add_sidecar_file(target, source);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
874
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
875 work = source->sidecar_files;
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
876 while (work)
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
877 {
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
878 FileData *sfd = work->data;
146
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
879 file_data_add_sidecar_file(target, sfd);
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
880 work = work->next;
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
881 }
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
882
146
e8285b0c0c7d prevent duplicate sidecar files; code cleanup
nadvornik
parents: 145
diff changeset
883 g_list_free(source->sidecar_files);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
884 source->sidecar_files = NULL;
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
885
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
886 target->sidecar_files = filelist_sort(target->sidecar_files, SORT_NAME, TRUE);
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
887 return target;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
888 }
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
889
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
890
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
891
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
892 FileData *file_data_ref(FileData *fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
893 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
894 if (fd == NULL) return NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
895
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
896 // return g_memdup(fd, sizeof(FileData));
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
897 g_assert(fd->magick == 0x12345678);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
898 fd->ref++;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
899 return fd;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
900 }
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
901
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
902 static void file_data_free(FileData *fd)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
903 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
904 g_assert(fd->magick == 0x12345678);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
905 g_assert(fd->ref == 0);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
906
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
907 g_hash_table_remove(file_data_pool, fd->original_path);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
908
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
909 g_free(fd->path);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
910 g_free(fd->original_path);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
911 if (fd->pixbuf) g_object_unref(fd->pixbuf);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
912
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
913
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
914 g_assert(fd->sidecar_files == NULL); /* sidecar files must be freed before calling this */
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
915
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
916 file_data_change_info_free(NULL, fd);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
917 g_free(fd);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
918 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
919
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
920 void file_data_unref(FileData *fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
921 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
922 if (fd == NULL) return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
923 g_assert(fd->magick == 0x12345678);
172
d18b94f1ca80 debug messages cleanup
nadvornik
parents: 170
diff changeset
924 if (debug) printf("file_data_unref: '%s'\n", fd->path);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
925 fd->ref--;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
926 if (fd->ref == 0)
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
927 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
928 FileData *parent = fd->parent ? fd->parent : fd;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
929
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
930 GList *work;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
931
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
932 if (parent->ref > 0)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
933 return;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
934
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
935 work = parent->sidecar_files;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
936 while (work)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
937 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
938 FileData *sfd = work->data;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
939 if (sfd->ref > 0)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
940 return;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
941 work = work->next;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
942 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
943
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
944 /* none of parent/children is referenced, we can free everything */
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
945
172
d18b94f1ca80 debug messages cleanup
nadvornik
parents: 170
diff changeset
946 if (debug) printf("file_data_unref: deleting '%s', parent '%s'\n", fd->path, parent->path);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
947
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
948 work = parent->sidecar_files;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
949 while (work)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
950 {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
951 FileData *sfd = work->data;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
952 file_data_free(sfd);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
953 work = work->next;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
954 }
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
955
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
956 g_list_free(parent->sidecar_files);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
957 parent->sidecar_files = NULL;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
958
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
959 file_data_free(parent);
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
960
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
961 }
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
962 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
963
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
964 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd)
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
965 {
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
966 sfd->parent = target;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
967 g_assert(g_list_find(target->sidecar_files, sfd));
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
968
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
969 target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
970 sfd->parent = NULL;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
971
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
972 if (sfd->ref == 0) {
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
973 file_data_free(sfd);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
974 return NULL;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
975 }
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
976
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
977 return sfd;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
978 }
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
979
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
980 /* compare name without extension */
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
981 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2)
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
982 {
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
983 size_t len1 = fd1->extension - fd1->name;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
984 size_t len2 = fd2->extension - fd2->name;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
985
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
986 if (len1 < len2) return -1;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
987 if (len1 > len2) return 1;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
988
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
989 return strncmp(fd1->name, fd2->name, len1);
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
990 }
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
991
240
cce347409480 Fix two more gcc warnings related to function declarations.
zas_
parents: 217
diff changeset
992 void file_data_do_change(FileData *fd)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
993 {
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
994 //FIXME sidecars
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
995 g_assert(fd->change);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
996 g_free(fd->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
997 g_hash_table_remove(file_data_pool, fd->original_path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
998 g_free(fd->original_path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
999 file_data_set_path(fd, fd->change->dest);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1000 fd->original_path = g_strdup(fd->change->dest);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1001 g_hash_table_insert(file_data_pool, fd->original_path, fd);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1002
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1003 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1004
143
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1005 gboolean file_data_add_change_info(FileData *fd, FileDataChangeType type, const gchar *src, const gchar *dest)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1006 {
143
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1007
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1008 FileDataChangeInfo *fdci;
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1009
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1010 if (fd->change) return FALSE;
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1011
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1012 fdci = g_new0(FileDataChangeInfo, 1);
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1013
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1014 fdci->type = type;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1015
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1016 if (src)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1017 fdci->source = g_strdup(src);
143
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1018 else
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1019 fdci->source = g_strdup(fd->path);
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1020
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1021 if (dest)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1022 fdci->dest = g_strdup(dest);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1023
143
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1024 fd->change = fdci;
0d1bf3ac6cd8 improved FileDataChangeInfo structure, check for another file operation in progress
nadvornik
parents: 141
diff changeset
1025 return TRUE;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1026 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1027
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1028 void file_data_change_info_free(FileDataChangeInfo *fdci, FileData *fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1029 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1030 if (!fdci && fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1031 fdci = fd->change;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1032
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1033 if (!fdci)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1034 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1035
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1036 g_free(fdci->source);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1037 g_free(fdci->dest);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1038
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1039 g_free(fdci);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1040
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1041 if (fd)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1042 fd->change = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1043 }
139
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1044
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1045
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1046
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1047
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1048 /*
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1049 *-----------------------------------------------------------------------------
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1050 * sidecar file info struct
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1051 *-----------------------------------------------------------------------------
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1052 */
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1053
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1054
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1055
240
cce347409480 Fix two more gcc warnings related to function declarations.
zas_
parents: 217
diff changeset
1056 static gint sidecar_file_priority(const gchar *path)
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1057 {
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1058 const char *extension = extension_from_path(path);
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1059 int i = 1;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1060 GList *work;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1061 if (extension == NULL)
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1062 return 0;
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1063
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1064 work = sidecar_ext_get_list();
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1065
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1066 while (work) {
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1067 gchar *ext = work->data;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1068 work = work->next;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1069 if (strcmp(extension, ext) == 0) return i;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1070 i++;
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1071 }
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1072 return 0;
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1073 }
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1074
139
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1075 gchar *sidecar_file_data_list_to_string(FileData *fd)
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1076 {
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1077 GList *work;
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1078 GString *result = g_string_new("");
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1079
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1080 work = fd->sidecar_files;
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1081 while (work)
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1082 {
141
bdc16027fa6f use FileData even for sidecar file list
nadvornik
parents: 139
diff changeset
1083 FileData *sfd = work->data;
139
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1084 result = g_string_append(result, "+ ");
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1085 result = g_string_append(result, sfd->extension);
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1086 work = work->next;
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1087 if (work) result = g_string_append_c(result, ' ');
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1088 }
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1089
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1090 return g_string_free(result, FALSE);
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1091 }
754c1e4349b6 display sidecar extensions in filelist
nadvornik
parents: 138
diff changeset
1092
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1093 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1094 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1095 * load file list
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1096 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1097 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1098
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1099 static SortType filelist_sort_method = SORT_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1100 static gint filelist_sort_ascend = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1101
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1102
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1103 gint filelist_sort_compare_filedata(FileData *fa, FileData *fb)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1104 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1105 if (!filelist_sort_ascend)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1106 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1107 FileData *tmp = fa;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1108 fa = fb;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1109 fb = tmp;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1110 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1111
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1112 switch (filelist_sort_method)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1113 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1114 case SORT_SIZE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1115 if (fa->size < fb->size) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1116 if (fa->size > fb->size) return 1;
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1117 return CASE_SORT(fa->name, fb->name); /* fall back to name */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1118 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1119 case SORT_TIME:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1120 if (fa->date < fb->date) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1121 if (fa->date > fb->date) return 1;
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1122 return CASE_SORT(fa->name, fb->name); /* fall back to name */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1123 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1124 #ifdef HAVE_STRVERSCMP
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1125 case SORT_NUMBER:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1126 return strverscmp(fa->name, fb->name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1127 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1128 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1129 case SORT_NAME:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1130 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1131 return CASE_SORT(fa->name, fb->name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1132 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1133 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1134 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1135
167
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1136 gint filelist_sort_compare_filedata_full(FileData *fa, FileData *fb, SortType method, gint ascend)
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1137 {
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1138 filelist_sort_method = method;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1139 filelist_sort_ascend = ascend;
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1140 return filelist_sort_compare_filedata(fa, fb);
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1141 }
05bf5d364dba fixed filelist refresh
nadvornik
parents: 164
diff changeset
1142
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1143 static gint filelist_sort_file_cb(void *a, void *b)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1144 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1145 return filelist_sort_compare_filedata(a, b);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1146 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1147
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1148 GList *filelist_sort_full(GList *list, SortType method, gint ascend, GCompareFunc cb)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1149 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1150 filelist_sort_method = method;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1151 filelist_sort_ascend = ascend;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1152 return g_list_sort(list, cb);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1153 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1154
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1155 GList *filelist_insert_sort_full(GList *list, void *data, SortType method, gint ascend, GCompareFunc cb)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1156 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1157 filelist_sort_method = method;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1158 filelist_sort_ascend = ascend;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1159 return g_list_insert_sorted(list, data, cb);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1160 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1161
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1162 GList *filelist_sort(GList *list, SortType method, gint ascend)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1163 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1164 return filelist_sort_full(list, method, ascend, (GCompareFunc) filelist_sort_file_cb);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1165 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1166
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1167 GList *filelist_insert_sort(GList *list, FileData *fd, SortType method, gint ascend)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1168 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1169 return filelist_insert_sort_full(list, fd, method, ascend, (GCompareFunc) filelist_sort_file_cb);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1170 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1171
137
be3328a58875 started support for sidecar files like xmp, raw+jpeg etc.
nadvornik
parents: 101
diff changeset
1172
148
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1173 static GList *filelist_filter_out_sidecars(GList *flist)
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1174 {
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1175 GList *work = flist;
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1176 GList *flist_filtered = NULL;
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1177
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1178 while (work)
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1179 {
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1180 FileData *fd = work->data;
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1181 work = work->next;
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1182 if (fd->parent) /* remove fd's that are children */
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1183 file_data_unref(fd);
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1184 else
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1185 flist_filtered = g_list_prepend(flist_filtered, fd);
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1186 }
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1187 g_list_free(flist);
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1188 return flist_filtered;
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1189 }
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1190
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1191 static gint filelist_read_real(const gchar *path, GList **files, GList **dirs, gint follow_symlinks)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1192 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1193 DIR *dp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1194 struct dirent *dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1195 struct stat ent_sbuf;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1196 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1197 GList *dlist;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1198 GList *flist;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1199
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1200 dlist = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1201 flist = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1203 pathl = path_from_utf8(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1204 if (!pathl || (dp = opendir(pathl)) == NULL)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1205 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1206 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1207 if (files) *files = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1208 if (dirs) *dirs = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1209 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1210 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1211
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1212 /* root dir fix */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1213 if (pathl[0] == '/' && pathl[1] == '\0')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1214 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1215 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1216 pathl = g_strdup("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1217 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1218
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1219 while ((dir = readdir(dp)) != NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1220 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1221 gchar *name = dir->d_name;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1222 if (show_dot_files || !ishidden(name))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1223 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1224 gchar *filepath = g_strconcat(pathl, "/", name, NULL);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1225 if ((follow_symlinks ?
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1226 stat(filepath, &ent_sbuf) :
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1227 lstat(filepath, &ent_sbuf)) >= 0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1228 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1229 if (S_ISDIR(ent_sbuf.st_mode))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1230 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1231 /* we ignore the .thumbnails dir for cleanliness */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1232 if ((dirs) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1233 !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1234 strcmp(name, GQVIEW_CACHE_LOCAL_THUMB) != 0 &&
79
528e3432e0c0 Thu Oct 19 07:23:37 2006 John Ellis <johne@verizon.net>
gqview
parents: 53
diff changeset
1235 strcmp(name, GQVIEW_CACHE_LOCAL_METADATA) != 0 &&
528e3432e0c0 Thu Oct 19 07:23:37 2006 John Ellis <johne@verizon.net>
gqview
parents: 53
diff changeset
1236 strcmp(name, THUMB_FOLDER_LOCAL) != 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1237 {
145
8be2cc687304 fixed grouping sidecar files and made it configurable via config file
nadvornik
parents: 143
diff changeset
1238 dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1239 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1240 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1241 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1242 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1243 if ((files) && filter_name_exists(name))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1244 {
148
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1245 flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1246 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1247 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1248 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1249 g_free(filepath);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1250 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1251 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1252
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1253 closedir(dp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1254
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1255 g_free(pathl);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1256
148
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1257 flist = filelist_filter_out_sidecars(flist);
a8b4b99c9359 improved directory scanning a bit
nadvornik
parents: 147
diff changeset
1258
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1259 if (dirs) *dirs = dlist;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1260 if (files) *files = flist;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1261
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1262 return TRUE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1263 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1264
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1265 gint filelist_read(const gchar *path, GList **files, GList **dirs)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1266 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1267 return filelist_read_real(path, files, dirs, TRUE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1268 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1269
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1270 gint filelist_read_lstat(const gchar *path, GList **files, GList **dirs)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1271 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1272 return filelist_read_real(path, files, dirs, FALSE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1273 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1274
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1275 void filelist_free(GList *list)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1276 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1277 GList *work;
3
gqview
parents: 1
diff changeset
1278
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1279 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1280 while (work)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1281 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1282 file_data_unref((FileData *)work->data);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1283 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1284 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1285
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
1286 g_list_free(list);
3
gqview
parents: 1
diff changeset
1287 }
gqview
parents: 1
diff changeset
1288
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1289
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1290 GList *filelist_copy(GList *list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1291 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1292 GList *new_list = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1293 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1294
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1295 work = list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1296 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1297 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1298 FileData *fd;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1299
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1300 fd = work->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1301 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1302
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1303 new_list = g_list_prepend(new_list, file_data_ref(fd));
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1304 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1305
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1306 return g_list_reverse(new_list);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1307 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1308
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1309 GList *filelist_from_path_list(GList *list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1310 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1311 GList *new_list = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1312 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1313
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1314 work = list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1315 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1316 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1317 gchar *path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1318
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1319 path = work->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1320 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1321
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1322 new_list = g_list_prepend(new_list, file_data_new_simple(path));
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1323 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1324
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1325 return g_list_reverse(new_list);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1326 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1327
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1328 GList *filelist_to_path_list(GList *list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1329 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1330 GList *new_list = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1331 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1332
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1333 work = list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1334 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1335 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1336 FileData *fd;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1337
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1338 fd = work->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1339 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1340
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1341 new_list = g_list_prepend(new_list, g_strdup(fd->path));
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1342 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1343
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1344 return g_list_reverse(new_list);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1345 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1346
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1347 GList *filelist_filter(GList *list, gint is_dir_list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1348 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1349 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1350
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1351 if (!is_dir_list && file_filter_disable && show_dot_files) return list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1352
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1353 work = list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1354 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1355 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1356 FileData *fd = (FileData *)(work->data);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1357 const gchar *name = fd->name;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1358
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1359 if ((!show_dot_files && ishidden(name)) ||
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1360 (!is_dir_list && !filter_name_exists(name)) ||
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1361 (is_dir_list && name[0] == '.' && (strcmp(name, GQVIEW_CACHE_LOCAL_THUMB) == 0 ||
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1362 strcmp(name, GQVIEW_CACHE_LOCAL_METADATA) == 0)) )
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1363 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1364 GList *link = work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1365 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1366 list = g_list_remove_link(list, link);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1367 file_data_unref(fd);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1368 g_list_free(link);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1369 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1370 else
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1371 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1372 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1373 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1374 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1375
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1376 return list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1377 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1378
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1379 /*
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1380 *-----------------------------------------------------------------------------
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1381 * filelist recursive
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1382 *-----------------------------------------------------------------------------
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1383 */
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1384
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1385 static gint filelist_sort_path_cb(gconstpointer a, gconstpointer b)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1386 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1387 return CASE_SORT(((FileData *)a)->path, ((FileData *)b)->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1388 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1389
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1390 GList *filelist_sort_path(GList *list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1391 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1392 return g_list_sort(list, filelist_sort_path_cb);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1393 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1394
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1395 static void filelist_recursive_append(GList **list, GList *dirs)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1396 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1397 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1398
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1399 work = dirs;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1400 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1401 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1402 FileData *fd = (FileData *)(work->data);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1403 const gchar *path = fd->path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1404 GList *f = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1405 GList *d = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1406
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1407 if (filelist_read(path, &f, &d))
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1408 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1409 f = filelist_filter(f, FALSE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1410 f = filelist_sort_path(f);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1411 *list = g_list_concat(*list, f);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1412
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1413 d = filelist_filter(d, TRUE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1414 d = filelist_sort_path(d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1415 filelist_recursive_append(list, d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1416 filelist_free(d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1417 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1418
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1419 work = work->next;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1420 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1421 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1422
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1423 GList *filelist_recursive(const gchar *path)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1424 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1425 GList *list = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1426 GList *d = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1427
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1428 if (!filelist_read(path, &list, &d)) return NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1429 list = filelist_filter(list, FALSE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1430 list = filelist_sort_path(list);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1431
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1432 d = filelist_filter(d, TRUE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1433 d = filelist_sort_path(d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1434 filelist_recursive_append(&list, d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1435 filelist_free(d);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1436
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1437 return list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 137
diff changeset
1438 }