[gnome-control-center/wip/power: 9/9] power: add a wifi switch
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/wip/power: 9/9] power: add a wifi switch
- Date: Sun, 2 Dec 2012 21:30:43 +0000 (UTC)
commit 9802472793fef0bed6601b9d71cdc741d04b32d1
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Dec 2 16:26:58 2012 -0500
power: add a wifi switch
This is using NMClient. The exact semantics of what the switch
should do are still up for discussion, I think. For now, it
turns off wireless by calling nm_client_set_wireless_enabled().
configure.ac | 3 +
panels/power/Makefile.am | 5 ++
panels/power/cc-power-panel.c | 141 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 143 insertions(+), 6 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 8900d82..51d1f80 100644
--- a/configure.ac
+++ b/configure.ac
@@ -177,6 +177,9 @@ if test "x$have_networkmanager" = xno ; then
AC_MSG_WARN(*** Network panel will not be built (NetworkManager ~0.9 or newer not found) ***)
fi
AM_CONDITIONAL(BUILD_NETWORK, [test x$have_networkmanager = xyes])
+if test x${have_networkmanager} = xyes; then
+ AC_DEFINE(HAVE_NETWORK_MANAGER, 1, [Define to 1 if NetworkManager is available])
+fi
# Check for gnome-bluetooth
PKG_CHECK_MODULES(BLUETOOTH, $COMMON_MODULES gnome-bluetooth-1.0 >= 3.5.5,
diff --git a/panels/power/Makefile.am b/panels/power/Makefile.am
index 9416be2..00d9532 100644
--- a/panels/power/Makefile.am
+++ b/panels/power/Makefile.am
@@ -27,6 +27,11 @@ INCLUDES += $(BLUETOOTH_CFLAGS)
libpower_la_LIBADD += $(BLUETOOTH_LIBS)
endif
+if BUILD_NETWORK
+INCLUDES += $(NETWORK_MANAGER_CFLAGS)
+libpower_la_LIBADD += $(NETWORK_MANAGER_LIBS)
+endif
+
uidir = $(pkgdatadir)/ui
dist_ui_DATA = power.ui
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 7ebe81c..264fc6f 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -31,6 +31,10 @@
#include <bluetooth-killswitch.h>
#endif
+#ifdef HAVE_NETWORK_MANAGER
+#include <nm-client.h>
+#endif
+
#include "cc-power-panel.h"
#define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w)
@@ -69,6 +73,12 @@ struct _CcPowerPanelPrivate
BluetoothKillswitch *bt_killswitch;
GtkWidget *bt_switch;
#endif
+
+#ifdef HAVE_NETWORK_MANAGER
+ NMClient *nm_client;
+ GtkWidget *wifi_switch;
+ GtkWidget *wifi_row;
+#endif
};
enum
@@ -97,6 +107,9 @@ cc_power_panel_dispose (GObject *object)
#ifdef HAVE_BLUETOOTH
g_clear_object (&priv->bt_killswitch);
#endif
+#ifdef HAVE_NETWORK_MANAGER
+ g_clear_object (&priv->nm_client);
+#endif
G_OBJECT_CLASS (cc_power_panel_parent_class)->dispose (object);
}
@@ -676,7 +689,7 @@ get_devices_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
g_variant_unref (child);
}
-#if 1
+#if 0
g_print ("adding fake devices\n");
child = g_variant_new_parsed ("('/',%u,'',%d,%u,%t)",
UP_DEVICE_KIND_MOUSE, 100.0,
@@ -1112,15 +1125,99 @@ bt_killswitch_state_changed (BluetoothKillswitch *killswitch,
BluetoothKillswitchState state,
CcPowerPanel *panel)
{
- gboolean enabled;
+ CcPowerPanelPrivate *priv = panel->priv;
+ gboolean active;
+ gboolean sensitive;
g_debug ("bt killswitch state changed to %s", bluetooth_killswitch_state_to_string (state));
- enabled = state == BLUETOOTH_KILLSWITCH_STATE_UNBLOCKED;
+ active = state == BLUETOOTH_KILLSWITCH_STATE_UNBLOCKED;
+ sensitive = state != BLUETOOTH_KILLSWITCH_STATE_HARD_BLOCKED;
- g_signal_handlers_block_by_func (panel->priv->bt_switch, bt_switch_changed, panel);
- gtk_switch_set_active (GTK_SWITCH (panel->priv->bt_switch), enabled);
- g_signal_handlers_unblock_by_func (panel->priv->bt_switch, bt_switch_changed, panel);
+ g_signal_handlers_block_by_func (priv->bt_switch, bt_switch_changed, panel);
+ gtk_switch_set_active (GTK_SWITCH (priv->bt_switch), active);
+ gtk_widget_set_sensitive (priv->bt_switch, sensitive);
+ g_signal_handlers_unblock_by_func (priv->bt_switch, bt_switch_changed, panel);
+}
+#endif
+
+#ifdef HAVE_NETWORK_MANAGER
+static gboolean
+has_wifi_devices (NMClient *client)
+{
+ const GPtrArray *devices;
+ NMDevice *device;
+ gint i;
+
+ if (!nm_client_get_manager_running (client))
+ return FALSE;
+
+ devices = nm_client_get_devices (client);
+ if (devices == NULL)
+ return FALSE;
+
+ for (i = 0; i < devices->len; i++)
+ {
+ device = g_ptr_array_index (devices, i);
+ switch (nm_device_get_device_type (device))
+ {
+ case NM_DEVICE_TYPE_WIFI:
+ case NM_DEVICE_TYPE_WIMAX:
+ return TRUE;
+ default:
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+wifi_switch_changed (GtkSwitch *sw,
+ GParamSpec *pspec,
+ CcPowerPanel *panel)
+{
+ gboolean enabled;
+
+ enabled = gtk_switch_get_active (sw);
+ g_debug ("Setting wifi %s", enabled ? "enabled" : "disabled");
+ nm_client_wireless_set_enabled (panel->priv->nm_client, enabled);
+}
+
+static void
+nm_client_state_changed (NMClient *client,
+ GParamSpec *pspec,
+ CcPowerPanel *self)
+{
+ CcPowerPanelPrivate *priv = self->priv;
+ gboolean visible;
+ gboolean active;
+ gboolean sensitive;
+
+ visible = has_wifi_devices (priv->nm_client);
+ active = nm_client_networking_get_enabled (client) &&
+ nm_client_wireless_get_enabled (client) &&
+ nm_client_wireless_hardware_get_enabled (client);
+ sensitive = nm_client_networking_get_enabled (client) &&
+ nm_client_wireless_hardware_get_enabled (client);
+
+ g_debug ("wifi state changed to %s", active ? "enabled" : "disabled");
+
+ g_signal_handlers_block_by_func (priv->wifi_switch, wifi_switch_changed, self);
+ gtk_switch_set_active (GTK_SWITCH (priv->wifi_switch), active);
+ gtk_widget_set_sensitive (priv->wifi_switch, sensitive);
+ gtk_widget_set_visible (priv->wifi_row, visible);
+ g_signal_handlers_unblock_by_func (priv->wifi_switch, wifi_switch_changed, self);
+}
+
+static void
+nm_device_changed (NMClient *client,
+ NMDevice *device,
+ CcPowerPanel *self)
+{
+ CcPowerPanelPrivate *priv = self->priv;
+
+ gtk_widget_set_visible (priv->wifi_row, has_wifi_devices (priv->nm_client));
}
#endif
@@ -1202,6 +1299,37 @@ add_power_saving_section (CcPowerPanel *self)
gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
gtk_container_add (GTK_CONTAINER (widget), box);
+#ifdef HAVE_NETWORK_MANAGER
+ priv->nm_client = nm_client_new ();
+ g_signal_connect (priv->nm_client, "notify",
+ G_CALLBACK (nm_client_state_changed), self);
+ g_signal_connect (priv->nm_client, "device-added",
+ G_CALLBACK (nm_device_changed), self);
+ g_signal_connect (priv->nm_client, "device-removed",
+ G_CALLBACK (nm_device_changed), self);
+
+ priv->wifi_row = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 50);
+ label = gtk_label_new (_("_Wi-Fi"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+ gtk_widget_set_margin_left (label, 12);
+ gtk_widget_set_margin_right (label, 12);
+ gtk_widget_set_margin_top (label, 6);
+ gtk_widget_set_margin_bottom (label, 6);
+ gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+
+ priv->wifi_switch = sw = gtk_switch_new ();
+ gtk_widget_set_margin_left (sw, 12);
+ gtk_widget_set_margin_right (sw, 12);
+ gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
+ gtk_container_add (GTK_CONTAINER (widget), box);
+ nm_device_changed (priv->nm_client, NULL, self);
+
+ g_signal_connect (G_OBJECT (priv->wifi_switch), "notify::active",
+ G_CALLBACK (wifi_switch_changed), self);
+#endif
+
#ifdef HAVE_BLUETOOTH
{
BluetoothKillswitchState bt_state;
@@ -1220,6 +1348,7 @@ add_power_saving_section (CcPowerPanel *self)
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
priv->bt_switch = sw = gtk_switch_new ();
+ gtk_widget_set_sensitive (priv->bt_switch, bt_state == BLUETOOTH_KILLSWITCH_STATE_HARD_BLOCKED);
gtk_widget_set_margin_left (sw, 12);
gtk_widget_set_margin_right (sw, 12);
gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]