[network-manager-netbook] Implement Ethernet enabling/disabling.



commit 2fb6c047076b187f3d1e8a6a9158b1937f8de0ce
Author: Tambet Ingo <tambet gmail com>
Date:   Wed May 27 14:42:16 2009 +0300

    Implement Ethernet enabling/disabling.
---
 TODO                       |    1 -
 src/nmn-applet.c           |   20 ++++++++++++--
 src/nmn-ethernet-handler.c |   61 ++++++++++++++++++++++++++++++++++++++------
 3 files changed, 70 insertions(+), 12 deletions(-)

diff --git a/TODO b/TODO
index afa6424..6aad066 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
 * Networks/AP lists are not sorted, in random order.
-* Ethernet switch doesn't work.
 * "Advanced" button doesn't do anything, used for specifying static IP, manual DNS, etc.
 * Hidden APs are not supported at all.
diff --git a/src/nmn-applet.c b/src/nmn-applet.c
index 134c7d1..4773726 100644
--- a/src/nmn-applet.c
+++ b/src/nmn-applet.c
@@ -119,6 +119,21 @@ enable_ethernet_toggled (NbtkGtkLightSwitch *w,
                          gboolean active,
                          gpointer user_data)
 {
+    NmnAppletPrivate *priv = GET_PRIVATE (user_data);
+
+    nmn_nm_data_ethernet_toggled (priv->nm_data, active);
+}
+
+static void
+ethernet_toggled (NmnNMData *nm_data,
+                  gboolean active,
+                  gpointer user_data)
+{
+    NmnAppletPrivate *priv = GET_PRIVATE (user_data);
+
+    g_signal_handlers_block_by_func (priv->nm_data, enable_ethernet_toggled, user_data);
+    nbtk_gtk_light_switch_set_active (NBTK_GTK_LIGHT_SWITCH (priv->enable_ethernet), active);
+    g_signal_handlers_unblock_by_func (priv->nm_data, enable_ethernet_toggled, user_data);
 }
 
 static void
@@ -136,9 +151,8 @@ enable_ethernet_setup (NmnApplet *applet)
     g_signal_connect (priv->enable_ethernet, "switch-flipped", G_CALLBACK (enable_ethernet_toggled), applet);
     gtk_widget_show (priv->enable_wifi);
 
-    /* FIXME: Enable/disable ethernet is not supported yet */
-    nbtk_gtk_light_switch_set_active (NBTK_GTK_LIGHT_SWITCH (priv->enable_ethernet), TRUE);
-    gtk_widget_set_sensitive (priv->enable_ethernet, FALSE);
+    g_signal_connect (priv->nm_data, "ethernet-toggled", G_CALLBACK (ethernet_toggled), applet);
+    ethernet_toggled (priv->nm_data, nmn_nm_data_ethernet_get_active (priv->nm_data), applet);
 }
 
 /* enable/disable 3G button */
diff --git a/src/nmn-ethernet-handler.c b/src/nmn-ethernet-handler.c
index bd2b00a..57bcf88 100644
--- a/src/nmn-ethernet-handler.c
+++ b/src/nmn-ethernet-handler.c
@@ -12,6 +12,7 @@ G_DEFINE_TYPE (NmnEthernetHandler, nmn_ethernet_handler, NMN_TYPE_DEVICE_HANDLER
 
 typedef struct {
     gulong carrier_changed_id;
+    gulong ethernet_toggled_id;
 
     gboolean disposed;
 } NmnEthernetHandlerPrivate;
@@ -50,15 +51,12 @@ connection_added (NmnDeviceHandler *handler,
 }
 
 static void
-carrier_changed (NMDeviceEthernet *device,
-                 GParamSpec *pspec,
-                 gpointer user_data)
+state_changed (NmnDeviceHandler *handler, gboolean active)
 {
-    NmnDeviceHandler *handler = NMN_DEVICE_HANDLER (user_data);
     GSList *list;
     GSList *iter;
 
-    if (nm_device_ethernet_get_carrier (device)) {
+    if (active) {
         list = nmn_device_handler_get_connections (handler);
         for (iter = list; iter; iter = iter->next)
             connection_added (handler, NM_EXPORTED_CONNECTION (iter->data));
@@ -66,8 +64,46 @@ carrier_changed (NMDeviceEthernet *device,
         g_slist_free (list);
     } else {
         list = nmn_device_handler_get_items (handler);
-        for (iter = list; iter; iter = iter->next)
-            nmn_item_remove_request (NMN_ITEM (iter->data));
+        for (iter = list; iter; iter = iter->next) {
+            NmnItem *item = NMN_ITEM (iter->data);
+
+            if (nmn_item_get_status (item) != NMN_ITEM_STATUS_DISCONNECTED)
+                nmn_item_disconnect_request (item);
+
+            nmn_item_remove_request (item);
+        }
+    }
+}
+
+static void
+carrier_changed (NMDeviceEthernet *device,
+                 GParamSpec *pspec,
+                 gpointer user_data)
+{
+    state_changed (NMN_DEVICE_HANDLER (user_data), nm_device_ethernet_get_carrier (device));
+}
+
+static void
+ethernet_toggled (NmnNMData *nm_data,
+                  gboolean active,
+                  gpointer user_data)
+{
+    NmnDeviceHandler *handler = NMN_DEVICE_HANDLER (user_data);
+
+    state_changed (handler, active);
+
+    /* When ethernet is enabled, it means we really want it enabled */
+    if (active) {
+        GSList *list;
+        GSList *iter;
+
+        list = nmn_device_handler_get_items (handler);
+        for (iter = list; iter; iter = iter->next) {
+            NmnItem *item = NMN_ITEM (iter->data);
+
+            if (nmn_item_get_status (item) == NMN_ITEM_STATUS_DISCONNECTED)
+                nmn_item_connect_request (item);
+        }
     }
 }
 
@@ -77,8 +113,9 @@ constructor (GType type,
              GObjectConstructParam *construct_params)
 {
     GObject *object;
-    NMDeviceEthernet *device;
     NmnEthernetHandlerPrivate *priv;
+    NMDeviceEthernet *device;
+    NmnNMData *nm_data;
 
     object = G_OBJECT_CLASS (nmn_ethernet_handler_parent_class)->constructor
         (type, n_construct_params, construct_params);
@@ -92,6 +129,10 @@ constructor (GType type,
     priv->carrier_changed_id = g_signal_connect (device, "notify::" NM_DEVICE_ETHERNET_CARRIER,
                                                  G_CALLBACK (carrier_changed), object);
 
+    nm_data = nmn_device_handler_get_nm_data (NMN_DEVICE_HANDLER (object));
+    priv->ethernet_toggled_id = g_signal_connect (nm_data, "ethernet-toggled",
+                                                  G_CALLBACK (ethernet_toggled), object);
+
     return object;
 }
 
@@ -105,6 +146,7 @@ dispose (GObject *object)
 {
     NmnEthernetHandlerPrivate *priv = GET_PRIVATE (object);
     NMDevice *device;
+    NmnNMData *nm_data;
 
     if (priv->disposed)
         return;
@@ -112,6 +154,9 @@ dispose (GObject *object)
     device = nmn_device_handler_get_device (NMN_DEVICE_HANDLER (object));
     g_signal_handler_disconnect (device, priv->carrier_changed_id);
 
+    nm_data = nmn_device_handler_get_nm_data (NMN_DEVICE_HANDLER (object));
+    g_signal_handler_disconnect (nm_data, priv->ethernet_toggled_id);
+
     priv->disposed = TRUE;
 
     G_OBJECT_CLASS (nmn_ethernet_handler_parent_class)->dispose (object);



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