[Xfce4-commits] <xfdesktop:jannis/port-to-gio> Let Thunar handle unlinking files.
Jannis Pohlmann
noreply at xfce.org
Fri Oct 22 13:36:01 CEST 2010
Updating branch refs/heads/jannis/port-to-gio
to 2adfdc04df575da1a0da4b7f3ff577ea5f8b9487 (commit)
from 5576ca9dac83187fc3d4760de274be537793a9c6 (commit)
commit 2adfdc04df575da1a0da4b7f3ff577ea5f8b9487
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Fri Oct 22 13:35:33 2010 +0200
Let Thunar handle unlinking files.
src/xfdesktop-file-icon-manager.c | 108 +++---------------------------------
src/xfdesktop-file-icon.c | 16 ------
src/xfdesktop-file-icon.h | 3 -
src/xfdesktop-file-utils.c | 76 ++++++++++++++++++++++++++
src/xfdesktop-file-utils.h | 3 +
src/xfdesktop-regular-file-icon.c | 64 ----------------------
6 files changed, 88 insertions(+), 182 deletions(-)
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 4ffa7f1..4110c45 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -646,106 +646,16 @@ static void
xfdesktop_file_icon_manager_delete_files(XfdesktopFileIconManager *fmanager,
GList *files)
{
- GList *l;
- gchar *primary;
- gint ret = GTK_RESPONSE_CANCEL;
- XfdesktopIcon *icon;
GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
-
- if(g_list_length(files) == 1) {
- icon = XFDESKTOP_ICON(files->data);
-
- primary = g_markup_printf_escaped(_("Are you sure that you want to delete \"%s\"?"),
- xfdesktop_icon_peek_label(icon));
- ret = xfce_message_dialog(GTK_WINDOW(toplevel),
- _("Question"), GTK_STOCK_DIALOG_QUESTION,
- primary,
- _("If you delete a file, it is permanently lost."),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT, NULL);
- g_free(primary);
- } else {
- GtkWidget *dlg, *treeview, *vbox, *sw, *cancel_btn, *delete_btn;
- GtkListStore *ls;
- GtkTreeIter itr;
- GtkTreeViewColumn *col;
- GtkCellRenderer *render;
- gint w,h;
-
- gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &w, &h);
-
- primary = g_strdup_printf(_("Are you sure you want to delete the following %d files?"),
- g_list_length(files));
- dlg = xfce_message_dialog_new(GTK_WINDOW(toplevel),
- _("Delete Multiple Files"),
- GTK_STOCK_DIALOG_QUESTION,
- primary,
- _("If you delete a file, it is permanently lost."),
- NULL, NULL);
- g_free(primary);
- vbox = GTK_DIALOG(dlg)->vbox;
-
- sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
- GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_widget_show(sw);
- gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
-
- ls = gtk_list_store_new(N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
- for(l = files; l; l = l->next) {
- icon = XFDESKTOP_ICON(l->data);
- gtk_list_store_append(ls, &itr);
- gtk_list_store_set(ls, &itr,
- COL_PIX, xfdesktop_icon_peek_pixbuf(icon, w),
- COL_NAME, xfdesktop_icon_peek_label(icon),
- -1);
- }
-
- treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
- gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
- GTK_SELECTION_NONE);
-
- render = gtk_cell_renderer_pixbuf_new();
- col = gtk_tree_view_column_new_with_attributes("pix", render,
- "pixbuf", COL_PIX, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col);
-
- render = gtk_cell_renderer_text_new();
- g_object_set(G_OBJECT(render),
- "ellipsize", PANGO_ELLIPSIZE_END,
- "ellipsize-set", TRUE,
- NULL);
- col = gtk_tree_view_column_new_with_attributes("label", render,
- "text", COL_NAME, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col);
-
- gtk_widget_show(treeview);
- gtk_container_add(GTK_CONTAINER(sw), treeview);
-
- cancel_btn = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_widget_show(cancel_btn);
- gtk_dialog_add_action_widget(GTK_DIALOG(dlg), cancel_btn,
- GTK_RESPONSE_CANCEL);
-
- delete_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
- GTK_WIDGET_SET_FLAGS(delete_btn, GTK_CAN_DEFAULT);
- gtk_widget_show(delete_btn);
- gtk_dialog_add_action_widget(GTK_DIALOG(dlg), delete_btn,
- GTK_RESPONSE_ACCEPT);
-
- gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_ACCEPT);
- gtk_widget_show(dlg);
- gtk_widget_grab_focus(delete_btn);
-
- ret = gtk_dialog_run(GTK_DIALOG(dlg));
- gtk_widget_destroy(dlg);
- }
-
- if(GTK_RESPONSE_ACCEPT == ret)
- g_list_foreach(files, (GFunc)xfdesktop_file_icon_delete_file, NULL);
+ GList *gfiles = NULL, *lp;
+
+ for(lp = g_list_last(files); lp != NULL; lp = lp->prev)
+ gfiles = g_list_prepend(gfiles, xfdesktop_file_icon_peek_file(lp->data));
+
+ xfdesktop_file_utils_unlink_files(gfiles, fmanager->priv->gscreen,
+ GTK_WINDOW(toplevel));
+
+ g_list_free(gfiles);
}
static void
diff --git a/src/xfdesktop-file-icon.c b/src/xfdesktop-file-icon.c
index 337680d..b6bf0e6 100644
--- a/src/xfdesktop-file-icon.c
+++ b/src/xfdesktop-file-icon.c
@@ -241,22 +241,6 @@ xfdesktop_file_icon_can_delete_file(XfdesktopFileIcon *icon)
return FALSE;
}
-gboolean
-xfdesktop_file_icon_delete_file(XfdesktopFileIcon *icon)
-{
- XfdesktopFileIconClass *klass;
-
- g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(icon), FALSE);
-
- klass = XFDESKTOP_FILE_ICON_GET_CLASS(icon);
-
- if(klass->delete_file)
- return klass->delete_file(icon);
- else
- return FALSE;
-}
-
-
void
xfdesktop_file_icon_add_active_job(XfdesktopFileIcon *icon,
ThunarVfsJob *job)
diff --git a/src/xfdesktop-file-icon.h b/src/xfdesktop-file-icon.h
index fb8c2b4..916941a 100644
--- a/src/xfdesktop-file-icon.h
+++ b/src/xfdesktop-file-icon.h
@@ -61,9 +61,7 @@ struct _XfdesktopFileIconClass
void (*update_file_info)(XfdesktopFileIcon *icon, GFileInfo *info);
gboolean (*can_rename_file)(XfdesktopFileIcon *icon);
-
gboolean (*can_delete_file)(XfdesktopFileIcon *icon);
- gboolean (*delete_file)(XfdesktopFileIcon *icon);
};
GType xfdesktop_file_icon_get_type(void) G_GNUC_CONST;
@@ -80,7 +78,6 @@ void xfdesktop_file_icon_update_file_info(XfdesktopFileIcon *icon,
gboolean xfdesktop_file_icon_can_rename_file(XfdesktopFileIcon *icon);
gboolean xfdesktop_file_icon_can_delete_file(XfdesktopFileIcon *icon);
-gboolean xfdesktop_file_icon_delete_file(XfdesktopFileIcon *icon);
void xfdesktop_file_icon_add_active_job(XfdesktopFileIcon *icon,
ThunarVfsJob *job);
diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c
index b3579e9..77e1a1e 100644
--- a/src/xfdesktop-file-utils.c
+++ b/src/xfdesktop-file-utils.c
@@ -674,6 +674,82 @@ xfdesktop_file_utils_rename_file(GFile *file,
}
static void
+xfdesktop_file_utils_unlink_files_cb(DBusGProxy *proxy,
+ GError *error,
+ gpointer user_data)
+{
+ GtkWindow *parent = user_data;
+
+ if(parent)
+ xfdesktop_file_utils_set_window_cursor(parent, GDK_LEFT_PTR);
+
+ if(error) {
+ xfce_message_dialog(parent,
+ _("Delete Error"), GTK_STOCK_DIALOG_ERROR,
+ _("The selected files could not be deleted"),
+ error->message,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+ }
+}
+
+void
+xfdesktop_file_utils_unlink_files(GList *files,
+ GdkScreen *screen,
+ GtkWindow *parent)
+{
+ DBusGProxy *fileman_proxy;
+
+ g_return_if_fail(files != NULL && G_IS_FILE(files->data));
+ g_return_if_fail(GDK_IS_SCREEN(screen) || GTK_IS_WINDOW(parent));
+
+ if(!screen)
+ screen = gtk_widget_get_screen(GTK_WIDGET(parent));
+
+ fileman_proxy = xfdesktop_file_utils_peek_filemanager_proxy();
+ if(fileman_proxy) {
+ guint nfiles = g_list_length(files);
+ gchar **uris = g_new0(gchar *, nfiles+1);
+ gchar *display_name = gdk_screen_make_display_name(screen);
+ gchar *startup_id = g_strdup_printf("_TIME%d", gtk_get_current_event_time());
+ GList *lp;
+ gint n;
+
+ /* convert GFile list into an array of URIs */
+ for(n = 0, lp = files; lp != NULL; ++n, lp = lp->next)
+ uris[n] = g_file_get_uri(lp->data);
+ uris[n] = NULL;
+
+ if(!xfdesktop_file_manager_proxy_unlink_files_async(fileman_proxy,
+ NULL, (const gchar **)uris,
+ display_name, startup_id,
+ xfdesktop_file_utils_unlink_files_cb,
+ parent))
+ {
+ xfce_message_dialog(parent,
+ _("Delete Error"), GTK_STOCK_DIALOG_ERROR,
+ _("The selected files could not be deleted"),
+ _("This feature requires a file manager service to "
+ "be present (such as the one supplied by Thunar)."),
+ GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+ } else {
+ if(parent)
+ xfdesktop_file_utils_set_window_cursor(parent, GDK_WATCH);
+ }
+
+ g_free(startup_id);
+ g_strfreev(uris);
+ g_free(display_name);
+ } else {
+ xfce_message_dialog(parent,
+ _("Delete Error"), GTK_STOCK_DIALOG_ERROR,
+ _("The selected files could not be deleted"),
+ _("This feature requires a file manager service to "
+ "be present (such as the one supplied by Thunar)."),
+ GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+ }
+}
+
+static void
xfdesktop_file_utils_create_file_cb(DBusGProxy *proxy,
GError *error,
gpointer user_data)
diff --git a/src/xfdesktop-file-utils.h b/src/xfdesktop-file-utils.h
index fc87177..4691560 100644
--- a/src/xfdesktop-file-utils.h
+++ b/src/xfdesktop-file-utils.h
@@ -90,6 +90,9 @@ void xfdesktop_file_utils_open_folder(GFile *file,
void xfdesktop_file_utils_rename_file(GFile *file,
GdkScreen *screen,
GtkWindow *parent);
+void xfdesktop_file_utils_unlink_files(GList *files,
+ GdkScreen *screen,
+ GtkWindow *parent);
void xfdesktop_file_utils_create_file(GFile *parent_folder,
const gchar *content_type,
GdkScreen *screen,
diff --git a/src/xfdesktop-regular-file-icon.c b/src/xfdesktop-regular-file-icon.c
index 1e08508..f0716cf 100644
--- a/src/xfdesktop-regular-file-icon.c
+++ b/src/xfdesktop-regular-file-icon.c
@@ -92,15 +92,11 @@ static void xfdesktop_regular_file_icon_update_info(XfdesktopFileIcon *icon,
static void xfdesktop_regular_file_icon_update_file_info(XfdesktopFileIcon *icon,
GFileInfo *info);
static gboolean xfdesktop_regular_file_can_write_parent(XfdesktopFileIcon *icon);
-static gboolean xfdesktop_regular_file_icon_delete_file(XfdesktopFileIcon *icon);
#ifdef HAVE_THUNARX
static void xfdesktop_regular_file_icon_tfi_init(ThunarxFileInfoIface *iface);
#endif
-static void xfdesktop_delete_file_finished(ThunarVfsJob *job,
- gpointer user_data);
-
static inline void xfdesktop_regular_file_icon_invalidate_pixbuf(XfdesktopRegularFileIcon *icon);
@@ -143,7 +139,6 @@ xfdesktop_regular_file_icon_class_init(XfdesktopRegularFileIconClass *klass)
file_icon_class->update_file_info = xfdesktop_regular_file_icon_update_file_info;
file_icon_class->can_rename_file = xfdesktop_regular_file_can_write_parent;
file_icon_class->can_delete_file = xfdesktop_regular_file_can_write_parent;
- file_icon_class->delete_file = xfdesktop_regular_file_icon_delete_file;
}
static void
@@ -554,65 +549,6 @@ xfdesktop_regular_file_can_write_parent(XfdesktopFileIcon *icon)
}
-static void
-xfdesktop_delete_file_error(ThunarVfsJob *job,
- GError *error,
- gpointer user_data)
-{
- XfdesktopRegularFileIcon *icon = XFDESKTOP_REGULAR_FILE_ICON(user_data);
- GtkWidget *icon_view = xfdesktop_icon_peek_icon_view(XFDESKTOP_ICON(icon));
- GtkWidget *toplevel = gtk_widget_get_toplevel(icon_view);
- gchar *primary = g_markup_printf_escaped("There was an error deleting \"%s\":",
- icon->priv->info->display_name);
-
- xfce_message_dialog(GTK_WINDOW(toplevel), _("Error"),
- GTK_STOCK_DIALOG_ERROR, primary,
- error->message, GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
- NULL);
-
- g_free(primary);
-}
-
-static void
-xfdesktop_delete_file_finished(ThunarVfsJob *job,
- gpointer user_data)
-{
- XfdesktopRegularFileIcon *icon = XFDESKTOP_REGULAR_FILE_ICON(user_data);
-
- if(!xfdesktop_file_icon_remove_active_job(XFDESKTOP_FILE_ICON(icon), job))
- g_critical("ThunarVfsJob 0x%p not found in active jobs list", job);
-
- g_object_unref(G_OBJECT(job));
- g_object_unref(G_OBJECT(icon));
-}
-
-static gboolean
-xfdesktop_regular_file_icon_delete_file(XfdesktopFileIcon *icon)
-{
- XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
- ThunarVfsJob *job;
-
- job = thunar_vfs_unlink_file(regular_file_icon->priv->info->path, NULL);
-
- if(job) {
- g_object_set_data(G_OBJECT(job), "--xfdesktop-file-icon-callback",
- G_CALLBACK(xfdesktop_delete_file_finished));
- g_object_set_data(G_OBJECT(job), "--xfdesktop-file-icon-data", icon);
- xfdesktop_file_icon_add_active_job(XFDESKTOP_FILE_ICON(regular_file_icon),
- job);
-
- g_signal_connect(G_OBJECT(job), "error",
- G_CALLBACK(xfdesktop_delete_file_error), icon);
- g_signal_connect(G_OBJECT(job), "finished",
- G_CALLBACK(xfdesktop_delete_file_finished), icon);
-
- g_object_ref(G_OBJECT(icon));
- }
-
- /* no real way to signal success or failure at this point */
- return (job != NULL);
-}
-
static G_CONST_RETURN ThunarVfsInfo *
xfdesktop_regular_file_icon_peek_info(XfdesktopFileIcon *icon)
{
More information about the Xfce4-commits
mailing list