diff options
author | haxar <[email protected]> | 2012-02-21 20:14:01 -0800 |
---|---|---|
committer | haxar <[email protected]> | 2012-02-21 20:14:01 -0800 |
commit | e46b4adef5c6c6805b3ca6dbfbe99a4299252514 (patch) | |
tree | f95660c9462b74c2775355c29df79267fc30501b /plugins/housekeeping/gsd-ldsm-trash-empty.c | |
parent | ddaceb232c8b537a7d29a9708928d3a3671b98e5 (diff) | |
download | mate-settings-daemon-e46b4adef5c6c6805b3ca6dbfbe99a4299252514.tar.bz2 mate-settings-daemon-e46b4adef5c6c6805b3ca6dbfbe99a4299252514.tar.xz |
gsd to msd complete rename patch by NiceandGently; file rename commit
Diffstat (limited to 'plugins/housekeeping/gsd-ldsm-trash-empty.c')
-rw-r--r-- | plugins/housekeeping/gsd-ldsm-trash-empty.c | 398 |
1 files changed, 0 insertions, 398 deletions
diff --git a/plugins/housekeeping/gsd-ldsm-trash-empty.c b/plugins/housekeeping/gsd-ldsm-trash-empty.c deleted file mode 100644 index 05f82cd..0000000 --- a/plugins/housekeeping/gsd-ldsm-trash-empty.c +++ /dev/null @@ -1,398 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * msd-ldsm-trash-empty.c - * Copyright (C) Chris Coulson 2009 <[email protected]> - * (C) Ryan Lortie 2008 - * - * msd-ldsm-trash-empty.c is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * msd-ldsm-trash-empty.c is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <mateconf/mateconf-client.h> -#include <glib/gi18n.h> -#include <gio/gio.h> - -#include "msd-ldsm-trash-empty.h" - -#define CAJA_CONFIRM_TRASH_KEY "/apps/caja/preferences/confirm_trash" - -/* Some of this code has been borrowed from the trash-applet, courtesy of Ryan Lortie */ - -static GtkWidget *trash_empty_confirm_dialog = NULL; -static GtkWidget *trash_empty_dialog = NULL; -static GtkWidget *location_label; -static GtkWidget *file_label; -static GtkWidget *progressbar; - -static gsize trash_empty_total_files; -static gboolean trash_empty_update_pending = FALSE; -static GFile *trash_empty_current_file = NULL; -static gsize trash_empty_deleted_files; -static GTimer *timer = NULL; -static gboolean trash_empty_actually_deleting; - -static gboolean -trash_empty_done (gpointer data) -{ - gtk_widget_destroy (trash_empty_dialog); - trash_empty_dialog = NULL; - if (timer) { - g_timer_destroy (timer); - timer = NULL; - } - - return FALSE; -} - -static gboolean -trash_empty_update_dialog (gpointer user_data) -{ - gsize deleted, total; - GFile *file; - gboolean actually_deleting; - - g_assert (trash_empty_update_pending); - - deleted = trash_empty_deleted_files; - total = trash_empty_total_files; - file = trash_empty_current_file; - actually_deleting = trash_empty_actually_deleting; - - /* maybe the done() got processed first. */ - if (!trash_empty_dialog) - goto out; - - if (!actually_deleting) { - /* If we havent finished counting yet, then pulse the progressbar every 100ms. - * This stops the user from thinking the dialog has frozen if there are - * a lot of files to delete. We don't pulse it every time we are called from the - * worker thread, otherwise it moves to fast and looks hideous - */ - if (timer) { - if (g_timer_elapsed (timer, NULL) > 0.1) { - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progressbar)); - g_timer_start (timer); - } - } else { - timer = g_timer_new (); - g_timer_start (timer); - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progressbar)); - } - } else { - gchar *text; - gchar *tmp; - gchar *markup; - GFile *parent; - - text = g_strdup_printf (_("Removing item %lu of %lu"), - deleted, total); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar), text); - - g_free (text); - - if (deleted > total) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar), 1.0); - else - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar), - (gdouble) deleted / (gdouble) total); - - parent = g_file_get_parent (file); - text = g_file_get_uri (parent); - g_object_unref (parent); - - gtk_label_set_text (GTK_LABEL (location_label), text); - g_free (text); - - tmp = g_file_get_basename (file); - text = g_markup_printf_escaped (_("Removing: %s"), tmp); - markup = g_strdup_printf ("<i>%s</i>", text); - gtk_label_set_markup (GTK_LABEL (file_label), text); - g_free (markup); - g_free (text); - g_free (tmp); - - /* unhide the labels */ - gtk_widget_show_all (GTK_WIDGET (trash_empty_dialog)); - } - -out: - trash_empty_current_file = NULL; - g_object_unref (file); - - trash_empty_update_pending = FALSE; - - return FALSE; -} - -/* Worker thread begin */ - -static void -trash_empty_maybe_schedule_update (GIOSchedulerJob *job, - GFile *file, - gsize deleted, - gboolean actually_deleting) -{ - if (!trash_empty_update_pending) { - g_assert (trash_empty_current_file == NULL); - - trash_empty_current_file = g_object_ref (file); - trash_empty_deleted_files = deleted; - trash_empty_actually_deleting = actually_deleting; - - trash_empty_update_pending = TRUE; - g_io_scheduler_job_send_to_mainloop_async (job, - trash_empty_update_dialog, - NULL, NULL); - } -} - -static void -trash_empty_delete_contents (GIOSchedulerJob *job, - GCancellable *cancellable, - GFile *file, - gboolean actually_delete, - gsize *deleted) -{ - GFileEnumerator *enumerator; - GFileInfo *info; - GFile *child; - - if (g_cancellable_is_cancelled (cancellable)) - return; - - enumerator = g_file_enumerate_children (file, - G_FILE_ATTRIBUTE_STANDARD_NAME "," - G_FILE_ATTRIBUTE_STANDARD_TYPE, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, - cancellable, NULL); - - if (enumerator) { - while ((info = g_file_enumerator_next_file (enumerator, - cancellable, NULL)) != NULL) { - child = g_file_get_child (file, g_file_info_get_name (info)); - - if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) - trash_empty_delete_contents (job, cancellable, child, - actually_delete, deleted); - - trash_empty_maybe_schedule_update (job, child, *deleted, actually_delete); - if (actually_delete) - g_file_delete (child, cancellable, NULL); - - (*deleted)++; - - g_object_unref (child); - g_object_unref (info); - - if (g_cancellable_is_cancelled (cancellable)) - break; - } - - g_object_unref (enumerator); - } -} - -static gboolean -trash_empty_job (GIOSchedulerJob *job, - GCancellable *cancellable, - gpointer user_data) -{ - gsize deleted; - GFile *trash; - - trash = g_file_new_for_uri ("trash:///"); - - /* first do a dry run to count the number of files */ - deleted = 0; - trash_empty_delete_contents (job, cancellable, trash, FALSE, &deleted); - trash_empty_total_files = deleted; - - /* now do the real thing */ - deleted = 0; - trash_empty_delete_contents (job, cancellable, trash, TRUE, &deleted); - - /* done */ - g_object_unref (trash); - g_io_scheduler_job_send_to_mainloop_async (job, - trash_empty_done, - NULL, NULL); - - return FALSE; -} - -/* Worker thread end */ - -static void -trash_empty_start () -{ - GtkWidget *vbox1, *vbox2, *hbox; - GtkWidget *label1, *label3; - gchar *markup; - GCancellable *cancellable; - - trash_empty_dialog = gtk_dialog_new (); - gtk_window_set_default_size (GTK_WINDOW (trash_empty_dialog), 400, -1); - gtk_window_set_icon_name (GTK_WINDOW (trash_empty_dialog), "user-trash"); - gtk_window_set_title (GTK_WINDOW (trash_empty_dialog), - _("Emptying the trash")); - - vbox1 = gtk_vbox_new (FALSE, 12); - vbox2 = gtk_vbox_new (FALSE, 0); - hbox = gtk_hbox_new (FALSE, 0); - - label1 = gtk_label_new (NULL); - gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE); - gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.5); - - label3 = gtk_label_new (NULL); - gtk_label_set_line_wrap (GTK_LABEL (label3), TRUE); - gtk_misc_set_alignment (GTK_MISC (label3), 0.0, 0.5); - gtk_widget_hide (label3); - - location_label = gtk_label_new (NULL); - gtk_label_set_line_wrap (GTK_LABEL (location_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (location_label), 0.0, 0.5); - - file_label = gtk_label_new (NULL); - gtk_label_set_line_wrap (GTK_LABEL (file_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (file_label), 0.0, 0.5); - - progressbar = gtk_progress_bar_new (); - gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (progressbar), 0.1); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar), _("Preparing to empty trash…")); - - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (trash_empty_dialog))), vbox1, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox1), label1, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), label3, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), location_label, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox1), hbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox2), progressbar, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox2), file_label, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox1), vbox2, TRUE, TRUE, 0); - - gtk_widget_show (label1); - gtk_widget_show (vbox1); - gtk_widget_show_all (vbox2); - gtk_widget_show (hbox); - gtk_widget_show (location_label); - - gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (trash_empty_dialog))), 6); - gtk_container_set_border_width (GTK_CONTAINER (vbox1), 6); - - gtk_dialog_add_button (GTK_DIALOG (trash_empty_dialog), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); - - markup = g_markup_printf_escaped ("<big><b>%s</b></big>", _("Emptying the trash")); - gtk_label_set_markup (GTK_LABEL (label1), markup); - /* Translators: "Emptying trash from <device>" */ - gtk_label_set_text (GTK_LABEL (label3), _("From: ")); - - cancellable = g_cancellable_new (); - g_signal_connect_object (trash_empty_dialog, "response", - G_CALLBACK (g_cancellable_cancel), - cancellable, G_CONNECT_SWAPPED); - g_io_scheduler_push_job (trash_empty_job, NULL, NULL, 0, cancellable); - - gtk_widget_show (trash_empty_dialog); - - g_free (markup); - g_object_unref (cancellable); -} - -static void -trash_empty_confirmation_response (GtkDialog *dialog, - gint response_id, - gpointer user_data) -{ - if (response_id == GTK_RESPONSE_YES) - trash_empty_start (); - - gtk_object_destroy (GTK_OBJECT (dialog)); - trash_empty_confirm_dialog = NULL; -} - -static gboolean -trash_empty_require_confirmation () -{ - MateConfClient *client; - gboolean require_confirmation = TRUE; - GError *error = NULL; - - client = mateconf_client_get_default (); - if (client) { - require_confirmation = mateconf_client_get_bool (client, CAJA_CONFIRM_TRASH_KEY, &error); - if (error) { - g_warning ("Failed to read confirm_trash key from MateConf: %s", error->message ? error->message : "Unknown error"); - /* It's safest to assume that confirmation is required here */ - require_confirmation = TRUE; - g_error_free (error); - } - g_object_unref (client); - } - - return require_confirmation; -} - -static void -trash_empty_show_confirmation_dialog () -{ - GtkWidget *button; - - if (!trash_empty_require_confirmation ()) { - trash_empty_start (); - return; - } - - trash_empty_confirm_dialog = gtk_message_dialog_new (NULL, 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_NONE, - _("Empty all of the items from the trash?")); - - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (trash_empty_confirm_dialog), - _("If you choose to empty the trash, all items in " - "it will be permanently lost. Please note that " - "you can also delete them separately.")); - - gtk_dialog_add_button (GTK_DIALOG (trash_empty_confirm_dialog), GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); - - button = gtk_button_new_with_mnemonic (_("_Empty Trash")); - gtk_widget_show (button); - gtk_widget_set_can_default (button, TRUE); - - gtk_dialog_add_action_widget (GTK_DIALOG (trash_empty_confirm_dialog), - button, GTK_RESPONSE_YES); - - gtk_dialog_set_default_response (GTK_DIALOG (trash_empty_confirm_dialog), - GTK_RESPONSE_YES); - - gtk_window_set_icon_name (GTK_WINDOW (trash_empty_confirm_dialog), - "user-trash"); - - gtk_widget_show (trash_empty_confirm_dialog); - - g_signal_connect (trash_empty_confirm_dialog, "response", - G_CALLBACK (trash_empty_confirmation_response), NULL); -} - -void -msd_ldsm_trash_empty () -{ - if (trash_empty_confirm_dialog) - gtk_window_present (GTK_WINDOW (trash_empty_confirm_dialog)); - else if (trash_empty_dialog) - gtk_window_present (GTK_WINDOW (trash_empty_dialog)); - else - trash_empty_show_confirmation_dialog (); -} |