clean-ups

This commit is contained in:
Daniel Pavel 2012-11-02 07:21:55 +02:00
parent 1d8ac27614
commit 802da6a21a
6 changed files with 49 additions and 32 deletions

View File

@ -4,6 +4,7 @@
from logging import getLogger as _Logger
from struct import pack as _pack
from time import sleep as _sleep
from logitech.unifying_receiver import base as _base
from logitech.unifying_receiver import api as _api
@ -136,7 +137,7 @@ class DeviceInfo(_api.PairedDevice):
self.LOG.debug("status %d => %d", self._status, new_status)
urgent = new_status < STATUS.CONNECTED or self._status < STATUS.CONNECTED
self._status = new_status
self._listener.status_changed_callback(self, urgent)
self._listener.status_changed(self, urgent)
if new_status < STATUS.CONNECTED:
self.props.clear()
@ -158,7 +159,11 @@ class DeviceInfo(_api.PairedDevice):
@property
def name(self):
if self._name is None:
if self._status >= STATUS.CONNECTED:
if self._status < STATUS.CONNECTED:
codename = self.codename
if codename in NAMES:
self._name, self._kind = NAMES[codename]
else:
self._name = _api.get_device_name(self.handle, self.number, self.features)
return self._name or self.codename
@ -168,7 +173,7 @@ class DeviceInfo(_api.PairedDevice):
if self._status < STATUS.CONNECTED:
codename = self.codename
if codename in NAMES:
self._kind = NAMES[codename][-1]
self._name, self._kind = NAMES[codename]
else:
self._kind = _api.get_device_kind(self.handle, self.number, self.features)
return self._kind or '?'
@ -216,7 +221,7 @@ class DeviceInfo(_api.PairedDevice):
self.props.update(status[1])
if self.status == status[0]:
if p != self.props:
self._listener.status_changed_callback(self)
self._listener.status_changed(self)
else:
self.status = status[0]
return True
@ -249,7 +254,7 @@ class ReceiverListener(_EventsListener):
"""Keeps the status of a Unifying Receiver.
"""
def __init__(self, receiver, status_changed_callback):
def __init__(self, receiver, status_changed_callback=None):
super(ReceiverListener, self).__init__(receiver.handle, self._events_handler)
self.receiver = receiver
@ -258,7 +263,7 @@ class ReceiverListener(_EventsListener):
self.events_filter = None
self.events_handler = None
self.status_changed_callback = status_changed_callback or (lambda reason, urgent=False: None)
self.status_changed_callback = status_changed_callback
receiver.kind = receiver.name
receiver.devices = {}
@ -280,7 +285,11 @@ class ReceiverListener(_EventsListener):
self.LOG.debug("status %d => %d", self.receiver.status, new_status)
self.receiver.status = new_status
self.receiver.status_text = _RECEIVER_STATUS_NAME[new_status]
self.status_changed_callback(self.receiver, True)
self.status_changed(None, True)
def status_changed(self, device=None, urgent=False):
if self.status_changed_callback:
self.status_changed_callback(self.receiver, device, urgent)
def _device_status_from(self, event):
state_code = ord(event.data[2:3]) & 0xF0
@ -337,7 +346,7 @@ class ReceiverListener(_EventsListener):
dev = DeviceInfo(self, event.devnumber, event.data[4:5], status)
self.LOG.info("new device %s", dev)
self.status_changed_callback(dev, True)
self.status_changed(dev, True)
return dev
def unpair_device(self, device):
@ -362,6 +371,8 @@ class ReceiverListener(_EventsListener):
if receiver:
rl = ReceiverListener(receiver, status_changed_callback)
rl.start()
while not rl._active:
_sleep(0.1)
return rl
#
@ -369,6 +380,7 @@ class ReceiverListener(_EventsListener):
#
class _DUMMY_RECEIVER(object):
__slots__ = ['name', 'max_devices', 'status', 'status_text', 'devices']
name = _api.Receiver.name
max_devices = _api.Receiver.max_devices
status = STATUS.UNAVAILABLE

View File

