[Xfce4-commits] <xfdesktop:master> Let Thunar handle unlinking files.

Jannis Pohlmann noreply at xfce.org
Tue Nov 2 01:14:27 CET 2010


Updating branch refs/heads/master
         to 53fe2fde337c40080dc34f0c308f54f2ecc62201 (commit)
       from ce112a289a47bcc9e7f89d11dc96d48cf9e3a38c (commit)

commit 53fe2fde337c40080dc34f0c308f54f2ecc62201
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