[nautilus] sidebarrow: Hold reference to nautilus file
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] sidebarrow: Hold reference to nautilus file
- Date: Sat, 2 Jul 2022 17:27:52 +0000 (UTC)
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", §ion_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]