From 67467c846c48acd7c08b5897e136b6c7eb4b4aeb Mon Sep 17 00:00:00 2001 From: Username Date: Sat, 28 Feb 2026 14:18:18 +0100 Subject: [PATCH] fix: debounce on_resize to prevent audio stutter --- src/tuimble/app.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/tuimble/app.py b/src/tuimble/app.py index cf76a44..4cd0d3b 100644 --- a/src/tuimble/app.py +++ b/src/tuimble/app.py @@ -447,6 +447,8 @@ class TuimbleApp(App): self._device_monitor = DeviceMonitor(self._on_device_change) self._pending_reload: Config | None = None self._tree_refresh_timer = None + self._resize_timer = None + self._pending_width: int = 80 self._reconnect = ReconnectManager( connect_fn=self._reconnect_connect, on_attempt=self._reconnect_on_attempt, @@ -1049,9 +1051,20 @@ class TuimbleApp(App): # -- resize -------------------------------------------------------------- def on_resize(self, event: events.Resize) -> None: - """Adapt layout to new terminal dimensions.""" + """Adapt layout to new terminal dimensions (debounced).""" + self._pending_width = event.size.width + if self._resize_timer is not None: + self._resize_timer.stop() + self._resize_timer = self.set_timer( + TREE_DEBOUNCE, self._apply_resize + ) + + def _apply_resize(self) -> None: + """Apply deferred resize — keeps event loop free during drag.""" + self._resize_timer = None + w = self._pending_width sidebar = self.query_one("#sidebar", ChannelTree) - sidebar.styles.width = max(16, min(32, event.size.width // 4)) + sidebar.styles.width = max(16, min(32, w // 4)) self.query_one("#status", StatusBar).refresh() # -- lifecycle -----------------------------------------------------------