Skip to content

Commit 124df59

Browse files
committed
handle exit from load
1 parent cf82a12 commit 124df59

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1717
- When looking for bindings that have priority, they are now looked from `App` downwards. https://github.com/Textualize/textual/issues/1343
1818
- `BINDINGS` on an `App`-derived class have priority by default. https://github.com/Textualize/textual/issues/1343
1919
- `BINDINGS` on a `Screen`-derived class have priority by default. https://github.com/Textualize/textual/issues/1343
20+
- Added a message parameter to Widget.exit
2021

2122
### Fixed
2223

src/textual/app.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ def __init__(
350350
self.devtools = DevtoolsClient()
351351

352352
self._return_value: ReturnType | None = None
353+
self._exit = False
353354

354355
self.css_monitor = (
355356
FileMonitor(self.css_path, self._on_css_change)
@@ -425,6 +426,7 @@ def exit(
425426
result (ReturnType | None, optional): Return value. Defaults to None.
426427
message (RenderableType | None): Optional message to display on exit.
427428
"""
429+
self._exit = True
428430
self._return_value = result
429431
self.post_message_no_wait(messages.ExitApp(sender=self))
430432
if message:
@@ -1413,28 +1415,29 @@ async def invoke_ready_callback() -> None:
14131415
)
14141416
driver = self._driver = driver_class(self.console, self, size=terminal_size)
14151417

1416-
driver.start_application_mode()
1417-
try:
1418-
if headless:
1419-
await run_process_messages()
1420-
else:
1421-
if self.devtools is not None:
1422-
devtools = self.devtools
1423-
assert devtools is not None
1424-
from .devtools.redirect_output import StdoutRedirector
1425-
1426-
redirector = StdoutRedirector(devtools)
1427-
with redirect_stderr(redirector):
1428-
with redirect_stdout(redirector): # type: ignore
1429-
await run_process_messages()
1418+
if not self._exit:
1419+
driver.start_application_mode()
1420+
try:
1421+
if headless:
1422+
await run_process_messages()
14301423
else:
1431-
null_file = _NullFile()
1432-
with redirect_stderr(null_file):
1433-
with redirect_stdout(null_file):
1434-
await run_process_messages()
1424+
if self.devtools is not None:
1425+
devtools = self.devtools
1426+
assert devtools is not None
1427+
from .devtools.redirect_output import StdoutRedirector
1428+
1429+
redirector = StdoutRedirector(devtools)
1430+
with redirect_stderr(redirector):
1431+
with redirect_stdout(redirector): # type: ignore
1432+
await run_process_messages()
1433+
else:
1434+
null_file = _NullFile()
1435+
with redirect_stderr(null_file):
1436+
with redirect_stdout(null_file):
1437+
await run_process_messages()
14351438

1436-
finally:
1437-
driver.stop_application_mode()
1439+
finally:
1440+
driver.stop_application_mode()
14381441
except Exception as error:
14391442
self._handle_exception(error)
14401443

src/textual/screen.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ def set_focus(self, widget: Widget | None, scroll_visible: bool = True) -> None:
297297
self.focused.post_message_no_wait(events.Blur(self))
298298
self.focused.emit_no_wait(events.DescendantBlur(self))
299299
self.focused = None
300+
self.log.debug("focus was removed")
300301
elif widget.can_focus:
301302
if self.focused != widget:
302303
if self.focused is not None:
@@ -310,6 +311,7 @@ def set_focus(self, widget: Widget | None, scroll_visible: bool = True) -> None:
310311
self.screen.scroll_to_widget(widget)
311312
widget.post_message_no_wait(events.Focus(self))
312313
widget.emit_no_wait(events.DescendantFocus(self))
314+
self.log.debug(widget, "was focused")
313315

314316
async def _on_idle(self, event: events.Idle) -> None:
315317
# Check for any widgets marked as 'dirty' (needs a repaint)

0 commit comments

Comments
 (0)