mirror of
https://github.com/microsoft/terminal.git
synced 2026-04-05 21:59:47 +00:00
Compare commits
1 Commits
v1.22.1175
...
dev/lhecke
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a95f55fb77 |
@@ -166,7 +166,8 @@ void AppHost::_HandleCommandlineArgs(const Remoting::WindowRequestedArgs& window
|
||||
|
||||
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();
|
||||
|
||||
// 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()
|
||||
@@ -82,7 +68,7 @@ void _buildArgsFromCommandline(std::vector<winrt::hstring>& args)
|
||||
}
|
||||
}
|
||||
|
||||
bool WindowEmperor::HandleCommandlineArgs()
|
||||
void WindowEmperor::HandleCommandlineArgs()
|
||||
{
|
||||
std::vector<winrt::hstring> args;
|
||||
_buildArgsFromCommandline(args);
|
||||
@@ -111,15 +97,14 @@ bool WindowEmperor::HandleCommandlineArgs()
|
||||
Remoting::CommandlineArgs eventArgs{ { args }, { cwd }, showWindow, winrt::hstring{ currentEnv.to_string() } };
|
||||
|
||||
const auto isolatedMode{ _app.Logic().IsolatedMode() };
|
||||
|
||||
const auto result = _manager.ProposeCommandline(eventArgs, isolatedMode);
|
||||
int exitCode = 0;
|
||||
|
||||
const bool makeWindow = result.ShouldCreateWindow();
|
||||
if (makeWindow)
|
||||
if (result.ShouldCreateWindow())
|
||||
{
|
||||
_createNewWindowThread(Remoting::WindowRequestedArgs{ result, eventArgs });
|
||||
|
||||
_becomeMonarch();
|
||||
WaitForWindows();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -127,11 +112,12 @@ bool WindowEmperor::HandleCommandlineArgs()
|
||||
if (!res.Message.empty())
|
||||
{
|
||||
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()
|
||||
@@ -584,15 +570,6 @@ LRESULT WindowEmperor::_messageHandler(UINT const message, WPARAM const wParam,
|
||||
// we'll undoubtedly crash.
|
||||
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
|
||||
// quit will go to the emperor's message pump.
|
||||
co_await wil::resume_foreground(_dispatcher);
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
~WindowEmperor();
|
||||
void WaitForWindows();
|
||||
|
||||
bool HandleCommandlineArgs();
|
||||
void HandleCommandlineArgs();
|
||||
|
||||
private:
|
||||
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);
|
||||
|
||||
const auto emperor = std::make_shared<::WindowEmperor>();
|
||||
if (emperor->HandleCommandlineArgs())
|
||||
{
|
||||
emperor->WaitForWindows();
|
||||
}
|
||||
emperor->HandleCommandlineArgs();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user