summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-icon-dnd.c
diff options
context:
space:
mode:
authorMartin Wehner <martin.wehner@gmail.com>2006-07-11 00:57:47 +0000
committerMartin Wehner <mwehner@src.gnome.org>2006-07-11 00:57:47 +0000
commit293e7cd0ef01b01dcd93f3602c48407a923575c7 (patch)
tree296946cf40c624fd8dad60833321c4e193e948f2 /libnautilus-private/nautilus-icon-dnd.c
parente1f4d9dbfa583a8cae2e2f9a730586dc518c7edb (diff)
downloadnautilus-293e7cd0ef01b01dcd93f3602c48407a923575c7.tar.gz
Add functions nautilus_drag_can_accept_files and
2006-07-11 Martin Wehner <martin.wehner@gmail.com> * libnautilus-private/nautilus-file-dnd.[ch]: Add functions nautilus_drag_can_accept_files and nautilus_drag_can_accept_info. * libnautilus-private/nautilus-icon-dnd.c: (receive_dropped_url), (receive_dropped_uri_list), (receive_dropped_text), (drag_data_received_callback): Accept the entire drag context as parameter and use nautilus_icon_container_find_drop_target. (nautilus_icon_container_find_drop_target): (nautilus_icon_dnd_update_drop_target): Use nautilus_drag_can_accept_info. * libnautilus-private/nautilus-marshal.list: Add new signature. * libnautilus-private/nautilus-tree-view-drag-dest.c: Add function get_drop_target_uri_at_pos and use it in the drop handlers to determine the target uris for actions. Rename get_drop_target to get_drop_target_uri_for path. (nautilus_tree_view_drag_dest_class_init): Adapt to new drag handler signatures. (set_widget_highlight): Fix DND highlighting of an empty tree view. (drag_motion_callback): Ignore drags on the header. * libnautilus-private/nautilus-tree-view-drag-dest.[ch]: * libnautilus-private/nautilus-icon-container.[ch]: * src/file-manager/fm-icon-view.c: * src/file-manager/fm-list-view.c: Add a target/parent uri parameter to the drop handler functions. * src/file-manager/fm-directory-view.[ch]: Add handling for the additional target parameter to support drops of URIs, URLs and text to subfolders. Patch from Christian Neumair <chris@gnome-de.org>
Diffstat (limited to 'libnautilus-private/nautilus-icon-dnd.c')
-rw-r--r--libnautilus-private/nautilus-icon-dnd.c75
1 files changed, 53 insertions, 22 deletions
diff --git a/libnautilus-private/nautilus-icon-dnd.c b/libnautilus-private/nautilus-icon-dnd.c
index 3cb4829d2..6771d1eca 100644
--- a/libnautilus-private/nautilus-icon-dnd.c
+++ b/libnautilus-private/nautilus-icon-dnd.c
@@ -84,6 +84,10 @@ static void dnd_highlight_queue_redraw (GtkWidget *widget);
static GtkTargetList *drop_types_list = NULL;
static GtkTargetList *drop_types_list_root = NULL;
+static char * nautilus_icon_container_find_drop_target (NautilusIconContainer *container,
+ GdkDragContext *context,
+ int x, int y, gboolean *icon_hit);
+
static EelCanvasItem *
create_selection_shadow (NautilusIconContainer *container,
GList *list)
@@ -618,44 +622,65 @@ receive_dropped_keyword (NautilusIconContainer *container, const char *keyword,
/* handle dropped url */
static void
-receive_dropped_url (NautilusIconContainer *container, const char *encoded_url, GdkDragAction action, int x, int y)
+receive_dropped_url (NautilusIconContainer *container, const char *encoded_url, GdkDragContext *context, int x, int y)
{
+ char *drop_target;
+
if (encoded_url == NULL) {
return;
}
+ drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL);
+
g_signal_emit_by_name (container, "handle_url",
encoded_url,
- action,
+ drop_target,
+ context->action,
x, y);
+
+ g_free (drop_target);
}
/* handle dropped uri list */
static void
-receive_dropped_uri_list (NautilusIconContainer *container, const char *uri_list, GdkDragAction action, int x, int y)
+receive_dropped_uri_list (NautilusIconContainer *container, const char *uri_list, GdkDragContext *context, int x, int y)
{
+ char *drop_target;
+
if (uri_list == NULL) {
return;
}
-
+
+ drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL);
+
g_signal_emit_by_name (container, "handle_uri_list",
uri_list,
- action,
+ drop_target,
+ context->action,
x, y);
+
+ g_free (drop_target);
}
/* handle dropped text */
static void
-receive_dropped_text (NautilusIconContainer *container, const char *text, GdkDragAction action, int x, int y)
+receive_dropped_text (NautilusIconContainer *container, const char *text, GdkDragContext *context, int x, int y)
{
+ char *drop_target;
+
if (text == NULL) {
return;
}
+
+ drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL);
g_signal_emit_by_name (container, "handle_text",
text,
- action,
+ drop_target,
+ context->action,
x, y);
+
+ g_free (drop_target);
}
static int
@@ -939,8 +964,11 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container,
NautilusFile *file;
char *icon_uri;
- *icon_hit = FALSE;
- if (container->details->dnd_info->drag_info.selection_list == NULL) {
+ if (icon_hit) {
+ *icon_hit = FALSE;
+ }
+
+ if (!container->details->dnd_info->drag_info.got_drop_data_type) {
return NULL;
}
@@ -959,8 +987,9 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container,
if (icon_uri != NULL) {
file = nautilus_file_get (icon_uri);
- if (!nautilus_drag_can_accept_items (file,
- container->details->dnd_info->drag_info.selection_list)) {
+ if (!nautilus_drag_can_accept_info (file,
+ container->details->dnd_info->drag_info.data_type,
+ container->details->dnd_info->drag_info.selection_list)) {
/* the item we dropped our selection on cannot accept the items,
* do the same thing as if we just dropped the items on the canvas
*/
@@ -973,11 +1002,16 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container,
}
if (drop_target_icon == NULL) {
- *icon_hit = FALSE;
+ if (icon_hit) {
+ *icon_hit = FALSE;
+ }
+
return get_container_uri (container);
}
- *icon_hit = TRUE;
+ if (icon_hit) {
+ *icon_hit = TRUE;
+ }
return nautilus_icon_container_get_icon_drop_target_uri (container, drop_target_icon);
}
@@ -1177,10 +1211,6 @@ nautilus_icon_dnd_update_drop_target (NautilusIconContainer *container,
char *uri;
g_assert (NAUTILUS_IS_ICON_CONTAINER (container));
- if ((container->details->dnd_info->drag_info.selection_list == NULL)
- && (container->details->dnd_info->drag_info.data_type != NAUTILUS_ICON_DND_KEYWORD)) {
- return;
- }
canvas_widget_to_world (EEL_CANVAS (container), x, y, &world_x, &world_y);
@@ -1199,8 +1229,9 @@ nautilus_icon_dnd_update_drop_target (NautilusIconContainer *container,
file = nautilus_file_get (uri);
g_free (uri);
- if (!nautilus_drag_can_accept_items (file,
- container->details->dnd_info->drag_info.selection_list)) {
+ if (!nautilus_drag_can_accept_info (file,
+ container->details->dnd_info->drag_info.data_type,
+ container->details->dnd_info->drag_info.selection_list)) {
icon = NULL;
}
@@ -1642,20 +1673,20 @@ drag_data_received_callback (GtkWidget *widget,
case NAUTILUS_ICON_DND_URL:
receive_dropped_url
(NAUTILUS_ICON_CONTAINER (widget),
- (char *) data->data, context->action, x, y);
+ (char *) data->data, context, x, y);
success = TRUE;
break;
case NAUTILUS_ICON_DND_URI_LIST:
receive_dropped_uri_list
(NAUTILUS_ICON_CONTAINER (widget),
- (char *) data->data, context->action, x, y);
+ (char *) data->data, context, x, y);
success = TRUE;
break;
case NAUTILUS_ICON_DND_TEXT:
tmp = gtk_selection_data_get_text (data);
receive_dropped_text
(NAUTILUS_ICON_CONTAINER (widget),
- (char *) tmp, context->action, x, y);
+ (char *) tmp, context, x, y);
success = TRUE;
g_free (tmp);
break;