Skip to content

Commit 094d433

Browse files
committed
Input should release mouse on screen change
1 parent 629ffb5 commit 094d433

File tree

4 files changed

+12
-2
lines changed

4 files changed

+12
-2
lines changed

src/textual/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,6 +2736,7 @@ def push_screen(
27362736
else:
27372737
future = loop.create_future()
27382738

2739+
self.app.capture_mouse(None)
27392740
if self._screen_stack:
27402741
self.screen.post_message(events.ScreenSuspend())
27412742
self.screen.refresh()
@@ -2804,6 +2805,7 @@ def switch_screen(self, screen: Screen | str) -> AwaitComplete:
28042805
self.log.system(f"Screen {screen} is already current.")
28052806
return AwaitComplete.nothing()
28062807

2808+
self.app.capture_mouse(None)
28072809
top_screen = self._screen_stack.pop()
28082810

28092811
top_screen._pop_result_callback()

src/textual/screen.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,7 @@ def _forward_event(self, event: events.Event) -> None:
16071607
except errors.NoWidget:
16081608
self.set_focus(None)
16091609
else:
1610+
16101611
if isinstance(event, events.MouseDown):
16111612
focusable_widget = self.get_focusable_widget_at(event.x, event.y)
16121613
if focusable_widget:

src/textual/widget.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4341,7 +4341,8 @@ def release_mouse(self) -> None:
43414341
43424342
Mouse events will only be sent when the mouse is over the widget.
43434343
"""
4344-
self.app.capture_mouse(None)
4344+
if self.app.mouse_captured is self:
4345+
self.app.capture_mouse(None)
43454346

43464347
def text_select_all(self) -> None:
43474348
"""Select the entire widget."""

src/textual/widgets/_input.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,12 +769,18 @@ async def _on_mouse_down(self, event: events.MouseDown) -> None:
769769
self._selecting = True
770770
self.capture_mouse()
771771

772-
async def _on_mouse_up(self, event: events.MouseUp) -> None:
772+
def _end_selecting(self):
773773
if self._selecting:
774774
self._selecting = False
775775
self.release_mouse()
776776
self._restart_blink()
777777

778+
async def _on_mouse_release(self, _event: events.MouseRelease) -> None:
779+
self._end_selecting()
780+
781+
async def _on_mouse_up(self, _event: events.MouseUp) -> None:
782+
self._end_selecting()
783+
778784
async def _on_mouse_move(self, event: events.MouseMove) -> None:
779785
if self._selecting:
780786
# As we drag the mouse, we update the end position of the selection,

0 commit comments

Comments
 (0)