#include "gtkfilefilter.h"
#include "gtkobject.h"
+#include "gtkintl.h"
#include "gtkprivate.h"
+#include "gtkalias.h"
+
+#ifdef G_OS_UNIX
+#define XDG_PREFIX _gtk_xdg
+#include "xdgmime/xdgmime.h"
+#endif
+
typedef struct _GtkFileFilterClass GtkFileFilterClass;
typedef struct _FilterRule FilterRule;
typedef enum {
FILTER_RULE_PATTERN,
FILTER_RULE_MIME_TYPE,
+ FILTER_RULE_PIXBUF_FORMATS,
FILTER_RULE_CUSTOM
} FilterRuleType;
union {
gchar *pattern;
gchar *mime_type;
+ GSList *pixbuf_formats;
struct {
GtkFileFilterFunc func;
gpointer data;
NULL /* init */
};
- file_filter_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkFileFilter",
+ file_filter_type = g_type_register_static (GTK_TYPE_OBJECT, I_("GtkFileFilter"),
&file_filter_info, 0);
}
if (rule->u.custom.notify)
rule->u.custom.notify (rule->u.custom.data);
break;
+ case FILTER_RULE_PIXBUF_FORMATS:
+ g_slist_free (rule->u.pixbuf_formats);
+ break;
default:
g_assert_not_reached ();
}
file_filter_add_rule (filter, rule);
}
+/**
+ * gtk_file_filter_add_pixbuf_formats:
+ * @filter: a #GtkFileFilter
+ *
+ * Adds a rule allowing image files in the formats supported
+ * by GdkPixbuf.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_file_filter_add_pixbuf_formats (GtkFileFilter *filter)
+{
+ FilterRule *rule;
+
+ g_return_if_fail (GTK_IS_FILE_FILTER (filter));
+
+ rule = g_new (FilterRule, 1);
+ rule->type = FILTER_RULE_PIXBUF_FORMATS;
+ rule->needed = GTK_FILE_FILTER_MIME_TYPE;
+ rule->u.pixbuf_formats = gdk_pixbuf_get_formats ();
+ file_filter_add_rule (filter, rule);
+}
+
+
/**
* gtk_file_filter_add_custom:
* @filter: a #GtkFileFilter
*
* Tests whether a file should be displayed according to @filter.
* The #GtkFileFilterInfo structure @filter_info should include
- * the fields returned feom gtk_file_filter_get_needed().
+ * the fields returned from gtk_file_filter_get_needed().
*
* This function will not typically be used by applications; it
* is intended principally for use in the implementation of
{
case FILTER_RULE_MIME_TYPE:
if (filter_info->mime_type != NULL
+#ifdef G_OS_UNIX
+ && xdg_mime_mime_type_subclass (filter_info->mime_type, rule->u.mime_type))
+#else
&& strcmp (rule->u.mime_type, filter_info->mime_type) == 0)
+#endif
return TRUE;
break;
case FILTER_RULE_PATTERN:
if (filter_info->display_name != NULL &&
- _gtk_fnmatch (rule->u.pattern, filter_info->display_name))
+ _gtk_fnmatch (rule->u.pattern, filter_info->display_name, FALSE))
return TRUE;
break;
+ case FILTER_RULE_PIXBUF_FORMATS:
+ {
+ GSList *list;
+
+ for (list = rule->u.pixbuf_formats; list; list = list->next)
+ {
+ int i;
+ gchar **mime_types;
+
+ mime_types = gdk_pixbuf_format_get_mime_types (list->data);
+
+ for (i = 0; mime_types[i] != NULL; i++)
+ {
+ if (strcmp (mime_types[i], filter_info->mime_type) == 0)
+ {
+ g_strfreev (mime_types);
+ return TRUE;
+ }
+ }
+
+ g_strfreev (mime_types);
+ }
+ break;
+ }
case FILTER_RULE_CUSTOM:
if (rule->u.custom.func (filter_info, rule->u.custom.data))
return TRUE;
return FALSE;
}
+
+#define __GTK_FILE_FILTER_C__
+#include "gtkaliasdef.c"