diff -up gnome-applets-2.21.4/trashapplet/src/trash-monitor.c.giotrash gnome-applets-2.21.4/trashapplet/src/trash-monitor.c
--- gnome-applets-2.21.4/trashapplet/src/trash-monitor.c.giotrash 2007-11-27 03:48:48.000000000 -0500
+++ gnome-applets-2.21.4/trashapplet/src/trash-monitor.c 2008-01-22 23:14:52.000000000 -0500
@@ -22,14 +22,12 @@
#include "trash-monitor.h"
#include <string.h>
-#include <libgnomevfs/gnome-vfs.h>
+#include <gio/gio.h>
struct _TrashMonitor {
GObject parent;
-
- GHashTable *volumes;
+ GFileMonitor *file_monitor;
gint total_item_count;
- gint notify_id;
};
struct _TrashMonitorClass {
@@ -38,16 +36,6 @@ struct _TrashMonitorClass {
void (* item_count_changed) (TrashMonitor *monitor);
};
-typedef struct {
- TrashMonitor *monitor;
- GnomeVFSVolume *volume;
- gchar *trash_uri;
- GnomeVFSAsyncHandle *find_handle;
- GnomeVFSMonitorHandle *trash_change_monitor;
- gint item_count;
-} VolumeInfo;
-
-
static void trash_monitor_init (TrashMonitor *monitor);
static void trash_monitor_class_init (TrashMonitorClass *class);
@@ -59,21 +47,14 @@ static GObjectClass *parent_class;
static guint signals[LAST_SIGNAL];
-static void volume_mounted_callback (GnomeVFSVolumeMonitor *volume_monitor,
- GnomeVFSVolume *volume,
- TrashMonitor *monitor);
-static void volume_unmount_started_callback (GnomeVFSVolumeMonitor *volume_monitor,
- GnomeVFSVolume *volume,
- TrashMonitor *monitor);
-
-static void add_volume (TrashMonitor *monitor, GnomeVFSVolume *volume);
-static void remove_volume (TrashMonitor *monitor, GnomeVFSVolume *volume);
-
-static void trash_changed_queue_notify (TrashMonitor *monitor);
+static void file_changed (GFileMonitor *monitor,
+ GFile *child,
+ GFile *other_child,
+ GFileMonitorEvent event_type,
+ gpointer user_data);
G_DEFINE_TYPE (TrashMonitor, trash_monitor, G_TYPE_OBJECT)
-
static void
trash_monitor_class_init (TrashMonitorClass *class)
{
@@ -90,32 +71,62 @@ trash_monitor_class_init (TrashMonitorCl
}
static void
-trash_monitor_init (TrashMonitor *monitor)
+count_children (TrashMonitor *monitor,
+ GFile *file)
{
- GnomeVFSVolumeMonitor *volume_monitor;
- GList *volumes, *tmp;
+ GFileEnumerator *enumerator;
+ GError *error = NULL;
+ GFileInfo *info;
+ gint count;
- monitor->volumes = g_hash_table_new (NULL, NULL);
monitor->total_item_count = 0;
- monitor->notify_id = 0;
- volume_monitor = gnome_vfs_get_volume_monitor ();
+ enumerator = g_file_enumerate_children (file,
+ G_FILE_ATTRIBUTE_STANDARD_TYPE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, &error);
+
+ count = 0;
+
+ if (error)
+ {
+ g_print ("failed to count trash content: %s\n", error->message);
+ return;
+ }
- g_signal_connect_object (volume_monitor, "volume_mounted",
- G_CALLBACK (volume_mounted_callback),
- monitor, 0);
- g_signal_connect_object (volume_monitor, "volume_pre_unmount",
- G_CALLBACK (volume_unmount_started_callback),
- monitor, 0);
-
- volumes = gnome_vfs_volume_monitor_get_mounted_volumes (volume_monitor);
- for (tmp = volumes; tmp != NULL; tmp = tmp->next) {
- GnomeVFSVolume *volume = tmp->data;
+ while (1)
+ {
+ info = g_file_enumerator_next_file (enumerator, NULL, &error);
+ if (error)
+ {
+ g_print ("failed to count trash content: %s\n", error->message);
+ return;
+ }
+ if (!info)
+ break;
- add_volume (monitor, volume);
- gnome_vfs_volume_unref (volume);
- }
- g_list_free (volumes);
+ g_object_unref (info);
+ count++;
+ }
+
+ monitor->total_item_count = count;
+ g_object_unref (enumerator);
+}
+
+static void
+trash_monitor_init (TrashMonitor *monitor)
+{
+ GFile *location;
+
+ monitor->total_item_count = 0;
+
+ location = g_file_new_for_uri ("trash:///");
+ count_children (monitor, location);
+ monitor->file_monitor = g_file_monitor_directory (location, 0, NULL, NULL);
+ g_object_unref (location);
+
+ g_signal_connect_object (monitor->file_monitor, "changed",
+ G_CALLBACK (file_changed), monitor, 0);
}
TrashMonitor *
@@ -130,293 +141,157 @@ trash_monitor_get (void)
}
static void
-volume_mounted_callback (GnomeVFSVolumeMonitor *volume_monitor,
- GnomeVFSVolume *volume,
- TrashMonitor *monitor)
+file_changed (GFileMonitor *file_monitor,
+ GFile *child,
+ GFile *other_file,
+ GFileMonitorEvent event_type,
+ gpointer user_data)
{
- add_volume (monitor, volume);
-}
-
-static void
-volume_unmount_started_callback (GnomeVFSVolumeMonitor *volume_monitor,
- GnomeVFSVolume *volume,
- TrashMonitor *monitor)
-{
- remove_volume (monitor, volume);
-}
-
-static void
-trash_dir_changed (GnomeVFSMonitorHandle *handle,
- const gchar *monitor_uri,
- const gchar *info_uri,
- GnomeVFSMonitorEventType type,
- gpointer user_data)
-{
- VolumeInfo *volinfo;
- GnomeVFSResult res;
- GList *dirlist, *tmp;
- gint count = 0;
-
- volinfo = user_data;
-
- res = gnome_vfs_directory_list_load (&dirlist, volinfo->trash_uri,
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if (res != GNOME_VFS_OK) {
- g_warning("GNOME VFS Error: %s", gnome_vfs_result_to_string (res));
- return;
- }
-
- for (tmp = dirlist; tmp != NULL; tmp = tmp->next) {
- GnomeVFSFileInfo *info = tmp->data;
-
- if (!strcmp (info->name, ".") || !strcmp (info->name, ".."))
- continue;
- count++;
- }
- gnome_vfs_file_info_list_free (dirlist);
-
- if (count != volinfo->item_count) {
- volinfo->item_count = count;
- trash_changed_queue_notify (volinfo->monitor);
- }
-}
-
-static void
-find_directory_callback (GnomeVFSAsyncHandle *handle,
- GList *results,
- gpointer callback_data)
-{
- VolumeInfo *volinfo;
- GnomeVFSFindDirectoryResult *result;
- GnomeVFSResult res;
-
- volinfo = callback_data;
-
- /* we are done finding the volume */
- volinfo->find_handle = NULL;
-
- /* If we can't find the trash, ignore it silently. */
- result = results->data;
- if (result->result != GNOME_VFS_OK)
- return;
+ TrashMonitor *monitor;
- volinfo->trash_uri = gnome_vfs_uri_to_string (result->uri,
- GNOME_VFS_URI_HIDE_NONE);
- /* g_message ("found trash dir: %s", volinfo->trash_uri); */
-
- /* simulate a change to update the directory count */
- trash_dir_changed (NULL, NULL, NULL, GNOME_VFS_MONITOR_EVENT_CHANGED,
- volinfo);
-
- res = gnome_vfs_monitor_add (&volinfo->trash_change_monitor,
- volinfo->trash_uri, GNOME_VFS_MONITOR_DIRECTORY,
- trash_dir_changed,
- volinfo);
-
- if (res != GNOME_VFS_OK) {
- g_warning("GNOME VFS Error: %s", gnome_vfs_result_to_string (res));
- volinfo->trash_change_monitor = NULL;
- }
-}
+ monitor = TRASH_MONITOR (user_data);
-static gboolean
-get_trash_volume (TrashMonitor *monitor,
- GnomeVFSVolume *volume,
- VolumeInfo **volinfo,
- GnomeVFSURI **mount_uri)
-{
- char *uri_str;
-
- *volinfo = g_hash_table_lookup (monitor->volumes, volume);
-
- if (*volinfo != NULL && (*volinfo)->trash_uri != NULL)
- return FALSE;
-
- if (!gnome_vfs_volume_handles_trash (volume))
- return FALSE;
-
- uri_str = gnome_vfs_volume_get_activation_uri (volume);
- *mount_uri = gnome_vfs_uri_new (uri_str);
- g_free (uri_str);
-
- if (*volinfo == NULL) {
- *volinfo = g_new0 (VolumeInfo, 1);
- (*volinfo)->monitor = monitor;
- (*volinfo)->volume = gnome_vfs_volume_ref (volume);
- g_hash_table_insert (monitor->volumes, volume, *volinfo);
- }
-
- return TRUE;
+ switch (event_type)
+ {
+ case G_FILE_MONITOR_EVENT_DELETED:
+ monitor->total_item_count--;
+ g_signal_emit (monitor, signals[ITEM_COUNT_CHANGED], 0);
+ break;
+ case G_FILE_MONITOR_EVENT_CREATED:
+ monitor->total_item_count++;
+ g_signal_emit (monitor, signals[ITEM_COUNT_CHANGED], 0);
+ break;
+ default: ;
+ }
}
-static void
-add_volume (TrashMonitor *monitor, GnomeVFSVolume *volume)
+typedef struct _EmptyTrashJob EmptyTrashJob;
+struct _EmptyTrashJob
{
- VolumeInfo *volinfo;
- GnomeVFSURI *mount_uri;
- GList vfs_uri_as_list;
+ GCancellable *cancellable;
+ GList *trash_dirs;
+ gint ref_count;
+};
- if (!get_trash_volume (monitor, volume, &volinfo, &mount_uri))
- return;
+static EmptyTrashJob *
+empty_trash_job_new (void)
+{
+ EmptyTrashJob *job;
- if (volinfo->find_handle) {
- /* already searchinf for trash */
- gnome_vfs_uri_unref (mount_uri);
- return;
- }
+ job = g_new0 (EmptyTrashJob, 1);
+ job->ref_count = 1;
-
- vfs_uri_as_list.data = mount_uri;
- vfs_uri_as_list.next = NULL;
- vfs_uri_as_list.prev = NULL;
-
- gnome_vfs_async_find_directory (&volinfo->find_handle, &vfs_uri_as_list,
- GNOME_VFS_DIRECTORY_KIND_TRASH,
- FALSE, TRUE, 0777,
- GNOME_VFS_PRIORITY_DEFAULT,
- find_directory_callback, volinfo);
- gnome_vfs_uri_unref (mount_uri);
+ return job;
}
static void
-remove_volume (TrashMonitor *monitor, GnomeVFSVolume *volume)
+empty_trash_job_ref (EmptyTrashJob *job)
{
- VolumeInfo *volinfo;
-
- volinfo = g_hash_table_lookup (monitor->volumes, volume);
- if (volinfo != NULL) {
- g_hash_table_remove (monitor->volumes, volume);
-
- /* g_message ("removing volume %s", volinfo->trash_uri); */
- if (volinfo->find_handle != NULL)
- gnome_vfs_async_cancel (volinfo->find_handle);
- if (volinfo->trash_change_monitor != NULL)
- gnome_vfs_monitor_cancel (volinfo->trash_change_monitor);
-
- if (volinfo->trash_uri)
- g_free (volinfo->trash_uri);
-
- /* if this volume contained some trash, then notify that the trash
- * state has changed */
- if (volinfo->item_count != 0)
- trash_changed_queue_notify (monitor);
-
- gnome_vfs_volume_unref (volinfo->volume);
- g_free (volinfo);
- }
+ job->ref_count++;
}
-/* --- */
-
static void
-readd_volumes (gpointer key, gpointer value, gpointer user_data)
+empty_trash_job_unref (EmptyTrashJob *job)
{
- TrashMonitor *monitor = user_data;
- GnomeVFSVolume *volume;
+ job->ref_count--;
+ if (job->ref_count == 0)
+ {
+ g_list_foreach (job->trash_dirs, (GFunc)g_object_unref, NULL);
+ g_list_free (job->trash_dirs);
- volume = key;
- add_volume (monitor, volume);
-}
-void
-trash_monitor_recheck_trash_dirs (TrashMonitor *monitor)
-{
- /* call add_volume() on each volume, to add trash dirs where missing */
- g_hash_table_foreach (monitor->volumes, readd_volumes, monitor);
+ g_object_unref (job->cancellable);
+ g_free (job);
+ }
}
-/* --- */
-
-void
-trash_monitor_empty_trash (TrashMonitor *monitor,
- GnomeVFSAsyncHandle **handle,
- GnomeVFSAsyncXferProgressCallback func,
- gpointer user_data)
-{
- GList *trash_dirs = NULL, *volumes, *tmp;
- GnomeVFSVolume *volume;
- GnomeVFSURI *mount_uri, *trash_uri;
- gchar *uri_str;
-
- /* collect the trash directories */
- volumes = gnome_vfs_volume_monitor_get_mounted_volumes (gnome_vfs_get_volume_monitor ());
- for (tmp = volumes; tmp != NULL; tmp = tmp->next) {
- volume = tmp->data;
- if (gnome_vfs_volume_handles_trash (volume)) {
- /* get the mount point for this volume */
- uri_str = gnome_vfs_volume_get_activation_uri (volume);
- mount_uri = gnome_vfs_uri_new (uri_str);
- g_free (uri_str);
-
- g_assert (mount_uri != NULL);
-
- /* Look for the trash directory. Since we tell it not to create or
- * look for the dir, it doesn't block. */
- if (gnome_vfs_find_directory (mount_uri,
- GNOME_VFS_DIRECTORY_KIND_TRASH, &trash_uri,
- FALSE, FALSE, 0777) == GNOME_VFS_OK) {
- trash_dirs = g_list_prepend (trash_dirs, trash_uri);
- }
- gnome_vfs_uri_unref (mount_uri);
- }
- gnome_vfs_volume_unref (volume);
- }
- g_list_free (volumes);
+static void
+delete_trash_file (EmptyTrashJob *job,
+ GFile *file,
+ gboolean del_dir)
+{
+ GFileInfo *info;
+ GFile *child;
+ GFileEnumerator *enumerator;
- if (trash_dirs != NULL)
- gnome_vfs_async_xfer (handle, trash_dirs, NULL,
- GNOME_VFS_XFER_EMPTY_DIRECTORIES,
- GNOME_VFS_XFER_ERROR_MODE_ABORT,
- GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
- GNOME_VFS_PRIORITY_DEFAULT,
- func, user_data, NULL, NULL);
- gnome_vfs_uri_list_free (trash_dirs);
-}
+ if (g_cancellable_is_cancelled (job->cancellable))
+ return;
+ /* FIXME: progress */
-/* --- */
+ enumerator = g_file_enumerate_children (file,
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ job->cancellable,
+ NULL);
+ if (enumerator)
+ {
+ while ((info = g_file_enumerator_next_file (enumerator, job->cancellable, NULL)) != NULL)
+ {
+ child = g_file_get_child (file,
+ g_file_info_get_name (info));
+ delete_trash_file (job, child, TRUE);
+ g_object_unref (child);
+ g_object_unref (info);
+
+ if (g_cancellable_is_cancelled (job->cancellable))
+ break;
+ }
-static void
-count_items (gpointer key, gpointer value, gpointer user_data)
-{
- VolumeInfo *volinfo;
- gint *item_count;
+ g_object_unref (enumerator);
+ }
- volinfo = value;
- item_count = user_data;
- *item_count += volinfo->item_count;
+ if (!g_cancellable_is_cancelled (job->cancellable) && del_dir)
+ g_file_delete (file, job->cancellable, NULL);
}
static gboolean
-trash_changed_notify (gpointer user_data)
+empty_trash_job_done (gpointer user_data)
{
- TrashMonitor *monitor = user_data;
- gint item_count;
+ EmptyTrashJob *job = user_data;
- /* reset notification id */
- monitor->notify_id = 0;
+ /* FIXME finish progress */
- /* count the volumes */
- item_count = 0;
- g_hash_table_foreach (monitor->volumes, count_items, &item_count);
-
- /* if the item count has changed ... */
- if (item_count != monitor->total_item_count) {
- monitor->total_item_count = item_count;
- /* g_message ("item count is %d", item_count); */
- g_signal_emit (monitor, signals[ITEM_COUNT_CHANGED], 0);
- }
+ empty_trash_job_unref (job);
return FALSE;
}
static void
-trash_changed_queue_notify (TrashMonitor *monitor)
+empty_trash_job (GIOSchedulerJob *io_job,
+ GCancellable *cancellable,
+ gpointer user_data)
{
- /* already queued */
- if (monitor->notify_id != 0)
- return;
+ EmptyTrashJob *job = user_data;
+ GList *l;
- monitor->notify_id = g_idle_add (trash_changed_notify, monitor);
+ /* FIXME start progress */
+
+ for (l = job->trash_dirs;
+ l && !g_cancellable_is_cancelled (cancellable);
+ l = l->next)
+ delete_trash_file (job, l->data, FALSE);
+
+ empty_trash_job_ref (job);
+ g_io_scheduler_job_send_to_mainloop_async (io_job,
+ empty_trash_job_done,
+ job,
+ (GDestroyNotify)empty_trash_job_unref);
+}
+
+void
+trash_monitor_empty_trash (TrashMonitor *monitor,
+ GCancellable *cancellable,
+ gpointer func,
+ gpointer user_data)
+{
+ EmptyTrashJob *job;
+
+ job = empty_trash_job_new ();
+ job->cancellable = g_object_ref (cancellable);
+ job->trash_dirs = g_list_prepend (job->trash_dirs,
+ g_file_new_for_uri ("trash:"));
+
+ g_io_scheduler_push_job (empty_trash_job, job, (GDestroyNotify)empty_trash_job_unref, 0, cancellable);
}
int
@@ -433,11 +308,6 @@ main (int argc, char **argv)
{
TrashMonitor *monitor;
- if (!gnome_vfs_init ()) {
- g_printerr ("Can not initialise gnome-vfs.\n");
- return 1;
- }
-
monitor = trash_monitor_get ();
g_main_loop_run (g_main_loop_new (NULL, FALSE));
diff -up gnome-applets-2.21.4/trashapplet/src/Makefile.am.giotrash gnome-applets-2.21.4/trashapplet/src/Makefile.am
--- gnome-applets-2.21.4/trashapplet/src/Makefile.am.giotrash 2007-11-27 03:48:48.000000000 -0500
+++ gnome-applets-2.21.4/trashapplet/src/Makefile.am 2008-01-22 23:14:52.000000000 -0500
@@ -1,6 +1,6 @@
INCLUDES = -I$(top_srcdir) \
$(GNOME_APPLETS_CFLAGS) \
- $(GNOME_VFS_APPLETS_CFLAGS) \
+ $(GIO_CFLAGS) \
$(LIBGLADE_CFLAGS)
libexec_PROGRAMS = trashapplet
@@ -13,7 +13,7 @@ trashapplet_SOURCES = \
xstuff.c \
xstuff.h
-trashapplet_LDADD = \
- $(GNOME_APPLETS_LIBS) \
- $(GNOME_VFS_APPLETS_LIBS) \
+trashapplet_LDADD = \
+ $(GNOME_APPLETS_LIBS) \
+ $(GIO_LIBS) \
$(LIBGLADE_LIBS)
diff -up gnome-applets-2.21.4/trashapplet/src/trashapplet.c.giotrash gnome-applets-2.21.4/trashapplet/src/trashapplet.c
--- gnome-applets-2.21.4/trashapplet/src/trashapplet.c.giotrash 2007-11-27 03:48:48.000000000 -0500
+++ gnome-applets-2.21.4/trashapplet/src/trashapplet.c 2008-01-22 23:14:52.000000000 -0500
@@ -31,6 +31,7 @@
#include <gconf/gconf-client.h>
#include <libgnome/gnome-help.h>
#include <glade/glade.h>
+#include <gio/gio.h>
#include "trashapplet.h"
#include "trash-monitor.h"
@@ -118,9 +119,6 @@ trash_applet_class_init (TrashAppletClas
static void
trash_applet_init (TrashApplet *applet)
{
- GnomeVFSResult res;
- GnomeVFSURI *trash_uri;
-
gtk_window_set_default_icon_name (TRASH_ICON_FULL);
panel_applet_set_flags (PANEL_APPLET (applet),
@@ -148,20 +146,6 @@ trash_applet_init (TrashApplet *applet)
gtk_widget_show (applet->image);
applet->icon_state = TRASH_STATE_UNKNOWN;
- /* create local trash directory if needed */
- res = gnome_vfs_find_directory (NULL,
- GNOME_VFS_DIRECTORY_KIND_TRASH,
- &trash_uri,
- TRUE,
- TRUE,
- 0700);
- if (trash_uri)
- gnome_vfs_uri_unref (trash_uri);
- if (res != GNOME_VFS_OK) {
- g_warning (_("Unable to find the Trash directory: %s"),
- gnome_vfs_result_to_string (res));
- }
-
/* set up trash monitor */
applet->monitor = trash_monitor_get ();
applet->monitor_signal_id =
@@ -239,6 +223,7 @@ trash_applet_change_orient (PanelApplet
break;
case PANEL_APPLET_ORIENT_UP:
case PANEL_APPLET_ORIENT_DOWN:
+ default:
applet->orient = GTK_ORIENTATION_HORIZONTAL;
new_size = GTK_WIDGET (applet)->allocation.height;
break;
@@ -503,6 +488,7 @@ error_dialog (TrashApplet *applet, const
g_free (error_string);
}
+#if 0
static gint
update_transfer_callback (GnomeVFSAsyncHandle *handle,
GnomeVFSXferProgressInfo *progress_info,
@@ -561,6 +547,7 @@ update_transfer_callback (GnomeVFSAsyncH
return 1;
}
+#endif
/* this function is based on the one with the same name in
libnautilus-private/nautilus-file-operations.c */
@@ -627,12 +614,9 @@ confirm_empty_trash (GtkWidget *parent_v
}
static void
-on_empty_trash_cancel (GtkWidget *widget, GnomeVFSAsyncHandle **handle)
+on_empty_trash_cancel (GtkWidget *widget, GCancellable *cancellable)
{
- if (handle != NULL) {
- gnome_vfs_async_cancel ((GnomeVFSAsyncHandle *) handle);
- }
-
+ g_cancellable_cancel (cancellable);
gtk_widget_hide (widget);
}
@@ -643,7 +627,7 @@ trash_applet_do_empty (BonoboUIComponent
{
GtkWidget *dialog;
- GnomeVFSAsyncHandle *hnd;
+ GCancellable *cancellable;
g_return_if_fail (TRASH_IS_APPLET (applet));
@@ -656,16 +640,17 @@ trash_applet_do_empty (BonoboUIComponent
if (!applet->xml)
applet->xml = glade_xml_new (GNOME_GLADEDIR "/trashapplet.glade", NULL, NULL);
- dialog = glade_xml_get_widget(applet->xml, "empty_trash");
+ dialog = glade_xml_get_widget (applet->xml, "empty_trash");
- g_signal_connect(dialog, "response", G_CALLBACK (on_empty_trash_cancel), &hnd);
+ cancellable = g_cancellable_new ();
+ g_signal_connect (dialog, "response", G_CALLBACK (on_empty_trash_cancel), cancellable);
- gtk_widget_show_all(dialog);
+ gtk_widget_show_all (dialog);
trash_monitor_empty_trash (applet->monitor,
- &hnd, update_transfer_callback, applet);
+ cancellable, NULL, applet);
- gtk_widget_hide(dialog);
+ gtk_widget_hide (dialog);
}
@@ -846,80 +831,50 @@ trash_applet_drag_data_received (GtkWidg
guint time_)
{
TrashApplet *applet = TRASH_APPLET (widget);
- GList *list, *scan;
- GList *source_uri_list, *target_uri_list, *unmovable_uri_list;
- GnomeVFSResult result;
-
- list = gnome_vfs_uri_list_parse ((gchar *)selectiondata->data);
-
- source_uri_list = NULL;
- target_uri_list = NULL;
- unmovable_uri_list = NULL;
- for (scan = g_list_first (list); scan; scan = g_list_next (scan)) {
- GnomeVFSURI *source_uri = scan->data;
- GnomeVFSURI *trash_uri, *target_uri;
- gchar *source_basename;
-
- /* find the trash directory for this file */
- result = gnome_vfs_find_directory (source_uri,
- GNOME_VFS_DIRECTORY_KIND_TRASH,
- &trash_uri, TRUE, FALSE, 0);
- if (result != GNOME_VFS_OK) {
- unmovable_uri_list = g_list_prepend (unmovable_uri_list,
- gnome_vfs_uri_ref (source_uri));
- continue;
+ gchar **list;
+ gint i;
+ GList *trashed = NULL;
+ GList *untrashable = NULL;
+ GList *l;
+ GError *error = NULL;
+
+ list = g_uri_list_extract_uris ((gchar *)selectiondata->data);
+
+ for (i = 0; list[i]; i++) {
+ GFile *file;
+
+ file = g_file_new_for_uri (list[i]);
+ if (!g_file_trash (file, NULL, NULL)) {
+ untrashable = g_list_prepend (untrashable, file);
}
-
- source_basename = gnome_vfs_uri_extract_short_name
- (source_uri);
-
- target_uri = gnome_vfs_uri_append_file_name(trash_uri,
- source_basename);
- g_free (source_basename);
- gnome_vfs_uri_unref (trash_uri);
-
- source_uri_list = g_list_prepend (source_uri_list,
- gnome_vfs_uri_ref (source_uri));
- target_uri_list = g_list_prepend (target_uri_list,
- target_uri);
- }
-
- gnome_vfs_uri_list_free(list);
-
- /* we might have added a trash dir, so recheck */
- trash_monitor_recheck_trash_dirs (applet->monitor);
-
- if (source_uri_list) {
- result = gnome_vfs_xfer_uri_list (source_uri_list, target_uri_list,
- GNOME_VFS_XFER_REMOVESOURCE |
- GNOME_VFS_XFER_RECURSIVE,
- GNOME_VFS_XFER_ERROR_MODE_ABORT,
- GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
- NULL, NULL);
- gnome_vfs_uri_list_free (source_uri_list);
- gnome_vfs_uri_list_free (target_uri_list);
- if (result != GNOME_VFS_OK) {
- error_dialog (applet, _("Unable to move to trash:\n%s"),
- gnome_vfs_result_to_string (result));
+ else {
+ trashed = g_list_prepend (trashed, file);
}
}
- if (unmovable_uri_list) {
- if (confirm_delete_immediately (widget,
- g_list_length (unmovable_uri_list),
- source_uri_list == NULL)) {
- result = gnome_vfs_xfer_delete_list (unmovable_uri_list,
- GNOME_VFS_XFER_ERROR_MODE_ABORT,
- GNOME_VFS_XFER_RECURSIVE,
- NULL, NULL);
- } else {
- result = GNOME_VFS_OK;
- }
- gnome_vfs_uri_list_free (unmovable_uri_list);
- if (result != GNOME_VFS_OK) {
- error_dialog (applet, _("Unable to move to trash:\n%s"),
- gnome_vfs_result_to_string (result));
+
+ if (untrashable) {
+ if (confirm_delete_immediately (widget,
+ g_list_length (untrashable),
+ trashed == NULL)) {
+ for (l = untrashable; l; l = l->next) {
+ if (!g_file_delete (l->data, NULL, &error)) {
+ error_dialog (applet,
+ _("Unable to delete '%s': %s"),
+ g_file_get_uri (l->data),
+ error->message);
+ g_clear_error (&error);
+ }
+ }
}
}
+
+ g_list_foreach (untrashable, (GFunc)g_object_unref, NULL);
+ g_list_free (untrashable);
+ g_list_foreach (trashed, (GFunc)g_object_unref, NULL);
+ g_list_free (trashed);
+
+ g_strfreev (list);
+
gtk_drag_finish (context, TRUE, FALSE, time_);
}
@@ -951,6 +906,8 @@ trash_applet_factory (PanelApplet *apple
int
main (int argc, char *argv [])
{
+ g_thread_init (NULL);
+
/* gettext stuff */
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
diff -up gnome-applets-2.21.4/trashapplet/src/trash-monitor.h.giotrash gnome-applets-2.21.4/trashapplet/src/trash-monitor.h
--- gnome-applets-2.21.4/trashapplet/src/trash-monitor.h.giotrash 2007-11-27 03:48:48.000000000 -0500
+++ gnome-applets-2.21.4/trashapplet/src/trash-monitor.h 2008-01-22 23:14:52.000000000 -0500
@@ -23,7 +23,7 @@
#ifndef __TRASH_MONITOR_H__
#define __TRASH_MONITOR_H__
-#include <libgnomevfs/gnome-vfs.h>
+#include <gio/gio.h>
typedef struct _TrashMonitor TrashMonitor;
typedef struct _TrashMonitorClass TrashMonitorClass;
@@ -41,9 +41,9 @@ TrashMonitor *trash_monitor_get (v
/* check if new trash dirs have been created */
void trash_monitor_recheck_trash_dirs (TrashMonitor *monitor);
void trash_monitor_empty_trash (TrashMonitor *monitor,
- GnomeVFSAsyncHandle **handle,
- GnomeVFSAsyncXferProgressCallback func,
- gpointer user_data);
+ GCancellable *cancellable,
+ gpointer func,
+ gpointer user_data);
int trash_monitor_get_item_count (TrashMonitor *monitor);
#endif
diff -up gnome-applets-2.21.4/Makefile.am.giotrash gnome-applets-2.21.4/Makefile.am
--- gnome-applets-2.21.4/Makefile.am.giotrash 2008-01-12 19:32:14.000000000 -0500
+++ gnome-applets-2.21.4/Makefile.am 2008-01-22 23:14:52.000000000 -0500
@@ -7,8 +7,7 @@ endif
vfs_applets = \
drivemount \
- gweather \
- trashapplet
+ gweather
if BUILD_GNOME_VFS_APPLETS
vfs_SUBDIRS = $(vfs_applets)
endif
@@ -45,12 +44,13 @@ if BUILD_INVEST_APPLET
invest_applet_SUBDIR = invest-applet
endif
-always_built_SUBDIRS = \
+always_built_SUBDIRS = \
charpick \
geyes \
mini-commander \
gkb-new \
stickynotes \
+ trashapplet \
null_applet
SUBDIRS = \
diff -up gnome-applets-2.21.4/configure.in.giotrash gnome-applets-2.21.4/configure.in
--- gnome-applets-2.21.4/configure.in.giotrash 2008-01-22 23:14:52.000000000 -0500
+++ gnome-applets-2.21.4/configure.in 2008-01-22 23:17:06.000000000 -0500
@@ -13,6 +13,7 @@ dnl *** Minimum library versions for GNO
dnl ***************************************************************************
GTK_REQUIRED=2.11.0
GLIB_REQUIRED=2.13.0
+GIO_REQUIRED=2.15.3
LIBGNOME_REQUIRED=2.8.0
LIBGNOMEUI_REQUIRED=2.8.0
GNOME_VFS_REQUIRED=2.15.4
@@ -110,6 +111,11 @@ PKG_CHECK_MODULES(GAILUTIL, gail >= $LIB
AC_SUBST(GAILUTIL_CFLAGS)
AC_SUBST(GAILUTIL_LIBS)
+dnl -- check for gio (required) ------------------------------------------
+PKG_CHECK_MODULES(GIO, gio-2.0 >= $GIO_REQUIRED)
+AC_SUBST(GIO_CFLAGS)
+AC_SUBST(GIO_LIBS)
+
dnl -- Check for GTK+ 2.0 (required) ------------------------------------------
PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_REQUIRED)
AC_SUBST(GTK_FLAGS)