Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DxD] Add 'Automatic' as a mode for CloseOnExit #13560

Merged
8 commits merged into from
Aug 1, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/cascadia/TerminalApp/Pane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1017,6 +1017,13 @@ void Pane::_ControlConnectionStateChangedHandler(const winrt::Windows::Foundatio
return;
}

if (_overrideCloseOnExit)
{
// We have been told to close upon process termination regardless of the value of
// the profile's CloseOnExit, so go ahead and close
Close();
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved
}

if (_profile)
{
const auto mode = _profile.CloseOnExit();
Expand Down Expand Up @@ -3108,6 +3115,28 @@ int Pane::GetLeafPaneCount() const noexcept
return _IsLeaf() ? 1 : (_firstChild->GetLeafPaneCount() + _secondChild->GetLeafPaneCount());
}

// Method Description:
// - Should be called when this pane is created via a default terminal handoff
// - Finalizes our configuration given the information that we have been
// created via default handoff
void Pane::FinalizeConfigurationGivenDefault()
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved
{
if (_IsLeaf())
{
if (_profile)
{
if (_profile.CloseOnExit() == CloseOnExitMode::GracefulIfLaunchedByTerminal)
{
// We only want to close 'gracefully' if we were launched by Terminal
// Since we were launched via defterm, override this (i.e. it will
// be treated as 'always', see _ControlConnectionStateChangedHandler
// for where this boolean is used, and see GH #13325 for discussion)
_overrideCloseOnExit = true;
}
}
}
}
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved

// Method Description:
// - Returns true if the pane or one of its descendants is read-only
bool Pane::ContainsReadOnly() const
Expand Down
4 changes: 4 additions & 0 deletions src/cascadia/TerminalApp/Pane.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ class Pane : public std::enable_shared_from_this<Pane>
bool FocusPane(const std::shared_ptr<Pane> pane);
std::shared_ptr<Pane> FindPane(const uint32_t id);

void FinalizeConfigurationGivenDefault();

bool ContainsReadOnly() const;

// Method Description:
Expand Down Expand Up @@ -241,6 +243,8 @@ class Pane : public std::enable_shared_from_this<Pane>

bool _zoomed{ false };

bool _overrideCloseOnExit{ false };

winrt::Windows::Media::Playback::MediaPlayer _bellPlayer{ nullptr };
winrt::Windows::Media::Playback::MediaPlayer::MediaEnded_revoker _mediaEndedRevoker;

Expand Down
6 changes: 5 additions & 1 deletion src/cascadia/TerminalApp/TerminalPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3202,7 +3202,11 @@ namespace winrt::TerminalApp::implementation
// elevated version of the Terminal with that profile... that's a
// recipe for disaster. We won't ever open up a tab in this window.
newTerminalArgs.Elevate(false);
_CreateNewTabFromPane(_MakePane(newTerminalArgs, false, connection));
const auto newPane = _MakePane(newTerminalArgs, false, connection);
newPane->WalkTree([](auto pane) {
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved
pane->FinalizeConfigurationGivenDefault();
});
_CreateNewTabFromPane(newPane);

// Request a summon of this window to the foreground
_SummonWindowRequestedHandlers(*this, nullptr);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,10 @@
<value>Never close automatically</value>
<comment>An option to choose from for the "profile termination behavior" (or "close on exit") setting. When selected, the terminal never closes, even if the process exits in a controlled or uncontrolled scenario. The user would have to manually close the terminal.</comment>
</data>
<data name="Profile_CloseOnExitGracefulIfLaunchedByTerminal.Content" xml:space="preserve">
<value>Graceful if launched by Windows Terminal</value>
<comment>An option to choose from for the "profile termination behavior" (or "close on exit") setting. When selected, the terminal closes if the process exits in a controlled scenario successfully and the process was launched by Windows Terminal.</comment>
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved
</data>
<data name="Profile_ColorScheme.Header" xml:space="preserve">
<value>Color scheme</value>
<comment>Header for a control to select the scheme (or set) of colors used in the session. This is selected from a list of options managed by the user.</comment>
Expand Down
2 changes: 1 addition & 1 deletion src/cascadia/TerminalSettingsModel/MTSMSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Author(s):
X(bool, SuppressApplicationTitle, "suppressApplicationTitle", false) \
X(guid, ConnectionType, "connectionType") \
X(hstring, Icon, "icon", L"\uE756") \
X(CloseOnExitMode, CloseOnExit, "closeOnExit", CloseOnExitMode::Graceful) \
X(CloseOnExitMode, CloseOnExit, "closeOnExit", CloseOnExitMode::GracefulIfLaunchedByTerminal) \
X(hstring, TabTitle, "tabTitle") \
X(Model::BellStyle, BellStyle, "bellStyle", BellStyle::Audible) \
X(bool, UseAtlasEngine, "experimental.useAtlasEngine", false) \
Expand Down
3 changes: 2 additions & 1 deletion src/cascadia/TerminalSettingsModel/Profile.idl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ namespace Microsoft.Terminal.Settings.Model
{
Never = 0,
Graceful,
Always
Always,
GracefulIfLaunchedByTerminal
};

[flags]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,11 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Control::TextAntialiasingMode)
// - Helper for converting a user-specified closeOnExit value to its corresponding enum
JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::CloseOnExitMode)
{
JSON_MAPPINGS(3) = {
JSON_MAPPINGS(4) = {
pair_type{ "always", ValueType::Always },
pair_type{ "graceful", ValueType::Graceful },
pair_type{ "never", ValueType::Never },
pair_type{ "gracefulIfLaunchedByTerminal", ValueType::GracefulIfLaunchedByTerminal },
PankajBhojwani marked this conversation as resolved.
Show resolved Hide resolved
};

// Override mapping parser to add boolean parsing
Expand Down