diff options
author | Colin Leroy <colin@colino.net> | 2017-09-12 15:32:36 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-12-07 21:31:46 -0500 |
commit | 0156c52a2cfcc92d89fd7958f639ad47f6891c7c (patch) | |
tree | ee220afb6e8cffc09e469c7ed3d61689d2390b2a /gtk/gtkplacesview.c | |
parent | 7531be3510baf4d2ded80b780ff1c02f268bfcb0 (diff) | |
download | gtk+-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.c | 43 |
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) |