refactor: drive UI from service signals, drop redundant polling

- bluetooth.py / wifi.py: remove 5s periodic refresh timers; rely on
  service `changed`/`device-added`/`device-removed`/`notify` signals
- expanded_player.py: remove 500ms metadata poll; rely on
  `meta-change`/`artwork-change` signals
- player.py (notch): connect previously dangling `artwork-change` handler
- popup_win.py: silence harmless "nothing connected" warning on destroy()

No behaviour change; eliminates dead timers and log spam.
This commit is contained in:
sankalp committed 2026-07-14 13:46:21 +05:45
1 parent 9ff5ebc95c
commit 2d22df94ca
5 files changed
+10 -86

No files matched your search

+8 -6
View File
@@ -100,15 +100,17 @@ class PopupWindow(WaylandWindow):
try:
self._pointing_widget.disconnect_by_func(self.do_handle_size_allocate)
except Exception as e:
logger.warning(
f"[popup_win] self._pointing_widget.disconnect_by_func(self.do_handle_s... failed: {e}"
)
if "nothing connected" not in str(e):
logger.warning(
f"[popup_win] self._pointing_widget.disconnect_by_func(self.do_handle_s... failed: {e}"
)
try:
self.disconnect_by_func(self.do_handle_size_allocate)
except Exception as e:
logger.warning(
f"[popup_win] self.disconnect_by_func(self.do_handle_size_allocate) failed: {e}"
)
if "nothing connected" not in str(e):
logger.warning(
f"[popup_win] self.disconnect_by_func(self.do_handle_size_allocate) failed: {e}"
)
super().destroy()
def do_calculate_edges(self):
-32
View File
@@ -338,7 +338,6 @@ class BluetoothConnections(Box):
self.parent = parent
self.show_hidden_devices = show_hidden_devices
self.is_scanning = False # Track scanning state
self.refresh_timer = None # Timer for periodic device refresh
self._update_in_progress = False # Prevent concurrent updates
self._destroyed = False # Track if widget is destroyed
self._client_signal_ids = [] # Track BluetoothClient signal IDs
@@ -470,7 +469,6 @@ class BluetoothConnections(Box):
self.connect("destroy", self.on_destroy)
self.connect("unmap", self.on_hide)
self.connect("map", lambda *_: self.start_device_monitoring())
self.client.notify("scanning")
self.client.notify("enabled")
@@ -489,7 +487,6 @@ class BluetoothConnections(Box):
def on_hide(self, *_):
"""Called when the widget is hidden (popup closed)"""
self.stop_device_monitoring()
self._cancel_pending_refresh()
if self.other_devices.get_visible():
self.other_devices.set_visible(False)
@@ -675,34 +672,6 @@ class BluetoothConnections(Box):
finally:
self._update_in_progress = False
def start_device_monitoring(self):
"""Start periodic monitoring for device changes"""
self.stop_device_monitoring()
self.refresh_timer = GLib.timeout_add_seconds(5, self.periodic_device_refresh)
def stop_device_monitoring(self):
"""Stop periodic monitoring"""
if self.refresh_timer:
GLib.source_remove(self.refresh_timer)
self.refresh_timer = None
def periodic_device_refresh(self):
"""Periodically refresh device list to catch external connections"""
if self._destroyed:
self.refresh_timer = None
return False
# Skip if update in progress or client not available/enabled
if self._update_in_progress or not self.client or not self.client.enabled:
return True # Continue monitoring
try:
self.update_devices()
except Exception as e:
logger.error(f"[Bluetooth] Error during periodic refresh: {e}")
return True
def force_device_refresh(self):
"""Force an immediate refresh of the device list"""
if self._update_in_progress or self._destroyed:
@@ -724,7 +693,6 @@ class BluetoothConnections(Box):
def on_destroy(self, widget):
"""Cleanup when widget is destroyed"""
self._destroyed = True
self.stop_device_monitoring()
self._cancel_pending_refresh()
for sig_id in self._client_signal_ids:
try:
+1 -13
View File
@@ -1,6 +1,6 @@
import weakref
from fabric.utils import GLib, bulk_connect, logger
from fabric.utils import bulk_connect, logger
from fabric.widgets.box import Box
from fabric.widgets.button import Button
from fabric.widgets.image import Image
@@ -286,7 +286,6 @@ class PlayerBox(Box):
self._signal_connections = []
self._property_bindings = []
self._seekbar_signal_ids = []
self._init_metadata_polled = False
self._cached_duration = 0
self.album_cover = Box(style_classes="album-image-c")
@@ -506,7 +505,6 @@ class PlayerBox(Box):
self.cover_path = result
self._load_initial_metadata()
GLib.timeout_add(500, self._poll_initial_metadata)
def _load_initial_metadata(self):
try:
@@ -533,16 +531,6 @@ class PlayerBox(Box):
f"[expanded_player] metadata = self.player._player.props.metadata failed: {e}"
)
def _poll_initial_metadata(self):
if self.exit:
return False
if self._init_metadata_polled:
return False
self._init_metadata_polled = True
self._load_initial_metadata()
self.set_image()
return False
def update_buttons(self, player_buttons, show_buttons):
if show_buttons and len(player_buttons) > 1:
if len(self.stack_buttons_box.get_children()) != len(player_buttons):
-35
View File
@@ -272,7 +272,6 @@ class WifiConnections(Box):
self.network_service = NetworkClient()
self.wifi_service = None
self.is_scanning = False # Track scanning state
self.refresh_timer = None # Timer for periodic network refresh
self._update_in_progress = False # Prevent concurrent updates
self._destroyed = False # Track if widget is destroyed
self._signal_ids = [] # Track all service signal IDs for cleanup
@@ -387,11 +386,9 @@ class WifiConnections(Box):
self.connect("destroy", self.on_destroy)
self.connect("unmap", self.on_hide)
self.connect("map", lambda *_: self.start_network_monitoring())
def on_hide(self, *_):
"""Called when the widget is hidden (popup closed)"""
self.stop_network_monitoring()
self._cancel_pending_refresh()
if self.other_networks.get_visible():
self.other_networks.set_visible(False)
@@ -633,37 +630,6 @@ class WifiConnections(Box):
if hasattr(child, "on_changed"):
child.on_changed()
def start_network_monitoring(self):
"""Start periodic monitoring for network changes"""
self.stop_network_monitoring()
self.refresh_timer = GLib.timeout_add_seconds(5, self.periodic_network_refresh)
def stop_network_monitoring(self):
"""Stop periodic monitoring"""
if self.refresh_timer:
GLib.source_remove(self.refresh_timer)
self.refresh_timer = None
def periodic_network_refresh(self):
"""Periodically refresh network list to catch external connections"""
if self._destroyed:
self.refresh_timer = None
return False
if (
self._update_in_progress
or not self.wifi_service
or not self.wifi_service.enabled
):
return True # Continue monitoring
try:
self.update_networks()
except Exception as e:
logger.error(f"[WiFi] Error during periodic network refresh: {e}")
return True # Continue monitoring
def force_network_refresh(self):
"""Force an immediate refresh of the network list"""
if self._update_in_progress or self._destroyed:
@@ -750,7 +716,6 @@ class WifiConnections(Box):
def on_destroy(self, widget):
"""Cleanup when widget is destroyed"""
self._destroyed = True
self.stop_network_monitoring()
self._cancel_pending_refresh()
for obj, sig_id in self._signal_ids:
try:
+1
View File
@@ -137,6 +137,7 @@ class NotchPlayer(Box):
self._update_from_service()
self._sigs.append(service.connect("play", self._on_play))
self._sigs.append(service.connect("pause", self._on_pause))
self._sigs.append(service.connect("artwork-change", self._on_artwork_change))
if service.playback_status == "Playing":
self._start_timer()