gnome-control-center/capplets/file-types/mime-type-info.c
Jody Goldberg b4995826e8 http://bugzilla.gnome.org/show_bug.cgi?id=85397
2002-06-15  Jody Goldberg <jody@gnome.org>

	http://bugzilla.gnome.org/show_bug.cgi?id=85397
	http://bugzilla.gnome.org/show_bug.cgi?id=84545
	* mime-types-model.c (mime_types_model_get_value) :
	  gtk_tree_view_search_equal_func does not like NULL.
	(IS_CATEGORY) : check for NULL.
	* file-types-capplet.c (create_dialog) : search the description not
	  the mime type.

2002-06-08  Jody Goldberg <jody@gnome.org>

	* mime-types-model.c (IS_CATEGORY) : test for null in case we are
	  stupid.

2002-06-07  Jody Goldberg <jody@gnome.org>

	* file-types-capplet.c (dialog_done_cb) : no need to save things
	  again.  The only caller had already done that.

	* mime-type-info.c (mime_type_info_save) : Don't mess with the
	  application here, it should already be setup.  However, be really
	  really anal about verifying it because I do not trust the
	  surrounding code or know it well enough to trust it.  Make sure that
	  the assigned app is on the short list of associated apps.

	* mime-category-edit-dialog.c (store_data) : Use
	  mime_edit_dialog_get_app.
	* mime-edit-dialog.c (store_data) : Use it here too.
	(mime_edit_dialog_get_app) : new.  split some duplicated code out of
	  the type and category dialogs and move it here.  Then make it
	  readable and less stupid about creating copies of existing
	  applications.  While we're at it have it handle the creation of new
	  applications, merging commands with existing applications and other
	  useful stuff.

