[Xfce4-commits] <xfdesktop:danielm/port-to-gio> * src/xfdesktop-regular-file-icon.c: - Dropped Jobs stuff. Implemented copy, move, link and unlink functions using Thunar D-Bus API

Daniel Morales noreply at xfce.org
Wed Feb 24 02:12:05 CET 2010


Updating branch refs/heads/danielm/port-to-gio
         to f7002f6a055f742714b0e68840ac594d06c868ac (commit)
       from 6e983da12d2b36c5d1e213d3bda42910b25110c7 (commit)

commit f7002f6a055f742714b0e68840ac594d06c868ac
Author: Daniel Morales <daniel at daniel.com.uy>
Date:   Tue Feb 23 23:03:03 2010 -0200

    * src/xfdesktop-regular-file-icon.c:
    	- Dropped Jobs stuff. Implemented copy, move, link and unlink
    	  functions using Thunar D-Bus API
    
    * TODO.gio:
    	- Updated

 TODO.gio                          |    9 --
 src/xfdesktop-regular-file-icon.c |  256 +++++++++++++++----------------------
 2 files changed, 102 insertions(+), 163 deletions(-)

diff --git a/TODO.gio b/TODO.gio
index 39e59f1..29dba69 100644
--- a/TODO.gio
+++ b/TODO.gio
@@ -1,20 +1,11 @@
 Port to GIO/gUDEV
 ========================
 
-- src/xfdesktop-file-icon.c:
-        -xfdesktop_file_icon_activated():
 - src/xfdesktop-regular-file-icon.c:
         - xfdesktop_regular_file_icon_do_drop_dest():
 
     * We have to implement a replacement for thunar_vfs_info_execute().
 
-- src/xfdesktop-job.[ch]: Implement
-- src/xfdesktop-file-jobs.[ch]: Implement
-    * Maybe we can take a look and see how THUNAR does it :)
-
-- src/xfdesktop-regular-file-icon.c:
-    * "ask" signal to jobs (currently commented until we implement Jobs)
-
 - GCancelable {
     * Maybe we can implement an GCancelable to use on:
         - xfdesktop_regular_file_icon_new
diff --git a/src/xfdesktop-regular-file-icon.c b/src/xfdesktop-regular-file-icon.c
index a0dbe25..5767bf2 100644
--- a/src/xfdesktop-regular-file-icon.c
+++ b/src/xfdesktop-regular-file-icon.c
@@ -45,12 +45,13 @@
 
 #include <libxfce4ui/libxfce4ui.h>
 
+#include <dbus/dbus-glib-lowlevel.h>
+
 #ifdef HAVE_THUNARX
 #include <thunarx/thunarx.h>
 #endif
 
-#include "xfdesktop-job.h"
-#include "xfdesktop-file-jobs.h"
+#include "xfdesktop-dbus-bindings-filemanager.h"
 #include "xfdesktop-file-utils.h"
 #include "xfdesktop-common.h"
 #include "xfdesktop-regular-file-icon.h"
@@ -91,9 +92,6 @@ static gboolean xfdesktop_regular_file_icon_delete_file(XfdesktopFileIcon *icon)
 static void xfdesktop_regular_file_icon_tfi_init(ThunarxFileInfoIface *iface);
 #endif
 
-static void xfdesktop_delete_file_finished(XfdesktopJob *job,
-                                           gpointer user_data);
-
 static inline void xfdesktop_regular_file_icon_invalidate_pixbuf(XfdesktopRegularFileIcon *icon);
 
 
@@ -317,62 +315,6 @@ xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
         return 0;
 }
 
-static void
-xfdesktop_regular_file_icon_drag_job_error(XfdesktopJob *job,
-                                           GError *error,
-                                           gpointer user_data)
-{
-    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(user_data);
-    XfdesktopFileIcon *src_file_icon = g_object_get_data(G_OBJECT(job),
-                                                         "--xfdesktop-src-file-icon");
-    XfdesktopFileUtilsFileop fileop = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(job),
-                                                                        "--xfdesktop-file-icon-action"));
-
-    g_return_if_fail(file_icon);
-    
-    if(!src_file_icon)
-        return;
-    
-    xfdesktop_file_utils_handle_fileop_error(NULL,
-                                             src_file_icon,
-                                             file_icon, fileop,
-                                             error);
-}
-
-#if 0
-static XfdesktopJobResponse
-xfdesktop_regular_file_icon_interactive_job_ask(XfdesktopJob *job,
-                                                const gchar *message,
-                                                XfdesktopJobResponse choices,
-                                                gpointer user_data)
-{
-    GtkWidget *icon_view = xfdesktop_icon_peek_icon_view(XFDESKTOP_ICON(user_data));
-    GtkWidget *toplevel = gtk_widget_get_toplevel(icon_view);
-    return xfdesktop_file_utils_interactive_job_ask(GTK_WINDOW(toplevel),
-                                                    message, choices);
-}
-#endif
-
-static void
-xfdesktop_regular_file_icon_drag_job_finished(XfdesktopJob *job,
-                                              gpointer user_data)
-{
-    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(user_data);
-    XfdesktopFileIcon *src_file_icon = g_object_get_data(G_OBJECT(job),
-                                                         "--xfdesktop-src-file-icon");
-    
-    if(!xfdesktop_file_icon_remove_active_job(file_icon, job))
-        g_critical("XfdesktopJob 0x%p not found in active jobs list", job);
-    
-    if(!xfdesktop_file_icon_remove_active_job(src_file_icon, job))
-        g_critical("XfdesktopJob 0x%p not found in active jobs list", job);
-    
-    g_object_unref(G_OBJECT(job));
-    
-    g_object_unref(G_OBJECT(src_file_icon));
-    g_object_unref(G_OBJECT(file_icon));
-}
-
 static gboolean
 xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                          XfdesktopIcon *src_icon,
