From 8a450d43030d40777ce5708f1dfb525946b1b2fd Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 11 Oct 2022 15:40:41 +0100 Subject: [PATCH] add max_idle for screen --- src/textual/message_pump.py | 10 +++++++++- src/textual/screen.py | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) 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: