[Xfce4-commits] r23628 - xfdesktop/trunk/src

Brian Tarricone kelnos at xfce.org
Sat Nov 4 11:28:12 CET 2006


Author: kelnos
Date: 2006-11-04 10:28:11 +0000 (Sat, 04 Nov 2006)
New Revision: 23628

Modified:
   xfdesktop/trunk/src/xfdesktop-icon-view.c
   xfdesktop/trunk/src/xfdesktop-icon.c
   xfdesktop/trunk/src/xfdesktop-icon.h
   xfdesktop/trunk/src/xfdesktop-regular-file-icon.c
   xfdesktop/trunk/src/xfdesktop-special-file-icon.c
   xfdesktop/trunk/src/xfdesktop-volume-icon.c
   xfdesktop/trunk/src/xfdesktop-window-icon.c
Log:
remove XfdesktopIcon::is_drop_dest().  XfdesktopIcon::get_allowed_drop_actions()
serves the same purpose (0 for FALSE, something else for TRUE).  implement
all the get_allowed_drag_actions() and get_allowed_drop_actions() in the
various XfdesktopIcon subclasses.  things are a lot more sane now.


Modified: xfdesktop/trunk/src/xfdesktop-icon-view.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon-view.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-icon-view.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -1084,7 +1084,7 @@
         return FALSE;
     icon_on_dest = xfdesktop_icon_view_icon_in_cell(icon_view, row, col);
     if(icon_on_dest) {
-        if(!xfdesktop_icon_is_drop_dest(icon_on_dest))
+        if(!xfdesktop_icon_get_allowed_drop_actions(icon_on_dest))
             return FALSE;
     } else if(!xfdesktop_grid_is_free_position(icon_view, row, col))
         return FALSE;
@@ -1112,7 +1112,9 @@
         else  /* #3 */
             our_action = context->suggested_action;
     } else {
-        GdkDragAction allowed_actions = 0xffffffff;
+        /* start with everything */
+        GdkDragAction allowed_actions = (GDK_ACTION_MOVE | GDK_ACTION_COPY
+                                         | GDK_ACTION_LINK);
         
         /* check to make sure we aren't just hovering over ourself */
         if(row == icon_row && col == icon_col) {
@@ -1198,7 +1200,7 @@
         
         if(icon_on_dest) {
             gboolean ret = xfdesktop_icon_do_drop_dest(icon_on_dest, icon,
-                                                       context->suggested_action);
+                                                       context->action);
             gtk_drag_finish(context, ret, FALSE, time);
             return ret;
         }

Modified: xfdesktop/trunk/src/xfdesktop-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-icon.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -31,8 +31,6 @@
 
 #include "xfdesktop-icon.h"
 
-#define DEFAULT_ACTIONS  (GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK)
-
 struct _XfdesktopIconPrivate
 {
     gint16 row;
@@ -236,7 +234,7 @@
     return klass->peek_label(icon);
 }
 
-/*< optional >*/
+/*< optional; drags aren't allowed if not provided >*/
 GdkDragAction
 xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 {
@@ -244,24 +242,12 @@
     
     g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
     if(!klass->get_allowed_drag_actions)
-        return DEFAULT_ACTIONS;
+        return 0;
     
     return klass->get_allowed_drag_actions(icon);
 }
 
-/*< required >*/
-gboolean
-xfdesktop_icon_is_drop_dest(XfdesktopIcon *icon)
-{
-    XfdesktopIconClass *klass = XFDESKTOP_ICON_GET_CLASS(icon);
-    
-    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
-    g_return_val_if_fail(klass->is_drop_dest, FALSE);
-    
-    return klass->is_drop_dest(icon);
-}
-
-/*< optional >*/
+/*< optional; drops aren't allowed if not provided >*/
 GdkDragAction
 xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
 {
@@ -269,12 +255,12 @@
     
     g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
     if(!klass->get_allowed_drop_actions)
-        return DEFAULT_ACTIONS;
+        return 0;
     
     return klass->get_allowed_drop_actions(icon);
 }
 
-/*< optional, required if is_drop_dest() can return TRUE >*/
+/*< optional; required if get_allowed_drop_actions() can return nonzero >*/
 gboolean
 xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
                             XfdesktopIcon *src_icon,

Modified: xfdesktop/trunk/src/xfdesktop-icon.h
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.h	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-icon.h	2006-11-04 10:28:11 UTC (rev 23628)
@@ -69,7 +69,6 @@
     
     GdkDragAction (*get_allowed_drag_actions)(XfdesktopIcon *icon);
     
-    gboolean (*is_drop_dest)(XfdesktopIcon *icon);
     GdkDragAction (*get_allowed_drop_actions)(XfdesktopIcon *icon);
     gboolean (*do_drop_dest)(XfdesktopIcon *icon, XfdesktopIcon *src_icon, GdkDragAction action);
     
@@ -101,7 +100,6 @@
 
 GdkDragAction xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
 
-gboolean xfdesktop_icon_is_drop_dest(XfdesktopIcon *icon);
 GdkDragAction xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon);
 gboolean xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
                                      XfdesktopIcon *src_icon,

Modified: xfdesktop/trunk/src/xfdesktop-regular-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-regular-file-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-regular-file-icon.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -70,7 +70,8 @@
                                                           gint size);
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_tooltip(XfdesktopIcon *icon);
-static gboolean xfdesktop_regular_file_icon_is_drop_dest(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon);
 static gboolean xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                                          XfdesktopIcon *src_icon,
                                                          GdkDragAction action);
@@ -120,7 +121,8 @@
     icon_class->peek_pixbuf = xfdesktop_regular_file_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_regular_file_icon_peek_label;
     icon_class->peek_tooltip = xfdesktop_regular_file_icon_peek_tooltip;
-    icon_class->is_drop_dest = xfdesktop_regular_file_icon_is_drop_dest;
+    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;
@@ -246,15 +248,54 @@
     return XFDESKTOP_REGULAR_FILE_ICON(icon)->priv->info->display_name;
 }
 
-static gboolean
-xfdesktop_regular_file_icon_is_drop_dest(XfdesktopIcon *icon)
+static GdkDragAction
+xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 {
-    XfdesktopRegularFileIcon *regular_file_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
-    return (regular_file_icon->priv->info
-            && (regular_file_icon->priv->info->type == THUNAR_VFS_FILE_TYPE_DIRECTORY
-                || regular_file_icon->priv->info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE));
+    const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+    GdkDragAction actions = GDK_ACTION_LINK;  /* we can always link */
+    
+    g_return_val_if_fail(info, 0);
+    
+    if(info->flags & THUNAR_VFS_FILE_FLAGS_READABLE) {
+        ThunarVfsPath *parent_path;
+        ThunarVfsInfo *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| is owned by |info| */
+    }
+    
+    return actions;
 }
 
+static GdkDragAction
+xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
+{
+    const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+    
+    g_return_val_if_fail(info, 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)
+        return GDK_ACTION_COPY;
+    else if(THUNAR_VFS_FILE_TYPE_DIRECTORY == info->type
+            && info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE)
+    {
+        return GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
+    } else
+        return 0;
+}
+
 static void
 xfdesktop_regular_file_icon_drag_job_error(ThunarVfsJob *job,
                                            GError *error,
@@ -318,7 +359,8 @@
     DBG("entering");
     
     g_return_val_if_fail(regular_file_icon && src_file_icon, FALSE);
-    g_return_val_if_fail(xfdesktop_regular_file_icon_is_drop_dest(icon), FALSE);
+    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)

Modified: xfdesktop/trunk/src/xfdesktop-special-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-special-file-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-special-file-icon.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -72,7 +72,8 @@
                                                           gint size);
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_tooltip(XfdesktopIcon *icon);
-static gboolean xfdesktop_special_file_icon_is_drop_dest(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_special_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_special_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon);
 static gboolean xfdesktop_special_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                                          XfdesktopIcon *src_icon,
                                                          GdkDragAction action);
@@ -118,7 +119,8 @@
     icon_class->peek_pixbuf = xfdesktop_special_file_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_special_file_icon_peek_label;
     icon_class->peek_tooltip = xfdesktop_special_file_icon_peek_tooltip;
-    icon_class->is_drop_dest = xfdesktop_special_file_icon_is_drop_dest;
+    icon_class->get_allowed_drag_actions = xfdesktop_special_file_icon_get_allowed_drag_actions;
+    icon_class->get_allowed_drop_actions = xfdesktop_special_file_icon_get_allowed_drop_actions;
     icon_class->do_drop_dest = xfdesktop_special_file_icon_do_drop_dest;
     icon_class->get_popup_menu = xfdesktop_special_file_icon_get_popup_menu;
     
@@ -258,14 +260,66 @@
         return special_file_icon->priv->info->display_name;
 }
 
-static gboolean
-xfdesktop_special_file_icon_is_drop_dest(XfdesktopIcon *icon)
+static GdkDragAction
+xfdesktop_special_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 {
     XfdesktopSpecialFileIcon *special_file_icon = XFDESKTOP_SPECIAL_FILE_ICON(icon);
-    /* FIXME: i suppose '/' could be writable if we're foolishly running as root */
-    return (XFDESKTOP_SPECIAL_FILE_ICON_FILESYSTEM != special_file_icon->priv->type);
+    GdkDragAction actions = 0;
+    
+    switch(special_file_icon->priv->type) {
+        case XFDESKTOP_SPECIAL_FILE_ICON_FILESYSTEM:
+            /* root dir should always be readable, but move is just impossible,
+             * and copy seems a bit retarded. */
+            actions = GDK_ACTION_LINK;
+            break;
+        
+        case XFDESKTOP_SPECIAL_FILE_ICON_HOME:
+            /* user shouldn't be able to move their own homedir.  copy might
+             * be a little silly, but allow it anyway.  link is fine. */
+            actions = GDK_ACTION_COPY | GDK_ACTION_LINK;
+            break;
+            
+        case XFDESKTOP_SPECIAL_FILE_ICON_TRASH:
+            /* i don't think we can even do a link here; thunar doesn't let
+             * us, anyway. */
+            actions = 0;
+            break;
+    }
+    
+    return actions;
 }
 
