diff --git a/src/cascadia/WindowsTerminal/WindowEmperor.cpp b/src/cascadia/WindowsTerminal/WindowEmperor.cpp index 678ef2b0e1c..08ca26483d6 100644 --- a/src/cascadia/WindowsTerminal/WindowEmperor.cpp +++ b/src/cascadia/WindowsTerminal/WindowEmperor.cpp @@ -155,13 +155,27 @@ void WindowEmperor::CreateNewWindowThread(Remoting::WindowRequestedArgs args, co co_await wil::resume_foreground(this->_dispatcher); this->_checkWindowsForNotificationIcon(); }); - - return window->WindowProc(); + window->Exited([this, peasant]() { + // find the window in _windows who's peasant's Id matches the peasant's Id + // and remove it + _windows.erase(std::remove_if(_windows.begin(), _windows.end(), [&](const auto& w) { + return w->Peasant().GetID() == peasant.GetID(); + }), + _windows.end()); + if (_windows.size() == 0) + { + _close(); + } + }); + auto result = window->WindowProc(); + return result; }; + // _threads.emplace_back(func); + // LOG_IF_FAILED(SetThreadDescription(_threads.back().native_handle(), L"Window Thread")); - _threads.emplace_back(func); - - LOG_IF_FAILED(SetThreadDescription(_threads.back().native_handle(), L"Window Thread")); + std::thread myWindowThread{ func }; + LOG_IF_FAILED(SetThreadDescription(myWindowThread.native_handle(), L"Window Thread")); + myWindowThread.detach(); } void WindowEmperor::_becomeMonarch() diff --git a/src/cascadia/WindowsTerminal/WindowThread.cpp b/src/cascadia/WindowsTerminal/WindowThread.cpp index 50fcdd4f19f..2e910707bb4 100644 --- a/src/cascadia/WindowsTerminal/WindowThread.cpp +++ b/src/cascadia/WindowsTerminal/WindowThread.cpp @@ -85,5 +85,12 @@ int WindowThread::WindowProc() TranslateMessage(&message); DispatchMessage(&message); } + + _ExitedHandlers(); return 0; } + +winrt::Microsoft::Terminal::Remoting::Peasant WindowThread::Peasant() +{ + return _peasant; +} diff --git a/src/cascadia/WindowsTerminal/WindowThread.h b/src/cascadia/WindowsTerminal/WindowThread.h index d97a9dfbc43..501665e2d30 100644 --- a/src/cascadia/WindowsTerminal/WindowThread.h +++ b/src/cascadia/WindowsTerminal/WindowThread.h @@ -14,6 +14,9 @@ class WindowThread int WindowProc(); winrt::TerminalApp::TerminalWindow Logic(); + winrt::Microsoft::Terminal::Remoting::Peasant Peasant(); + + WINRT_CALLBACK(Exited, winrt::delegate<>); private: ::AppHost _host;