A close button, and more logging

This commit is contained in:
Mike Griese 2021-08-12 09:47:50 -05:00
parent 9331cc8e59
commit 6910677a11
4 changed files with 62 additions and 17 deletions

View file

@ -96,10 +96,13 @@ namespace winrt::SampleApp::implementation
return std::move(piOne);
}
void MyPage::_writeToLog(std::wstring_view str)
winrt::fire_and_forget MyPage::_writeToLog(std::wstring_view str)
{
winrt::hstring copy{ str };
// Switch back to the UI thread.
co_await resume_foreground(Dispatcher());
winrt::WUX::Controls::TextBlock block;
block.Text(str);
block.Text(copy);
Log().Children().Append(block);
}
@ -110,7 +113,6 @@ namespace winrt::SampleApp::implementation
// Capture calling context.
winrt::apartment_context ui_thread;
co_await winrt::resume_background();
auto canConvert = guidString.size() == 38 &&
guidString.front() == '{' &&
@ -127,11 +129,13 @@ namespace winrt::SampleApp::implementation
tryingToAttach = true;
}
}
_writeToLog(tryingToAttach ? L"Attaching to existing content process" : L"Creating new content process");
co_await winrt::resume_background();
if (!tryingToAttach)
{
// Spawn a wt.exe, with the guid on the commandline
auto piContent{ std::move(_createHostClassProcess(contentGuid)) };
piContentProcess = std::move(_createHostClassProcess(contentGuid));
}
// THIS MUST TAKE PLACE AFTER _createHostClassProcess.
@ -139,11 +143,21 @@ namespace winrt::SampleApp::implementation
// spawn the process that will actually host the ContentProcess
// object.
// * If we're attaching, then that process already exists.
Control::ContentProcess content = create_instance<Control::ContentProcess>(contentGuid, CLSCTX_LOCAL_SERVER);
Control::ContentProcess content;
try
{
content = create_instance<Control::ContentProcess>(contentGuid, CLSCTX_LOCAL_SERVER);
}
catch (winrt::hresult_error hr)
{
_writeToLog(L"CreateInstance the ContentProces object");
_writeToLog(fmt::format(L" HR ({}): {}", hr.code(), hr.message().c_str()));
co_return; // be sure to co_return or we'll fall through to the part where we clear the log
}
if (content == nullptr)
{
// Switch back to the UI thread.
co_await ui_thread;
_writeToLog(L"Failed to connect to the ContentProces object. It may not have been started fast enough.");
co_return; // be sure to co_return or we'll fall through to the part where we clear the log
}
@ -172,8 +186,6 @@ namespace winrt::SampleApp::implementation
if (!content.Initialize(settings, connectInfo))
{
// Switch back to the UI thread.
co_await ui_thread;
_writeToLog(L"Failed to Initialize the ContentProces object.");
co_return; // be sure to co_return or we'll fall through to the part where we clear the log
}
@ -200,6 +212,16 @@ namespace winrt::SampleApp::implementation
}
}
void MyPage::CloseClicked(const IInspectable& /*sender*/,
const WUX::Input::TappedRoutedEventArgs& /*eventArgs*/)
{
OutOfProcContent().Children().Clear();
if (piContentProcess.hProcess)
{
piContentProcess.reset();
}
}
// Method Description:
// - Gets the title of the currently focused terminal control. If there
// isn't a control selected for any reason, returns "Windows Terminal"

View file

@ -17,11 +17,14 @@ namespace winrt::SampleApp::implementation
hstring Title();
winrt::fire_and_forget CreateClicked(const IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& eventArgs);
void CloseClicked(const IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& eventArgs);
private:
friend struct MyPageT<MyPage>; // for Xaml to bind events
void _writeToLog(std::wstring_view str);
wil::unique_process_information piContentProcess;
winrt::fire_and_forget _writeToLog(std::wstring_view str);
};
}

View file

@ -28,6 +28,11 @@
Tapped="CreateClicked">
Create
</Button>
<Button x:Name="CloseOopControl"
Grid.Row="0"
Tapped="CloseClicked">
Close
</Button>
</StackPanel>
@ -48,16 +53,25 @@
VerticalAlignment="Stretch"
Background="#ff0000" />
<Grid x:Name="OutOfProcContent"
Grid.Column="1"
Padding="16"
<Grid Grid.Column="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#0000ff">
VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel x:Name="Log"
Grid.Row="0"
Orientation="Vertical" />
<Grid x:Name="OutOfProcContent"
Grid.Row="1"
Padding="16"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#0000ff" />
</Grid>
</Grid>

View file

@ -1726,8 +1726,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// Disconnect the TSF input control so it doesn't receive EditContext events.
TSFInputControl().Close();
_autoScrollTimer.Stop();
_core.Close();
// try
// {
if (!_contentProc)
{
_core.Close();
}
// }
// CATCH_LOG();
}
}