From 039feecf4f8c0a970e73b83ec15951d7c84f790c Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Mon, 12 Dec 2011 20:58:40 +0300 Subject: [PATCH] Added a check to see if the user can delete files in their trash before counting it against them. Also added code to load the correct trash icon based on the trash_item_count. Fixes Bug 6256. --- src/xfdesktop-special-file-icon.c | 127 +++++++++++++++++++++++++++++++++--- 1 files changed, 116 insertions(+), 11 deletions(-) diff --git a/src/xfdesktop-special-file-icon.c b/src/xfdesktop-special-file-icon.c index 1226adf..ef12a7b 100644 --- a/src/xfdesktop-special-file-icon.c +++ b/src/xfdesktop-special-file-icon.c @@ -234,11 +234,40 @@ xfdesktop_special_file_icon_peek_pixbuf(XfdesktopIcon *icon, if(parent) g_object_unref(parent); - if(file_icon->priv->file_info) + /* Try very hard to use the right trash icon. */ + if(file_icon->priv->type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH) { + GtkIconTheme *icon_theme; + icon_theme = gtk_icon_theme_get_default(); + if(file_icon->priv->trash_item_count == 0) { + if(gtk_icon_theme_has_icon(icon_theme, "user-trash")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "user-trash", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "xfce-trash_empty")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "xfce-trash_empty", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "gnome-fs-trash-empty")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "gnome-fs-trash-empty", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "stock_trash_empty")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "stock_trash_empty", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(file_icon->priv->file_info) + gicon = g_file_info_get_icon(file_icon->priv->file_info); + } else { + if(gtk_icon_theme_has_icon(icon_theme, "user-trash_full")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "user-trash-full", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "xfce-trash_full")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "xfce-trash_full", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "gnome-fs-trash-empty")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "gnome-fs-trash-empty", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(gtk_icon_theme_has_icon(icon_theme, "stock_trash_full")) + file_icon->priv->pix = gtk_icon_theme_load_icon(icon_theme, "stock_trash_full", size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + else if(file_icon->priv->file_info) + gicon = g_file_info_get_icon(file_icon->priv->file_info); + } + } else if(file_icon->priv->file_info) { gicon = g_file_info_get_icon(file_icon->priv->file_info); - - file_icon->priv->pix = xfdesktop_file_utils_get_icon(custom_icon_name, gicon, - size, NULL, 100); + } + + if(!file_icon->priv->pix) + file_icon->priv->pix = xfdesktop_file_utils_get_icon(custom_icon_name, gicon, + size, NULL, 100); file_icon->priv->cur_pix_size = size; } @@ -496,13 +525,31 @@ xfdesktop_special_file_icon_populate_context_menu(XfdesktopIcon *icon, mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); - - if(gtk_icon_theme_has_icon(icon_theme, "user-trash")) - img = gtk_image_new_from_icon_name("user-trash", GTK_ICON_SIZE_MENU); - else if(gtk_icon_theme_has_icon(icon_theme, "gnome-fs-trash-empty")) - img = gtk_image_new_from_icon_name("gnome-fs-trash-empty", GTK_ICON_SIZE_MENU); - else - img = NULL; + + /* Try very hard to use the right trash icon. */ + if(special_file_icon->priv->trash_item_count == 0) { + if(gtk_icon_theme_has_icon(icon_theme, "user-trash")) + img = gtk_image_new_from_icon_name("user-trash", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "xfce-trash_empty")) + img = gtk_image_new_from_icon_name("xfce-trash_empty", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "gnome-fs-trash-empty")) + img = gtk_image_new_from_icon_name("gnome-fs-trash-empty", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "stock_trash_empty")) + img = gtk_image_new_from_icon_name("stock_trash_empty", GTK_ICON_SIZE_MENU); + else + img = NULL; + } else { + if(gtk_icon_theme_has_icon(icon_theme, "user-trash-full")) + img = gtk_image_new_from_icon_name("user-trash-full", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "xfce-trash_full")) + img = gtk_image_new_from_icon_name("xfce-trash_full", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "gnome-fs-trash-empty")) + img = gtk_image_new_from_icon_name("gnome-fs-trash-empty", GTK_ICON_SIZE_MENU); + else if(gtk_icon_theme_has_icon(icon_theme, "stock_trash_full")) + img = gtk_image_new_from_icon_name("stock_trash_full", GTK_ICON_SIZE_MENU); + else + img = NULL; + } mi = gtk_image_menu_item_new_with_mnemonic(_("_Empty Trash")); if(img) @@ -580,6 +627,35 @@ xfdesktop_special_file_icon_changed(GFileMonitor *monitor, { special_file_icon->priv->trash_item_count = g_file_info_get_attribute_uint32(special_file_icon->priv->file_info, G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT); + if(special_file_icon->priv->trash_item_count > 0) { + gint n = 0; + GFileEnumerator *enumerator; + + /* The trash count may return a number of files the user can't + * currently delete, for example if the file is in a removable + * drive that isn't mounted. + */ + enumerator = g_file_enumerate_children(special_file_icon->priv->file, + G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + if(enumerator) { + GFileInfo *f_info; + for(f_info = g_file_enumerator_next_file(enumerator, NULL, NULL); f_info != NULL; + f_info = g_file_enumerator_next_file(enumerator, NULL, NULL)) + { + n++; + g_object_unref(f_info); + } + g_file_enumerator_close(enumerator, NULL, NULL); + g_object_unref(enumerator); + } else { + n = special_file_icon->priv->trash_item_count; + } + + special_file_icon->priv->trash_item_count = n; + } } /* invalidate the tooltip */ @@ -640,6 +716,35 @@ xfdesktop_special_file_icon_new(XfdesktopSpecialFileIconType type, if(type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH) { special_file_icon->priv->trash_item_count = g_file_info_get_attribute_uint32(special_file_icon->priv->file_info, G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT); + if(special_file_icon->priv->trash_item_count > 0) { + gint n = 0; + GFileEnumerator *enumerator; + + /* The trash count may return a number of files the user can't + * currently delete, for example if the file is in a removable + * drive that isn't mounted. + */ + enumerator = g_file_enumerate_children(special_file_icon->priv->file, + G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + if(enumerator) { + GFileInfo *f_info; + for(f_info = g_file_enumerator_next_file(enumerator, NULL, NULL); f_info != NULL; + f_info = g_file_enumerator_next_file(enumerator, NULL, NULL)) + { + n++; + g_object_unref(f_info); + } + g_file_enumerator_close(enumerator, NULL, NULL); + g_object_unref(enumerator); + } else { + n = special_file_icon->priv->trash_item_count; + } + + special_file_icon->priv->trash_item_count = n; + } } g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)), -- 1.7.5.4