Skip to content

Commit cc35c83

Browse files
Add a splitPane option to duplicate current profile (#4683)
This change adds the ability to configure a pane to split by duplicating the current profile Closes #1756
1 parent d8f7aac commit cc35c83

File tree

5 files changed

+48
-4
lines changed

5 files changed

+48
-4
lines changed

src/cascadia/TerminalApp/ActionArgs.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,26 @@ namespace winrt::TerminalApp::implementation
331331
return TerminalApp::SplitState::None;
332332
};
333333

334+
// Possible SplitType values
335+
static constexpr std::string_view DuplicateKey{ "duplicate" };
336+
static TerminalApp::SplitType ParseSplitModeState(const std::string& stateString)
337+
{
338+
if (stateString == DuplicateKey)
339+
{
340+
return TerminalApp::SplitType::Duplicate;
341+
}
342+
return TerminalApp::SplitType::Manual;
343+
}
344+
334345
struct SplitPaneArgs : public SplitPaneArgsT<SplitPaneArgs>
335346
{
336347
SplitPaneArgs() = default;
337348
GETSET_PROPERTY(winrt::TerminalApp::SplitState, SplitStyle, winrt::TerminalApp::SplitState::None);
338349
GETSET_PROPERTY(winrt::TerminalApp::NewTerminalArgs, TerminalArgs, nullptr);
350+
GETSET_PROPERTY(winrt::TerminalApp::SplitType, SplitMode, winrt::TerminalApp::SplitType::Manual);
339351

340352
static constexpr std::string_view SplitKey{ "split" };
353+
static constexpr std::string_view SplitModeKey{ "splitMode" };
341354

342355
public:
343356
bool Equals(const IActionArgs& other)
@@ -346,7 +359,8 @@ namespace winrt::TerminalApp::implementation
346359
if (otherAsUs)
347360
{
348361
return otherAsUs->_SplitStyle == _SplitStyle &&
349-
otherAsUs->_TerminalArgs == _TerminalArgs;
362+
otherAsUs->_TerminalArgs == _TerminalArgs &&
363+
otherAsUs->_SplitMode == _SplitMode;
350364
}
351365
return false;
352366
};
@@ -359,6 +373,10 @@ namespace winrt::TerminalApp::implementation
359373
{
360374
args->_SplitStyle = ParseSplitState(jsonStyle.asString());
361375
}
376+
if (auto jsonStyle{ json[JsonKey(SplitModeKey)] })
377+
{
378+
args->_SplitMode = ParseSplitModeState(jsonStyle.asString());
379+
}
362380
return { *args, {} };
363381
}
364382
};

src/cascadia/TerminalApp/ActionArgs.idl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ namespace TerminalApp
3131
Horizontal = 2
3232
};
3333

34+
enum SplitType
35+
{
36+
Manual = 0,
37+
Duplicate = 1
38+
};
39+
3440
[default_interface] runtimeclass NewTerminalArgs {
3541
NewTerminalArgs();
3642
String Commandline;
@@ -82,5 +88,6 @@ namespace TerminalApp
8288
{
8389
SplitState SplitStyle { get; };
8490
NewTerminalArgs TerminalArgs { get; };
91+
SplitType SplitMode { get; };
8592
};
8693
}

src/cascadia/TerminalApp/AppActionHandlers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ namespace winrt::TerminalApp::implementation
9898
}
9999
else if (const auto& realArgs = args.ActionArgs().try_as<TerminalApp::SplitPaneArgs>())
100100
{
101-
_SplitPane(realArgs.SplitStyle(), realArgs.TerminalArgs());
101+
_SplitPane(realArgs.SplitStyle(), realArgs.SplitMode(), realArgs.TerminalArgs());
102102
args.Handled(true);
103103
}
104104
}

src/cascadia/TerminalApp/TerminalPage.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,10 +1045,12 @@ namespace winrt::TerminalApp::implementation
10451045
// Arguments:
10461046
// - splitType: one value from the TerminalApp::SplitState enum, indicating how the
10471047
// new pane should be split from its parent.
1048+
// - splitMode: value from TerminalApp::SplitType enum, indicating the profile to be used in the newly split pane.
10481049
// - newTerminalArgs: An object that may contain a blob of parameters to
10491050
// control which profile is created and with possible other
10501051
// configurations. See CascadiaSettings::BuildSettings for more details.
10511052
void TerminalPage::_SplitPane(const TerminalApp::SplitState splitType,
1053+
const TerminalApp::SplitType splitMode,
10521054
const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs)
10531055
{
10541056
// Do nothing if we're requesting no split.
@@ -1067,7 +1069,24 @@ namespace winrt::TerminalApp::implementation
10671069

10681070
auto focusedTab = _GetStrongTabImpl(*indexOpt);
10691071

1070-
const auto [realGuid, controlSettings] = _settings->BuildSettings(newTerminalArgs);
1072+
winrt::Microsoft::Terminal::Settings::TerminalSettings controlSettings;
1073+
GUID realGuid;
1074+
bool profileFound = false;
1075+
1076+
if (splitMode == TerminalApp::SplitType::Duplicate)
1077+
{
1078+
std::optional<GUID> current_guid = focusedTab->GetFocusedProfile();
1079+
if (current_guid)
1080+
{
1081+
profileFound = true;
1082+
controlSettings = _settings->BuildSettings(current_guid.value());
1083+
realGuid = current_guid.value();
1084+
}
1085+
}
1086+
if (!profileFound)
1087+
{
1088+
std::tie(realGuid, controlSettings) = _settings->BuildSettings(newTerminalArgs);
1089+
}
10711090

10721091
const auto controlConnection = _CreateConnectionFromSettings(realGuid, controlSettings);
10731092

src/cascadia/TerminalApp/TerminalPage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ namespace winrt::TerminalApp::implementation
122122
// Todo: add more event implementations here
123123
// MSFT:20641986: Add keybindings for New Window
124124
void _Scroll(int delta);
125-
void _SplitPane(const winrt::TerminalApp::SplitState splitType, const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs = nullptr);
125+
void _SplitPane(const winrt::TerminalApp::SplitState splitType, const winrt::TerminalApp::SplitType splitMode = winrt::TerminalApp::SplitType::Manual, const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs = nullptr);
126126
void _ResizePane(const Direction& direction);
127127
void _ScrollPage(int delta);
128128
void _SetAcceleratorForMenuItem(Windows::UI::Xaml::Controls::MenuFlyoutItem& menuItem, const winrt::Microsoft::Terminal::Settings::KeyChord& keyChord);

0 commit comments

Comments
 (0)