From b2c1a49353fc1482b276d81f358987025b3a2656 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Mon, 24 Apr 2023 13:38:43 -0500 Subject: [PATCH 1/3] I think this should work --- src/cascadia/WindowsTerminal/WindowEmperor.cpp | 10 ++++++++++ src/cascadia/WindowsTerminal/WindowThread.cpp | 6 ++++-- src/cascadia/WindowsTerminal/WindowThread.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/cascadia/WindowsTerminal/WindowEmperor.cpp b/src/cascadia/WindowsTerminal/WindowEmperor.cpp index 9e851dcf8fe..c10a2cd3899 100644 --- a/src/cascadia/WindowsTerminal/WindowEmperor.cpp +++ b/src/cascadia/WindowsTerminal/WindowEmperor.cpp @@ -155,6 +155,16 @@ void WindowEmperor::_createNewWindowThread(const Remoting::WindowRequestedArgs& } window->RunMessagePump(); + + // Manually trigger the cleaup callback. This will ensure that we + // remove the window from our list of windows, before we release the + // AppHost (and subsequently, the host's Logic() member that we use + // elsewhere). + cleanup.reset(); + + // Now that we no longer care about this thread's window, let it + // release it's app host and flush the rest of the XAML queue. + window->RundownForExit(); } CATCH_LOG() }); diff --git a/src/cascadia/WindowsTerminal/WindowThread.cpp b/src/cascadia/WindowsTerminal/WindowThread.cpp index 398a36e16dd..14cafb7b79b 100644 --- a/src/cascadia/WindowsTerminal/WindowThread.cpp +++ b/src/cascadia/WindowsTerminal/WindowThread.cpp @@ -37,7 +37,11 @@ int WindowThread::RunMessagePump() // Enter the main window loop. const auto exitCode = _messagePump(); // Here, the main window loop has exited. + return exitCode; +} +void WindowThread::RundownForExit() +{ _host = nullptr; // !! LOAD BEARING !! // @@ -54,8 +58,6 @@ int WindowThread::RunMessagePump() ::DispatchMessageW(&msg); } } - - return exitCode; } winrt::TerminalApp::TerminalWindow WindowThread::Logic() diff --git a/src/cascadia/WindowsTerminal/WindowThread.h b/src/cascadia/WindowsTerminal/WindowThread.h index fecee558876..86b0854639e 100644 --- a/src/cascadia/WindowsTerminal/WindowThread.h +++ b/src/cascadia/WindowsTerminal/WindowThread.h @@ -15,6 +15,7 @@ class WindowThread : public std::enable_shared_from_this winrt::TerminalApp::TerminalWindow Logic(); void CreateHost(); int RunMessagePump(); + void RundownForExit(); winrt::Microsoft::Terminal::Remoting::Peasant Peasant(); From 5e8b1549f35103ed375aabd8e46438eeb71b3645 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Mon, 24 Apr 2023 14:14:35 -0500 Subject: [PATCH 2/3] spel --- src/cascadia/WindowsTerminal/WindowEmperor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/WindowsTerminal/WindowEmperor.cpp b/src/cascadia/WindowsTerminal/WindowEmperor.cpp index c10a2cd3899..7d3366c5542 100644 --- a/src/cascadia/WindowsTerminal/WindowEmperor.cpp +++ b/src/cascadia/WindowsTerminal/WindowEmperor.cpp @@ -156,7 +156,7 @@ void WindowEmperor::_createNewWindowThread(const Remoting::WindowRequestedArgs& window->RunMessagePump(); - // Manually trigger the cleaup callback. This will ensure that we + // Manually trigger the cleanup callback. This will ensure that we // remove the window from our list of windows, before we release the // AppHost (and subsequently, the host's Logic() member that we use // elsewhere). From e3aca8afeeb98b2c40a31e6b334a5af012c420b5 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Mon, 24 Apr 2023 15:00:44 -0500 Subject: [PATCH 3/3] Oh sure of course I built the wrong VS window --- src/cascadia/WindowsTerminal/WindowEmperor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/WindowsTerminal/WindowEmperor.cpp b/src/cascadia/WindowsTerminal/WindowEmperor.cpp index 7d3366c5542..dcccce3a316 100644 --- a/src/cascadia/WindowsTerminal/WindowEmperor.cpp +++ b/src/cascadia/WindowsTerminal/WindowEmperor.cpp @@ -140,7 +140,7 @@ void WindowEmperor::_createNewWindowThread(const Remoting::WindowRequestedArgs& std::thread t([weakThis, window]() { try { - const auto cleanup = wil::scope_exit([&]() { + auto cleanup = wil::scope_exit([&]() { if (auto self{ weakThis.lock() }) { self->_windowExitedHandler(window->Peasant().GetID());