Ticket #2094: 0001-Only-show-mesh-device-icon-when-mesh-is-active.patch

File 0001-Only-show-mesh-device-icon-when-mesh-is-active.patch, 8.1 KB (added by dsd, 14 years ago)
  • extensions/deviceicon/network.py

    From 24c19c14c6f3020b8e210a9da4d84b66f3df1837 Mon Sep 17 00:00:00 2001
    From: Daniel Drake <dsd@laptop.org>
    Date: Mon, 12 Jul 2010 11:30:18 -0600
    Subject: [PATCH] Only show mesh device icon when mesh is active
    
    Simon pointed out that there's no reason to have the mesh device
    icon active when the mesh is not being used.
    
    Adapt it to behave more like the wired network device icon in this
    respect.
    ---
     extensions/deviceicon/network.py |  106 +++++++++++++++++++++++++-------------
     1 files changed, 70 insertions(+), 36 deletions(-)
    
    diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
    index 399ef78..84914ef 100644
    a b class OlpcMeshDeviceView(ToolButton): 
    587587    _ICON_NAME = 'network-mesh'
    588588    FRAME_POSITION_RELATIVE = 302
    589589
    590     def __init__(self, device):
     590    def __init__(self, device, state):
    591591        ToolButton.__init__(self)
    592592
    593593        self._bus = dbus.SystemBus()
    class OlpcMeshDeviceView(ToolButton): 
    613613        self.set_palette(self._palette)
    614614        self._palette.set_group_id('frame')
    615615
     616        self.update_state(state)
     617
    616618        self._device_props = dbus.Interface(self._device,
    617619                                            'org.freedesktop.DBus.Properties')
    618         self._device_props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
    619                               reply_handler=self.__get_device_props_reply_cb,
    620                               error_handler=self.__get_device_props_error_cb)
    621620        self._device_props.Get(_NM_OLPC_MESH_IFACE, 'ActiveChannel',
    622621                            reply_handler=self.__get_active_channel_reply_cb,
    623622                            error_handler=self.__get_active_channel_error_cb)
    624623
    625         self._bus.add_signal_receiver(self.__state_changed_cb,
    626                                       signal_name='StateChanged',
    627                                       path=self._device.object_path,
    628                                       dbus_interface=_NM_DEVICE_IFACE)
    629624        self._bus.add_signal_receiver(self.__wireless_properties_changed_cb,
    630625                                      signal_name='PropertiesChanged',
    631626                                      path=device.object_path,
    632627                                      dbus_interface=_NM_OLPC_MESH_IFACE)
    633628
    634629    def disconnect(self):
    635         self._bus.remove_signal_receiver(self.__state_changed_cb,
    636                                          signal_name='StateChanged',
    637                                          path=self._device.object_path,
    638                                          dbus_interface=_NM_DEVICE_IFACE)
    639630        self._bus.remove_signal_receiver(self.__wireless_properties_changed_cb,
    640631                                         signal_name='PropertiesChanged',
    641632                                         path=self._device.object_path,
    642633                                         dbus_interface=_NM_OLPC_MESH_IFACE)
    643634
    644     def __get_device_props_reply_cb(self, properties):
    645         if 'State' in properties:
    646             self._device_state = properties['State']
    647             self._update()
    648 
    649     def __get_device_props_error_cb(self, err):
    650         logging.error('Error getting the device properties: %s', err)
    651 
    652635    def __get_active_channel_reply_cb(self, channel):
    653636        self._channel = channel
    654637        self._update_text()
    class OlpcMeshDeviceView(ToolButton): 
    692675            self._palette.set_connected_with_channel(self._channel, address)
    693676            self._icon.props.base_color = profile.get_color()
    694677            self._icon.props.pulsing = False
    695         else:
    696             self._icon.props.base_color = self._inactive_color
    697             self._icon.props.pulsing = False
    698             self._palette.set_disconnected()
    699678        self._update_text()
    700679
     680    def update_state(self, state):
     681        self._device_state = state
     682        self._update()
     683
    701684    def __deactivate_connection(self, palette, data=None):
    702685        obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
    703686        netmgr = dbus.Interface(obj, _NM_IFACE)
    class GsmDeviceView(TrayIcon): 
    901884        self._palette.connection_time_label.set_text(text)
    902885
    903886class WirelessDeviceObserver(object):
    904     def __init__(self, device, tray, device_type):
     887    def __init__(self, device, tray):
    905888        self._device = device
    906889        self._device_view = None
    907890        self._tray = tray
    908 
    909         if device_type == network.DEVICE_TYPE_802_11_WIRELESS:
    910             self._device_view = WirelessDeviceView(self._device)
    911         elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
    912             self._device_view = OlpcMeshDeviceView(self._device)
    913         else:
    914             raise ValueError('Unimplemented device type %d' % device_type)
    915 
     891        self._device_view = WirelessDeviceView(self._device)
    916892        self._tray.add_device(self._device_view)
    917893
    918894    def disconnect(self):
    class WirelessDeviceObserver(object): 
    922898        self._device_view = None
    923899
    924900
     901class MeshDeviceObserver(object):
     902    def __init__(self, device, tray):
     903        self._bus = dbus.SystemBus()
     904        self._device = device
     905        self._device_view = None
     906        self._tray = tray
     907
     908        props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
     909        props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
     910                     reply_handler=self.__get_device_props_reply_cb,
     911                     error_handler=self.__get_device_props_error_cb)
     912
     913        self._bus.add_signal_receiver(self.__state_changed_cb,
     914                                      signal_name='StateChanged',
     915                                      path=self._device.object_path,
     916                                      dbus_interface=_NM_DEVICE_IFACE)
     917
     918    def _remove_device_view(self):
     919        self._device_view.disconnect()
     920        self._tray.remove_device(self._device_view)
     921        del self._device_view
     922        self._device_view = None
     923
     924    def disconnect(self):
     925        if self._device_view is not None:
     926            self._remove_device_view()
     927
     928        self._bus.remove_signal_receiver(self.__state_changed_cb,
     929                                         signal_name='StateChanged',
     930                                         path=self._device.object_path,
     931                                         dbus_interface=_NM_DEVICE_IFACE)
     932
     933    def __get_device_props_reply_cb(self, properties):
     934        if 'State' in properties:
     935            self._update_state(properties['State'])
     936
     937    def __get_device_props_error_cb(self, err):
     938        logging.error('Error getting the device properties: %s', err)
     939
     940    def __state_changed_cb(self, new_state, old_state, reason):
     941        self._update_state(new_state)
     942
     943    def _update_state(self, state):
     944        if state >= network.DEVICE_STATE_PREPARE \
     945           and state <= network.DEVICE_STATE_ACTIVATED:
     946            if self._device_view is not None:
     947                self._device_view.update_state(state)
     948                return
     949
     950            self._device_view = OlpcMeshDeviceView(self._device, state)
     951            self._tray.add_device(self._device_view)
     952        else:
     953            if self._device_view is not None:
     954                self._remove_device_view()
     955
     956
    925957class WiredDeviceObserver(object):
    926958    def __init__(self, device, tray):
    927959        self._bus = dbus.SystemBus()
    class NetworkManagerObserver(object): 
    10231055        if device_type == network.DEVICE_TYPE_802_3_ETHERNET:
    10241056            device = WiredDeviceObserver(nm_device, self._tray)
    10251057            self._devices[device_op] = device
    1026         elif device_type in [network.DEVICE_TYPE_802_11_WIRELESS,
    1027                              network.DEVICE_TYPE_802_11_OLPC_MESH]:
    1028             device = WirelessDeviceObserver(nm_device, self._tray, device_type)
     1058        elif device_type == network.DEVICE_TYPE_802_11_WIRELESS:
     1059            device = WirelessDeviceObserver(nm_device, self._tray)
     1060            self._devices[device_op] = device
     1061        elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
     1062            device = MeshDeviceObserver(nm_device, self._tray)
    10291063            self._devices[device_op] = device
    10301064        elif device_type == network.DEVICE_TYPE_GSM_MODEM:
    10311065            device = GsmDeviceObserver(nm_device, self._tray)