remove the caching code, (gtk_file_info_get_icon_name): new function,
2006-04-30 Kristian Rietveld <kris@imendio.com> * gtk/gtkfilesystem.[ch] (gtk_file_info_render_icon): remove the caching code, (gtk_file_info_get_icon_name): new function, (gtk_file_system_volume_get_icon_name): new function, (gtk_file_system_volume_render_icon): refactor to use get_icon_name() and render the icon on the fly. * gtk/gtkfilesystemunix.c (gtk_file_system_unix_volume_render_icon), (gtk_file_system_unix_volume_get_icon_name): reflect updates in file system interface, (get_fallback_icon): remove, along with icon caching code. * gtk/gtk.symbols: updated.
This commit is contained in:
committed by
Kristian Rietveld
parent
c0d7735260
commit
65bdb7ca9a
16
ChangeLog
16
ChangeLog
@@ -1,3 +1,19 @@
|
||||
2006-04-30 Kristian Rietveld <kris@imendio.com>
|
||||
|
||||
* gtk/gtkfilesystem.[ch] (gtk_file_info_render_icon): remove the
|
||||
caching code,
|
||||
(gtk_file_info_get_icon_name): new function,
|
||||
(gtk_file_system_volume_get_icon_name): new function,
|
||||
(gtk_file_system_volume_render_icon): refactor to use
|
||||
get_icon_name() and render the icon on the fly.
|
||||
|
||||
* gtk/gtkfilesystemunix.c (gtk_file_system_unix_volume_render_icon),
|
||||
(gtk_file_system_unix_volume_get_icon_name): reflect updates in
|
||||
file system interface,
|
||||
(get_fallback_icon): remove, along with icon caching code.
|
||||
|
||||
* gtk/gtk.symbols: updated.
|
||||
|
||||
2006-04-30 Kristian Rietveld <kris@imendio.com>
|
||||
|
||||
* gtk/gtkfilesystemmodel.c (got_root_folder_cb), (ref_path_cb),
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
2006-04-30 Kristian Rietveld <kris@imendio.com>
|
||||
|
||||
* gtk/gtkfilesystem.[ch] (gtk_file_info_render_icon): remove the
|
||||
caching code,
|
||||
(gtk_file_info_get_icon_name): new function,
|
||||
(gtk_file_system_volume_get_icon_name): new function,
|
||||
(gtk_file_system_volume_render_icon): refactor to use
|
||||
get_icon_name() and render the icon on the fly.
|
||||
|
||||
* gtk/gtkfilesystemunix.c (gtk_file_system_unix_volume_render_icon),
|
||||
(gtk_file_system_unix_volume_get_icon_name): reflect updates in
|
||||
file system interface,
|
||||
(get_fallback_icon): remove, along with icon caching code.
|
||||
|
||||
* gtk/gtk.symbols: updated.
|
||||
|
||||
2006-04-30 Kristian Rietveld <kris@imendio.com>
|
||||
|
||||
* gtk/gtkfilesystemmodel.c (got_root_folder_cb), (ref_path_cb),
|
||||
|
||||
@@ -1344,6 +1344,7 @@ gtk_file_info_copy
|
||||
gtk_file_info_free
|
||||
gtk_file_info_get_display_key
|
||||
gtk_file_info_get_display_name
|
||||
gtk_file_info_get_icon_name
|
||||
gtk_file_info_get_is_folder
|
||||
gtk_file_info_get_is_hidden
|
||||
gtk_file_info_get_mime_type
|
||||
@@ -1385,6 +1386,7 @@ gtk_file_system_uri_to_path
|
||||
gtk_file_system_volume_free
|
||||
gtk_file_system_volume_get_base_path
|
||||
gtk_file_system_volume_get_display_name
|
||||
gtk_file_system_volume_get_icon_name
|
||||
gtk_file_system_volume_get_is_mounted
|
||||
gtk_file_system_volume_mount
|
||||
gtk_file_system_volume_render_icon
|
||||
|
||||
@@ -271,81 +271,12 @@ gtk_file_info_set_icon_name (GtkFileInfo *info,
|
||||
info->icon_name = g_strdup (icon_name);
|
||||
}
|
||||
|
||||
|
||||
typedef struct
|
||||
G_CONST_RETURN gchar *
|
||||
gtk_file_info_get_icon_name (const GtkFileInfo *info)
|
||||
{
|
||||
gint size;
|
||||
GdkPixbuf *pixbuf;
|
||||
} IconCacheElement;
|
||||
|
||||
static void
|
||||
icon_cache_element_free (IconCacheElement *element)
|
||||
{
|
||||
if (element->pixbuf)
|
||||
g_object_unref (element->pixbuf);
|
||||
g_free (element);
|
||||
}
|
||||
|
||||
static void
|
||||
icon_theme_changed (GtkIconTheme *icon_theme)
|
||||
{
|
||||
GHashTable *cache;
|
||||
|
||||
/* Difference from the initial creation is that we don't
|
||||
* reconnect the signal
|
||||
*/
|
||||
cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
(GDestroyNotify)g_free,
|
||||
(GDestroyNotify)icon_cache_element_free);
|
||||
g_object_set_data_full (G_OBJECT (icon_theme), I_("gtk-file-icon-cache"),
|
||||
cache, (GDestroyNotify)g_hash_table_destroy);
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
get_cached_icon (GtkWidget *widget,
|
||||
const gchar *name,
|
||||
gint pixel_size)
|
||||
{
|
||||
GtkIconTheme *icon_theme;
|
||||
GHashTable *cache;
|
||||
IconCacheElement *element;
|
||||
|
||||
icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget));
|
||||
cache = g_object_get_data (G_OBJECT (icon_theme), "gtk-file-icon-cache");
|
||||
|
||||
if (!cache)
|
||||
{
|
||||
cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
(GDestroyNotify)g_free,
|
||||
(GDestroyNotify)icon_cache_element_free);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (icon_theme), I_("gtk-file-icon-cache"),
|
||||
cache, (GDestroyNotify)g_hash_table_destroy);
|
||||
g_signal_connect (icon_theme, "changed",
|
||||
G_CALLBACK (icon_theme_changed), NULL);
|
||||
}
|
||||
|
||||
element = g_hash_table_lookup (cache, name);
|
||||
if (!element)
|
||||
{
|
||||
element = g_new0 (IconCacheElement, 1);
|
||||
g_hash_table_insert (cache, g_strdup (name), element);
|
||||
}
|
||||
|
||||
if (element->size != pixel_size)
|
||||
{
|
||||
if (element->pixbuf)
|
||||
g_object_unref (element->pixbuf);
|
||||
element->size = pixel_size;
|
||||
|
||||
if (g_path_is_absolute (name))
|
||||
element->pixbuf = gdk_pixbuf_new_from_file_at_size (name, pixel_size, pixel_size, NULL);
|
||||
else
|
||||
element->pixbuf = gtk_icon_theme_load_icon (icon_theme, name,
|
||||
pixel_size, 0, NULL);
|
||||
}
|
||||
|
||||
return element->pixbuf ? g_object_ref (element->pixbuf) : NULL;
|
||||
g_return_val_if_fail (info != NULL, NULL);
|
||||
|
||||
return info->icon_name;
|
||||
}
|
||||
|
||||
GdkPixbuf *
|
||||
@@ -360,7 +291,21 @@ gtk_file_info_render_icon (const GtkFileInfo *info,
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
||||
|
||||
if (info->icon_name)
|
||||
pixbuf = get_cached_icon (widget, info->icon_name, pixel_size);
|
||||
{
|
||||
if (g_path_is_absolute (info->icon_name))
|
||||
pixbuf = gdk_pixbuf_new_from_file_at_size (info->icon_name,
|
||||
pixel_size,
|
||||
pixel_size,
|
||||
NULL);
|
||||
else
|
||||
{
|
||||
GtkIconTheme *icon_theme;
|
||||
|
||||
icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget));
|
||||
pixbuf = gtk_icon_theme_load_icon (icon_theme, info->icon_name,
|
||||
pixel_size, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!pixbuf)
|
||||
{
|
||||
@@ -740,17 +685,53 @@ gtk_file_system_volume_render_icon (GtkFileSystem *file_system,
|
||||
gint pixel_size,
|
||||
GError **error)
|
||||
{
|
||||
gchar *icon_name;
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
|
||||
g_return_val_if_fail (volume != NULL, NULL);
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
||||
g_return_val_if_fail (pixel_size > 0, NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->volume_render_icon (file_system,
|
||||
volume,
|
||||
widget,
|
||||
pixel_size,
|
||||
error);
|
||||
icon_name = gtk_file_system_volume_get_icon_name (file_system, volume,
|
||||
error);
|
||||
if (!icon_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget)),
|
||||
icon_name, pixel_size, 0, NULL);
|
||||
g_free (icon_name);
|
||||
|
||||
return pixbuf;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_file_system_volume_get_icon_name:
|
||||
* @file_system: a #GtkFileSystem
|
||||
* @volume: a #GtkFileSystemVolume
|
||||
* @error: location to store error, or %NULL
|
||||
*
|
||||
* Gets an icon name suitable for a #GtkFileSystemVolume.
|
||||
*
|
||||
* Return value: An icon name which can be used for rendering an icon for
|
||||
* this volume, or %NULL if no icon name could be found. In the latter
|
||||
* case, the @error value will be set as appropriate.
|
||||
**/
|
||||
gchar *
|
||||
gtk_file_system_volume_get_icon_name (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
|
||||
g_return_val_if_fail (volume != NULL, NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->volume_get_icon_name (file_system,
|
||||
volume,
|
||||
error);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -109,6 +109,7 @@ void gtk_file_info_set_size (GtkFileInfo *in
|
||||
|
||||
void gtk_file_info_set_icon_name (GtkFileInfo *info,
|
||||
const gchar *con_name);
|
||||
G_CONST_RETURN gchar *gtk_file_info_get_icon_name (const GtkFileInfo *info);
|
||||
GdkPixbuf *gtk_file_info_render_icon (const GtkFileInfo *info,
|
||||
GtkWidget *widget,
|
||||
gint pixel_size,
|
||||
@@ -214,10 +215,8 @@ struct _GtkFileSystemIface
|
||||
gpointer data);
|
||||
char * (*volume_get_display_name) (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume);
|
||||
GdkPixbuf * (*volume_render_icon) (GtkFileSystem *file_system,
|
||||
gchar * (*volume_get_icon_name) (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GtkWidget *widget,
|
||||
gint pixel_size,
|
||||
GError **error);
|
||||
|
||||
/* Path Manipulation
|
||||
@@ -294,6 +293,9 @@ GdkPixbuf * gtk_file_system_volume_render_icon (GtkFileSystem
|
||||
GtkWidget *widget,
|
||||
gint pixel_size,
|
||||
GError **error);
|
||||
gchar * gtk_file_system_volume_get_icon_name (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GError **error);
|
||||
|
||||
gboolean gtk_file_system_get_parent (GtkFileSystem *file_system,
|
||||
const GtkFilePath *path,
|
||||
|
||||
@@ -172,10 +172,8 @@ static GtkFileSystemHandle *gtk_file_system_unix_volume_mount (GtkFileSystem
|
||||
gpointer data);
|
||||
static gchar * gtk_file_system_unix_volume_get_display_name (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume);
|
||||
static GdkPixbuf * gtk_file_system_unix_volume_render_icon (GtkFileSystem *file_system,
|
||||
static gchar * gtk_file_system_unix_volume_get_icon_name (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GtkWidget *widget,
|
||||
gint pixel_size,
|
||||
GError **error);
|
||||
|
||||
static gboolean gtk_file_system_unix_get_parent (GtkFileSystem *file_system,
|
||||
@@ -348,7 +346,7 @@ gtk_file_system_unix_iface_init (GtkFileSystemIface *iface)
|
||||
iface->volume_get_is_mounted = gtk_file_system_unix_volume_get_is_mounted;
|
||||
iface->volume_mount = gtk_file_system_unix_volume_mount;
|
||||
iface->volume_get_display_name = gtk_file_system_unix_volume_get_display_name;
|
||||
iface->volume_render_icon = gtk_file_system_unix_volume_render_icon;
|
||||
iface->volume_get_icon_name = gtk_file_system_unix_volume_get_icon_name;
|
||||
iface->get_parent = gtk_file_system_unix_get_parent;
|
||||
iface->make_path = gtk_file_system_unix_make_path;
|
||||
iface->parse = gtk_file_system_unix_parse;
|
||||
@@ -1136,75 +1134,6 @@ get_icon_type (const char *filename,
|
||||
return get_icon_type_from_stat (&statbuf);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gint size;
|
||||
GdkPixbuf *pixbuf;
|
||||
} IconCacheElement;
|
||||
|
||||
static void
|
||||
icon_cache_element_free (IconCacheElement *element)
|
||||
{
|
||||
if (element->pixbuf)
|
||||
g_object_unref (element->pixbuf);
|
||||
g_free (element);
|
||||
}
|
||||
|
||||
static void
|
||||
icon_theme_changed (GtkIconTheme *icon_theme)
|
||||
{
|
||||
GHashTable *cache;
|
||||
|
||||
/* Difference from the initial creation is that we don't
|
||||
* reconnect the signal
|
||||
*/
|
||||
cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
(GDestroyNotify)g_free,
|
||||
(GDestroyNotify)icon_cache_element_free);
|
||||
g_object_set_data_full (G_OBJECT (icon_theme), I_("gtk-file-icon-cache"),
|
||||
cache, (GDestroyNotify)g_hash_table_destroy);
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
get_cached_icon (GtkWidget *widget,
|
||||
const gchar *name,
|
||||
gint pixel_size)
|
||||
{
|
||||
GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget));
|
||||
GHashTable *cache = g_object_get_data (G_OBJECT (icon_theme), "gtk-file-icon-cache");
|
||||
IconCacheElement *element;
|
||||
|
||||
if (!cache)
|
||||
{
|
||||
cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
(GDestroyNotify)g_free,
|
||||
(GDestroyNotify)icon_cache_element_free);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (icon_theme), I_("gtk-file-icon-cache"),
|
||||
cache, (GDestroyNotify)g_hash_table_destroy);
|
||||
g_signal_connect (icon_theme, "changed",
|
||||
G_CALLBACK (icon_theme_changed), NULL);
|
||||
}
|
||||
|
||||
element = g_hash_table_lookup (cache, name);
|
||||
if (!element)
|
||||
{
|
||||
element = g_new0 (IconCacheElement, 1);
|
||||
g_hash_table_insert (cache, g_strdup (name), element);
|
||||
}
|
||||
|
||||
if (element->size != pixel_size)
|
||||
{
|
||||
if (element->pixbuf)
|
||||
g_object_unref (element->pixbuf);
|
||||
element->size = pixel_size;
|
||||
element->pixbuf = gtk_icon_theme_load_icon (icon_theme, name,
|
||||
pixel_size, 0, NULL);
|
||||
}
|
||||
|
||||
return element->pixbuf ? g_object_ref (element->pixbuf) : NULL;
|
||||
}
|
||||
|
||||
/* Renders a fallback icon from the stock system */
|
||||
static const gchar *
|
||||
get_fallback_icon_name (IconType icon_type)
|
||||
@@ -1233,44 +1162,13 @@ get_fallback_icon_name (IconType icon_type)
|
||||
return stock_name;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
get_fallback_icon (GtkWidget *widget,
|
||||
IconType icon_type,
|
||||
GError **error)
|
||||
static gchar *
|
||||
gtk_file_system_unix_volume_get_icon_name (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GError **error)
|
||||
{
|
||||
const char *name;
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
name = get_fallback_icon_name (icon_type);
|
||||
|
||||
pixbuf = gtk_widget_render_icon (widget, name, GTK_ICON_SIZE_SMALL_TOOLBAR, NULL);
|
||||
if (!pixbuf)
|
||||
g_set_error (error,
|
||||
GTK_FILE_SYSTEM_ERROR,
|
||||
GTK_FILE_SYSTEM_ERROR_FAILED,
|
||||
_("Could not get a stock icon for %s"),
|
||||
name);
|
||||
|
||||
return pixbuf;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
gtk_file_system_unix_volume_render_icon (GtkFileSystem *file_system,
|
||||
GtkFileSystemVolume *volume,
|
||||
GtkWidget *widget,
|
||||
gint pixel_size,
|
||||
GError **error)
|
||||
{
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
pixbuf = get_cached_icon (widget, "gnome-dev-harddisk", pixel_size);
|
||||
if (pixbuf)
|
||||
return pixbuf;
|
||||
|
||||
pixbuf = get_fallback_icon (widget, ICON_BLOCK_DEVICE, error);
|
||||
g_assert (pixbuf != NULL);
|
||||
|
||||
return pixbuf;
|
||||
/* FIXME: maybe we just always want to return GTK_STOCK_HARDDISK here */
|
||||
return g_strdup ("gnome-dev-harddisk");
|
||||
}
|
||||
|
||||
static char *
|
||||
|
||||
Reference in New Issue
Block a user