@@ -380,6 +322,7 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
 {
     XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
     XfdesktopFileIcon *src_file_icon = XFDESKTOP_FILE_ICON(src_icon);
+    GError *error = NULL;
     
     DBG("entering");
     
@@ -393,7 +336,6 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
     if(xfdesktop_file_utils_is_executable(file_icon)) {
 #if 0
         GList *path_list = g_list_prepend(NULL, src_info->path);
-        GError *error = NULL;
         gboolean succeeded;
         
         succeeded = thunar_vfs_info_execute(file_icon->priv->info,
@@ -417,10 +359,16 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
 #endif
         return TRUE;
     } else {
-        XfdesktopJob *job = NULL;
-        gchar *name;
-        GFile *dest_path;
-        
+        DBusGProxy *thunar_proxy;
+        gchar     **filenames = NULL;
+        gboolean    result = TRUE;
+        GtkWidget  *icon_view, *toplevel;
+        GdkScreen  *gscreen;
+        GFile      *dest_path;
+        gchar      *display_name;
+        gchar      *dest_uri;
+        gchar      *name;
+
         if(xfdesktop_file_utils_is_root(src_file_icon))
             return FALSE;
         
@@ -435,65 +383,71 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
         if(!dest_path)
             return FALSE;
         
+        thunar_proxy = xfdesktop_file_utils_peek_thunar_proxy();
+        
+        /* only one file, but null terminated */
+        filenames = g_new(gchar *, 2);
+        filenames[0] = g_file_get_uri(file_icon->gfile);
+        filenames[1] = NULL;
+        
+        dest_uri = g_file_get_uri(dest_path);
+
+        icon_view = xfdesktop_icon_peek_icon_view(src_icon);
+        gscreen = gtk_widget_get_screen(icon_view);
+        display_name = gdk_screen_make_display_name(gscreen);
+
         switch(action) {
             case GDK_ACTION_MOVE:
                 DBG("doing move");
-                job = xfdesktop_file_jobs_move_file(src_file_icon->gfile, dest_path);
+                result = org_xfce_Thunar_move_into(thunar_proxy,
+                                                   (const gchar **)filenames,
+                                                   dest_uri,
+                                                   display_name,
+                                                   NULL,
+                                                   &error);
                 break;
             
             case GDK_ACTION_COPY:
                 DBG("doing copy");
-                job = xfdesktop_file_jobs_copy_file(src_file_icon->gfile, dest_path);
+                result = org_xfce_Thunar_copy_into(thunar_proxy,
+                                                   (const gchar **)filenames,
+                                                   dest_uri,
+                                                   display_name,
+                                                   NULL,
+                                                   &error);
                 break;
             
             case GDK_ACTION_LINK:
                 DBG("doing link");
-                job = xfdesktop_file_jobs_link_file(src_file_icon->gfile, dest_path);
+                result = org_xfce_Thunar_link_into(thunar_proxy,
+                                                   (const gchar **)filenames,
+                                                   dest_uri,
+                                                   display_name,
+                                                   NULL,
+                                                   &error);
                 break;
             
             default:
                 g_warning("Unsupported drag action: %d", action);
         }
+
+        if(!result && (error != NULL)) {
+            toplevel = gtk_widget_get_toplevel(icon_view);
+
+            xfdesktop_file_utils_handle_fileop_error(GTK_WINDOW(toplevel),
+                                                     src_file_icon,
+                                                     file_icon, action,
+                                                     error);
+            g_error_free(error);
+        }
         
+        g_strfreev(filenames); 
+        g_free(dest_uri);
+        g_free(display_name);
         g_object_unref(dest_path);
         
-        if(job) {
-            DBG("got job, action initiated");
-            
-            /* ensure they aren't destroyed until the job is finished */
-            g_object_ref(G_OBJECT(src_file_icon));
-            g_object_ref(G_OBJECT(file_icon));
-            
-            g_object_set_data(G_OBJECT(job), "--xfdesktop-file-icon-callback",
-                              G_CALLBACK(xfdesktop_regular_file_icon_drag_job_finished));
-            g_object_set_data(G_OBJECT(job), "--xfdesktop-file-icon-data", icon);
-            xfdesktop_file_icon_add_active_job(XFDESKTOP_FILE_ICON(file_icon),
-                                               job);
-            xfdesktop_file_icon_add_active_job(src_file_icon, job);
-            
-            g_object_set_data(G_OBJECT(job), "--xfdesktop-src-file-icon",
-                              src_icon);
-            g_object_set_data(G_OBJECT(job), "--xfdesktop-file-icon-action",
-                              GINT_TO_POINTER(action == GDK_ACTION_MOVE
-                                              ? XFDESKTOP_FILE_UTILS_FILEOP_MOVE
-                                              : (action == GDK_ACTION_COPY
-                                                 ? XFDESKTOP_FILE_UTILS_FILEOP_COPY
-                                                 : XFDESKTOP_FILE_UTILS_FILEOP_LINK)));
-            g_signal_connect(G_OBJECT(job), "error",
-                             G_CALLBACK(xfdesktop_regular_file_icon_drag_job_error),
-                             file_icon);
-#if 0
-            g_signal_connect(G_OBJECT(job), "ask",
-                             G_CALLBACK(xfdesktop_regular_file_icon_interactive_job_ask),
-                             file_icon);
-#endif
-            g_signal_connect(G_OBJECT(job), "finished",
-                             G_CALLBACK(xfdesktop_regular_file_icon_drag_job_finished),
-                             file_icon);
-            
-            return TRUE;
-        } else
-            return FALSE;
+        return result;
+        
     }
     
     return FALSE;
@@ -545,64 +499,58 @@ xfdesktop_regular_file_can_delete_file(XfdesktopFileIcon *icon)
     return xfdesktop_file_utils_can_delete(icon);
 }
 
-static void
-xfdesktop_delete_file_error(XfdesktopJob *job,
-                            GError *error,
-                            gpointer user_data)
-{
-    XfdesktopFileIcon *icon = XFDESKTOP_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\":",
-                                             g_file_info_get_display_name(icon->info));
-                                     
-    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(XfdesktopJob *job,
-                               gpointer user_data)
-{
-    XfdesktopFileIcon *icon = XFDESKTOP_FILE_ICON(user_data);
-    
-    if(!xfdesktop_file_icon_remove_active_job(XFDESKTOP_FILE_ICON(icon), job))
-        g_critical("XfdesktopJob 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)
 {
     XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
-    XfdesktopJob *job;
+    DBusGProxy        *thunar_proxy;
+    GdkScreen         *gscreen;
+    GtkWidget         *icon_view, *toplevel;
+    gboolean           result = TRUE;
+    GError            *error = NULL;
+    gchar            **filenames = NULL;
+    gchar             *display_name;
 
     g_return_val_if_fail(G_IS_FILE(file_icon->gfile), FALSE);
+    g_return_val_if_fail(G_IS_FILE_INFO(file_icon->info), FALSE);
 
-    job = xfdesktop_file_jobs_unlink_file(file_icon->gfile);
+    thunar_proxy = xfdesktop_file_utils_peek_thunar_proxy();
 
-    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(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));
+    /* only one file, but null terminated */
+    filenames = g_new(gchar *, 2);
+    filenames[0] = g_file_get_uri(file_icon->gfile);
+    filenames[1] = NULL;
+    
+    icon_view = xfdesktop_icon_peek_icon_view(XFDESKTOP_ICON(icon));
+    gscreen = gtk_widget_get_screen(icon_view);
+    display_name = gdk_screen_make_display_name(gscreen);
+
+    /* delete the file using Thunar d-bus API */
+    result = org_xfce_Thunar_unlink_files(thunar_proxy,
+                                          (const gchar **)filenames,
+                                          display_name,
+                                          NULL,
+                                          &error);
+    
+    if(!result && (error != NULL)) {
+        gchar *primary = g_markup_printf_escaped("There was an error deleting \"%s\":",
+                                                 g_file_info_get_display_name(file_icon->info));
+
+        toplevel = gtk_widget_get_toplevel(icon_view);
+
+        xfce_message_dialog(GTK_WINDOW(toplevel), _("Error"),
+                            GTK_STOCK_DIALOG_ERROR, primary,
+                            error->message, GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
+                            NULL);
+
+        g_error_free(error);
+        g_free(primary);
     }
     
-    /* no real way to signal success or failure at this point */
-    return (job != NULL);
+    g_strfreev(filenames); 
+    g_free(display_name);
+ 
+    return result;
 }
 
 static gboolean



More information about the Xfce4-commits mailing list