[gtk+/gtk-3-22] places-view: monitor network



commit dfb5d11a53249bfeb03fac7ec201439d7d9e3d2f
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Apr 10 18:59:33 2017 -0300

    places-view: monitor network
    
    GtkPlacesView exposes local access points and network
    shares transparently by using the 'network:///' URI,
    which is handled by GIO.
    
    Currently, however, it doesn't monitor the network
    for new available points, such as computers that just
    join the network. It may happen too that the backend
    won't find all the networks before the network enumeration
    finishes.
    
    Fix that by keeping a file monitor inspecting the network
    uri, and update the places list when that happens.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781162

 gtk/gtkplacesview.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c
index 15d95cc..f4437b7 100644
--- a/gtk/gtkplacesview.c
+++ b/gtk/gtkplacesview.c
@@ -56,6 +56,7 @@ struct _GtkPlacesViewPrivate
 
   GFile                         *server_list_file;
   GFileMonitor                  *server_list_monitor;
+  GFileMonitor                  *network_monitor;
 
   GCancellable                  *cancellable;
 
@@ -397,6 +398,7 @@ gtk_places_view_destroy (GtkWidget *widget)
   priv->destroyed = 1;
 
   g_signal_handlers_disconnect_by_func (priv->volume_monitor, update_places, widget);
+  g_signal_handlers_disconnect_by_func (priv->network_monitor, update_places, widget);
 
   g_cancellable_cancel (priv->cancellable);
   g_cancellable_cancel (priv->networks_fetching_cancellable);
@@ -417,6 +419,7 @@ gtk_places_view_finalize (GObject *object)
   g_clear_object (&priv->server_list_file);
   g_clear_object (&priv->server_list_monitor);
   g_clear_object (&priv->volume_monitor);
+  g_clear_object (&priv->network_monitor);
   g_clear_object (&priv->cancellable);
   g_clear_object (&priv->networks_fetching_cancellable);
   g_clear_object (&priv->path_size_group);
@@ -902,6 +905,40 @@ update_network_state (GtkPlacesView *view)
 }
 
 static void
+monitor_network (GtkPlacesView *self)
+{
+  GtkPlacesViewPrivate *priv;
+  GFile *network_file;
+  GError *error;
+
+  priv = gtk_places_view_get_instance_private (self);
+
+  if (priv->network_monitor)
+    return;
+
+  error = NULL;
+  network_file = g_file_new_for_uri ("network:///");
+  priv->network_monitor = g_file_monitor (network_file,
+                                          G_FILE_MONITOR_NONE,
+                                          NULL,
+                                          &error);
+
+  g_clear_object (&network_file);
+
+  if (error)
+    {
+      g_warning ("Error monitoring network: %s", error->message);
+      g_clear_error (&error);
+      return;
+    }
+
+  g_signal_connect_swapped (priv->network_monitor,
+                            "changed",
+                            G_CALLBACK (update_places),
+                            self);
+}
+
+static void
 populate_networks (GtkPlacesView   *view,
                    GFileEnumerator *enumerator,
                    GList           *detected_networks)
@@ -974,6 +1011,7 @@ network_enumeration_next_files_finished (GObject      *source_object,
   if (!priv->destroyed)
     {
       update_network_state (view);
+      monitor_network (view);
       update_loading (view);
     }
 }


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