[network-manager-netbook/MplPanelClient] Keep the light switches up to date with devices



commit e17c5f4bb89bb5881931d4c7419f1bb5d19117d0
Author: Tambet Ingo <tambet gmail com>
Date:   Wed Dec 2 16:32:38 2009 +0200

    Keep the light switches up to date with devices
    
    Do not allow to enable/disable device type for which no devices is present.

 src/nmn-applet.c |   90 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 75 insertions(+), 15 deletions(-)
---
diff --git a/src/nmn-applet.c b/src/nmn-applet.c
index f57af91..c4fc329 100644
--- a/src/nmn-applet.c
+++ b/src/nmn-applet.c
@@ -20,6 +20,10 @@
 #include <glib/gi18n.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <nbtk/nbtk-gtk.h>
+#include <nm-device-ethernet.h>
+#include <nm-device-wifi.h>
+#include <nm-serial-device.h>
+#include <nm-device-bt.h>
 #include "nmn-applet.h"
 #include "nmn-new-connection.h"
 
@@ -58,6 +62,7 @@ typedef struct {
 } NmnAppletPrivate;
 
 static void add_new_connection_hide (GtkWidget *widget, gpointer user_data);
+static void wifi_toggle_set_sensitive (NmnModel *model, GtkWidget *widget, gboolean suggested);
 
 NmnApplet *
 nmn_applet_new (NmnModel *model)
@@ -69,6 +74,45 @@ nmn_applet_new (NmnModel *model)
                                      NULL));
 }
 
+/* I know 'sensitize' isn't a real word. So? */
+static void
+sensitize_switches (NmnApplet *applet)
+{
+    NmnAppletPrivate *priv = GET_PRIVATE (applet);
+    int ethernet;
+    int wifi;
+    int modem;
+    int wimax;
+    int bt;
+
+    ethernet = wifi = modem = wimax = bt = 0;
+
+    if (!nmn_model_offline_mode_get_active (priv->model)) {
+        const GPtrArray *devices;
+        int i;
+
+        devices = nm_client_get_devices (nmn_model_get_client (priv->model));
+        for (i = 0; devices && i < devices->len; i++) {
+            NMDevice *device = NM_DEVICE (g_ptr_array_index (devices, i));
+
+            if (NM_IS_DEVICE_ETHERNET (device))
+                ethernet++;
+            else if (NM_IS_DEVICE_WIFI (device))
+                wifi++;
+            else if (NM_IS_SERIAL_DEVICE (device))
+                modem++;
+            else if (NM_IS_DEVICE_BT (device))
+                bt++;
+        }
+    }
+
+    gtk_widget_set_sensitive (priv->enable_ethernet, ethernet > 0);
+    wifi_toggle_set_sensitive (priv->model, priv->enable_wifi, wifi > 0);
+    gtk_widget_set_sensitive (priv->enable_3g, modem > 0);
+    gtk_widget_set_sensitive (priv->enable_wimax, wimax > 0);
+    gtk_widget_set_sensitive (priv->enable_bt, bt > 0);
+}
+
 void
 nmn_applet_show (NmnApplet *applet)
 {
@@ -210,10 +254,6 @@ enable_network_toggled (NbtkGtkLightSwitch *w,
 {
     NmnAppletPrivate *priv = GET_PRIVATE (user_data);
 
-    gtk_widget_set_sensitive (priv->enable_ethernet, !active);
-    gtk_widget_set_sensitive (priv->enable_3g, !active);
-    wifi_toggle_set_sensitive (priv->model, priv->enable_wifi, !active);
-
     nmn_model_offline_mode_toggled (priv->model, active);
 }
 
@@ -228,9 +268,7 @@ offline_toggled (NmnModel *model,
     nbtk_gtk_light_switch_set_active (NBTK_GTK_LIGHT_SWITCH (priv->enable_network), active);
     g_signal_handlers_unblock_by_func (priv->model, enable_network_toggled, user_data);
 
-    gtk_widget_set_sensitive (priv->enable_3g, !active);
-    gtk_widget_set_sensitive (priv->enable_ethernet, !active);
-    wifi_toggle_set_sensitive (priv->model, priv->enable_wifi, !active);
+    sensitize_switches (NMN_APPLET (user_data));
 }
 
 static void
@@ -280,6 +318,23 @@ add_new_connection_setup (NmnApplet *applet)
     g_signal_connect (priv->add_new_connection, "clicked", G_CALLBACK (add_new_connection_show), applet);
 }
 
+static gboolean
+devices_changed_cb (gpointer user_data)
+{
+    sensitize_switches (NMN_APPLET (user_data));
+    return FALSE;
+}
+
+static void
+devices_changed (NMClient *client,
+                 NMDevice *device,
+                 gpointer user_data)
+{
+    /* Do it in the idle handler, otherwise the client still has the device
+       which is being removed here */
+    g_idle_add (devices_changed_cb, user_data);
+}
+
 static void
 nmn_applet_init (NmnApplet *applet)
 {
@@ -356,14 +411,12 @@ nmn_applet_init (NmnApplet *applet)
     gtk_misc_set_alignment (GTK_MISC (w), 0.2, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), w, 0, 1, 3, 4);
     priv->enable_wimax = nbtk_gtk_light_switch_new ();
-    gtk_widget_set_sensitive (priv->enable_wimax, FALSE);
     gtk_table_attach_defaults (GTK_TABLE (table), priv->enable_wimax, 1, 2, 3, 4);
 
     w = gtk_label_new (_("Bluetooth"));
     gtk_misc_set_alignment (GTK_MISC (w), 0.2, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), w, 0, 1, 4, 5);
     priv->enable_bt = nbtk_gtk_light_switch_new ();
-    gtk_widget_set_sensitive (priv->enable_bt, FALSE);
     gtk_table_attach_defaults (GTK_TABLE (table), priv->enable_bt, 1, 2, 4, 5);
 
 
@@ -393,6 +446,7 @@ constructor (GType type,
     GObject *object;
     NmnApplet *applet;
     NmnAppletPrivate *priv;
+    NMClient *client;
 
     object = G_OBJECT_CLASS (nmn_applet_parent_class)->constructor
         (type, n_construct_params, construct_params);
@@ -417,6 +471,11 @@ constructor (GType type,
     add_new_connection_setup (applet);
     add_new_connection_hide (NULL, applet);
 
+    client = nmn_model_get_client (priv->model);
+    g_signal_connect (client, "device-added", G_CALLBACK (devices_changed), applet);
+    g_signal_connect (client, "device-removed", G_CALLBACK (devices_changed), applet);
+    sensitize_switches (applet);
+
     return object;
 }
 
@@ -458,13 +517,14 @@ dispose (GObject *object)
 {
     NmnAppletPrivate *priv = GET_PRIVATE (object);
 
-    if (priv->disposed)
-        return;
+    if (!priv->disposed) {
+        if (priv->model) {
+            g_signal_handlers_disconnect_by_func (nmn_model_get_client (priv->model), devices_changed, object);
+            g_object_unref (priv->model);
+        }
 
-    priv->disposed = TRUE;
-
-    if (priv->model)
-        g_object_unref (priv->model);
+        priv->disposed = TRUE;
+    }
 
     G_OBJECT_CLASS (nmn_applet_parent_class)->dispose (object);
 }



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