@ -69,18 +69,19 @@ if __name__ == '__main__':
listener = None
notify_missing = True
def status_changed(reason, urgent=False):
global listener
receiver = DUMMY if listener is None else listener.receiver
ui.update(receiver, icon, window, reason)
def status_changed(receiver, device=None, urgent=False):
ui.update(receiver, icon, window, device)
if ui.notify.available and urgent:
ui.notify.show(reason)
if not listener:
listener = None
GObject.timeout_add(3000, check_for_listener)
ui.notify.show(device or receiver)
def check_for_listener():
global listener
if not listener:
GObject.timeout_add(5000, check_for_listener)
listener = None
def check_for_listener(retry=True):
global listener, notify_missing
if listener is None:
listener = ReceiverListener.open(status_changed)
if listener is None:
@ -88,14 +89,14 @@ if __name__ == '__main__':
if notify_missing:
status_changed(DUMMY, True)
notify_missing = False
return True
return retry
# print ("opened receiver", listener, listener.receiver)
pairing.state = pairing.State(listener)
notify_missing = True
status_changed(listener.receiver, True)
pairing.state = pairing.State(listener)
status_changed(listener.receiver, None, True)
check_for_listener()
GObject.timeout_add(100, check_for_listener, False)
Gtk.main()
if listener is not None:

View File

@ -37,10 +37,12 @@ def _toggle_info(action, label_widget, box_widget, frame):
def _make_receiver_box(name):
frame = Gtk.Frame()
frame._device = None
frame.set_name(name)
icon = Gtk.Image.new_from_icon_name(name, _SMALL_DEVICE_ICON_SIZE)
icon_name = ui.get_icon(name, 'preferences-desktop-peripherals')
icon = Gtk.Image.new_from_icon_name(icon_name, _SMALL_DEVICE_ICON_SIZE)
label = Gtk.Label('Initializing...')
label = Gtk.Label('Scanning...')
label.set_name('label')
label.set_alignment(0, 0.5)
@ -83,8 +85,10 @@ def _make_receiver_box(name):
def _make_device_box(index):
frame = Gtk.Frame()
frame._device = None
frame.set_name(_PLACEHOLDER)
icon = Gtk.Image.new_from_icon_name('image-missing', _DEVICE_ICON_SIZE)
icon_name = 'preferences-desktop-peripherals'
icon = Gtk.Image.new_from_icon_name(icon_name, _DEVICE_ICON_SIZE)
icon.set_name('icon')
icon.set_alignment(0.5, 0)
@ -222,7 +226,8 @@ def _update_device_box(frame, dev):
if frame.get_name() != dev.name:
frame.set_name(dev.name)
icon.set_from_icon_name(ui.get_icon(dev.name, dev.kind), _DEVICE_ICON_SIZE)
icon_name = ui.get_icon(dev.name, dev.kind)
icon.set_from_icon_name(icon_name, _DEVICE_ICON_SIZE)
label.set_markup('<b>' + dev.name + '</b>')
status = ui.find_children(frame, 'status')
@ -274,14 +279,14 @@ def _update_device_box(frame, dev):
frame.set_visible(True)
def update(window, receiver, device):
print ("update", receiver, receiver.status, device)
def update(window, receiver, device=None):
# print ("update", receiver, receiver.status, device)
window.set_icon_name(ui.appicon(receiver.status))
vbox = window.get_child()
frames = list(vbox.get_children())
if id(device) == id(receiver):
if device is None:
_update_receiver_box(frames[0], receiver)
if receiver.status < STATUS.CONNECTED:
for frame in frames[1:]:

View File

@ -77,8 +77,7 @@ class Receiver(object):
self._firmware = None
def close(self):
handle = self.handle
self.handle = 0
handle, self.handle = self.handle, 0
return (handle and _base.close(handle))
@property

View File

@ -102,9 +102,9 @@ class EventsListener(_Thread):
self._events.put(event)
_base.request_context = None
_base.close(self._handle)
handle, self._handle = self._handle, 0
_base.close(handle)
_log.debug("stopped")
self._handle = 0
def stop(self):
"""Tells the listener to stop as soon as possible."""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB