diff --git a/src/textual/message_pump.py b/src/textual/message_pump.py index d6b6ecf6b..d937a0239 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -10,6 +10,7 @@ from __future__ import annotations import asyncio import inspect from asyncio import CancelledError, Queue, QueueEmpty, Task +from time import time from functools import partial from typing import TYPE_CHECKING, Any, Awaitable, Callable, Iterable from weakref import WeakSet @@ -75,6 +76,8 @@ class MessagePump(metaclass=MessagePumpMeta): self._pending_message: Message | None = None self._task: Task | None = None self._timers: WeakSet[Timer] = WeakSet() + self._last_idle: float = time() + self._max_idle: float | None = None @property def task(self) -> Task: @@ -337,7 +340,12 @@ class MessagePump(metaclass=MessagePumpMeta): break finally: self._message_queue.task_done() - if self._message_queue.empty(): + current_time = time() + if self._message_queue.empty() or ( + self._max_idle is not None + and current_time - self._last_idle > self._max_idle + ): + self._last_idle = current_time if not self._closed: event = events.Idle(self) for _cls, method in self._get_dispatch_methods( diff --git a/src/textual/screen.py b/src/textual/screen.py index 39780d5b9..dd8c78cfd 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -51,6 +51,7 @@ class Screen(Widget): self._dirty_widgets: set[Widget] = set() self._update_timer: Timer | None = None self._callbacks: list[CallbackType] = [] + self._max_idle = UPDATE_PERIOD @property def is_transparent(self) -> bool: