Tons of comments
This commit is contained in:
parent
9b1e30ba92
commit
904045bb62
|
@ -8,14 +8,27 @@
|
||||||
#include <wil/win32_helpers.h>
|
#include <wil/win32_helpers.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
|
||||||
|
// BODGY
|
||||||
|
//
|
||||||
|
// If we try to do this in the Terminal itself, then there's a bunch of weird
|
||||||
|
// things that can go wrong and prevent the elevated Terminal window from
|
||||||
|
// getting created. Specifically, if the origin Terminal exits right away after
|
||||||
|
// spawning the elevated WT, then ShellExecute might not successfully complete
|
||||||
|
// the elevation. What's even more, the Terminal will mysteriously crash
|
||||||
|
// somewhere in XAML land.
|
||||||
|
//
|
||||||
|
// To mitigate this, the Terminal will call into us with the commandline it
|
||||||
|
// wants elevated. We'll hang around until ShellExecute is finished, so that the
|
||||||
|
// process can successfully elevate.
|
||||||
|
|
||||||
#pragma warning(suppress : 26461) // we can't change the signature of wWinMain
|
#pragma warning(suppress : 26461) // we can't change the signature of wWinMain
|
||||||
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR pCmdLine, int)
|
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR pCmdLine, int)
|
||||||
{
|
{
|
||||||
|
// All of the args passed to us (something like `new-tab -p {guid}`) are in
|
||||||
|
// pCmdLine
|
||||||
|
|
||||||
|
// Get the path to WindowsTerminal.exe, which should live next to us.
|
||||||
std::filesystem::path module{ wil::GetModuleFileNameW<std::wstring>(nullptr) };
|
std::filesystem::path module{ wil::GetModuleFileNameW<std::wstring>(nullptr) };
|
||||||
|
|
||||||
// Cache our name (elevate-shim)
|
|
||||||
std::wstring ourFilename{ module.filename() };
|
|
||||||
|
|
||||||
// Swap elevate-shim.exe for WindowsTerminal.exe
|
// Swap elevate-shim.exe for WindowsTerminal.exe
|
||||||
module.replace_filename(L"WindowsTerminal.exe");
|
module.replace_filename(L"WindowsTerminal.exe");
|
||||||
|
|
||||||
|
@ -23,9 +36,9 @@ int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR pCmdLine, int)
|
||||||
SHELLEXECUTEINFOW seInfo{ 0 };
|
SHELLEXECUTEINFOW seInfo{ 0 };
|
||||||
seInfo.cbSize = sizeof(seInfo);
|
seInfo.cbSize = sizeof(seInfo);
|
||||||
seInfo.fMask = SEE_MASK_DEFAULT;
|
seInfo.fMask = SEE_MASK_DEFAULT;
|
||||||
seInfo.lpVerb = L"runas";
|
seInfo.lpVerb = L"runas"; // This asks the shell to elevate the process
|
||||||
seInfo.lpFile = module.c_str();
|
seInfo.lpFile = module.c_str(); // This is `...\WindowsTerminal.exe`
|
||||||
seInfo.lpParameters = pCmdLine;
|
seInfo.lpParameters = pCmdLine; // This is `new-tab -p {guid}`
|
||||||
seInfo.nShow = SW_SHOWNORMAL;
|
seInfo.nShow = SW_SHOWNORMAL;
|
||||||
LOG_IF_WIN32_BOOL_FALSE(ShellExecuteExW(&seInfo));
|
LOG_IF_WIN32_BOOL_FALSE(ShellExecuteExW(&seInfo));
|
||||||
}
|
}
|
||||||
|
|
|
@ -550,26 +550,9 @@ namespace winrt::TerminalApp::implementation
|
||||||
// However, we need to make sure to close this window in that scenario.
|
// However, we need to make sure to close this window in that scenario.
|
||||||
// Since there aren't any _tabs_ in this window, we won't ever get a
|
// Since there aren't any _tabs_ in this window, we won't ever get a
|
||||||
// closed event. So do it manually.
|
// closed event. So do it manually.
|
||||||
// auto weakThis{ get_weak() };
|
|
||||||
if (_tabs.Size() == 0)
|
if (_tabs.Size() == 0)
|
||||||
{
|
{
|
||||||
// This is MENTAL. If we exit right away after spawning the elevated
|
|
||||||
// WT, then ShellExecute might not successfully complete the
|
|
||||||
// elevation. What's even more, the Terminal will mysteriously crash
|
|
||||||
// somewhere in XAML land.
|
|
||||||
//
|
|
||||||
// So I'm introducing a 5s delay here for the Shell to complete the
|
|
||||||
// execution, and _then_ close the window.
|
|
||||||
//
|
|
||||||
// TODO! There's no way this is the right answer, right?
|
|
||||||
// co_await winrt::resume_background();
|
|
||||||
// if (auto page{ weakThis.get() })
|
|
||||||
// {
|
|
||||||
// Sleep(5000);
|
|
||||||
// co_await winrt::resume_foreground(page->Dispatcher(), CoreDispatcherPriority::Normal);
|
|
||||||
// page->_LastTabClosedHandlers(*page, nullptr);
|
|
||||||
_LastTabClosedHandlers(*this, nullptr);
|
_LastTabClosedHandlers(*this, nullptr);
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3576,11 +3559,12 @@ namespace winrt::TerminalApp::implementation
|
||||||
// Hop to the BG thread
|
// Hop to the BG thread
|
||||||
co_await winrt::resume_background();
|
co_await winrt::resume_background();
|
||||||
|
|
||||||
// This is supremely dumb. We're going to construct the commandline we
|
// BODGY
|
||||||
// want, then toss it to a helper process called `elevate-shim.exe` that
|
//
|
||||||
// happens to live next to us. elevate-shim.exe will be the one to call
|
// We're going to construct the commandline we want, then toss it to a
|
||||||
// ShellExecute with the args that we want (to elevate the given
|
// helper process called `elevate-shim.exe` that happens to live next to
|
||||||
// profile).
|
// us. elevate-shim.exe will be the one to call ShellExecute with the
|
||||||
|
// args that we want (to elevate the given profile).
|
||||||
//
|
//
|
||||||
// We can't be the one to call ShellExecute ourselves. ShellExecute
|
// We can't be the one to call ShellExecute ourselves. ShellExecute
|
||||||
// requires that the calling process stays alive until the child is
|
// requires that the calling process stays alive until the child is
|
||||||
|
@ -3611,6 +3595,10 @@ namespace winrt::TerminalApp::implementation
|
||||||
nullptr,
|
nullptr,
|
||||||
&si,
|
&si,
|
||||||
&pi));
|
&pi));
|
||||||
|
|
||||||
|
// TODO: GH#8592 - It may be useful to pop a Toast here in the original
|
||||||
|
// Terminal window informing the user that the tab was opened in a new
|
||||||
|
// window.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
|
|
Loading…
Reference in a new issue