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

View File

@ -69,18 +69,19 @@ if __name__ == '__main__':
listener = None listener = None
notify_missing = True notify_missing = True
def status_changed(reason, urgent=False): def status_changed(receiver, device=None, urgent=False):
global listener ui.update(receiver, icon, window, device)
receiver = DUMMY if listener is None else listener.receiver
ui.update(receiver, icon, window, reason)
if ui.notify.available and urgent: if ui.notify.available and urgent:
ui.notify.show(reason) ui.notify.show(device or receiver)
if not listener:
listener = None
GObject.timeout_add(3000, check_for_listener)
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 global listener, notify_missing
if listener is None: if listener is None:
listener = ReceiverListener.open(status_changed) listener = ReceiverListener.open(status_changed)
if listener is None: if listener is None:
@ -88,14 +89,14 @@ if __name__ == '__main__':
if notify_missing: if notify_missing:
status_changed(DUMMY, True) status_changed(DUMMY, True)
notify_missing = False notify_missing = False
return True return retry
# print ("opened receiver", listener, listener.receiver) # print ("opened receiver", listener, listener.receiver)
pairing.state = pairing.State(listener)
notify_missing = True 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() Gtk.main()
if listener is not None: 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): def _make_receiver_box(name):
frame = Gtk.Frame() frame = Gtk.Frame()
frame._device = None 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_name('label')
label.set_alignment(0, 0.5) label.set_alignment(0, 0.5)
@ -83,8 +85,10 @@ def _make_receiver_box(name):
def _make_device_box(index): def _make_device_box(index):
frame = Gtk.Frame() frame = Gtk.Frame()
frame._device = None 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_name('icon')
icon.set_alignment(0.5, 0) icon.set_alignment(0.5, 0)
@ -222,7 +226,8 @@ def _update_device_box(frame, dev):
if frame.get_name() != dev.name: if frame.get_name() != dev.name:
frame.set_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>') label.set_markup('<b>' + dev.name + '</b>')
status = ui.find_children(frame, 'status') status = ui.find_children(frame, 'status')
@ -274,14 +279,14 @@ def _update_device_box(frame, dev):
frame.set_visible(True) frame.set_visible(True)
def update(window, receiver, device): def update(window, receiver, device=None):
print ("update", receiver, receiver.status, device) # print ("update", receiver, receiver.status, device)
window.set_icon_name(ui.appicon(receiver.status)) window.set_icon_name(ui.appicon(receiver.status))
vbox = window.get_child() vbox = window.get_child()
frames = list(vbox.get_children()) frames = list(vbox.get_children())
if id(device) == id(receiver): if device is None:
_update_receiver_box(frames[0], receiver) _update_receiver_box(frames[0], receiver)
if receiver.status < STATUS.CONNECTED: if receiver.status < STATUS.CONNECTED:
for frame in frames[1:]: for frame in frames[1:]:

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB