This duplicates the existing functionality in the Control Panel for more convenient access. Disabling wifi devices can save power, thereby increasing battery life.
Signed-off-by: Sascha Silbe <si...@activitycentral.com> --- This is fully working but I'm not sure about the correct way to change the label of a MenuItem. Accessing it via MenuItem.child seems hacky. Suggestions? We could also do with a better icon. Maybe something like the circles from emblem-outofrange combined with the arrow from emblem-charging, striking out the arrow depending on the current action (disable or enable wifi)? Since the wiki is down I've uploaded the screenshot to the scratch area on my own server [1,2]. [1] http://sascha.silbe.org/tmp/sugar-wifi-conn-disable.png [2] http://sascha.silbe.org/tmp/sugar-wifi-enable.png extensions/deviceicon/network.py | 57 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py index 9a74237..85ca884 100644 --- a/extensions/deviceicon/network.py +++ b/extensions/deviceicon/network.py @@ -72,12 +72,15 @@ class WirelessPalette(Palette): __gsignals__ = { 'deactivate-connection': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'disable-wifi': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + 'enable-wifi': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), } def __init__(self, primary_text): Palette.__init__(self, label=primary_text) self._disconnect_item = None + self._enabled = True self._channel_label = gtk.Label() self._channel_label.props.xalign = 0.0 @@ -109,6 +112,13 @@ class WirelessPalette(Palette): self.__disconnect_activate_cb) self.menu.append(self._disconnect_item) + label = glib.markup_escape_text(_('Disable all wireless devices')) + self._powercontrol_item = MenuItem(label, 'system-shutdown') + self._powercontrol_item.connect('activate', + self.__powercontrol_activate_cb) + self._powercontrol_item.show() + self.menu.append(self._powercontrol_item) + def set_connecting(self): self.props.secondary_text = _('Connecting...') @@ -132,9 +142,26 @@ class WirelessPalette(Palette): self._disconnect_item.hide() self.set_content(None) + def set_enabled(self, enabled): + self._enabled = enabled + if enabled: + label = glib.markup_escape_text(_('Disable all wireless devices')) + else: + self.set_disconnected() + label = glib.markup_escape_text(_('Enable wireless devices')) + + # FIXME: what's the right way to do this? + self._powercontrol_item.child.set_markup(label) + def __disconnect_activate_cb(self, menuitem): self.emit('deactivate-connection') + def __powercontrol_activate_cb(self, menuitem): + if self._enabled: + self.emit('disable-wifi') + else: + self.emit('enable-wifi') + def _set_frequency(self, frequency): channel = network.frequency_to_channel(frequency) self._set_channel(channel) @@ -402,6 +429,8 @@ class WirelessDeviceView(ToolButton): self._palette = WirelessPalette(self._name) self._palette.connect('deactivate-connection', self.__deactivate_connection_cb) + self._palette.connect('disable-wifi', self.__disable_wifi_cb) + self._palette.connect('enable-wifi', self.__enable_wifi_cb) self.set_palette(self._palette) self._palette.set_group_id('frame') @@ -420,6 +449,16 @@ class WirelessDeviceView(ToolButton): path=self._device.object_path, dbus_interface=_NM_DEVICE_IFACE) + obj = self._bus.get_object(_NM_SERVICE, _NM_PATH) + network_manager = dbus.Interface(obj, _NM_IFACE) + self._nm_props = dbus.Interface(network_manager, dbus.PROPERTIES_IFACE) + self._nm_props.connect_to_signal('PropertiesChanged', + self.__nm_props_changed_cb, + dbus_interface=_NM_IFACE) + self._nm_props.Get(_NM_IFACE, 'XWirelessEnabled', + reply_handler=self.__nm_wifi_enabled_reply_cb, + error_handler=self.__nm_wifi_enabled_error_cb) + def disconnect(self): self._bus.remove_signal_receiver(self.__state_changed_cb, signal_name='StateChanged', @@ -578,6 +617,24 @@ class WirelessDeviceView(ToolButton): def __activate_error_cb(self, err): logging.debug('Failed to create network: %s', err) + def __nm_wifi_enabled_reply_cb(self, enabled): + self._palette.set_enabled(enabled) + + def __nm_wifi_enabled_error_cb(self, error): + logging.error('Could not determine whether wifi is enabled: %r', error) + + def __nm_props_changed_cb(self, changed): + if 'WirelessEnabled' not in changed: + return + + self._palette.set_enabled(changed['WirelessEnabled']) + + def __disable_wifi_cb(self, palette_): + self._nm_props.Set(_NM_IFACE, 'WirelessEnabled', False) + + def __enable_wifi_cb(self, palette_): + self._nm_props.Set(_NM_IFACE, 'WirelessEnabled', True) + class OlpcMeshDeviceView(ToolButton): _ICON_NAME = 'network-mesh' -- 1.7.2.5 _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel