[Xfce4-commits] <xfdesktop:danielm/port-to-gio> - src/xfdesktop-regular-file-icon.c: - src/xfdesktop-regular-file-icon.h: * Porting Regular File Icon. (GIO and thunarx-2 stuff) - TODO.gio: * A TODO file to track what is missing/need some research.

Jannis Pohlmann noreply at xfce.org
Sun Aug 29 21:14:06 CEST 2010


Updating branch refs/heads/danielm/port-to-gio
         to 014a1b5a038a10fa92212564d144a30a509ef535 (commit)
       from 5b8b29e890b0041ed7182b2cab4dac075a50bfa6 (commit)

commit 014a1b5a038a10fa92212564d144a30a509ef535
Author: Daniel Morales <daniel at daniel.com.uy>
Date:   Tue Feb 16 16:36:08 2010 -0200

    - src/xfdesktop-regular-file-icon.c:
    - src/xfdesktop-regular-file-icon.h:
    	* Porting Regular File Icon. (GIO and thunarx-2 stuff)
    - TODO.gio:
    	* A TODO file to track what is missing/need some research.

 TODO.gio                          |   23 +++
 src/xfdesktop-regular-file-icon.c |  362 ++++++++++++++++++++-----------------
 src/xfdesktop-regular-file-icon.h |    4 +-
 3 files changed, 219 insertions(+), 170 deletions(-)

diff --git a/TODO.gio b/TODO.gio
new file mode 100644
index 0000000..39e59f1
--- /dev/null
+++ b/TODO.gio
@@ -0,0 +1,23 @@
+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
+        - xfdesktop_regular_file_icon_update_gfile
+        - xfdesktop_regular_file_icon_rename_file
+}
diff --git a/src/xfdesktop-regular-file-icon.c b/src/xfdesktop-regular-file-icon.c
index ced25f9..8e53be7 100644
--- a/src/xfdesktop-regular-file-icon.c
+++ b/src/xfdesktop-regular-file-icon.c
@@ -49,6 +49,8 @@
 #include <thunarx/thunarx.h>
 #endif
 
+#include "xfdesktop-job.h"
+#include "xfdesktop-file-jobs.h"
 #include "xfdesktop-file-utils.h"
 #include "xfdesktop-common.h"
 #include "xfdesktop-regular-file-icon.h"
@@ -61,7 +63,6 @@ struct _XfdesktopRegularFileIconPrivate
     gchar *tooltip;
     guint pix_opacity;
     gint cur_pix_size;
-    ThunarVfsInfo *info;
     GdkScreen *gscreen;
 };
 
@@ -77,10 +78,11 @@ static gboolean xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                                          XfdesktopIcon *src_icon,
                                                          GdkDragAction action);
 
-static G_CONST_RETURN ThunarVfsInfo *xfdesktop_regular_file_icon_peek_info(XfdesktopFileIcon *icon);
-static void xfdesktop_regular_file_icon_update_info(XfdesktopFileIcon *icon,
-                                                    ThunarVfsInfo *info);
-static gboolean xfdesktop_regular_file_can_write_parent(XfdesktopFileIcon *icon);
+static void xfdesktop_regular_file_icon_update_gfile(XfdesktopFileIcon *icon,
+                                                     GFile *gfile);
+
+static gboolean xfdesktop_regular_file_can_rename_file(XfdesktopFileIcon *icon);
+static gboolean xfdesktop_regular_file_can_delete_file(XfdesktopFileIcon *icon);
 static gboolean xfdesktop_regular_file_icon_rename_file(XfdesktopFileIcon *icon,
                                                         const gchar *new_name);
 static gboolean xfdesktop_regular_file_icon_delete_file(XfdesktopFileIcon *icon);
@@ -89,7 +91,7 @@ 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(ThunarVfsJob *job,
+static void xfdesktop_delete_file_finished(XfdesktopJob *job,
                                            gpointer user_data);
 
 static inline void xfdesktop_regular_file_icon_invalidate_pixbuf(XfdesktopRegularFileIcon *icon);
@@ -125,12 +127,12 @@ xfdesktop_regular_file_icon_class_init(XfdesktopRegularFileIconClass *klass)
     icon_class->get_allowed_drag_actions = xfdesktop_regular_file_icon_get_allowed_drag_actions;
     icon_class->get_allowed_drop_actions = xfdesktop_regular_file_icon_get_allowed_drop_actions;
     icon_class->do_drop_dest = xfdesktop_regular_file_icon_do_drop_dest;
-    
-    file_icon_class->peek_info = xfdesktop_regular_file_icon_peek_info;
-    file_icon_class->update_info = xfdesktop_regular_file_icon_update_info;
-    file_icon_class->can_rename_file = xfdesktop_regular_file_can_write_parent;
+
+    file_icon_class->update_gfile = xfdesktop_regular_file_icon_update_gfile;
+
+    file_icon_class->can_rename_file = xfdesktop_regular_file_can_rename_file;
     file_icon_class->rename_file = xfdesktop_regular_file_icon_rename_file;
-    file_icon_class->can_delete_file = xfdesktop_regular_file_can_write_parent;
+    file_icon_class->can_delete_file = xfdesktop_regular_file_can_delete_file;
     file_icon_class->delete_file = xfdesktop_regular_file_icon_delete_file;
 }
 
@@ -156,9 +158,6 @@ xfdesktop_regular_file_icon_finalize(GObject *obj)
     if(icon->priv->pix)
         g_object_unref(G_OBJECT(icon->priv->pix));
     
-    if(icon->priv->info)
-        thunar_vfs_info_unref(icon->priv->info);
-    
     if(icon->priv->tooltip)
         g_free(icon->priv->tooltip);
     
@@ -176,7 +175,9 @@ xfdesktop_regular_file_icon_tfi_init(ThunarxFileInfoIface *iface)
     iface->get_mime_type = xfdesktop_thunarx_file_info_get_mime_type;
     iface->has_mime_type = xfdesktop_thunarx_file_info_has_mime_type;
     iface->is_directory = xfdesktop_thunarx_file_info_is_directory;
-    iface->get_vfs_info = xfdesktop_thunarx_file_info_get_vfs_info;
+    iface->get_file_info = xfdesktop_thunarx_file_info_get_file_info;
+    iface->get_filesystem_info = xfdesktop_thunarx_file_info_get_filesystem_info;
+    iface->get_location = xfdesktop_thunarx_file_info_get_location;
 }
 #endif
 
@@ -194,22 +195,26 @@ static GdkPixbuf *
 xfdesktop_regular_file_icon_peek_pixbuf(XfdesktopIcon *icon,
                                         gint size)
 {
-    XfdesktopRegularFileIcon *file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
-    const gchar *icon_name = NULL;
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
+    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
+    gchar *icon_name = NULL;
     GdkPixbuf *emblem_pix = NULL;
+
+    g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(file_icon), NULL);
+    g_return_val_if_fail(G_IS_FILE(file_icon->gfile), NULL);
+
+    if(size != regular_file_icon->priv->cur_pix_size)
+        xfdesktop_regular_file_icon_invalidate_pixbuf(regular_file_icon);
     
