diff options
Diffstat (limited to 'src/xfdesktop-special-file-icon.c')
-rw-r--r-- | src/xfdesktop-special-file-icon.c | 94 |
1 files changed, 55 insertions, 39 deletions
diff --git a/src/xfdesktop-special-file-icon.c b/src/xfdesktop-special-file-icon.c index 3f4b96ee..17c3fb5f 100644 --- a/src/xfdesktop-special-file-icon.c +++ b/src/xfdesktop-special-file-icon.c @@ -216,59 +216,75 @@ xfdesktop_special_file_icon_invalidate_pixbuf(XfdesktopSpecialFileIcon *icon) } } -static GdkPixbuf * -xfdesktop_special_file_icon_peek_pixbuf(XfdesktopIcon *icon, - gint width, gint height) +static GIcon * +xfdesktop_special_file_icon_load_icon(XfdesktopIcon *icon) { XfdesktopSpecialFileIcon *special_icon = XFDESKTOP_SPECIAL_FILE_ICON(icon); XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon); + gchar *icon_name = NULL; GFile *parent = NULL; + GIcon *gicon; - if(height != special_icon->priv->cur_pix_height) - xfdesktop_special_file_icon_invalidate_pixbuf(special_icon); + TRACE("entering"); - /* Still valid */ - if(special_icon->priv->pix != NULL) - return special_icon->priv->pix; + /* use a custom icon name for the local filesystem root */ + parent = g_file_get_parent(special_icon->priv->file); + if(!parent && g_file_has_uri_scheme(special_icon->priv->file, "file")) + icon_name = g_strdup("drive-harddisk"); - if(!G_IS_ICON(file_icon->gicon)) { - gchar *icon_name = NULL; + if(parent) + g_object_unref(parent); - /* use a custom icon name for the local filesystem root */ - parent = g_file_get_parent(special_icon->priv->file); - if(!parent && g_file_has_uri_scheme(special_icon->priv->file, "file")) - icon_name = g_strdup("drive-harddisk"); + /* use a custom icon for the trash, based on it having files + * the user can delete */ + if(special_icon->priv->type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH) { + if(special_icon->priv->trash_item_count == 0) + icon_name = g_strdup("user-trash"); + else + icon_name = g_strdup("user-trash-full"); + } - if(parent) - g_object_unref(parent); + /* Create the themed icon for it */ + if(icon_name) { + gicon = g_themed_icon_new(icon_name); + g_free(icon_name); + } - /* use a custom icon for the trash, based on it having files - * the user can delete */ - if(special_icon->priv->type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH) { - if(special_icon->priv->trash_item_count == 0) - icon_name = g_strdup("user-trash"); - else - icon_name = g_strdup("user-trash-full"); - } + /* If we still don't have an icon, use the default */ + if(!G_IS_ICON(gicon)) { + gicon = g_file_info_get_icon(special_icon->priv->file_info); + if(G_IS_ICON(gicon)) + g_object_ref(gicon); + } - /* Create the themed icon for it */ - if(icon_name) { - file_icon->gicon = g_themed_icon_new(icon_name); - g_free(icon_name); - } + g_object_set(file_icon, "gicon", gicon, NULL); - /* If we still don't have an icon, use the default */ - if(!G_IS_ICON(file_icon->gicon)) { - file_icon->gicon = g_file_info_get_icon(special_icon->priv->file_info); - if(G_IS_ICON(file_icon->gicon)) - g_object_ref(file_icon->gicon); - } + /* Add any user set emblems */ + gicon = xfdesktop_file_icon_add_emblems(file_icon); - /* Add any user set emblems */ - xfdesktop_file_icon_add_emblems(file_icon); - } + return gicon; +} + +static GdkPixbuf * +xfdesktop_special_file_icon_peek_pixbuf(XfdesktopIcon *icon, + gint width, gint height) +{ + XfdesktopSpecialFileIcon *special_icon = XFDESKTOP_SPECIAL_FILE_ICON(icon); + GIcon *gicon = NULL; + + if(height != special_icon->priv->cur_pix_height) + xfdesktop_special_file_icon_invalidate_pixbuf(special_icon); + + /* Still valid */ + if(special_icon->priv->pix != NULL) + return special_icon->priv->pix; + + if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon))) + gicon = xfdesktop_special_file_icon_load_icon(icon); + else + g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL); - special_icon->priv->pix = xfdesktop_file_utils_get_icon(file_icon->gicon, + special_icon->priv->pix = xfdesktop_file_utils_get_icon(gicon, height, height, 100); |