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

Multi-Click Selection: Triple-Click Settings + Viewport Selection #1302

Closed
Show file tree
Hide file tree
Changes from all commits
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
54 changes: 54 additions & 0 deletions src/cascadia/TerminalApp/Profile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ static constexpr std::string_view IconKey{ "icon" };
static constexpr std::string_view BackgroundImageKey{ "backgroundImage" };
static constexpr std::string_view BackgroundImageOpacityKey{ "backgroundImageOpacity" };
static constexpr std::string_view BackgroundimageStretchModeKey{ "backgroundImageStretchMode" };
static constexpr std::string_view TripleClickSelectionModeKey{ "tripleClickSelectionMode" };

// Possible values for Scrollbar state
static constexpr std::wstring_view AlwaysVisible{ L"visible" };
Expand All @@ -58,6 +59,11 @@ static constexpr std::string_view ImageStretchModeFill{ "fill" };
static constexpr std::string_view ImageStretchModeUniform{ "uniform" };
static constexpr std::string_view ImageStretchModeUniformTofill{ "uniformToFill" };

// Possible values for Triple Click Selection Mode
static constexpr std::wstring_view TripleClickSelectionModeDisabled{ L"disabled" };
static constexpr std::wstring_view TripleClickSelectionModeLine{ L"line" };
static constexpr std::wstring_view TripleClickSelectionModeViewport{ L"viewport" };

Profile::Profile() :
Profile(Utils::CreateGuid())
{
Expand All @@ -76,6 +82,7 @@ Profile::Profile(const winrt::guid& guid) :
_cursorColor{ DEFAULT_CURSOR_COLOR },
_cursorShape{ CursorStyle::Bar },
_cursorHeight{ DEFAULT_CURSOR_HEIGHT },
_tripleClickSelectionMode{ TripleClickSelectionMode::Line },

_commandline{ L"cmd.exe" },
_startingDirectory{},
Expand Down Expand Up @@ -144,6 +151,7 @@ TerminalSettings Profile::CreateTerminalSettings(const std::vector<ColorScheme>&
terminalSettings.CursorColor(_cursorColor);
terminalSettings.CursorHeight(_cursorHeight);
terminalSettings.CursorShape(_cursorShape);
terminalSettings.TripleClickSelectionMode(_tripleClickSelectionMode);

// Fill in the remaining properties from the profile
terminalSettings.UseAcrylic(_useAcrylic);
Expand Down Expand Up @@ -249,6 +257,7 @@ Json::Value Profile::ToJson() const
root[JsonKey(CursorHeightKey)] = _cursorHeight;
}
root[JsonKey(CursorShapeKey)] = winrt::to_string(_SerializeCursorStyle(_cursorShape));
root[JsonKey(TripleClickSelectionModeKey)] = winrt::to_string(_SerializeTripleClickSelectionMode(_tripleClickSelectionMode));

///// Control Settings /////
root[JsonKey(CommandlineKey)] = winrt::to_string(_commandline);
Expand Down Expand Up @@ -369,6 +378,10 @@ Profile Profile::FromJson(const Json::Value& json)
{
result._cursorShape = _ParseCursorShape(GetWstringFromJson(cursorShape));
}
if (auto tripleClickSelectionMode{ json[JsonKey(TripleClickSelectionModeKey)] })
{
result._tripleClickSelectionMode = _ParseTripleClickSelectionMode(GetWstringFromJson(tripleClickSelectionMode));
}

// Control Settings
if (auto commandline{ json[JsonKey(CommandlineKey)] })
Expand Down Expand Up @@ -673,3 +686,44 @@ std::wstring_view Profile::_SerializeCursorStyle(const CursorStyle cursorShape)
return CursorShapeBar;
}
}

// Method Description:
// - Helper function for converting a user-specified triple click selection mode to the corresponding
// TripleClickSelectionMode enum value
// Arguments:
// - selectionModeString: The string value from the settings file to parse
// Return Value:
// - The corresponding enum value which maps to the string provided by the user
winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode Profile::_ParseTripleClickSelectionMode(const std::wstring& selectionModeString)
{
if (selectionModeString == TripleClickSelectionModeDisabled)
{
return winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::Disabled;
}
else if (selectionModeString == TripleClickSelectionModeViewport)
{
return winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::VisibleViewport;
}
return winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::Line;
}

