summaryrefslogtreecommitdiff
path: root/gtk/gtkplacesview.c
diff options
context:
space:
mode:
authorColin Leroy <colin@colino.net>2017-09-12 15:32:36 +0200
committerMatthias Clasen <mclasen@redhat.com>2017-12-07 21:31:46 -0500
commit0156c52a2cfcc92d89fd7958f639ad47f6891c7c (patch)
treeee220afb6e8cffc09e469c7ed3d61689d2390b2a /gtk/gtkplacesview.c
parent7531be3510baf4d2ded80b780ff1c02f268bfcb0 (diff)
downloadgtk+-0156c52a2cfcc92d89fd7958f639ad47f6891c7c.tar.gz
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
Diffstat (limited to 'gtk/gtkplacesview.c')
-rw-r--r--gtk/gtkplacesview.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c
index 48db272ce7..c4bcb382a7 100644
--- a/gtk/gtkplacesview.c
+++ b/gtk/gtkplacesview.c
@@ -1171,8 +1171,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 */
@@ -1890,12 +1889,37 @@ on_listbox_row_activated (GtkPlacesView *view,
}
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)
{
GtkPlacesViewPrivate *priv;
gboolean is_network;
gboolean is_placeholder;
+ gboolean is_local = FALSE;
gboolean retval;
gboolean searching;
gchar *name;
@@ -1908,7 +1932,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)