Skip to content

Commit cda675e

Browse files
committed
don't bubble detached widgets
1 parent c45fd96 commit cda675e

File tree

3 files changed

+5
-5
lines changed

3 files changed

+5
-5
lines changed

src/textual/message_pump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ async def _on_message(self, message: Message) -> None:
746746
if message._sender is not None and message._sender == self._parent:
747747
# parent is sender, so we stop propagation after parent
748748
message.stop()
749-
if self.is_parent_active and not self._parent._closing:
749+
if self.is_parent_active and not self._parent._closing and self.is_attached:
750750
message._bubble_to(self._parent)
751751

752752
def check_idle(self) -> None:

src/textual/widget.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from __future__ import annotations
66

7-
from asyncio import Lock, create_task, wait
7+
from asyncio import create_task, wait
88
from collections import Counter
99
from contextlib import asynccontextmanager
1010
from fractions import Fraction
@@ -81,6 +81,7 @@
8181
from .reactive import Reactive
8282
from .render import measure
8383
from .renderables.blank import Blank
84+
from .rlock import RLock
8485
from .strip import Strip
8586
from .walk import walk_depth_first
8687

@@ -396,7 +397,7 @@ def __init__(
396397
if self.BORDER_SUBTITLE:
397398
self.border_subtitle = self.BORDER_SUBTITLE
398399

399-
self.lock = Lock()
400+
self.lock = RLock()
400401
"""`asyncio` lock to be used to synchronize the state of the widget.
401402
402403
Two different tasks might call methods on a widget at the same time, which
@@ -3550,7 +3551,6 @@ def post_message(self, message: Message) -> bool:
35503551
self.log.warning(self, f"IS NOT RUNNING, {message!r} not sent")
35513552
except NoActiveAppError:
35523553
pass
3553-
35543554
return super().post_message(message)
35553555

35563556
async def _on_idle(self, event: events.Idle) -> None:

tests/test_widget_removing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async def test_remove_move_focus():
7878
assert pilot.app.focused == buttons[9]
7979

8080

81-
async def test_widget_remove_order():
81+
async def test_widget_remove_order() -> None:
8282
"""A Widget.remove of a top-level widget should cause bottom-first removal."""
8383

8484
removals: list[str] = []

0 commit comments

Comments
 (0)