[gnome-control-center/gnome-3-36] network: Correctly detect when ethernet devices are hotplugged.



commit 476eba4c42c62e25ad9199cc366acc84017f601c
Author: Robert Ancell <robert ancell canonical com>
Date:   Thu Nov 5 17:04:36 2020 +1300

    network: Correctly detect when ethernet devices are hotplugged.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/995

 panels/network/cc-network-panel.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)
---
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c
index fc97fbca8..b87e58b45 100644
--- a/panels/network/cc-network-panel.c
+++ b/panels/network/cc-network-panel.c
@@ -391,9 +391,6 @@ panel_add_device (CcNetworkPanel *self, NMDevice *device)
         NetDeviceBluetooth *device_bluetooth;
         g_autoptr(GDBusObject) modem_object = NULL;
 
-        if (!nm_device_get_managed (device))
-                return;
-
         /* does already exist */
         if (g_hash_table_lookup (self->nm_device_to_device, device) != NULL)
                 return;
@@ -517,19 +514,36 @@ active_connections_changed (CcNetworkPanel *self)
 }
 
 static void
-device_added_cb (CcNetworkPanel *self, NMDevice *device)
+device_managed_cb (CcNetworkPanel *self, GParamSpec *pspec, NMDevice *device)
 {
-        g_debug ("New device added");
+        if (!nm_device_get_managed (device))
+                return;
+
         panel_add_device (self, device);
         panel_refresh_device_titles (self);
 }
 
+static void
+device_added_cb (CcNetworkPanel *self, NMDevice *device)
+{
+        g_debug ("New device added");
+
+        if (nm_device_get_managed (device))
+                device_managed_cb (self, NULL, device);
+        else
+                g_signal_connect_object (device, "notify::managed", G_CALLBACK (device_managed_cb), self, 
G_CONNECT_SWAPPED);
+}
+
 static void
 device_removed_cb (CcNetworkPanel *self, NMDevice *device)
 {
         g_debug ("Device removed");
         panel_remove_device (self, device);
         panel_refresh_device_titles (self);
+
+        g_signal_handlers_disconnect_by_func (device,
+                                              G_CALLBACK (device_managed_cb),
+                                              self);
 }
 
 static void
@@ -537,7 +551,6 @@ manager_running (CcNetworkPanel *self)
 {
         const GPtrArray *devices;
         int i;
-        NMDevice *device_tmp;
 
         /* clear all devices we added */
         if (!nm_client_get_nm_running (self->client)) {
@@ -552,8 +565,8 @@ manager_running (CcNetworkPanel *self)
                 return;
         }
         for (i = 0; i < devices->len; i++) {
-                device_tmp = g_ptr_array_index (devices, i);
-                panel_add_device (self, device_tmp);
+                NMDevice *device = g_ptr_array_index (devices, i);
+                device_added_cb (self, device);
         }
 out:
         panel_refresh_device_titles (self);


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