1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /*
3 * Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20
21 #include <config.h>
22
23 #include "ev-utils.h"
24 #include "ev-file-helpers.h"
25
26 #include <string.h>
27 #include <glib/gi18n.h>
28
29 void
file_chooser_dialog_add_writable_pixbuf_formats(GtkFileChooser * chooser)30 file_chooser_dialog_add_writable_pixbuf_formats (GtkFileChooser *chooser)
31 {
32 GSList *pixbuf_formats = NULL;
33 GSList *iter;
34 GtkFileFilter *filter;
35 int i;
36
37 filter = gtk_file_filter_new();
38 gtk_file_filter_set_name (filter, _("By extension"));
39 g_object_set_data (G_OBJECT(filter), "pixbuf-format", NULL);
40 gtk_file_chooser_add_filter (chooser, filter);
41
42 pixbuf_formats = gdk_pixbuf_get_formats ();
43
44 for (iter = pixbuf_formats; iter; iter = iter->next) {
45 GdkPixbufFormat *format = iter->data;
46
47 gchar *description, *name, *extensions;
48 gchar **extension_list, **mime_types;
49
50 if (gdk_pixbuf_format_is_disabled (format) ||
51 !gdk_pixbuf_format_is_writable (format))
52 continue;
53
54 name = gdk_pixbuf_format_get_description (format);
55 extension_list = gdk_pixbuf_format_get_extensions (format);
56 extensions = g_strjoinv (", ", extension_list);
57 g_strfreev (extension_list);
58 description = g_strdup_printf ("%s (%s)", name, extensions);
59
60 filter = gtk_file_filter_new ();
61 gtk_file_filter_set_name (filter, description);
62 g_object_set_data (G_OBJECT (filter), "pixbuf-format", format);
63 gtk_file_chooser_add_filter (chooser, filter);
64
65 g_free (description);
66 g_free (extensions);
67 g_free (name);
68
69 mime_types = gdk_pixbuf_format_get_mime_types (format);
70 for (i = 0; mime_types[i] != 0; i++)
71 gtk_file_filter_add_mime_type (filter, mime_types[i]);
72 g_strfreev (mime_types);
73 }
74
75 g_slist_free (pixbuf_formats);
76 }
77
78 GdkPixbufFormat*
get_gdk_pixbuf_format_by_extension(gchar * uri)79 get_gdk_pixbuf_format_by_extension (gchar *uri)
80 {
81 GSList *pixbuf_formats = NULL;
82 GSList *iter;
83 int i;
84
85 pixbuf_formats = gdk_pixbuf_get_formats ();
86
87 for (iter = pixbuf_formats; iter; iter = iter->next) {
88 gchar **extension_list;
89 GdkPixbufFormat *format = iter->data;
90
91 if (gdk_pixbuf_format_is_disabled (format) ||
92 !gdk_pixbuf_format_is_writable (format))
93 continue;
94
95 extension_list = gdk_pixbuf_format_get_extensions (format);
96
97 for (i = 0; extension_list[i] != 0; i++) {
98 if (g_str_has_suffix (uri, extension_list[i])) {
99 g_slist_free (pixbuf_formats);
100 g_strfreev (extension_list);
101 return format;
102 }
103 }
104 g_strfreev (extension_list);
105 }
106
107 g_slist_free (pixbuf_formats);
108 return NULL;
109 }
110