[nautilus] sidebarrow: Hold reference to nautilus file



commit dc2711bd74056ed1711c0bce8dfcd9d0056bc3ad
Author: Corey Berla <corey berla me>
Date:   Fri Jun 3 14:14:40 2022 -0700

    sidebarrow: Hold reference to nautilus file
    
    When dragging to the sidebar, we check whether the source and dest
    files are on the same file system.  Since the source file is already
    loaded in the files view, we have a nautilus file with preloaded
    filesystem info.  The dest file, however, doesn't have file system
    info available.  Rather than checking for file system over and over
    as we drag accross the sidebar, keep a reference of the Nautilus File.
    
    Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1781

 src/gtk/nautilusgtkplacessidebar.c | 13 +++++++------
 src/gtk/nautilusgtksidebarrow.c    | 25 +++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 6 deletions(-)
---
diff --git a/src/gtk/nautilusgtkplacessidebar.c b/src/gtk/nautilusgtkplacessidebar.c
index e4f39fd6e..b9b845180 100644
--- a/src/gtk/nautilusgtkplacessidebar.c
+++ b/src/gtk/nautilusgtkplacessidebar.c
@@ -331,7 +331,7 @@ emit_unmount_operation (NautilusGtkPlacesSidebar *sidebar,
 
 static GdkDragAction
 emit_drag_action_requested (NautilusGtkPlacesSidebar *sidebar,
-                            GFile            *dest_file,
+                            NautilusFile            *dest_file,
                             GSList           *source_file_list)
 {
   GdkDragAction ret_action = 0;
@@ -1467,9 +1467,9 @@ check_valid_drop_target (NautilusGtkPlacesSidebar *sidebar,
 {
   NautilusGtkPlacesPlaceType place_type;
   NautilusGtkPlacesSectionType section_type;
+  g_autoptr (NautilusFile) dest_file = NULL;
   gboolean valid = FALSE;
   char *uri;
-  GFile *dest_file;
   int drag_action;
 
   g_return_val_if_fail (value != NULL, TRUE);
@@ -1481,6 +1481,7 @@ check_valid_drop_target (NautilusGtkPlacesSidebar *sidebar,
                 "place-type", &place_type,
                 "section_type", &section_type,
                 "uri", &uri,
+                "file", &dest_file,
                 NULL);
 
   if (place_type == NAUTILUS_GTK_PLACES_STARRED_LOCATION)
@@ -1528,11 +1529,8 @@ check_valid_drop_target (NautilusGtkPlacesSidebar *sidebar,
       /* Dragging a file */
       if (uri != NULL)
         {
-          dest_file = g_file_new_for_uri (uri);
           drag_action = emit_drag_action_requested (sidebar, dest_file, g_value_get_boxed (value));
           valid = drag_action > 0;
-
-          g_object_unref (dest_file);
         }
       else
         {
@@ -1713,11 +1711,13 @@ drag_motion_callback (GtkDropTarget    *target,
     }
   else if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST))
     {
+      NautilusFile *file;
       gtk_list_box_drag_highlight_row (GTK_LIST_BOX (sidebar->list_box), row);
 
       g_object_get (row,
                     "place-type", &place_type,
                     "uri", &drop_target_uri,
+                    "file", &file,
                     NULL);
       /* URIs are being dragged.  See if the caller wants to handle a
        * file move/copy operation itself, or if we should only try to
@@ -1734,12 +1734,13 @@ drag_motion_callback (GtkDropTarget    *target,
             {
               GFile *dest_file = g_file_new_for_uri (drop_target_uri);
 
-              action = emit_drag_action_requested (sidebar, dest_file, g_value_get_boxed (value));
+              action = emit_drag_action_requested (sidebar, file, g_value_get_boxed (value));
 
               g_object_unref (dest_file);
             }
         }
 
+      nautilus_file_unref (file);
       g_free (drop_target_uri);
     }
   else
diff --git a/src/gtk/nautilusgtksidebarrow.c b/src/gtk/nautilusgtksidebarrow.c
index f5d502995..4b35ddd48 100644
--- a/src/gtk/nautilusgtksidebarrow.c
+++ b/src/gtk/nautilusgtksidebarrow.c
@@ -20,6 +20,7 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include "nautilus-enum-types.h"
+#include "nautilus-file.h"
 
 #include "nautilusgtksidebarrowprivate.h"
 /* For section and place type enums */
@@ -46,6 +47,7 @@ struct _NautilusGtkSidebarRow
   NautilusGtkPlacesSectionType section_type;
   NautilusGtkPlacesPlaceType place_type;
   char *uri;
+  NautilusFile *file;
   GDrive *drive;
   GVolume *volume;
   GMount *mount;
@@ -72,6 +74,7 @@ enum
   PROP_SECTION_TYPE,
   PROP_PLACE_TYPE,
   PROP_URI,
+  PROP_NAUTILUS_FILE,
   PROP_DRIVE,
   PROP_VOLUME,
   PROP_MOUNT,
@@ -181,6 +184,10 @@ nautilus_gtk_sidebar_row_get_property (GObject    *object,
       g_value_set_string (value, self->uri);
       break;
 
+    case PROP_NAUTILUS_FILE:
+      g_value_set_object (value, self->file);
+      break;
+
     case PROP_DRIVE:
       g_value_set_object (value, self->drive);
       break;
@@ -300,6 +307,12 @@ nautilus_gtk_sidebar_row_set_property (GObject      *object,
     case PROP_URI:
       g_free (self->uri);
       self->uri = g_strdup (g_value_get_string (value));
+      if (self->uri != NULL)
+        {
+          self->file = nautilus_file_get_by_uri (self->uri);
+          if (self->file != NULL)
+            nautilus_file_call_when_ready (self->file, NAUTILUS_FILE_ATTRIBUTE_MOUNT, NULL, NULL);
+        }
       break;
 
     case PROP_DRIVE:
@@ -455,6 +468,7 @@ nautilus_gtk_sidebar_row_finalize (GObject *object)
   self->eject_tooltip = NULL;
   g_free (self->uri);
   self->uri = NULL;
+  nautilus_file_unref (self->file);
   g_clear_object (&self->drive);
   g_clear_object (&self->volume);
   g_clear_object (&self->mount);
@@ -473,6 +487,8 @@ nautilus_gtk_sidebar_row_init (NautilusGtkSidebarRow *self)
   gtk_widget_init_template (GTK_WIDGET (self));
 
   gtk_widget_set_focus_on_click (GTK_WIDGET (self), FALSE);
+
+  self->file = NULL;
 }
 
 static void
@@ -579,6 +595,14 @@ nautilus_gtk_sidebar_row_class_init (NautilusGtkSidebarRowClass *klass)
                           G_PARAM_CONSTRUCT_ONLY |
                           G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_NAUTILUS_FILE] =
+    g_param_spec_object ("file",
+                       "File",
+                       "Nautilus File",
+                       NAUTILUS_TYPE_FILE,
+                       (G_PARAM_READABLE |
+                        G_PARAM_STATIC_STRINGS ));
+
   properties [PROP_DRIVE] =
     g_param_spec_object ("drive",
                          "Drive",
@@ -654,6 +678,7 @@ nautilus_gtk_sidebar_row_clone (NautilusGtkSidebarRow *self)
                       "section-type", self->section_type,
                       "place-type", self->place_type,
                       "uri", self->uri,
+                      "file", self->file,
                       "drive", self->drive,
                       "volume", self->volume,
                       "mount", self->mount,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]