placesview: Present FUSE-reachable network shares in Other Locations

The documentation about gtk_file_chooser_set_local_only() states
that "non-native files may still be available using the native
filesystem via a userspace filesystem (FUSE)."
The code that made this possible in GTK+2 was missing from GTK+3 and
that represented a regression for Linux users in numerous applications
(Firefox, Thunderbird, Chromium, ...)

https://bugzilla.gnome.org/show_bug.cgi?id=787128
This commit is contained in:
Colin Leroy
2017-09-12 15:32:36 +02:00
committed by Matthias Clasen
parent 86dd1e37a7
commit 279b81d202

View File

@@ -1183,8 +1183,7 @@ update_places (GtkPlacesView *view)
populate_servers (view);
/* fetch networks and add them asynchronously */
if (!gtk_places_view_get_local_only (view))
fetch_networks (view);
fetch_networks (view);
update_view_mode (view);
/* Check whether we still are in a loading state */
@@ -1904,6 +1903,30 @@ on_listbox_row_activated (GtkPlacesView *view,
activate_row (view, row, priv->current_open_flags);
}
static gboolean
is_mount_locally_accessible (GMount *mount)
{
GFile *base_file;
gchar *path;
if (mount == NULL)
return FALSE;
base_file = g_mount_get_root (mount);
if (base_file == NULL)
return FALSE;
path = g_file_get_path (base_file);
g_object_unref (base_file);
if (path == NULL)
return FALSE;
g_free (path);
return TRUE;
}
static gboolean
listbox_filter_func (GtkListBoxRow *row,
gpointer user_data)
@@ -1911,6 +1934,7 @@ listbox_filter_func (GtkListBoxRow *row,
GtkPlacesViewPrivate *priv;
gboolean is_network;
gboolean is_placeholder;
gboolean is_local = FALSE;
gboolean retval;
gboolean searching;
gchar *name;
@@ -1923,7 +1947,20 @@ listbox_filter_func (GtkListBoxRow *row,
is_network = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-network"));
is_placeholder = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-placeholder"));
if (is_network && priv->local_only)
if (GTK_IS_PLACES_VIEW_ROW (row))
{
GtkPlacesViewRow *placesviewrow;
GMount *mount;
placesviewrow = GTK_PLACES_VIEW_ROW (row);
g_object_get(G_OBJECT (placesviewrow), "mount", &mount, NULL);
is_local = is_mount_locally_accessible (mount);
g_clear_object (&mount);
}
if (is_network && priv->local_only && !is_local)
return FALSE;
if (is_placeholder && searching)