Network: Implement and show on/off switch for wireless/wimax

These map to nm_client_wireless/wimax_set/get_enabled.
This commit is contained in:
Matthias Clasen 2011-03-14 19:21:54 -04:00
parent b7f42ae161
commit b160c1549b
2 changed files with 124 additions and 1 deletions

View file

@ -60,6 +60,7 @@ struct _CcNetworkPanelPrivate
GSettings *proxy_settings; GSettings *proxy_settings;
GtkBuilder *builder; GtkBuilder *builder;
NMClient *client; NMClient *client;
gboolean updating_device;
}; };
enum { enum {
@ -796,6 +797,96 @@ out:
return str; return str;
} }
static NMDevice *
find_device_by_udi (CcNetworkPanel *panel,
const gchar *udi)
{
gint i;
NMDevice *device;
for (i=0; i<panel->priv->devices->len; i++) {
device = g_ptr_array_index (panel->priv->devices, i);
if (g_strcmp0 (udi, nm_device_get_udi (device)) == 0) {
return device;
}
}
return NULL;
}
static void
device_off_toggled (GtkSwitch *sw,
GParamSpec *pspec,
CcNetworkPanel *panel)
{
NMDevice *device;
gboolean active;
if (panel->priv->updating_device)
return;
active = gtk_switch_get_active (sw);
device = find_device_by_udi (panel, panel->priv->current_device);
switch (nm_device_get_device_type (device)) {
case NM_DEVICE_TYPE_WIFI:
nm_client_wireless_set_enabled (panel->priv->client, active);
break;
case NM_DEVICE_TYPE_WIMAX:
nm_client_wimax_set_enabled (panel->priv->client, active);
break;
default: ;
/* FIXME: handle other device types */
}
}
static void
wireless_enabled_toggled (NMClient *client,
GParamSpec *pspec,
CcNetworkPanel *panel)
{
gboolean enabled;
GtkSwitch *sw;
NMDevice *device;
device = find_device_by_udi (panel, panel->priv->current_device);
if (nm_device_get_device_type (device) != NM_DEVICE_TYPE_WIFI)
return;
enabled = nm_client_wireless_get_enabled (client);
sw = GTK_SWITCH (gtk_builder_get_object (panel->priv->builder,
"device_off_switch"));
panel->priv->updating_device = TRUE;
gtk_switch_set_active (sw, enabled);
panel->priv->updating_device = FALSE;
}
static void
wimax_enabled_toggled (NMClient *client,
GParamSpec *pspec,
CcNetworkPanel *panel)
{
gboolean enabled;
GtkSwitch *sw;
NMDevice *device;
device = find_device_by_udi (panel, panel->priv->current_device);
if (nm_device_get_device_type (device) != NM_DEVICE_TYPE_WIMAX)
return;
enabled = nm_client_wimax_get_enabled (client);
sw = GTK_SWITCH (gtk_builder_get_object (panel->priv->builder,
"device_off_switch"));
panel->priv->updating_device = TRUE;
gtk_switch_set_active (sw, enabled);
panel->priv->updating_device = FALSE;
}
static void static void
nm_device_refresh_device_ui (CcNetworkPanel *panel, NMDevice *device) nm_device_refresh_device_ui (CcNetworkPanel *panel, NMDevice *device)
{ {
@ -808,6 +899,7 @@ nm_device_refresh_device_ui (CcNetworkPanel *panel, NMDevice *device)
GHashTable *options = NULL; GHashTable *options = NULL;
GtkListStore *liststore_wireless_network; GtkListStore *liststore_wireless_network;
GtkWidget *widget; GtkWidget *widget;
GtkWidget *sw;
guint i; guint i;
guint speed; guint speed;
NMAccessPoint *ap; NMAccessPoint *ap;
@ -854,6 +946,23 @@ nm_device_refresh_device_ui (CcNetworkPanel *panel, NMDevice *device)
} }
gtk_label_set_label (GTK_LABEL (widget), str); gtk_label_set_label (GTK_LABEL (widget), str);
sw = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"device_off_switch"));
/* keep this in sync with the signal handler setup in cc_network_panel_init */
switch (type) {
case NM_DEVICE_TYPE_WIFI:
gtk_widget_show (sw);
wireless_enabled_toggled (priv->client, NULL, panel);
break;
case NM_DEVICE_TYPE_WIMAX:
gtk_widget_show (sw);
wimax_enabled_toggled (priv->client, NULL, panel);
break;
default:
gtk_widget_hide (sw);
break;
}
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"notebook_types")); "notebook_types"));
if (type == NM_DEVICE_TYPE_ETHERNET) { if (type == NM_DEVICE_TYPE_ETHERNET) {
@ -1076,6 +1185,10 @@ nm_device_refresh_vpn_ui (CcNetworkPanel *panel, NetVpn *vpn)
"hbox_device_header")); "hbox_device_header"));
gtk_widget_set_visible (widget, TRUE); gtk_widget_set_visible (widget, TRUE);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"device_off_switch"));
gtk_widget_set_visible (widget, FALSE);
/* use proxy note page */ /* use proxy note page */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"notebook_types")); "notebook_types"));
@ -1562,6 +1675,15 @@ cc_network_panel_init (CcNetworkPanel *panel)
g_signal_connect (panel->priv->client, "device-removed", g_signal_connect (panel->priv->client, "device-removed",
G_CALLBACK (device_removed_cb), panel); G_CALLBACK (device_removed_cb), panel);
widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
"device_off_switch"));
g_signal_connect (widget, "notify::active",
G_CALLBACK (device_off_toggled), panel);
g_signal_connect (panel->priv->client, "notify::wireless-enabled",
G_CALLBACK (wireless_enabled_toggled), panel);
g_signal_connect (panel->priv->client, "notify::wimax-enabled",
G_CALLBACK (wimax_enabled_toggled), panel);
/* disable for now, until we can remove connections without /* disable for now, until we can remove connections without
* segfaulting NM... */ * segfaulting NM... */
widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,

View file

@ -245,7 +245,7 @@
</child> </child>
<child> <child>
<object class="GtkSwitch" id="device_off_switch"> <object class="GtkSwitch" id="device_off_switch">
<property name="visible">False</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">start</property> <property name="valign">start</property>
@ -1690,6 +1690,7 @@
<object class="GtkComboBoxText" id="combobox_proxy_mode"> <object class="GtkComboBoxText" id="combobox_proxy_mode">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="model">list_store_proxy_method</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>