summaryrefslogtreecommitdiff
path: root/gtk/gtkfilesystem.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-07-23 13:39:23 -0400
committerMatthias Clasen <mclasen@redhat.com>2014-07-23 13:41:57 -0400
commitd26a84889b54ec9654c023304d8151cc03d79ed3 (patch)
treebed1ab3b816035258a15b2c634a15f93e7ffd11c /gtk/gtkfilesystem.c
parent386e59683a40de6a90b40466b77ace90bd5b3f80 (diff)
downloadgtk+-d26a84889b54ec9654c023304d8151cc03d79ed3.tar.gz
GktFileSystem: Support rendering symbolic icons
Diffstat (limited to 'gtk/gtkfilesystem.c')
-rw-r--r--gtk/gtkfilesystem.c86
1 files changed, 73 insertions, 13 deletions
diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c
index 6508ee8195..d424e44fcb 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)
{