[network-manager-netbook/MplPanelClient] Keep the light switches up to date with devices
- From: Tambet Ingo <tambeti src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [network-manager-netbook/MplPanelClient] Keep the light switches up to date with devices
- Date: Wed, 2 Dec 2009 14:35:34 +0000 (UTC)
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]