[gnome-shell] Thumbnail generation without GtkRecentlyUsed in TextureCache
- From: Siegfried-Angel Gevatter Pujals <sgevatter src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Thumbnail generation without GtkRecentlyUsed in TextureCache
- Date: Sun, 9 Aug 2009 15:47:34 +0000 (UTC)
commit f96193dc8ca1237f191831b8e5578f1618e2f5e9
Author: Siegfried-Angel Gevatter Pujals <rainct ubuntu com>
Date: Fri Aug 7 23:34:36 2009 +0200
Thumbnail generation without GtkRecentlyUsed in TextureCache
This fixes Shell.TextureCache.get_default().load_thumbnail so
that it can be used to get thumbnails (with an icon matching
the mimetype or, in the worst case, gtk-file, as fallback) for
items which don't have a GtkRecentlyUsed object. This is needed
for the Zeitgeist integration.
src/shell-texture-cache.c | 87 +++++++++++++++++++++++++++++++++++----------
1 files changed, 68 insertions(+), 19 deletions(-)
---
diff --git a/src/shell-texture-cache.c b/src/shell-texture-cache.c
index 8e83b75..9c9ecb7 100644
--- a/src/shell-texture-cache.c
+++ b/src/shell-texture-cache.c
@@ -446,6 +446,21 @@ impl_load_thumbnail (ShellTextureCache *cache,
return pixbuf;
}
+static GIcon *
+icon_for_mimetype (const char *mimetype)
+{
+ char *content_type;
+ GIcon *icon;
+
+ content_type = g_content_type_from_mime_type (mimetype);
+ if (!content_type)
+ return NULL;
+
+ icon = g_content_type_get_icon (content_type);
+ g_free (content_type);
+ return icon;
+}
+
static void
load_pixbuf_thread (GSimpleAsyncResult *result,
GObject *object,
@@ -474,10 +489,6 @@ load_pixbuf_thread (GSimpleAsyncResult *result,
mimetype = data->mimetype;
}
pixbuf = impl_load_thumbnail (data->cache, uri, mimetype, data->width, &error);
- if (!pixbuf && data->recent_info)
- {
- pixbuf = gtk_recent_info_get_icon (data->recent_info, data->width);
- }
}
else if (data->uri)
pixbuf = impl_load_pixbuf_file (data->uri, data->width, data->height, &error);
@@ -492,8 +503,9 @@ load_pixbuf_thread (GSimpleAsyncResult *result,
return;
}
- g_simple_async_result_set_op_res_gpointer (result, g_object_ref (pixbuf),
- g_object_unref);
+ if (pixbuf)
+ g_simple_async_result_set_op_res_gpointer (result, g_object_ref (pixbuf),
+ g_object_unref);
}
/**
@@ -646,6 +658,45 @@ pixbuf_to_cogl_handle (GdkPixbuf *pixbuf)
gdk_pixbuf_get_pixels (pixbuf));
}
+static GdkPixbuf *
+load_pixbuf_fallback(AsyncTextureLoadData *data)
+{
+ GdkPixbuf *pixbuf = NULL;
+
+ if (data->thumbnail)
+ {
+
+ GtkIconTheme *theme = gtk_icon_theme_get_default ();
+
+ if (data->recent_info)
+ pixbuf = gtk_recent_info_get_icon (data->recent_info, data->width);
+ else
+ {
+ GIcon *icon = icon_for_mimetype (data->mimetype);
+ if (icon != NULL)
+ {
+ GtkIconInfo *icon_info = gtk_icon_theme_lookup_by_gicon (theme,
+ icon,
+ data->width,
+ GTK_ICON_LOOKUP_USE_BUILTIN);
+ g_object_unref (icon);
+ if (icon_info != NULL)
+ pixbuf = gtk_icon_info_load_icon (icon_info, NULL);
+ }
+ }
+
+ if (pixbuf == NULL)
+ pixbuf = gtk_icon_theme_load_icon (theme,
+ "gtk-file",
+ data->width,
+ GTK_ICON_LOOKUP_USE_BUILTIN,
+ NULL);
+ }
+ /* Maybe we could need a fallback for outher image types? */
+
+ return pixbuf;
+}
+
static void
on_pixbuf_loaded (GObject *source,
GAsyncResult *result,
@@ -662,10 +713,9 @@ on_pixbuf_loaded (GObject *source,
cache = SHELL_TEXTURE_CACHE (source);
pixbuf = load_pixbuf_async_finish (cache, result, &error);
if (pixbuf == NULL)
- {
- /* TODO - we need a "broken image" display of some sort */
- goto out;
- }
+ pixbuf = load_pixbuf_fallback(data);
+ if (pixbuf == NULL)
+ goto out;
texdata = pixbuf_to_cogl_handle (pixbuf);
@@ -929,6 +979,13 @@ shell_texture_cache_load_thumbnail (ShellTextureCache *cache,
CacheKey key;
CoglHandle texdata;
+ /* Don't attempt to load thumbnails for non-local URIs */
+ if (!g_str_has_prefix (uri, "file://"))
+ {
+ GIcon *icon = icon_for_mimetype (mimetype);
+ return shell_texture_cache_load_gicon (cache, icon, size);
+ }
+
texture = create_default_texture (cache);
clutter_actor_set_size (CLUTTER_ACTOR (texture), size, size);
@@ -961,8 +1018,6 @@ static GIcon *
icon_for_recent (GtkRecentInfo *info)
{
const char *mimetype;
- char *content_type;
- GIcon *icon;
mimetype = gtk_recent_info_get_mime_type (info);
if (!mimetype)
@@ -970,13 +1025,7 @@ icon_for_recent (GtkRecentInfo *info)
return g_themed_icon_new (GTK_STOCK_FILE);
}
- content_type = g_content_type_from_mime_type (mimetype);
- if (!content_type)
- return NULL;
-
- icon = g_content_type_get_icon (content_type);
- g_free (content_type);
- return icon;
+ return icon_for_mimetype (mimetype);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]