mirror of
https://github.com/microsoft/terminal.git
synced 2026-04-18 20:21:05 +00:00
Compare commits
1 Commits
dev/duhowe
...
dev/lhecke
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a95f55fb77 |
@@ -166,7 +166,8 @@ void AppHost::_HandleCommandlineArgs(const Remoting::WindowRequestedArgs& window
|
|||||||
|
|
||||||
if (_windowLogic.ShouldExitEarly())
|
if (_windowLogic.ShouldExitEarly())
|
||||||
{
|
{
|
||||||
ExitThread(result);
|
TerminateProcess(GetCurrentProcess(), gsl::narrow_cast<UINT>(result));
|
||||||
|
__assume(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,20 +38,6 @@ WindowEmperor::WindowEmperor() noexcept :
|
|||||||
});
|
});
|
||||||
|
|
||||||
_dispatcher = winrt::Windows::System::DispatcherQueue::GetForCurrentThread();
|
_dispatcher = winrt::Windows::System::DispatcherQueue::GetForCurrentThread();
|
||||||
|
|
||||||
// BODGY
|
|
||||||
//
|
|
||||||
// There's a mysterious crash in XAML on Windows 10 if you just let the App
|
|
||||||
// get dtor'd. By all accounts, it doesn't make sense. To mitigate this, we
|
|
||||||
// need to intentionally leak a reference to our App. Crazily, if you just
|
|
||||||
// let the app get cleaned up with the rest of the process when the process
|
|
||||||
// exits, then it doesn't crash. But if you let it get explicitly dtor'd, it
|
|
||||||
// absolutely will crash on exit.
|
|
||||||
//
|
|
||||||
// GH#15410 has more details.
|
|
||||||
|
|
||||||
auto a{ _app };
|
|
||||||
::winrt::detach_abi(a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowEmperor::~WindowEmperor()
|
WindowEmperor::~WindowEmperor()
|
||||||
@@ -82,7 +68,7 @@ void _buildArgsFromCommandline(std::vector<winrt::hstring>& args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WindowEmperor::HandleCommandlineArgs()
|
void WindowEmperor::HandleCommandlineArgs()
|
||||||
{
|
{
|
||||||
std::vector<winrt::hstring> args;
|
std::vector<winrt::hstring> args;
|
||||||
_buildArgsFromCommandline(args);
|
_buildArgsFromCommandline(args);
|
||||||
@@ -111,15 +97,14 @@ bool WindowEmperor::HandleCommandlineArgs()
|
|||||||
Remoting::CommandlineArgs eventArgs{ { args }, { cwd }, showWindow, winrt::hstring{ currentEnv.to_string() } };
|
Remoting::CommandlineArgs eventArgs{ { args }, { cwd }, showWindow, winrt::hstring{ currentEnv.to_string() } };
|
||||||
|
|
||||||
const auto isolatedMode{ _app.Logic().IsolatedMode() };
|
const auto isolatedMode{ _app.Logic().IsolatedMode() };
|
||||||
|
|
||||||
const auto result = _manager.ProposeCommandline(eventArgs, isolatedMode);
|
const auto result = _manager.ProposeCommandline(eventArgs, isolatedMode);
|
||||||
|
int exitCode = 0;
|
||||||
|
|
||||||
const bool makeWindow = result.ShouldCreateWindow();
|
if (result.ShouldCreateWindow())
|
||||||
if (makeWindow)
|
|
||||||
{
|
{
|
||||||
_createNewWindowThread(Remoting::WindowRequestedArgs{ result, eventArgs });
|
_createNewWindowThread(Remoting::WindowRequestedArgs{ result, eventArgs });
|
||||||
|
|
||||||
_becomeMonarch();
|
_becomeMonarch();
|
||||||
|
WaitForWindows();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -127,11 +112,12 @@ bool WindowEmperor::HandleCommandlineArgs()
|
|||||||
if (!res.Message.empty())
|
if (!res.Message.empty())
|
||||||
{
|
{
|
||||||
AppHost::s_DisplayMessageBox(res);
|
AppHost::s_DisplayMessageBox(res);
|
||||||
std::quick_exit(res.ExitCode);
|
|
||||||
}
|
}
|
||||||
|
exitCode = res.ExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
return makeWindow;
|
TerminateProcess(GetCurrentProcess(), gsl::narrow_cast<UINT>(exitCode));
|
||||||
|
__assume(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowEmperor::WaitForWindows()
|
void WindowEmperor::WaitForWindows()
|
||||||
@@ -584,15 +570,6 @@ LRESULT WindowEmperor::_messageHandler(UINT const message, WPARAM const wParam,
|
|||||||
// we'll undoubtedly crash.
|
// we'll undoubtedly crash.
|
||||||
winrt::fire_and_forget WindowEmperor::_close()
|
winrt::fire_and_forget WindowEmperor::_close()
|
||||||
{
|
{
|
||||||
{
|
|
||||||
auto fridge{ _oldThreads.lock() };
|
|
||||||
for (auto& window : *fridge)
|
|
||||||
{
|
|
||||||
window->ThrowAway();
|
|
||||||
}
|
|
||||||
fridge->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Important! Switch back to the main thread for the emperor. That way, the
|
// Important! Switch back to the main thread for the emperor. That way, the
|
||||||
// quit will go to the emperor's message pump.
|
// quit will go to the emperor's message pump.
|
||||||
co_await wil::resume_foreground(_dispatcher);
|
co_await wil::resume_foreground(_dispatcher);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public:
|
|||||||
~WindowEmperor();
|
~WindowEmperor();
|
||||||
void WaitForWindows();
|
void WaitForWindows();
|
||||||
|
|
||||||
bool HandleCommandlineArgs();
|
void HandleCommandlineArgs();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _createNewWindowThread(const winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs& args);
|
void _createNewWindowThread(const winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs& args);
|
||||||
|
|||||||
@@ -115,8 +115,5 @@ int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
|
|||||||
winrt::init_apartment(winrt::apartment_type::single_threaded);
|
winrt::init_apartment(winrt::apartment_type::single_threaded);
|
||||||
|
|
||||||
const auto emperor = std::make_shared<::WindowEmperor>();
|
const auto emperor = std::make_shared<::WindowEmperor>();
|
||||||
if (emperor->HandleCommandlineArgs())
|
emperor->HandleCommandlineArgs();
|
||||||
{
|
|
||||||
emperor->WaitForWindows();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user