diff --git a/lib/logitech_receiver/device.py b/lib/logitech_receiver/device.py
index ac125202..5a6a08b3 100644
--- a/lib/logitech_receiver/device.py
+++ b/lib/logitech_receiver/device.py
@@ -463,6 +463,9 @@ class Device:
__nonzero__ = __bool__
+ def status_string(self):
+ return self.status.battery.to_str() if hasattr(self, "status") and self.status.battery is not None else ""
+
def __str__(self):
try:
name = self.name or self.codename or "?"
diff --git a/lib/logitech_receiver/notifications.py b/lib/logitech_receiver/notifications.py
index 937c49dd..f43f8143 100644
--- a/lib/logitech_receiver/notifications.py
+++ b/lib/logitech_receiver/notifications.py
@@ -280,7 +280,7 @@ def _process_hidpp10_notification(device, status, n):
if n.address == 0x01:
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: device powered on", device)
- reason = status.to_string() or _("powered on")
+ reason = device.status_string() or _("powered on")
status.changed(active=True, alert=_ALERT.NOTIFICATION, reason=reason)
else:
logger.warning("%s: unknown %s", device, n)
diff --git a/lib/logitech_receiver/receiver.py b/lib/logitech_receiver/receiver.py
index c2e5f375..01b7ab2d 100644
--- a/lib/logitech_receiver/receiver.py
+++ b/lib/logitech_receiver/receiver.py
@@ -26,6 +26,7 @@ import hidapi as _hid
from . import base as _base
from . import exceptions, hidpp10, hidpp10_constants
from .device import Device
+from .i18n import _, ngettext
logger = logging.getLogger(__name__)
@@ -331,6 +332,14 @@ class Receiver:
def __hash__(self):
return self.path.__hash__()
+ def status_string(self):
+ count = len(self)
+ return (
+ _("No paired devices.")
+ if count == 0
+ else ngettext("%(count)s paired device.", "%(count)s paired devices.", count) % {"count": count}
+ )
+
def __str__(self):
return "<%s(%s,%s%s)>" % (
self.name.replace(" ", ""),
diff --git a/lib/logitech_receiver/status.py b/lib/logitech_receiver/status.py
index 596f18f2..e1258910 100644
--- a/lib/logitech_receiver/status.py
+++ b/lib/logitech_receiver/status.py
@@ -22,7 +22,6 @@ from . import hidpp10_constants as _hidpp10_constants
from . import hidpp20_constants as _hidpp20_constants
from . import settings as _settings
from .common import Battery, NamedInts
-from .i18n import _, ngettext
logger = logging.getLogger(__name__)
@@ -66,17 +65,6 @@ class ReceiverStatus:
# self.device_passkey = None
# self.new_device = None
- def to_string(self):
- count = len(self._receiver)
- return (
- _("No paired devices.")
- if count == 0
- else ngettext("%(count)s paired device.", "%(count)s paired devices.", count) % {"count": count}
- )
-
- def __str__(self):
- self.to_string()
-
def changed(self, alert=ALERT.NOTIFICATION, reason=None):
self._changed_callback(self._receiver, alert=alert, reason=reason)
@@ -98,9 +86,6 @@ class DeviceStatus:
# self.notification_flags = None
self.battery_error = None
- def to_string(self):
- return self.battery.to_str() if self.battery is not None else ""
-
def __bool__(self):
return bool(self._active)
diff --git a/lib/solaar/ui/notify.py b/lib/solaar/ui/notify.py
index fd41842e..d282e49d 100644
--- a/lib/solaar/ui/notify.py
+++ b/lib/solaar/ui/notify.py
@@ -116,7 +116,7 @@ if available:
elif dev.status is None:
message = _("unpaired")
elif bool(dev.status):
- message = dev.status.to_string() or _("connected")
+ message = dev.status_string() or _("connected")
else:
message = _("offline")
diff --git a/lib/solaar/ui/tray.py b/lib/solaar/ui/tray.py
index f645d934..59908047 100644
--- a/lib/solaar/ui/tray.py
+++ b/lib/solaar/ui/tray.py
@@ -196,12 +196,13 @@ try:
def _update_tray_icon():
if _picked_device and gtk.battery_icons_style != "solaar":
- _ignore, _ignore, name, device_status = _picked_device
+ _ignore, _ignore, name, device = _picked_device
+ device_status = device.status
battery_level = device_status.battery.level if device_status.battery is not None else None
battery_charging = device_status.battery.charging() if device_status.battery is not None else None
tray_icon_name = _icons.battery(battery_level, battery_charging)
- description = "%s: %s" % (name, device_status.to_string())
+ description = "%s: %s" % (name, device.status_string())
else:
# there may be a receiver, but no peripherals
tray_icon_name = _icons.TRAY_OKAY if _devices_info else _icons.TRAY_INIT
@@ -302,19 +303,19 @@ def _generate_description_lines():
yield _("no receiver")
return
- for _ignore, number, name, status in _devices_info:
+ for _ignore, number, name, device in _devices_info:
if number is None: # receiver
continue
- p = status.to_string()
+ p = device.status_string()
if p: # does it have any properties to print?
yield "%s" % name
- if status:
+ if device.online:
yield "\t%s" % p
else:
yield "\t%s (" % p + _("offline") + ")"
else:
- if status:
+ if device.online:
yield "%s (" % name + _("no status") + ")"
else:
yield "%s (" % name + _("offline") + ")"
@@ -330,7 +331,7 @@ def _pick_device_with_lowest_battery():
for info in _devices_info:
if info[1] is None: # is receiver
continue
- level = info[-1].battery.level if info[-1].battery is not None else None
+ level = info[-1].status.battery.level if hasattr(info[-1], "status") and info[-1].status.battery is not None else None
# print ("checking %s -> %s", info, level)
if level is not None and picked_level > level:
picked = info
@@ -366,7 +367,7 @@ def _add_device(device):
break
index = index + 1
- new_device_info = (receiver_path, device.number, device.name, device.status)
+ new_device_info = (receiver_path, device.number, device.name, device)
_devices_info.insert(index, new_device_info)
label_prefix = " "
@@ -431,7 +432,7 @@ def _update_menu_item(index, device):
charging = device.status.battery.charging() if device.status.battery is not None else None
icon_name = _icons.battery(level, charging)
- menu_item.set_label((" " if 0 < device.number <= 6 else "") + device.name + ": " + device.status.to_string())
+ menu_item.set_label((" " if 0 < device.number <= 6 else "") + device.name + ": " + device.status_string())
image_widget = menu_item.get_image()
image_widget.set_sensitive(bool(device.online))
_update_menu_icon(image_widget, icon_name)