@@ -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 )
@@ -416,14 +417,20 @@ def screen_stack(self) -> list[Screen]:
416417        """list[Screen]: A *copy* of the screen stack.""" 
417418        return  self ._screen_stack .copy ()
418419
419-     def  exit (self , result : ReturnType  |  None  =  None ) ->  None :
420+     def  exit (
421+         self , result : ReturnType  |  None  =  None , message : RenderableType  |  None  =  None 
422+     ) ->  None :
420423        """Exit the app, and return the supplied result. 
421424
422425        Args: 
423426            result (ReturnType | None, optional): Return value. Defaults to None. 
427+             message (RenderableType | None): Optional message to display on exit. 
424428        """ 
429+         self ._exit  =  True 
425430        self ._return_value  =  result 
426431        self .post_message_no_wait (messages .ExitApp (sender = self ))
432+         if  message :
433+             self ._exit_renderables .append (message )
427434
428435    @property  
429436    def  focused (self ) ->  Widget  |  None :
@@ -1082,9 +1089,9 @@ def _get_screen(self, screen: Screen | str) -> tuple[Screen, AwaitMount]:
10821089        _screen  =  self .get_screen (screen )
10831090        if  not  _screen .is_running :
10841091            widgets  =  self ._register (self , _screen )
1085-             return  (_screen , AwaitMount (widgets ))
1092+             return  (_screen , AwaitMount (_screen ,  widgets ))
10861093        else :
1087-             return  (_screen , AwaitMount ([]))
1094+             return  (_screen , AwaitMount (_screen ,  []))
10881095
10891096    def  _replace_screen (self , screen : Screen ) ->  Screen :
10901097        """Handle the replaced screen. 
@@ -1130,7 +1137,7 @@ def switch_screen(self, screen: Screen | str) -> AwaitMount:
11301137            self .screen .post_message_no_wait (events .ScreenResume (self ))
11311138            self .log .system (f"{ self .screen }   is current (SWITCHED)" )
11321139            return  await_mount 
1133-         return  AwaitMount ([])
1140+         return  AwaitMount (self . screen ,  [])
11341141
11351142    def  install_screen (self , screen : Screen , name : str  |  None  =  None ) ->  AwaitMount :
11361143        """Install a screen. 
@@ -1408,28 +1415,29 @@ async def invoke_ready_callback() -> None:
14081415            )
14091416            driver  =  self ._driver  =  driver_class (self .console , self , size = terminal_size )
14101417
1411-             driver .start_application_mode ()
1412-             try :
1413-                 if  headless :
1414-                     await  run_process_messages ()
1415-                 else :
1416-                     if  self .devtools  is  not   None :
1417-                         devtools  =  self .devtools 
1418-                         assert  devtools  is  not   None 
1419-                         from  .devtools .redirect_output  import  StdoutRedirector 
1420- 
1421-                         redirector  =  StdoutRedirector (devtools )
1422-                         with  redirect_stderr (redirector ):
1423-                             with  redirect_stdout (redirector ):  # type: ignore 
1424-                                 await  run_process_messages ()
1418+             if  not  self ._exit :
1419+                 driver .start_application_mode ()
1420+                 try :
1421+                     if  headless :
1422+                         await  run_process_messages ()
14251423                    else :
1426-                         null_file  =  _NullFile ()
1427-                         with  redirect_stderr (null_file ):
1428-                             with  redirect_stdout (null_file ):
1429-                                 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 ()
14301438
1431-             finally :
1432-                 driver .stop_application_mode ()
1439+                  finally :
1440+                      driver .stop_application_mode ()
14331441        except  Exception  as  error :
14341442            self ._handle_exception (error )
14351443
@@ -1565,7 +1573,6 @@ def _register(
15651573                if  widget .children :
15661574                    self ._register (widget , * widget .children )
15671575                apply_stylesheet (widget )
1568- 
15691576        return  list (widgets )
15701577
15711578    def  _unregister (self , widget : Widget ) ->  None :
@@ -1735,13 +1742,12 @@ async def check_bindings(self, key: str, priority: bool = False) -> bool:
17351742        """Handle a key press. 
17361743
17371744        Args: 
1738-             key (str): A key 
1745+             key (str): A key.  
17391746            priority (bool): If `True` check from `App` down, otherwise from focused up. 
17401747
17411748        Returns: 
17421749            bool: True if the key was handled by a binding, otherwise False 
17431750        """ 
1744- 
17451751        for  namespace , bindings  in  (
17461752            reversed (self ._binding_chain ) if  priority  else  self ._binding_chain 
17471753        ):
@@ -2046,7 +2052,8 @@ async def _prune_node(self, root: Widget) -> None:
20462052        self ._unregister (root )
20472053
20482054    async  def  action_check_bindings (self , key : str ) ->  None :
2049-         await  self .check_bindings (key )
2055+         if  not  await  self .check_bindings (key , priority = True ):
2056+             await  self .check_bindings (key , priority = False )
20502057
20512058    async  def  action_quit (self ) ->  None :
20522059        """Quit the app as soon as possible.""" 
0 commit comments