[nautilus/wip/csoriano/dnd] meh
- From: Carlos Soriano Sánchez <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/csoriano/dnd] meh
- Date: Wed, 30 Sep 2015 16:47:41 +0000 (UTC)
commit fe4f2a5c459e695b5d10b7f341e80a4d5b5e1453
Author: Carlos Soriano <csoriano gnome org>
Date: Wed Sep 30 18:47:14 2015 +0200
meh
libnautilus-private/nautilus-canvas-dnd.c | 5 +-
libnautilus-private/nautilus-canvas-dnd.h | 5 +-
libnautilus-private/nautilus-dnd.c | 188 ++++++++---------------------
libnautilus-private/nautilus-dnd.h | 3 +
src/nautilus-list-view.c | 41 ++++++-
src/nautilus-list-view.h | 5 +
src/nautilus-window.c | 12 ++-
7 files changed, 115 insertions(+), 144 deletions(-)
---
diff --git a/libnautilus-private/nautilus-canvas-dnd.c b/libnautilus-private/nautilus-canvas-dnd.c
index 4905cbb..10192d6 100644
--- a/libnautilus-private/nautilus-canvas-dnd.c
+++ b/libnautilus-private/nautilus-canvas-dnd.c
@@ -1081,8 +1081,11 @@ nautilus_canvas_container_receive_dropped_icons (NautilusCanvasContainer *contai
}
GList *
-nautilus_canvas_container_get_drag_source_data (NautilusCanvasContainer *container)
+nautilus_canvas_container_get_drag_source_data (NautilusCanvasContainer *container,
+ GdkDragContext *context,
+ guint32 time)
{
+ nautilus_canvas_container_ensure_drag_data (container, context, time);
if (!container->details->dnd_info->drag_info.got_drop_data_type ||
container->details->dnd_info->drag_info.data_type != NAUTILUS_ICON_DND_GNOME_ICON_LIST) {
/* drag_data_received_callback didn't get called yet or the drag
diff --git a/libnautilus-private/nautilus-canvas-dnd.h b/libnautilus-private/nautilus-canvas-dnd.h
index ad57d43..fcfbe6a 100644
--- a/libnautilus-private/nautilus-canvas-dnd.h
+++ b/libnautilus-private/nautilus-canvas-dnd.h
@@ -53,6 +53,9 @@ void nautilus_canvas_dnd_begin_drag (NautilusCanvasContainer *conta
int start_x,
int start_y);
void nautilus_canvas_dnd_end_drag (NautilusCanvasContainer *container);
-GList *nautilus_canvas_container_get_drag_source_data (NautilusCanvasContainer *container);
+
+GList* nautilus_canvas_container_get_drag_source_data (NautilusCanvasContainer *container,
+ GdkDragContext *context,
+ guint32 time);
#endif /* NAUTILUS_CANVAS_DND_H */
diff --git a/libnautilus-private/nautilus-dnd.c b/libnautilus-private/nautilus-dnd.c
index 917d080..5948587 100644
--- a/libnautilus-private/nautilus-dnd.c
+++ b/libnautilus-private/nautilus-dnd.c
@@ -35,6 +35,8 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <libnautilus-private/nautilus-file-utilities.h>
+#include <libnautilus-private/nautilus-canvas-dnd.h>
+#include <src/nautilus-list-view.h>
#include <stdio.h>
#include <string.h>
@@ -381,137 +383,45 @@ source_is_deletable (GFile *file)
return ret;
}
-void
-nautilus_drag_sidebar_default_drop_action_for_icons (GdkDragContext *context,
- const char *target_uri_string, const GList *items,
- int *action)
-{
- gboolean same_fs;
- gboolean target_is_source_parent;
- gboolean source_deletable;
- const char *dropped_uri;
- GFile *target, *dropped, *dropped_directory;
- GdkDragAction actions;
- NautilusFile *dropped_file, *target_file;
-
- g_assert_not_reached ();
-
- g_print ("default %d\n", gdk_drag_context_get_suggested_action (context));
- if (target_uri_string == NULL) {
- g_print ("uri null\n");
- *action = 0;
- return;
- }
-
- actions = gdk_drag_context_get_actions (context) & (GDK_ACTION_MOVE | GDK_ACTION_COPY);
- if (actions == 0) {
- g_print ("actions 0\n");
- /* We can't use copy or move, just go with the suggested action. */
- *action = gdk_drag_context_get_suggested_action (context);
- return;
- }
-
- if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_ASK) {
- g_print ("ask\n");
- /* Don't override ask */
- *action = gdk_drag_context_get_suggested_action (context);
- return;
- }
-
- dropped_uri = ((NautilusDragSelectionItem *)items->data)->uri;
- dropped_file = ((NautilusDragSelectionItem *)items->data)->file;
- target_file = nautilus_file_get_existing_by_uri (target_uri_string);
-
- g_print ("hey 1\n");
- if (eel_uri_is_desktop (dropped_uri) &&
- !eel_uri_is_desktop (target_uri_string)) {
- /* Desktop items only move on the desktop */
- *action = 0;
- return;
- }
-
- /*
- * Check for trash URI. We do a find_directory for any Trash directory.
- * Passing 0 permissions as gnome-vfs would override the permissions
- * passed with 700 while creating .Trash directory
- */
- if (eel_uri_is_trash (target_uri_string)) {
- /* Only move to Trash */
- if (actions & GDK_ACTION_MOVE) {
- *action = GDK_ACTION_MOVE;
- }
- nautilus_file_unref (target_file);
- return;
-
- } else if (dropped_file != NULL && nautilus_file_is_launcher (dropped_file)) {
- if (actions & GDK_ACTION_MOVE) {
- *action = GDK_ACTION_MOVE;
- }
- nautilus_file_unref (target_file);
- return;
- } else if (eel_uri_is_desktop (target_uri_string)) {
- target = nautilus_get_desktop_location ();
-
- nautilus_file_unref (target_file);
- target_file = nautilus_file_get (target);
-
- if (eel_uri_is_desktop (dropped_uri)) {
- /* Only move to Desktop icons */
- if (actions & GDK_ACTION_MOVE) {
- *action = GDK_ACTION_MOVE;
- }
-
- g_object_unref (target);
- nautilus_file_unref (target_file);
- return;
- }
- } else if (target_file != NULL && nautilus_file_is_archive (target_file)) {
- *action = GDK_ACTION_COPY;
-
- nautilus_file_unref (target_file);
- return;
- } else {
- target = g_file_new_for_uri (target_uri_string);
- }
-
- g_print ("hey 2\n");
- same_fs = check_same_fs (target_file, dropped_file);
-
- nautilus_file_unref (target_file);
-
- /* Compare the first dropped uri with the target uri for same fs match. */
- dropped = g_file_new_for_uri (dropped_uri);
- dropped_directory = g_file_get_parent (dropped);
- target_is_source_parent = FALSE;
- if (dropped_directory != NULL) {
- /* If the dropped file is already in the same directory but
- is in another filesystem we still want to move, not copy
- as this is then just a move of a mountpoint to another
- position in the dir */
- target_is_source_parent = g_file_equal (dropped_directory, target);
- g_object_unref (dropped_directory);
- }
- source_deletable = source_is_deletable (dropped);
-
- if ((same_fs && source_deletable) || target_is_source_parent ||
- g_file_has_uri_scheme (dropped, "trash")) {
- if (actions & GDK_ACTION_MOVE) {
- *action = GDK_ACTION_MOVE;
- } else {
- *action = gdk_drag_context_get_suggested_action (context);
- }
- } else {
- if (actions & GDK_ACTION_COPY) {
- *action = GDK_ACTION_COPY;
- } else {
- *action = gdk_drag_context_get_suggested_action (context);
- }
- }
- g_print ("hey 3 %d\n", *action);
-
- g_object_unref (target);
- g_object_unref (dropped);
-
+GList *
+nautilus_drag_get_source_data (GdkDragContext *context,
+ guint32 time)
+{
+ GtkWidget *source_widget;
+ GList *source_data;
+
+ source_widget = gtk_drag_get_source_widget (context);
+ if (source_widget == NULL)
+ return NULL;
+
+ g_print ("type %s\n", G_OBJECT_TYPE_NAME (source_widget));
+ if (NAUTILUS_IS_CANVAS_CONTAINER (source_widget)) {
+ source_data = nautilus_canvas_container_get_drag_source_data (NAUTILUS_CANVAS_CONTAINER
(source_widget),
+ context,
+ time);
+ } else if (GTK_IS_TREE_VIEW (source_widget)) {
+ NautilusWindow *window;
+ NautilusWindowSlot *active_slot;
+ NautilusView *view;
+
+ window = NAUTILUS_WINDOW (gtk_widget_get_toplevel (source_widget));
+ active_slot = nautilus_window_get_active_slot (window);
+ view = nautilus_window_slot_get_current_view (active_slot);
+ if (NAUTILUS_IS_LIST_VIEW (view)) {
+ source_data = nautilus_list_view_get_drag_source_data (NAUTILUS_LIST_VIEW (view),
+ context,
+ time);
+ } else {
+ g_warning ("Got a drag context with a tree view source widget, but current view is
not list view");
+ source_data = NULL;
+ }
+ } else {
+ /* it's a slot or something else */
+ g_warning ("Requested drag source data from a widget that doesn't support it");
+ source_data = NULL;
+ }
+
+ return source_data;
}
void
@@ -530,31 +440,33 @@ nautilus_drag_default_drop_action_for_icons (GdkDragContext *context,
g_print ("default %d\n", gdk_drag_context_get_suggested_action (context));
if (target_uri_string == NULL) {
- g_print ("uri null\n");
*action = 0;
return;
}
actions = gdk_drag_context_get_actions (context) & (GDK_ACTION_MOVE | GDK_ACTION_COPY);
+ g_print ("actions %d\n", gdk_drag_context_get_actions (context));
+ if (gdk_drag_context_get_actions (context) == 46) {
+ G_BREAKPOINT ();
+
+ }
if (actions == 0) {
- g_print ("actions 0\n");
+ g_print ("returning because actions 0\n");
/* We can't use copy or move, just go with the suggested action. */
*action = gdk_drag_context_get_suggested_action (context);
return;
}
if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_ASK) {
- g_print ("ask\n");
/* Don't override ask */
*action = gdk_drag_context_get_suggested_action (context);
return;
}
-
+
dropped_uri = ((NautilusDragSelectionItem *)items->data)->uri;
dropped_file = ((NautilusDragSelectionItem *)items->data)->file;
target_file = nautilus_file_get_existing_by_uri (target_uri_string);
- g_print ("hey 1\n");
if (eel_uri_is_desktop (dropped_uri) &&
!eel_uri_is_desktop (target_uri_string)) {
/* Desktop items only move on the desktop */
@@ -592,7 +504,7 @@ nautilus_drag_default_drop_action_for_icons (GdkDragContext *context,
if (actions & GDK_ACTION_MOVE) {
*action = GDK_ACTION_MOVE;
}
-
+
g_object_unref (target);
nautilus_file_unref (target_file);
return;
@@ -606,11 +518,10 @@ nautilus_drag_default_drop_action_for_icons (GdkDragContext *context,
target = g_file_new_for_uri (target_uri_string);
}
- g_print ("hey 2\n");
same_fs = check_same_fs (target_file, dropped_file);
nautilus_file_unref (target_file);
-
+
/* Compare the first dropped uri with the target uri for same fs match. */
dropped = g_file_new_for_uri (dropped_uri);
dropped_directory = g_file_get_parent (dropped);
@@ -639,7 +550,6 @@ nautilus_drag_default_drop_action_for_icons (GdkDragContext *context,
*action = gdk_drag_context_get_suggested_action (context);
}
}
- g_print ("hey 3 %d\n", *action);
g_object_unref (target);
g_object_unref (dropped);
diff --git a/libnautilus-private/nautilus-dnd.h b/libnautilus-private/nautilus-dnd.h
index c62d828..d7afc79 100644
--- a/libnautilus-private/nautilus-dnd.h
+++ b/libnautilus-private/nautilus-dnd.h
@@ -153,4 +153,7 @@ void nautilus_drag_autoscroll_stop
(NautilusDragInfo *drag_info);
gboolean nautilus_drag_selection_includes_special_link (GList
*selection_list);
+GList * nautilus_drag_get_source_data (GdkDragContext *context,
+ guint32 time);
+
#endif
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 0e13415..a97b567 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -342,7 +342,36 @@ nautilus_list_view_did_not_drag (NautilusListView *view,
}
-static void
+GList *
+nautilus_list_view_get_drag_source_data (NautilusListView *list_view,
+ GdkDragContext *context,
+ guint32 time)
+{
+ GtkTreeView *tree_view;
+ GtkTreeModel *model;
+ GList *selection_cache;
+
+ tree_view = GTK_TREE_VIEW (list_view->details->tree_view);
+
+ model = gtk_tree_view_get_model (tree_view);
+
+ if (model == NULL) {
+ g_print ("model null\n");
+ return NULL;
+ }
+
+ selection_cache = g_object_get_data (G_OBJECT (context), "drag-info");
+ if (selection_cache == NULL) {
+ g_print ("selection cache null \n");
+ return NULL;
+ }
+
+ g_print ("returning selection cache \n");
+ return selection_cache;
+
+}
+
+static void
drag_data_get_callback (GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *selection_data,
@@ -491,6 +520,10 @@ drag_end_callback (GtkWidget *widget,
nautilus_window_end_dnd (window, context);
}
+
+static void
+drag_motion_callback ()
+
static void
drag_begin_callback (GtkWidget *widget,
GdkDragContext *context,
@@ -499,9 +532,12 @@ drag_begin_callback (GtkWidget *widget,
GList *selection_cache;
cairo_surface_t *surface;
NautilusWindow *window;
+ GdkDragAction actions;
window = nautilus_files_view_get_window (NAUTILUS_FILES_VIEW (view));
surface = get_drag_surface (view);
+ actions = gdk_drag_context_get_actions (context);
+ g_print ("ACTIONS LIST VIEW %d\n", actions);
if (surface) {
gtk_drag_set_icon_surface (context, surface);
cairo_surface_destroy (surface);
@@ -520,6 +556,7 @@ drag_begin_callback (GtkWidget *widget,
selection_cache,
(GDestroyNotify)nautilus_drag_destroy_selection_list);
+ g_print ("start window dnd\n");
nautilus_window_start_dnd (window, context);
}
@@ -1866,6 +1903,8 @@ create_and_set_up_tree_view (NautilusListView *view)
g_signal_connect_object (view->details->tree_view, "drag-begin",
G_CALLBACK (drag_begin_callback), view, 0);
+ g_signal_connect_object (view->details->tree_view, "drag-motion",
+ G_CALLBACK (drag_motion_callback), view, 0);
g_signal_connect_object (view->details->tree_view, "drag-end",
G_CALLBACK (drag_end_callback), view, 0);
g_signal_connect_object (view->details->tree_view, "drag-data-get",
diff --git a/src/nautilus-list-view.h b/src/nautilus-list-view.h
index 03f027e..4213968 100644
--- a/src/nautilus-list-view.h
+++ b/src/nautilus-list-view.h
@@ -54,4 +54,9 @@ typedef struct {
GType nautilus_list_view_get_type (void);
NautilusFilesView * nautilus_list_view_new (NautilusWindowSlot *slot);
+GList *
+nautilus_list_view_get_drag_source_data (NautilusListView *list_view,
+ GdkDragContext *context,
+ guint32 time);
+
#endif /* NAUTILUS_LIST_VIEW_H */
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 0c74b74..7df7fa6 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -1007,14 +1007,22 @@ places_sidebar_drag_action_requested_cb (GtkPlacesSidebar *sidebar,
gpointer user_data)
{
GList *items;
+ GList *items_from_nautilus_data;
char *uri;
int action = 0;
+ GtkWidget *source_widget;
+ GdkAtom target;
+
+ source_widget = gtk_drag_get_source_widget (context);
+ target = gtk_drag_dest_find_target (GTK_WIDGET (sidebar), context, NULL);
+ //gtk_drag_get_data (source_widget, context, target, GDK_CURRENT_TIME);
items = build_selection_list_from_gfile_list (source_file_list);
+ items_from_nautilus_data = nautilus_drag_get_source_data (context, GDK_CURRENT_TIME);
uri = g_file_get_uri (dest_file);
- nautilus_drag_default_drop_action_for_icons (context, uri, items, &action);
- g_print ("action %d %s\n", action, uri, g_list_length (source_file_list));
+ nautilus_drag_default_drop_action_for_icons (context, uri, items_from_nautilus_data, &action);
+ g_print ("action %d %s %d %d\n", action, uri, g_list_length (source_file_list), g_list_length
(items_from_nautilus_data));
nautilus_drag_destroy_selection_list (items);
g_free (uri);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]