Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [8.2.3] - Unreleased

### Changed

- Reduce lag when resizing window, by moving resize from idle to a timer

## [8.2.2] - 2026-04-03

### Fixed
Expand Down
26 changes: 24 additions & 2 deletions src/textual/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,9 @@ def __init__(
)
)

self._resize_timer: Timer | None = None
"""Timer used to invoke screen resize."""

def get_line_filters(self) -> Sequence[LineFilter]:
"""Get currently enabled line filters.

Expand Down Expand Up @@ -4310,8 +4313,16 @@ async def _on_key(self, event: events.Key) -> None:

async def _on_resize(self, event: events.Resize) -> None:
event.stop()
self._size = event.size
self._resize_event = event
if self._size is None:
self._size = event.size
self._check_resize()
return
if self._size == event.size:
return
self._size = event.size
if self._resize_timer is None:
self._resize_timer = self.set_timer(1 / 120, self._check_resize)

async def _on_app_focus(self, event: events.AppFocus) -> None:
"""App has focus."""
Expand Down Expand Up @@ -4978,9 +4989,20 @@ def _on_in_band_window_resize(self, message: messages.InBandWindowResize) -> Non
self.log.debug(message)

def _on_idle(self) -> None:
"""Send app resize events on idle, so we don't do more resizing that necessary."""
if self._resize_event is not None and self._resize_timer is None:
self._check_resize()

def _check_resize(self) -> None:
"""Send a resize event to screen(s) (invoked from `self._resize_timer`)."""
event = self._resize_event
if self._resize_timer is not None:
self._resize_timer.stop()
self._resize_timer = None
if event is not None:
try:
self.screen
except ScreenError:
return
self._resize_event = None
self.screen.post_message(event)
for screen in self._background_screens:
Expand Down
Loading