[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