-    if(size != file_icon->priv->cur_pix_size)
-        xfdesktop_regular_file_icon_invalidate_pixbuf(file_icon);
-    
-    if(!file_icon->priv->pix) {
+    if(!regular_file_icon->priv->pix) {
         /* check the application's binary name like thunar does (bug 1956) */
-        if(!file_icon->priv->pix
-           && file_icon->priv->info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE)
+        if(!regular_file_icon->priv->pix
+           && xfdesktop_file_utils_is_executable(file_icon))
         {
-            icon_name = thunar_vfs_path_get_name(file_icon->priv->info->path);
+            icon_name = g_file_get_basename(file_icon->gfile);
         }
         
-        if(file_icon->priv->info->flags & THUNAR_VFS_FILE_FLAGS_SYMLINK) {
+        if(xfdesktop_file_utils_is_symlink(file_icon)) {
             GtkIconTheme *itheme = gtk_icon_theme_get_default();
             gint sym_pix_size = size * 2 / 3;
             
@@ -230,53 +235,64 @@ xfdesktop_regular_file_icon_peek_pixbuf(XfdesktopIcon *icon,
             }
         }
         
-        file_icon->priv->pix = xfdesktop_file_utils_get_file_icon(icon_name,
-                                                                  file_icon->priv->info,
+        regular_file_icon->priv->pix = xfdesktop_file_utils_get_file_icon(icon_name,
+                                                                  file_icon,
                                                                   size,
                                                                   emblem_pix,
-                                                                  file_icon->priv->pix_opacity);
+                                                                  regular_file_icon->priv->pix_opacity);
         
         if(emblem_pix)
              g_object_unref(G_OBJECT(emblem_pix));
-        
-        file_icon->priv->cur_pix_size = size;
+
+        if(icon_name)
+            g_free(icon_name);
+
+        regular_file_icon->priv->cur_pix_size = size;
     }
-    
-    return file_icon->priv->pix;
+
+    return regular_file_icon->priv->pix;
 }
 
 static G_CONST_RETURN gchar *
 xfdesktop_regular_file_icon_peek_label(XfdesktopIcon *icon)
 {
-    g_return_val_if_fail(XFDESKTOP_IS_REGULAR_FILE_ICON(icon), NULL);
-    return XFDESKTOP_REGULAR_FILE_ICON(icon)->priv->info->display_name;
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
+
+    g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(file_icon), NULL);
+    g_return_val_if_fail(G_IS_FILE_INFO(file_icon->info), NULL);
+
+    return g_file_info_get_display_name(file_icon->info);
 }
 
 static GdkDragAction
 xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 {
-    const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
     GdkDragAction actions = GDK_ACTION_LINK;  /* we can always link */
-    
-    if(!info)
-        return 0;
-    
-    if(info->flags & THUNAR_VFS_FILE_FLAGS_READABLE) {
-        ThunarVfsPath *parent_path;
-        ThunarVfsInfo *parent_info;
+ 
+    g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(file_icon), 0);
+    g_return_val_if_fail(G_IS_FILE(file_icon->gfile), 0);
+
+    if(xfdesktop_file_utils_is_readable(file_icon)) {
+        GFile *parent_path;
+        GFileInfo *parent_info;
         
         actions |= GDK_ACTION_COPY;
         
         /* we can only move if the parent is writable */
-        parent_path = thunar_vfs_path_get_parent(info->path);
-        parent_info = thunar_vfs_info_new_for_path(parent_path, NULL);
-        if(parent_info) {
-            if(parent_info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE)
-                actions |= GDK_ACTION_MOVE;
-            thunar_vfs_info_unref(parent_info);
+        parent_path = g_file_get_parent(file_icon->gfile);
+        if(parent_path) {
+            parent_info = xfdesktop_file_utils_get_file_info(parent_path, NULL);
+            if(parent_info) {
+                if(g_file_info_get_attribute_boolean(parent_info,
+                                           G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) {
+                    actions |= GDK_ACTION_MOVE;
+                }
+                g_object_unref(parent_info);
+            }
+
+            g_object_unref(parent_path);
         }
-        
-        /* |parent_path| is owned by |info| */
     }
     
     return actions;
@@ -285,17 +301,16 @@ xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 static GdkDragAction
 xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
 {
-    const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
-    
-    if(!info)
-        return 0;
-    
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
+ 
+    g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(file_icon), 0);
+
     /* if it's executable we can 'copy'.  if it's a folder we can do anything
      * if it's writable. */
-    if(info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE)
+    if(xfdesktop_file_utils_is_executable(file_icon))
         return GDK_ACTION_COPY;
-    else if(THUNAR_VFS_FILE_TYPE_DIRECTORY == info->type
-            && info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE)
+    else if(xfdesktop_file_utils_is_directory(file_icon)
+            && xfdesktop_file_utils_is_writable(file_icon))
     {
         return GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
     } else
@@ -303,31 +318,32 @@ xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
 }
 
 static void
-xfdesktop_regular_file_icon_drag_job_error(ThunarVfsJob *job,
+xfdesktop_regular_file_icon_drag_job_error(XfdesktopJob *job,
                                            GError *error,
                                            gpointer user_data)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(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(regular_file_icon);
+
+    g_return_if_fail(file_icon);
     
     if(!src_file_icon)
         return;
     
     xfdesktop_file_utils_handle_fileop_error(NULL,
-                                             xfdesktop_file_icon_peek_info(src_file_icon),
-                                             regular_file_icon->priv->info, fileop,
+                                             src_file_icon,
+                                             file_icon, fileop,
                                              error);
 }
 
-static ThunarVfsInteractiveJobResponse
-xfdesktop_regular_file_icon_interactive_job_ask(ThunarVfsJob *job,
+#if 0
+static XfdesktopJobResponse
+xfdesktop_regular_file_icon_interactive_job_ask(XfdesktopJob *job,
                                                 const gchar *message,
-                                                ThunarVfsInteractiveJobResponse choices,
+                                                XfdesktopJobResponse choices,
                                                 gpointer user_data)
 {
     GtkWidget *icon_view = xfdesktop_icon_peek_icon_view(XFDESKTOP_ICON(user_data));
@@ -335,9 +351,10 @@ xfdesktop_regular_file_icon_interactive_job_ask(ThunarVfsJob *job,
     return xfdesktop_file_utils_interactive_job_ask(GTK_WINDOW(toplevel),
                                                     message, choices);
 }
+#endif
 
 static void
-xfdesktop_regular_file_icon_drag_job_finished(ThunarVfsJob *job,
+xfdesktop_regular_file_icon_drag_job_finished(XfdesktopJob *job,
                                               gpointer user_data)
 {
     XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(user_data);
@@ -345,10 +362,10 @@ xfdesktop_regular_file_icon_drag_job_finished(ThunarVfsJob *job,
                                                          "--xfdesktop-src-file-icon");
     
     if(!xfdesktop_file_icon_remove_active_job(XFDESKTOP_FILE_ICON(regular_file_icon), job))
-        g_critical("ThunarVfsJob 0x%p not found in active jobs list", 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("ThunarVfsJob 0x%p not found in active jobs list", job);
+        g_critical("XfdesktopJob 0x%p not found in active jobs list", job);
     
     g_object_unref(G_OBJECT(job));
     
@@ -361,9 +378,8 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                          XfdesktopIcon *src_icon,
                                          GdkDragAction action)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
+    XfdesktopFileIcon *regular_file_icon = XFDESKTOP_FILE_ICON(icon);
     XfdesktopFileIcon *src_file_icon = XFDESKTOP_FILE_ICON(src_icon);
-    const ThunarVfsInfo *src_info;
     
     DBG("entering");
     
@@ -371,11 +387,11 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
     g_return_val_if_fail(xfdesktop_regular_file_icon_get_allowed_drop_actions(icon) != 0,
                          FALSE);
     
-    src_info = xfdesktop_file_icon_peek_info(src_file_icon);
-    if(!src_info)
-        return FALSE;
+    g_return_val_if_fail(G_IS_FILE(regular_file_icon->gfile), FALSE);
+    g_return_val_if_fail(G_IS_FILE(src_file_icon->gfile), FALSE);
     
-    if(regular_file_icon->priv->info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE) {
+    if(xfdesktop_file_utils_is_executable(regular_file_icon)) {
+#if 0
         GList *path_list = g_list_prepend(NULL, src_info->path);
         GError *error = NULL;
         gboolean succeeded;
@@ -398,46 +414,48 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
             
             return FALSE;
         }
-        
+#endif
         return TRUE;
     } else {
-        ThunarVfsJob *job = NULL;
-        const gchar *name;
-        ThunarVfsPath *dest_path;
+        XfdesktopJob *job = NULL;
+        gchar *name;
+        GFile *dest_path;
         
-        if(thunar_vfs_path_is_root(src_info->path))
+        if(xfdesktop_file_utils_is_root(src_file_icon))
             return FALSE;
         
-        name = thunar_vfs_path_get_name(src_info->path);
+        name = g_file_get_basename(src_file_icon->gfile);
         if(!name)
             return FALSE;
         
-        dest_path = thunar_vfs_path_relative(regular_file_icon->priv->info->path,
-                                             name);
+        dest_path = g_file_resolve_relative_path(regular_file_icon->gfile,
+                                                 name);
+        g_free(name);
+
         if(!dest_path)
             return FALSE;
         
         switch(action) {
             case GDK_ACTION_MOVE:
                 DBG("doing move");
-                job = thunar_vfs_move_file(src_info->path, dest_path, NULL);
+                job = xfdesktop_file_jobs_move_file(src_file_icon->gfile, dest_path);
                 break;
             
             case GDK_ACTION_COPY:
                 DBG("doing copy");
-                job = thunar_vfs_copy_file(src_info->path, dest_path, NULL);
+                job = xfdesktop_file_jobs_copy_file(src_file_icon->gfile, dest_path);
                 break;
             
             case GDK_ACTION_LINK:
                 DBG("doing link");
-                job = thunar_vfs_link_file(src_info->path, dest_path, NULL);
+                job = xfdesktop_file_jobs_link_file(src_file_icon->gfile, dest_path);
                 break;
             
             default:
                 g_warning("Unsupported drag action: %d", action);
         }
         
-        thunar_vfs_path_unref(dest_path);
+        g_object_unref(dest_path);
         
         if(job) {
             DBG("got job, action initiated");
@@ -464,9 +482,11 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
             g_signal_connect(G_OBJECT(job), "error",
                              G_CALLBACK(xfdesktop_regular_file_icon_drag_job_error),
                              regular_file_icon);
+#if 0
             g_signal_connect(G_OBJECT(job), "ask",
                              G_CALLBACK(xfdesktop_regular_file_icon_interactive_job_ask),
                              regular_file_icon);
+#endif
             g_signal_connect(G_OBJECT(job), "finished",
                              G_CALLBACK(xfdesktop_regular_file_icon_drag_job_finished),
                              regular_file_icon);
@@ -482,66 +502,59 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
 static G_CONST_RETURN gchar *
 xfdesktop_regular_file_icon_peek_tooltip(XfdesktopIcon *icon)
 {
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
     XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
     
-    if(!regular_file_icon->priv->info)
-       return NULL;  /* FIXME: implement something here */
-    
     if(!regular_file_icon->priv->tooltip) {
-        gchar mod[64], *kind, sizebuf[64], *size;
-        struct tm *tm = localtime(&regular_file_icon->priv->info->mtime);
-
-        strftime(mod, 64, "%Y-%m-%d %H:%M:%S", tm);
-        kind = xfdesktop_file_utils_get_file_kind(regular_file_icon->priv->info, NULL);
-        thunar_vfs_humanize_size(regular_file_icon->priv->info->size, sizebuf, 64);
-        size = g_strdup_printf(_("%s (%" G_GINT64_FORMAT " Bytes)"), sizebuf,
-                              (gint64)regular_file_icon->priv->info->size);
+        guint64 fSize;
+        gchar *mod, *kind, *size, *buffSize;
+
+        kind = xfdesktop_file_utils_get_file_kind(file_icon, NULL);
+
+        mod = xfdesktop_file_utils_get_file_date(file_icon,
+                                                 G_FILE_ATTRIBUTE_TIME_MODIFIED);
+
+        fSize = xfdesktop_file_utils_get_file_size(file_icon,
+                                                   &buffSize);
+
+        size = g_strdup_printf(_("%s (%" G_GINT64_FORMAT " Bytes)"),
+                               buffSize,
+                               (gint64)fSize);
         
         regular_file_icon->priv->tooltip = g_strdup_printf(_("Kind: %s\nModified:%s\nSize: %s"),
                                                    kind, mod, size);
         
         g_free(kind);
         g_free(size);
+        g_free(mod);
+        g_free(buffSize);
     }
     
     return regular_file_icon->priv->tooltip;
 }
 
 static gboolean
-xfdesktop_regular_file_can_write_parent(XfdesktopFileIcon *icon)
+xfdesktop_regular_file_can_rename_file(XfdesktopFileIcon *icon)
 {
-    XfdesktopRegularFileIcon *file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
-    ThunarVfsPath *parent;
-    ThunarVfsInfo *parent_info;
-    gboolean writable;
-
-    g_return_val_if_fail(file_icon && file_icon->priv->info, FALSE);
-
-    parent = thunar_vfs_path_get_parent(file_icon->priv->info->path);
-    if(!parent)
-        return FALSE;
-
-    parent_info = thunar_vfs_info_new_for_path(parent, NULL);
-    if(!parent_info)
-        return FALSE;
-
-    writable = (parent_info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE);
-    thunar_vfs_info_unref(parent_info);
-
-    return writable;
+    return xfdesktop_file_utils_can_rename(icon);
+}
 
+static gboolean
+xfdesktop_regular_file_can_delete_file(XfdesktopFileIcon *icon)
+{
+    return xfdesktop_file_utils_can_delete(icon);
 }
 
 static void
-xfdesktop_delete_file_error(ThunarVfsJob *job,
+xfdesktop_delete_file_error(XfdesktopJob *job,
                             GError *error,
                             gpointer user_data)
 {
-    XfdesktopRegularFileIcon *icon = XFDESKTOP_REGULAR_FILE_ICON(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\":",
-                                             icon->priv->info->display_name);
+                                             g_file_info_get_display_name(icon->info));
                                      
     xfce_message_dialog(GTK_WINDOW(toplevel), _("Error"),
                         GTK_STOCK_DIALOG_ERROR, primary,
@@ -552,13 +565,13 @@ xfdesktop_delete_file_error(ThunarVfsJob *job,
 }
 
 static void
-xfdesktop_delete_file_finished(ThunarVfsJob *job,
+xfdesktop_delete_file_finished(XfdesktopJob *job,
                                gpointer user_data)
 {
-    XfdesktopRegularFileIcon *icon = XFDESKTOP_REGULAR_FILE_ICON(user_data);
+    XfdesktopFileIcon *icon = XFDESKTOP_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_critical("XfdesktopJob 0x%p not found in active jobs list", job);
     
     g_object_unref(G_OBJECT(job));
     g_object_unref(G_OBJECT(icon));
@@ -567,17 +580,18 @@ xfdesktop_delete_file_finished(ThunarVfsJob *job,
 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);
-    
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
+    XfdesktopJob *job;
+
+    g_return_val_if_fail(G_IS_FILE(file_icon->gfile), FALSE);
+
+    job = xfdesktop_file_jobs_unlink_file(file_icon->gfile);
+
     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);
+        xfdesktop_file_icon_add_active_job(file_icon, job);
         
         g_signal_connect(G_OBJECT(job), "error",
                          G_CALLBACK(xfdesktop_delete_file_error), icon);
@@ -595,17 +609,24 @@ static gboolean
 xfdesktop_regular_file_icon_rename_file(XfdesktopFileIcon *icon,
                                         const gchar *new_name)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
+    XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
     GError *error = NULL;
+    GFile *new_gfile;
     
     g_return_val_if_fail(XFDESKTOP_IS_REGULAR_FILE_ICON(icon) && new_name
                          && *new_name, FALSE);
-    
-    if(!thunar_vfs_info_rename(regular_file_icon->priv->info, new_name, &error)) {
+
+    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);
+
+    new_gfile = g_file_set_display_name(file_icon->gfile, new_name, NULL, &error);
+
+    if(new_gfile == NULL)
+    {
         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(_("Failed to rename \"%s\" to \"%s\":"),
-                                                 regular_file_icon->priv->info->display_name,
+                                                 g_file_info_get_display_name(file_icon->info),
                                                  new_name);
         xfce_message_dialog(GTK_WINDOW(toplevel), _("Error"),
                             GTK_STOCK_DIALOG_ERROR,
@@ -616,52 +637,57 @@ xfdesktop_regular_file_icon_rename_file(XfdesktopFileIcon *icon,
         
         return FALSE;
     }
-    
-    return TRUE;
-}
 
-static G_CONST_RETURN ThunarVfsInfo *
-xfdesktop_regular_file_icon_peek_info(XfdesktopFileIcon *icon)
-{
-    g_return_val_if_fail(XFDESKTOP_IS_REGULAR_FILE_ICON(icon), NULL);
-    return XFDESKTOP_REGULAR_FILE_ICON(icon)->priv->info;
+    /* Update references */
+    g_object_unref (file_icon->gfile);
+    g_object_unref (file_icon->info);    
+
+    file_icon->gfile = new_gfile;
+    file_icon->info= xfdesktop_file_utils_get_file_info(file_icon->gfile, NULL);
+
+    return TRUE;
 }
 
 static void
-xfdesktop_regular_file_icon_update_info(XfdesktopFileIcon *icon,
-                                        ThunarVfsInfo *info)
+xfdesktop_regular_file_icon_update_gfile(XfdesktopFileIcon *icon,
+                                         GFile *gfile)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
-    gboolean label_changed = TRUE;
-    
-    g_return_if_fail(XFDESKTOP_IS_REGULAR_FILE_ICON(icon) && info);
-    
-    if(!strcmp(regular_file_icon->priv->info->display_name, info->display_name))
-        label_changed = FALSE;
-    
-    thunar_vfs_info_unref(regular_file_icon->priv->info);
-    regular_file_icon->priv->info = thunar_vfs_info_ref(info);
-    
-    if(label_changed)
-        xfdesktop_icon_label_changed(XFDESKTOP_ICON(icon));
-    
-    /* not really easy to check if this changed or not, so just invalidate it */
-    xfdesktop_regular_file_icon_invalidate_pixbuf(regular_file_icon);
-    xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
-}
+    g_return_if_fail(XFDESKTOP_IS_FILE_ICON(icon) && G_IS_FILE(gfile));
+
+    if(icon->gfile)
+        g_object_unref(icon->gfile);
 
+    if(icon->info)
+        g_object_unref(icon->info);
 
+    icon->gfile = gfile;
+    icon->info= xfdesktop_file_utils_get_file_info(gfile, NULL);
+}
 
 /* public API */
 
 XfdesktopRegularFileIcon *
-xfdesktop_regular_file_icon_new(ThunarVfsInfo *info,
+xfdesktop_regular_file_icon_new(GFile *gfile,
                                 GdkScreen *screen)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = g_object_new(XFDESKTOP_TYPE_REGULAR_FILE_ICON, NULL);
-    regular_file_icon->priv->info = thunar_vfs_info_ref(info);
+    XfdesktopRegularFileIcon *regular_file_icon;
+    XfdesktopFileIcon *file_icon;
+
+    g_return_val_if_fail(G_IS_FILE(gfile), NULL);
+
+    regular_file_icon = g_object_new(XFDESKTOP_TYPE_REGULAR_FILE_ICON, NULL);
+    file_icon = XFDESKTOP_FILE_ICON(regular_file_icon);
+
     regular_file_icon->priv->gscreen = screen;
-    
+    file_icon->gfile = g_object_ref(gfile);
+    file_icon->info = xfdesktop_file_utils_get_file_info(file_icon->gfile, NULL);
+
+    if(!file_icon->info) {
+        g_object_unref(regular_file_icon);
+        return NULL;
+    }
+        
+
     g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)),
                              "changed",
                              G_CALLBACK(xfdesktop_regular_file_icon_invalidate_pixbuf),
diff --git a/src/xfdesktop-regular-file-icon.h b/src/xfdesktop-regular-file-icon.h
index 6014627..3ebb866 100644
--- a/src/xfdesktop-regular-file-icon.h
+++ b/src/xfdesktop-regular-file-icon.h
@@ -23,7 +23,7 @@
 
 #include <glib-object.h>
 
-#include <thunar-vfs/thunar-vfs.h>
+#include <gio/gio.h>
 
 #include "xfdesktop-file-icon.h"
 
@@ -52,7 +52,7 @@ struct _XfdesktopRegularFileIconClass
 
 GType xfdesktop_regular_file_icon_get_type(void) G_GNUC_CONST;
 
-XfdesktopRegularFileIcon *xfdesktop_regular_file_icon_new(ThunarVfsInfo *info,
+XfdesktopRegularFileIcon *xfdesktop_regular_file_icon_new(GFile *gfile,
                                                           GdkScreen *screen);
 
 void xfdesktop_regular_file_icon_set_pixbuf_opacity(XfdesktopRegularFileIcon *icon,



More information about the Xfce4-commits mailing list