[gtk+] GktFileSystem: Support rendering symbolic icons
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GktFileSystem: Support rendering symbolic icons
- Date: Wed, 23 Jul 2014 17:42:07 +0000 (UTC)
commit d26a84889b54ec9654c023304d8151cc03d79ed3
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Jul 23 13:39:23 2014 -0400
GktFileSystem: Support rendering symbolic icons
gtk/gtkfilesystem.c | 86 +++++++++++++++++++++++++++++++++++++++++++--------
gtk/gtkfilesystem.h | 7 ++++
2 files changed, 80 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c
index 6508ee8..d424e44 100644
--- a/gtk/gtkfilesystem.c
+++ b/gtk/gtkfilesystem.c
@@ -713,25 +713,36 @@ get_surface_from_gicon (GIcon *icon,
GdkScreen *screen;
GtkIconTheme *icon_theme;
GtkIconInfo *icon_info;
+ GdkPixbuf *pixbuf;
cairo_surface_t *surface;
screen = gtk_widget_get_screen (GTK_WIDGET (widget));
icon_theme = gtk_icon_theme_get_for_screen (screen);
icon_info = gtk_icon_theme_lookup_by_gicon_for_scale (icon_theme,
- icon,
- icon_size,
- gtk_widget_get_scale_factor (widget),
- GTK_ICON_LOOKUP_USE_BUILTIN);
+ icon,
+ icon_size,
+ gtk_widget_get_scale_factor (widget),
+ GTK_ICON_LOOKUP_USE_BUILTIN);
if (!icon_info)
return NULL;
- surface = gtk_icon_info_load_surface (icon_info,
- gtk_widget_get_window (widget), error);
+ pixbuf = gtk_icon_info_load_symbolic_for_context (icon_info,
+ gtk_widget_get_style_context (widget),
+ NULL,
+ error);
g_object_unref (icon_info);
+ if (pixbuf == NULL)
+ return NULL;
+
+ surface = gdk_cairo_surface_create_from_pixbuf (pixbuf,
+ gtk_widget_get_scale_factor (widget),
+ gtk_widget_get_window (widget));
+ g_object_unref (pixbuf);
+
return surface;
}
@@ -744,8 +755,6 @@ _gtk_file_system_volume_render_icon (GtkFileSystemVolume *volume,
GIcon *icon = NULL;
cairo_surface_t *surface;
- DEBUG ("volume_get_icon_name");
-
if (IS_ROOT_VOLUME (volume))
icon = g_themed_icon_new ("drive-harddisk");
else if (G_IS_DRIVE (volume))
@@ -765,6 +774,34 @@ _gtk_file_system_volume_render_icon (GtkFileSystemVolume *volume,
return surface;
}
+cairo_surface_t *
+_gtk_file_system_volume_render_symbolic_icon (GtkFileSystemVolume *volume,
+ GtkWidget *widget,
+ gint icon_size,
+ GError **error)
+{
+ GIcon *icon = NULL;
+ cairo_surface_t *surface;
+
+ if (IS_ROOT_VOLUME (volume))
+ icon = g_themed_icon_new ("drive-harddisk-symbolic");
+ else if (G_IS_DRIVE (volume))
+ icon = g_drive_get_symbolic_icon (G_DRIVE (volume));
+ else if (G_IS_VOLUME (volume))
+ icon = g_volume_get_symbolic_icon (G_VOLUME (volume));
+ else if (G_IS_MOUNT (volume))
+ icon = g_mount_get_symbolic_icon (G_MOUNT (volume));
+
+ if (!icon)
+ return NULL;
+
+ surface = get_surface_from_gicon (icon, widget, icon_size, error);
+
+ g_object_unref (icon);
+
+ return surface;
+}
+
GtkFileSystemVolume *
_gtk_file_system_volume_ref (GtkFileSystemVolume *volume)
{
@@ -794,9 +831,10 @@ _gtk_file_system_volume_unref (GtkFileSystemVolume *volume)
/* GFileInfo helper functions */
cairo_surface_t *
-_gtk_file_info_render_icon (GFileInfo *info,
- GtkWidget *widget,
- gint icon_size)
+_gtk_file_info_render_icon_internal (GFileInfo *info,
+ GtkWidget *widget,
+ gint icon_size,
+ gboolean symbolic)
{
GIcon *icon;
GdkPixbuf *pixbuf;
@@ -823,7 +861,10 @@ _gtk_file_info_render_icon (GFileInfo *info,
if (!surface)
{
- icon = g_file_info_get_icon (info);
+ if (symbolic)
+ icon = g_file_info_get_symbolic_icon (info);
+ else
+ icon = g_file_info_get_icon (info);
if (icon)
surface = get_surface_from_gicon (icon, widget, icon_size, NULL);
@@ -831,7 +872,10 @@ _gtk_file_info_render_icon (GFileInfo *info,
if (!surface)
{
/* Use general fallback for all files without icon */
- icon = g_themed_icon_new ("text-x-generic");
+ if (symbolic)
+ icon = g_themed_icon_new ("text-x-generic-symbolic");
+ else
+ icon = g_themed_icon_new ("text-x-generic");
surface = get_surface_from_gicon (icon, widget, icon_size, NULL);
g_object_unref (icon);
}
@@ -840,6 +884,22 @@ _gtk_file_info_render_icon (GFileInfo *info,
return surface;
}
+cairo_surface_t *
+_gtk_file_info_render_icon (GFileInfo *info,
+ GtkWidget *widget,
+ gint icon_size)
+{
+ return _gtk_file_info_render_icon_internal (info, widget, icon_size, FALSE);
+}
+
+cairo_surface_t *
+_gtk_file_info_render_symbolic_icon (GFileInfo *info,
+ GtkWidget *widget,
+ gint icon_size)
+{
+ return _gtk_file_info_render_icon_internal (info, widget, icon_size, TRUE);
+}
+
gboolean
_gtk_file_info_consider_as_directory (GFileInfo *info)
{
diff --git a/gtk/gtkfilesystem.h b/gtk/gtkfilesystem.h
index 1f38184..ebc796e 100644
--- a/gtk/gtkfilesystem.h
+++ b/gtk/gtkfilesystem.h
@@ -97,6 +97,10 @@ cairo_surface_t * _gtk_file_system_volume_render_icon (GtkFileSystemVol
GtkWidget *widget,
gint icon_size,
GError **error);
+cairo_surface_t * _gtk_file_system_volume_render_symbolic_icon (GtkFileSystemVolume *volume,
+ GtkWidget *widget,
+ gint icon_size,
+ GError **error);
GtkFileSystemVolume *_gtk_file_system_volume_ref (GtkFileSystemVolume *volume);
void _gtk_file_system_volume_unref (GtkFileSystemVolume *volume);
@@ -105,6 +109,9 @@ void _gtk_file_system_volume_unref (GtkFileSystemVol
cairo_surface_t * _gtk_file_info_render_icon (GFileInfo *info,
GtkWidget *widget,
gint icon_size);
+cairo_surface_t * _gtk_file_info_render_symbolic_icon (GFileInfo *info,
+ GtkWidget *widget,
+ gint icon_size);
gboolean _gtk_file_info_consider_as_directory (GFileInfo *info);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]