2002-06-07  Jody Goldberg <jody@gnome.org>

	* mime-category-edit-dialog.c (store_data) : clarify and remove the
	  custom flag.

	* mime-type-info.c (mime_category_info_using_custom_app) : delete.
	(mime_type_info_using_custom_app) : delete.

	* mime-edit-dialog.c (validate_data) : correct the warning about
	  invalid type, we would _not_ create one for the user :-(
	  Allow a user to optionally overwrite an existing mime type.
	  This is useful when editing.
	* mime-edit-dialog.c (store_data) : clarify and remove the custom flag.


2002-06-10  Jody Goldberg <jody@gnome.org>

	* accessibility-keyboard.c : tweak the layout as requested and adjust
	  the max slowkey delay to 500 to avoid losing the keyboard due to some
	  sort of an X problem.

2002-06-13  Jody Goldberg <jody@gnome.org>

	* gnome-keyboard-properties.c (accessibility_button_clicked) : produce
	  a better warning for failure to launch the keyboard accessibility
	  capplet.
2002-06-18 18:55:14 +00:00

845 lines
22 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* -*- mode: c; style: linux -*- */
/* mime-type-info.c
*
* Copyright (C) 2000 Eazel, Inc.
* Copyright (C) 2002 Ximian, Inc.
*
* Written by Bradford Hovinen <hovinen@ximian.com>,
* Jonathan Blandford <jrb@redhat.com>,
* Gene Z. Ragan <gzr@eazel.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <string.h>
#include <bonobo.h>
#include <libgnomevfs/gnome-vfs-application-registry.h>
#include <libgnomevfs/gnome-vfs-utils.h>
#include <gconf/gconf-client.h>
#include "libuuid/uuid.h"
#include "mime-type-info.h"
#include "mime-types-model.h"
static const gchar *get_category_name (const gchar *mime_type);
static const gchar *get_category_description (const gchar *mime_type);
static GSList *get_lang_list (void);
static gchar *form_extensions_string (const MimeTypeInfo *info,
gchar *sep,
gchar *prepend);
static void get_icon_pixbuf (MimeTypeInfo *info,
const gchar *icon_path,
gboolean want_large);
static MimeCategoryInfo *get_category (const gchar *category_name,
const gchar *category_desc,
GtkTreeModel *model);
gchar *get_real_icon_path (const MimeTypeInfo *info,
const gchar *icon_name);
void
load_all_mime_types (GtkTreeModel *model)
{
GList *list, *tmp;
list = gnome_vfs_get_registered_mime_types ();
for (tmp = list; tmp != NULL; tmp = tmp->next)
mime_type_info_new (tmp->data, model);
g_list_free (list);
}
MimeTypeInfo *
mime_type_info_new (const gchar *mime_type, GtkTreeModel *model)
{
MimeTypeInfo *info;
info = g_new0 (MimeTypeInfo, 1);
MODEL_ENTRY (info)->type = MODEL_ENTRY_MIME_TYPE;
if (mime_type != NULL) {
info->mime_type = g_strdup (mime_type);
mime_type_info_set_category_name (info, get_category_name (mime_type), get_category_description (mime_type), model);
mime_type_info_get_icon (info);
} else {
info->entry.parent = get_model_entries (model);
}
return info;
}
/* Fill in the remaining fields in a MimeTypeInfo structure; suitable for
* subsequent use in an edit dialog */
void
mime_type_info_load_all (MimeTypeInfo *info)
{
mime_type_info_get_description (info);
mime_type_info_get_file_extensions (info);
if (info->icon_name == NULL)
info->icon_name = g_strdup (gnome_vfs_mime_get_icon (info->mime_type));
if (info->icon_pixbuf == NULL)
get_icon_pixbuf (info, info->icon_name, TRUE);
if (info->default_action == NULL)
info->default_action = gnome_vfs_mime_get_default_application (info->mime_type);
if (info->default_action == NULL)
info->default_action = g_new0 (GnomeVFSMimeApplication, 1);
if (info->default_component == NULL)
info->default_component = gnome_vfs_mime_get_default_component (info->mime_type);
mime_type_info_get_use_category (info);
}
const gchar *
mime_type_info_get_description (MimeTypeInfo *info)
{
if (info->description == NULL)
info->description = g_strdup (gnome_vfs_mime_get_description (info->mime_type));
return info->description;
}
GdkPixbuf *
mime_type_info_get_icon (MimeTypeInfo *info)
{
if (info->small_icon_pixbuf == NULL)
get_icon_pixbuf (info, mime_type_info_get_icon_path (info), FALSE);
if (info->small_icon_pixbuf != NULL)
g_object_ref (G_OBJECT (info->small_icon_pixbuf));
return info->small_icon_pixbuf;
}
const gchar *
mime_type_info_get_icon_path (MimeTypeInfo *info)
{
if (info->icon_name == NULL)
info->icon_name = g_strdup (gnome_vfs_mime_get_icon (info->mime_type));
info->icon_path = get_real_icon_path (info, info->icon_name);
return info->icon_path;
}
const GList *
mime_type_info_get_file_extensions (MimeTypeInfo *info)
{
if (info->file_extensions == NULL)
info->file_extensions = gnome_vfs_mime_get_extensions_list (info->mime_type);
return info->file_extensions;
}
gboolean
mime_type_info_get_use_category (MimeTypeInfo *info)
{
const gchar *tmp1;
if (!info->use_cat_loaded) {
tmp1 = gnome_vfs_mime_get_value (info->mime_type, "use_category_default");
if (tmp1 != NULL && !strcmp (tmp1, "yes"))
info->use_category = TRUE;
else
info->use_category = FALSE;
info->use_cat_loaded = TRUE;
}
return info->use_category;
}
gchar *
mime_type_info_get_file_extensions_pretty_string (MimeTypeInfo *info)
{
mime_type_info_get_file_extensions (info);
return form_extensions_string (info, ", ", ".");
}
gchar *
mime_type_info_get_category_name (const MimeTypeInfo *info)
{
return mime_category_info_get_full_description (MIME_CATEGORY_INFO (info->entry.parent));
}
void
mime_type_info_set_category_name (const MimeTypeInfo *info, const gchar *category_name, const gchar *category_desc, GtkTreeModel *model)
{
if (MODEL_ENTRY (info)->parent != NULL)
model_entry_remove_child (MODEL_ENTRY (info)->parent, MODEL_ENTRY (info), model);
if (category_name != NULL) {
MODEL_ENTRY (info)->parent = MODEL_ENTRY (get_category (category_name, category_desc, model));
if (MODEL_ENTRY (info)->parent != NULL)
model_entry_insert_child (MODEL_ENTRY (info)->parent, MODEL_ENTRY (info), model);
} else {
MODEL_ENTRY (info)->parent = NULL;
}
}
void
mime_type_info_set_file_extensions (MimeTypeInfo *info, GList *list)
{
gnome_vfs_mime_extensions_list_free (info->file_extensions);
info->file_extensions = list;
}
void
mime_type_info_save (MimeTypeInfo *info)
{
gchar *tmp;
gnome_vfs_mime_freeze ();
gnome_vfs_mime_set_description (info->mime_type, info->description);
gnome_vfs_mime_set_icon (info->mime_type, info->icon_name);
/* Be really anal about validating this action */
if (info->default_action != NULL) {
if ( info->default_action->command == NULL ||
*info->default_action->command == '\0' ||
info->default_action->id == NULL ||
*info->default_action->id == '\0') {
g_warning ("Invalid application");
gnome_vfs_mime_application_free (info->default_action);
info->default_action = NULL;
}
}
if (info->default_action != NULL) {
gnome_vfs_mime_set_default_application (info->mime_type,
info->default_action->id);
gnome_vfs_mime_add_application_to_short_list (info->mime_type,
info->default_action->id);
} else
gnome_vfs_mime_set_default_application (info->mime_type, NULL);
tmp = form_extensions_string (info, " ", NULL);
gnome_vfs_mime_set_extensions_list (info->mime_type, tmp);
g_free (tmp);
if (info->default_component != NULL)
gnome_vfs_mime_set_default_component (info->mime_type, info->default_component->iid);
else
gnome_vfs_mime_set_default_component (info->mime_type, NULL);
tmp = mime_type_info_get_category_name (info);
gnome_vfs_mime_set_value (info->mime_type, "category", tmp);
g_free (tmp);
gnome_vfs_mime_set_value (info->mime_type, "use_category_default", info->use_category ? "yes" : "no");
gnome_vfs_application_registry_sync ();
gnome_vfs_mime_thaw ();
}
void
mime_type_info_free (MimeTypeInfo *info)
{
g_free (info->mime_type);
g_free (info->description);
g_free (info->icon_name);
g_free (info->icon_path);
gnome_vfs_mime_extensions_list_free (info->file_extensions);
CORBA_free (info->default_component);
gnome_vfs_mime_application_free (info->default_action);
if (info->icon_pixbuf != NULL)
g_object_unref (G_OBJECT (info->icon_pixbuf));
if (info->small_icon_pixbuf != NULL)
g_object_unref (G_OBJECT (info->small_icon_pixbuf));
g_free (info);
}
MimeCategoryInfo *
mime_category_info_new (MimeCategoryInfo *parent, const gchar *name, const gchar *description, GtkTreeModel *model)
{
MimeCategoryInfo *info;
info = g_new0 (MimeCategoryInfo, 1);
MODEL_ENTRY (info)->type = MODEL_ENTRY_CATEGORY;
info->name = g_strdup (name);
info->description = g_strdup (description);
if (parent != NULL)
MODEL_ENTRY (info)->parent = MODEL_ENTRY (parent);
else
MODEL_ENTRY (info)->parent = get_model_entries (model);
return info;
}
static gchar *
get_gconf_base_name (MimeCategoryInfo *category)
{
gchar *tmp, *tmp1;
tmp1 = mime_category_info_get_full_name (category);
for (tmp = tmp1; *tmp != '\0'; tmp++)
if (g_ascii_isspace (*tmp) || *tmp == '(' || *tmp == ')')
*tmp = '-';
tmp = g_strconcat ("/desktop/gnome/file-types-categories/", tmp1, NULL);
g_free (tmp1);
return tmp;
}
void
mime_category_info_load_all (MimeCategoryInfo *category)
{
gchar *tmp, *tmp1;
gchar *appid;
tmp1 = get_gconf_base_name (category);
if (category->default_action == NULL) {
tmp = g_strconcat (tmp1, "/default-action-id", NULL);
appid = gconf_client_get_string (gconf_client_get_default (), tmp, NULL);
g_free (tmp);
if (appid != NULL && *appid != '\0')
category->default_action = gnome_vfs_application_registry_get_mime_application (appid);
/* This must be non NULL, so be extra careful incase gnome-vfs
* spits back a NULL
*/
if (category->default_action == NULL)
category->default_action = g_new0 (GnomeVFSMimeApplication, 1);
}
if (!category->use_parent_cat_loaded) {
if (category->entry.parent->type == MODEL_ENTRY_CATEGORY) {
tmp = g_strconcat (tmp1, "/use-parent-category", NULL);
category->use_parent_category = gconf_client_get_bool (gconf_client_get_default (), tmp, NULL);
g_free (tmp);
} else {
category->use_parent_category = FALSE;
}
category->use_parent_cat_loaded = TRUE;
}
g_free (tmp1);
}
static void
set_subcategory_ids (ModelEntry *entry, MimeCategoryInfo *category, gchar *app_id)
{
ModelEntry *tmp;
switch (entry->type) {
case MODEL_ENTRY_MIME_TYPE:
if (MIME_TYPE_INFO (entry)->use_category)
gnome_vfs_mime_set_default_application (MIME_TYPE_INFO (entry)->mime_type, app_id);
break;
case MODEL_ENTRY_CATEGORY:
if (entry != MODEL_ENTRY (category) && MIME_CATEGORY_INFO (entry)->use_parent_category)
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next)
set_subcategory_ids (tmp, category, app_id);
break;
default:
break;
}
}
void
mime_category_info_save (MimeCategoryInfo *category)
{
gchar *key, *basename;
gboolean set_ids;
/* Be really anal about validating this action */
if (category->default_action != NULL) {
if ( category->default_action->command == NULL ||
*category->default_action->command == '\0' ||
category->default_action->id == NULL ||
*category->default_action->id == '\0') {
g_warning ("Invalid application");
gnome_vfs_mime_application_free (category->default_action);
category->default_action = NULL;
}
}
basename = get_gconf_base_name (category);
key = g_strconcat (basename, "/default-action-id", NULL);
if (category->default_action != NULL) {
gconf_client_set_string (gconf_client_get_default (),
key, category->default_action->id, NULL);
set_ids = TRUE;
} else
gconf_client_unset (gconf_client_get_default (), key, NULL);
g_free (key);
key = g_strconcat (basename, "/use-parent-category", NULL);
gconf_client_set_bool (gconf_client_get_default (), key,
category->use_parent_category, NULL);
g_free (key);
g_free (basename);
if (set_ids)
set_subcategory_ids (MODEL_ENTRY (category), category, category->default_action->id);
}
static GList *
find_possible_supported_apps (ModelEntry *entry, gboolean top)
{
GList *ret;
ModelEntry *tmp;
if (entry == NULL) return NULL;
switch (entry->type) {
case MODEL_ENTRY_CATEGORY:
if (!top && !MIME_CATEGORY_INFO (entry)->use_parent_category)
return NULL;
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next) {
ret = find_possible_supported_apps (tmp, FALSE);
if (ret != NULL)
return ret;
}
return NULL;
case MODEL_ENTRY_MIME_TYPE:
if (mime_type_info_get_use_category (MIME_TYPE_INFO (entry)))
return gnome_vfs_application_registry_get_applications (MIME_TYPE_INFO (entry)->mime_type);
else
return NULL;
default:
return NULL;
}
}
static GList *
intersect_lists (GList *list, GList *list1)
{
GList *tmp, *tmp1, *tmpnext;
tmp = list;
while (tmp != NULL) {
tmpnext = tmp->next;
for (tmp1 = list1; tmp1 != NULL; tmp1 = tmp1->next)
if (!strcmp (tmp->data, tmp1->data))
break;
if (tmp1 == NULL)
list = g_list_remove_link (list, tmp);
tmp = tmpnext;
}
return list;
}
static GList *
reduce_supported_app_list (ModelEntry *entry, GList *list, gboolean top)
{
GList *type_list;
ModelEntry *tmp;
switch (entry->type) {
case MODEL_ENTRY_CATEGORY:
if (!top && !MIME_CATEGORY_INFO (entry)->use_parent_category)
break;
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next)
list = reduce_supported_app_list (tmp, list, FALSE);
break;
case MODEL_ENTRY_MIME_TYPE:
if (mime_type_info_get_use_category (MIME_TYPE_INFO (entry))) {
type_list = gnome_vfs_application_registry_get_applications (MIME_TYPE_INFO (entry)->mime_type);
list = intersect_lists (list, type_list);
g_list_free (type_list);
}
break;
default:
break;
}
return list;
}
GList *
mime_category_info_find_apps (MimeCategoryInfo *info)
{
return reduce_supported_app_list (MODEL_ENTRY (info),
find_possible_supported_apps (MODEL_ENTRY (info), TRUE), TRUE);
}
gchar *
mime_category_info_get_full_name (MimeCategoryInfo *info)
{
GString *string;
ModelEntry *tmp;
gchar *ret, *s;
string = g_string_new ("");
for (tmp = MODEL_ENTRY (info); tmp != NULL && tmp->type != MODEL_ENTRY_NONE; tmp = tmp->parent) {
g_string_prepend (string, MIME_CATEGORY_INFO (tmp)->name);
g_string_prepend (string, "/");
}
/* work around gcc 2.96 bug */
s = (*string->str == '\0') ? string->str : string->str + 1;
ret = g_strdup (s);
g_string_free (string, TRUE);
return ret;
}
gchar *
mime_category_info_get_full_description (MimeCategoryInfo *info)
{
GString *string;
ModelEntry *tmp;
gchar *ret, *s;
string = g_string_new ("");
for (tmp = MODEL_ENTRY (info); tmp != NULL && tmp->type != MODEL_ENTRY_NONE; tmp = tmp->parent) {
g_string_prepend (string, MIME_CATEGORY_INFO (tmp)->description);
g_string_prepend (string, "/");
}
/* work around gcc 2.96 bug */
s = (*string->str == '\0') ? string->str : string->str + 1;
ret = g_strdup (s);
g_string_free (string, TRUE);
return ret;
}
char *
mime_type_get_pretty_name_for_server (Bonobo_ServerInfo *server)
{
const char *view_as_name;
char *display_name;
GSList *langs;
display_name = NULL;
langs = get_lang_list ();
view_as_name = bonobo_server_info_prop_lookup (server, "nautilus:view_as_name", langs);
if (view_as_name == NULL)
view_as_name = bonobo_server_info_prop_lookup (server, "name", langs);
if (view_as_name == NULL)
view_as_name = server->iid;
g_slist_foreach (langs, (GFunc) g_free, NULL);
g_slist_free (langs);
/* if the name is an OAFIID, clean it up for display */
if (!strncmp (view_as_name, "OAFIID:", strlen ("OAFIID:"))) {
char *display_name, *colon_ptr;
display_name = g_strdup (view_as_name + strlen ("OAFIID:"));
colon_ptr = strchr (display_name, ':');
if (colon_ptr)
*colon_ptr = '\0';
return display_name;
}
return g_strdup_printf ("View as %s", view_as_name);
}
static MimeTypeInfo *
get_mime_type_info_int (ModelEntry *entry, const gchar *mime_type)
{
ModelEntry *tmp;
MimeTypeInfo *ret;
switch (entry->type) {
case MODEL_ENTRY_MIME_TYPE:
if (!strcmp (MIME_TYPE_INFO (entry)->mime_type, mime_type))
return MIME_TYPE_INFO (entry);
return NULL;
case MODEL_ENTRY_CATEGORY:
case MODEL_ENTRY_NONE:
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next)
if ((ret = get_mime_type_info_int (tmp, mime_type)) != NULL)
return ret;
return NULL;
default:
return NULL;
}
}
MimeTypeInfo *
get_mime_type_info (const gchar *mime_type)
{
return get_mime_type_info_int (get_model_entries (NULL), mime_type);
}
static const gchar *
get_category_name (const gchar *mime_type)
{
const gchar *path;
path = gnome_vfs_mime_get_value (mime_type, "category");
if (path != NULL)
return g_strdup (path);
else if (!strncmp (mime_type, "image/", strlen ("image/")))
return "Images";
else if (!strncmp (mime_type, "video/", strlen ("video/")))
return "Video";
else if (!strncmp (mime_type, "audio/", strlen ("audio/")))
return "Audio";
else
return "Misc";
}
static const gchar *
get_category_description (const gchar *mime_type)
{
const gchar *path;
path = gnome_vfs_mime_get_value (mime_type, "category");
if (path != NULL)
return g_strdup (path);
else if (!strncmp (mime_type, "image/", strlen ("image/")))
return _("Images");
else if (!strncmp (mime_type, "video/", strlen ("video/")))
return _("Video");
else if (!strncmp (mime_type, "audio/", strlen ("audio/")))
return _("Audio");
else
return _("Misc");
}
static GSList *
get_lang_list (void)
{
GSList *retval;
const char *lang;
char *equal_char;
retval = NULL;
lang = g_getenv ("LANGUAGE");
if (lang == NULL)
lang = g_getenv ("LANG");
if (lang != NULL) {
equal_char = strchr (lang, '=');
if (equal_char != NULL)
lang = equal_char + 1;
retval = g_slist_prepend (retval, g_strdup (lang));
}
return retval;
}
static gchar *
form_extensions_string (const MimeTypeInfo *info, gchar *sep, gchar *prepend)
{
gchar *tmp;
gchar **array;
GList *l;
gint i = 0;
if (prepend == NULL)
prepend = "";
array = g_new0 (gchar *, g_list_length (info->file_extensions) + 1);
for (l = info->file_extensions; l != NULL; l = l->next)
array[i++] = g_strconcat (prepend, l->data, NULL);
tmp = g_strjoinv (sep, array);
g_strfreev (array);
return tmp;
}
gchar *get_real_icon_path (const MimeTypeInfo *info, const gchar *icon_name)
{
gchar *tmp, *tmp1, *ret, *real_icon_name;
if (icon_name == NULL || *icon_name == '\0') {
tmp = g_strdup (info->mime_type);
tmp1 = strchr (tmp, '/');
if (tmp1 != NULL) *tmp1 = '-';
real_icon_name = g_strconcat ("document-icons/gnome-", tmp, ".png", NULL);
g_free (tmp);
} else {
real_icon_name = g_strdup (icon_name);
}
ret = gnome_vfs_icon_path_from_filename (real_icon_name);
if (ret == NULL && strstr (real_icon_name, ".png") == NULL) {
tmp = g_strconcat (real_icon_name, ".png", NULL);
ret = gnome_vfs_icon_path_from_filename (tmp);
g_free (tmp);
}
if (ret == NULL) {
tmp = g_strconcat ("nautilus/", real_icon_name, NULL);
ret = gnome_vfs_icon_path_from_filename (tmp);
g_free (tmp);
}
if (ret == NULL && strstr (real_icon_name, ".png") == NULL) {
tmp = g_strconcat ("nautilus/", real_icon_name, ".png", NULL);
ret = gnome_vfs_icon_path_from_filename (tmp);
g_free (tmp);
}
if (ret == NULL)
ret = gnome_vfs_icon_path_from_filename ("nautilus/i-regular-24.png");
g_free (real_icon_name);
return ret;
}
/* Loads a pixbuf for the icon, falling back on the default icon if
* necessary
*/
void
get_icon_pixbuf (MimeTypeInfo *info, const gchar *icon_path, gboolean want_large)
{
static GHashTable *icon_table = NULL;
if (icon_path == NULL)
icon_path = get_real_icon_path (info, NULL);
if (icon_path == NULL)
return;
if ((want_large && info->icon_pixbuf != NULL) || info->small_icon_pixbuf != NULL)
return;
if (icon_table == NULL)
icon_table = g_hash_table_new (g_str_hash, g_str_equal);
if (!want_large)
info->small_icon_pixbuf = g_hash_table_lookup (icon_table, icon_path);
if (info->small_icon_pixbuf != NULL) {
g_object_ref (G_OBJECT (info->small_icon_pixbuf));
} else {
info->icon_pixbuf = gdk_pixbuf_new_from_file (icon_path, NULL);
if (info->icon_pixbuf == NULL) {
get_icon_pixbuf (info, NULL, want_large);
}
else if (!want_large) {
info->small_icon_pixbuf =
gdk_pixbuf_scale_simple (info->icon_pixbuf, 16, 16, GDK_INTERP_HYPER);
g_hash_table_insert (icon_table, g_strdup (icon_path), info->small_icon_pixbuf);
}
}
}
static MimeCategoryInfo *
get_category (const gchar *category_name, const gchar *category_desc, GtkTreeModel *model)
{
ModelEntry *current, *child;
gchar **cf = NULL, **df = NULL;
gchar **categories = NULL, **desc_categories = NULL;
int i;
if (category_name == NULL && category_desc == NULL)
return NULL;
if (category_name != NULL)
categories = cf = g_strsplit (category_name, "/", -1);
if (category_desc != NULL)
desc_categories = df = g_strsplit (category_desc, "/", -1);
if (category_name == NULL)
categories = desc_categories;
else if (category_desc == NULL)
desc_categories = categories;
current = get_model_entries (model);
for (i = 0; categories[i] != NULL; i++) {
for (child = current->first_child; child != NULL; child = child->next) {
if (child->type != MODEL_ENTRY_CATEGORY)
continue;
if (!g_ascii_strcasecmp ((category_name == NULL) ?
MIME_CATEGORY_INFO (child)->description :
MIME_CATEGORY_INFO (child)->name,
categories[i]))
break;
}
if (child == NULL) {
child = MODEL_ENTRY (mime_category_info_new (MIME_CATEGORY_INFO (current), categories[i],
desc_categories[i], model));
model_entry_insert_child (MODEL_ENTRY (child)->parent, MODEL_ENTRY (child), model);
}
current = child;
}
g_strfreev (cf);
g_strfreev (df);
return MIME_CATEGORY_INFO (current);
}