+static GdkDragAction
+xfdesktop_special_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
+{
+    XfdesktopSpecialFileIcon *special_file_icon = XFDESKTOP_SPECIAL_FILE_ICON(icon);
+    const ThunarVfsInfo *info;
+    GdkDragAction actions = 0;
+    
+    switch(special_file_icon->priv->type) {
+        case XFDESKTOP_SPECIAL_FILE_ICON_FILESYSTEM:
+            /* we should hope the user isn't running as root, but we might as
+             * well let them hang themselves if they are */
+            info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+            if(info && info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE)
+                actions = GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
+            else
+                actions = 0;
+            break;
+        
+        case XFDESKTOP_SPECIAL_FILE_ICON_HOME:
+            /* assume the user can write to their own home directory */
+            actions = GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
+            break;
+            
+        case XFDESKTOP_SPECIAL_FILE_ICON_TRASH:
+            actions = GDK_ACTION_MOVE;  /* anything else is just silly */
+            break;
+    }
+    
+    return actions;
+}
+
 static void
 xfdesktop_special_file_icon_drag_job_error(ThunarVfsJob *job,
                                            GError *error,
@@ -326,23 +380,26 @@
     XfdesktopFileIcon *src_file_icon = XFDESKTOP_FILE_ICON(src_icon);
     const ThunarVfsInfo *src_info;
     ThunarVfsJob *job = NULL;
-    const gchar *name;
+    const gchar *name = NULL;
     ThunarVfsPath *dest_path;
     
     DBG("entering");
     
     g_return_val_if_fail(special_file_icon && src_file_icon,
                          FALSE);
-    g_return_val_if_fail(xfdesktop_special_file_icon_is_drop_dest(icon),
+    g_return_val_if_fail(xfdesktop_special_file_icon_get_allowed_drop_actions(icon),
                          FALSE);
     
     src_info = xfdesktop_file_icon_peek_info(src_file_icon);
     if(!src_info)
         return FALSE;
     
-    name = thunar_vfs_path_get_name(src_info->path);
+    if(thunar_vfs_path_is_root(src_info->path))
+        name = src_info->display_name;
+    else
+        name = thunar_vfs_path_get_name(src_info->path);
     g_return_val_if_fail(name, FALSE);
-        
+    
     dest_path = thunar_vfs_path_relative(special_file_icon->priv->info->path,
                                          name);
     g_return_val_if_fail(dest_path, FALSE);

Modified: xfdesktop/trunk/src/xfdesktop-volume-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-volume-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-volume-icon.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -65,7 +65,8 @@
                                                     gint size);
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_tooltip(XfdesktopIcon *icon);
-static gboolean xfdesktop_volume_icon_is_drop_dest(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_volume_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
+static GdkDragAction xfdesktop_volume_icon_get_allowed_drop_actions(XfdesktopIcon *icon);
 static gboolean xfdesktop_volume_icon_do_drop_dest(XfdesktopIcon *icon,
                                                    XfdesktopIcon *src_icon,
                                                    GdkDragAction action);
@@ -110,7 +111,8 @@
     icon_class->peek_pixbuf = xfdesktop_volume_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_volume_icon_peek_label;
     icon_class->peek_tooltip = xfdesktop_volume_icon_peek_tooltip;
-    icon_class->is_drop_dest = xfdesktop_volume_icon_is_drop_dest;
+    icon_class->get_allowed_drag_actions = xfdesktop_volume_icon_get_allowed_drag_actions;
+    icon_class->get_allowed_drop_actions = xfdesktop_volume_icon_get_allowed_drop_actions;
     icon_class->do_drop_dest = xfdesktop_volume_icon_do_drop_dest;
     icon_class->get_popup_menu = xfdesktop_volume_icon_get_popup_menu;
     icon_class->activated = xfdesktop_volume_icon_activated;
@@ -213,14 +215,53 @@
     return thunar_vfs_volume_get_name(XFDESKTOP_VOLUME_ICON(icon)->priv->volume);
 }
 
-static gboolean
-xfdesktop_volume_icon_is_drop_dest(XfdesktopIcon *icon)
+static GdkDragAction
+xfdesktop_volume_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
 {
     XfdesktopVolumeIcon *volume_icon = XFDESKTOP_VOLUME_ICON(icon);
-    /* FIXME: return TRUE, and attempt to mount later if it isn't? */
-    return thunar_vfs_volume_is_mounted(volume_icon->priv->volume);
+    
+    /* volume icons more or less represent the volume's mount point, usually
+     * (hopefully) a local path.  so when it's mounted, we certainly can't move
+     * the mount point, but copying and linking should be OK.  when not mounted,
+     * we should just disallow everything, since, even if its ThunarVfsInfo
+     * is valid, we can't guarantee it won't change after mounting. */
+    
+    /* FIXME: should i allow all actions if not mounted as well, and try to
+     * mount and resolve on drop? */
+    
+    if(thunar_vfs_volume_is_mounted(volume_icon->priv->volume)) {
+        const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+        if(info) {
+            if(info->flags & THUNAR_VFS_FILE_FLAGS_READABLE)
+                return GDK_ACTION_COPY | GDK_ACTION_LINK;
+            else
+                return GDK_ACTION_LINK;
+        }
+    }
+    
+    return 0;
 }
 
+static GdkDragAction
+xfdesktop_volume_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
+{
+    XfdesktopVolumeIcon *volume_icon = XFDESKTOP_VOLUME_ICON(icon);
+    
+    /* if not mounted, it doesn't really make sense to allow any operations
+     * here.  if mounted, we should allow everything if it's writable. */
+    
+    /* FIXME: should i allow all actions if not mounted as well, and try to
+     * mount and resolve on drop? */
+    
+    if(thunar_vfs_volume_is_mounted(volume_icon->priv->volume)) {
+        const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(XFDESKTOP_FILE_ICON(icon));
+        if(info && info->flags & THUNAR_VFS_FILE_FLAGS_WRITABLE)
+            return GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
+    }
+    
+    return 0;
+}
+
 static void
 xfdesktop_volume_icon_drag_job_error(ThunarVfsJob *job,
                                      GError *error,
@@ -288,7 +329,7 @@
     
     g_return_val_if_fail(volume_icon && src_file_icon,
                          FALSE);
-    g_return_val_if_fail(xfdesktop_volume_icon_is_drop_dest(icon),
+    g_return_val_if_fail(xfdesktop_volume_icon_get_allowed_drop_actions(icon),
                          FALSE);
     
     src_info = xfdesktop_file_icon_peek_info(src_file_icon);

Modified: xfdesktop/trunk/src/xfdesktop-window-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-window-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
+++ xfdesktop/trunk/src/xfdesktop-window-icon.c	2006-11-04 10:28:11 UTC (rev 23628)
@@ -72,7 +72,6 @@
     
     icon_class->peek_pixbuf = xfdesktop_window_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_window_icon_peek_label;
-    icon_class->is_drop_dest = (gboolean (*)(XfdesktopIcon *))gtk_false;
     icon_class->activated = xfdesktop_window_icon_activated;
     icon_class->menu_popup = xfdesktop_window_icon_menu_popup;
 }



More information about the Xfce4-commits mailing list