[nautilus/wip/csoriano/dnd] meh



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]