// Method Description:
// - Helper function for converting a TripleClickSelectionMode to its corresponding string
// value.
// Arguments:
// - selectionMode: The enum value to convert to a string.
// Return Value:
// - The string value for the given TripleClickSelectionMode
std::wstring_view Profile::_SerializeTripleClickSelectionMode(const winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode selectionMode)
{
switch (selectionMode)
{
case winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::Disabled:
return TripleClickSelectionModeDisabled;
case winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::VisibleViewport:
return TripleClickSelectionModeViewport;
case winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode::Line:
default:
return TripleClickSelectionModeLine;
}
}
3 changes: 3 additions & 0 deletions src/cascadia/TerminalApp/Profile.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ class TerminalApp::Profile final
static std::string_view SerializeImageStretchMode(const winrt::Windows::UI::Xaml::Media::Stretch imageStretchMode);
static winrt::Microsoft::Terminal::Settings::CursorStyle _ParseCursorShape(const std::wstring& cursorShapeString);
static std::wstring_view _SerializeCursorStyle(const winrt::Microsoft::Terminal::Settings::CursorStyle cursorShape);
static winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode _ParseTripleClickSelectionMode(const std::wstring& selectionModeString);
static std::wstring_view _SerializeTripleClickSelectionMode(const winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode selectionMode);

GUID _guid;
std::wstring _name;
Expand All @@ -76,6 +78,7 @@ class TerminalApp::Profile final
uint32_t _cursorColor;
uint32_t _cursorHeight;
winrt::Microsoft::Terminal::Settings::CursorStyle _cursorShape;
winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode _tripleClickSelectionMode;

std::wstring _commandline;
std::wstring _fontFace;
Expand Down
33 changes: 32 additions & 1 deletion src/cascadia/TerminalCore/Terminal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ void Terminal::UpdateSettings(winrt::Microsoft::Terminal::Settings::ICoreSetting

_snapOnInput = settings.SnapOnInput();

_tripleClickMode = settings.TripleClickSelectionMode();

// TODO:MSFT:21327402 - if HistorySize has changed, resize the buffer so we
// have a smaller scrollback. We should do this carefully - if the new buffer
// size is smaller than where the mutable viewport currently is, we'll want
Expand Down Expand Up @@ -517,15 +519,44 @@ void Terminal::DoubleClickSelection(const COORD position)
}

// Method Description:
// - Select the entire row of the position clicked
// - Performs a triple click selection based on the setting
// Arguments:
// - position: the (x,y) coordinate on the visible viewport
void Terminal::TripleClickSelection(const COORD position)
{
switch (_tripleClickMode)
{
case TripleClickSelectionMode::VisibleViewport:
_SelectViewport();
break;
case TripleClickSelectionMode::Line:
_SelectRow(position);
break;
case TripleClickSelectionMode::Disabled:
default:
SetSelectionAnchor(position);
break;
}
}

// Method Description:
// - Create a selection of the entire row of the position clicked
// Arguments:
// - position: the (x,y) coordinate on the visible viewport
void Terminal::_SelectRow(const COORD position)
{
SetSelectionAnchor({ 0, position.Y });
SetEndSelectionPosition({ _buffer->GetSize().RightInclusive(), position.Y });
}

// Method Description:
// - Create a selection of the entire visible viewport present
void Terminal::_SelectViewport()
{
SetSelectionAnchor({ 0, 0 });
SetEndSelectionPosition(_mutableViewport.Dimensions());
}

// Method Description:
// - expand the double click selection to the left (stopped by delimiter)
// Arguments:
Expand Down
4 changes: 4 additions & 0 deletions src/cascadia/TerminalCore/Terminal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
namespace winrt::Microsoft::Terminal::Settings
{
struct ICoreSettings;
enum class TripleClickSelectionMode;
}

namespace Microsoft::Terminal::Core
Expand Down Expand Up @@ -151,9 +152,12 @@ class Microsoft::Terminal::Core::Terminal final :
bool _selectionActive;
SHORT _selectionAnchor_YOffset;
SHORT _endSelectionPosition_YOffset;
winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode _tripleClickMode;
void _ExpandDoubleClickSelectionLeft(const COORD position);
void _ExpandDoubleClickSelectionRight(const COORD position);
const bool _DoubleClickDelimiterCheck(std::wstring_view cellChar) const;
void _SelectRow(const COORD position);
void _SelectViewport();
const COORD _ConvertToBufferCell(const COORD viewportPos) const;

std::shared_mutex _readWriteLock;
Expand Down
8 changes: 8 additions & 0 deletions src/cascadia/TerminalSettings/ICoreSettings.idl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ namespace Microsoft.Terminal.Settings
EmptyBox
};

enum TripleClickSelectionMode
{
Disabled,
Line,
VisibleViewport
};

interface ICoreSettings
{
UInt32 DefaultForeground;
Expand All @@ -27,6 +34,7 @@ namespace Microsoft.Terminal.Settings
UInt32 CursorColor;
CursorStyle CursorShape;
UInt32 CursorHeight;
TripleClickSelectionMode TripleClickSelectionMode;
};

}
11 changes: 11 additions & 0 deletions src/cascadia/TerminalSettings/TerminalSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
_cursorColor{ DEFAULT_CURSOR_COLOR },
_cursorShape{ CursorStyle::Vintage },
_cursorHeight{ DEFAULT_CURSOR_HEIGHT },
_tripleClickSelectionMode{ Settings::TripleClickSelectionMode::Line },
_useAcrylic{ false },
_closeOnExit{ true },
_tintOpacity{ 0.5 },
Expand Down Expand Up @@ -135,6 +136,16 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
_cursorHeight = value;
}

Settings::TripleClickSelectionMode TerminalSettings::TripleClickSelectionMode() const noexcept
{
return _tripleClickSelectionMode;
}

void TerminalSettings::TripleClickSelectionMode(winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode const& value) noexcept
{
_tripleClickSelectionMode = value;
}

bool TerminalSettings::UseAcrylic()
{
return _useAcrylic;
Expand Down
3 changes: 3 additions & 0 deletions src/cascadia/TerminalSettings/terminalsettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
void CursorShape(winrt::Microsoft::Terminal::Settings::CursorStyle const& value) noexcept;
uint32_t CursorHeight();
void CursorHeight(uint32_t value);
Settings::TripleClickSelectionMode TripleClickSelectionMode() const noexcept;
void TripleClickSelectionMode(winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode const& value) noexcept;
// ------------------------ End of Core Settings -----------------------

bool UseAcrylic();
Expand Down Expand Up @@ -94,6 +96,7 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
uint32_t _cursorColor;
Settings::CursorStyle _cursorShape;
uint32_t _cursorHeight;
Settings::TripleClickSelectionMode _tripleClickSelectionMode;

bool _useAcrylic;
bool _closeOnExit;
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/UnitTests_TerminalCore/ScreenSizeLimitsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ namespace TerminalCoreUnitTests
uint32_t CursorColor() { return COLOR_WHITE; }
CursorStyle CursorShape() const noexcept { return CursorStyle::Vintage; }
uint32_t CursorHeight() { return 42UL; }
TripleClickSelectionMode TripleClickSelectionMode() { return TripleClickSelectionMode::Line; }

// other implemented methods
uint32_t GetColorTableEntry(int32_t) const { return 123; }
Expand All @@ -50,6 +51,7 @@ namespace TerminalCoreUnitTests
void CursorColor(uint32_t) {}
void CursorShape(CursorStyle const&) noexcept {}
void CursorHeight(uint32_t) {}
void TripleClickSelectionMode(winrt::Microsoft::Terminal::Settings::TripleClickSelectionMode) {}

// other unimplemented methods
void SetColorTableEntry(int32_t /* index */, uint32_t /* value */) {}
Expand Down