From 863e3e5c22366cf4c6257b9d6b9fb0dca849e7e4 Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 16 Sep 2020 10:19:49 -0700 Subject: [PATCH 1/7] Fix code format from inbox It appears as though the pragma above broke the format below. --- src/inc/til/color.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/inc/til/color.h b/src/inc/til/color.h index 37025b26e..0ab76f661 100644 --- a/src/inc/til/color.h +++ b/src/inc/til/color.h @@ -42,7 +42,9 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" r{ 0 }, g{ 0 }, b{ 0 }, - a{ 0 } {} + a{ 0 } + { + } constexpr color(uint8_t _r, uint8_t _g, uint8_t _b) noexcept : r{ _r }, From f91b53d5fdc5b20387e297357668f5f14a795d4c Mon Sep 17 00:00:00 2001 From: Chester Liu Date: Thu, 17 Sep 2020 06:30:46 +0800 Subject: [PATCH 2/7] Preprocess and convert C1 controls to their 7 bit equivalent (#7340) C1 control characters are now first converted to their 7 bit equivalent. This allows us to unify the logic of C1 and C0 escape handling. This also adds support for SOS/PM/APC string. * Unify the logic for C1 and C0 escape handling by converting C1 to C0 beforehand. This adds support for various C1 characters, including IND(8/4), NEL(8/5), HTS(8/8), RI(8/13), SS2(8/14), SS3(8/15), OSC(9/13), etc. * Add support for SOS/PM/APC escape sequences. Fixes #7032 * Use "Variable Length String" logic to unify the string termination handling of OSC, DCS and SOS/PM/APC. This fixes an issue where OSC action is successfully dispatched even when terminated with non-ST character. Introduced by #6328, the DCS PassThrough is spared from this issue. This PR puts them together and add test cases for them. References: https://vt100.net/docs/vt510-rm/chapter4.html https://vt100.net/emu/dec_ansi_parser Closes #7032 Closes #7317 --- .../spell-check/dictionary/dictionary.txt | 3 + src/terminal/parser/stateMachine.cpp | 290 +++++++++++------- src/terminal/parser/stateMachine.hpp | 13 +- .../parser/ut_parser/OutputEngineTest.cpp | 196 +++++++++++- 4 files changed, 392 insertions(+), 110 deletions(-) diff --git a/.github/actions/spell-check/dictionary/dictionary.txt b/.github/actions/spell-check/dictionary/dictionary.txt index 7344a626e..5e60c5772 100644 --- a/.github/actions/spell-check/dictionary/dictionary.txt +++ b/.github/actions/spell-check/dictionary/dictionary.txt @@ -20937,6 +20937,8 @@ apay Apayao APB APC +Apc +apc APDA APDU APE @@ -383889,6 +383891,7 @@ sorus sorva sory SOS +Sos sos Sosanna so-seeming diff --git a/src/terminal/parser/stateMachine.cpp b/src/terminal/parser/stateMachine.cpp index 536bc591c..60f9bdac8 100644 --- a/src/terminal/parser/stateMachine.cpp +++ b/src/terminal/parser/stateMachine.cpp @@ -68,14 +68,15 @@ static constexpr bool _isC0Code(const wchar_t wch) noexcept } // Routine Description: -// - Determines if a character is a C1 CSI (Control Sequence Introducer) -// This is a single-character way to start a control sequence, as opposed to "ESC[". +// - Determines if a character is a C1 control characters. +// This is a single-character way to start a control sequence, as opposed to using ESC +// and their 7-bit equivalent. // // Not all single-byte codepages support C1 control codes--in some, the range that would // be used for C1 codes are instead used for additional graphic characters. // -// However, we do not need to worry about confusion whether a single byte \x9b in a -// single-byte stream represents a C1 CSI or some other glyph, because by the time we +// However, we do not need to worry about confusion whether a single byte, for example, +// \x9b in a single-byte stream represents a C1 CSI or some other glyph, because by the time we // get here, everything is Unicode. Knowing whether a single-byte \x9b represents a // single-character C1 CSI or some other glyph is handled by MultiByteToWideChar before // we get here (if the stream was not already UTF-16). For instance, in CP_ACP, if a @@ -86,24 +87,21 @@ static constexpr bool _isC0Code(const wchar_t wch) noexcept // - wch - Character to check. // Return Value: // - True if it is. False if it isn't. -static constexpr bool _isC1Csi(const wchar_t wch) noexcept +static constexpr bool _isC1ControlCharacter(const wchar_t wch) noexcept { - return wch == L'\x9b'; + return (wch >= L'\x80' && wch <= L'\x9F'); } // Routine Description: -// - Determines if a character is a C1 DCS (Device Control Strings) -// This is a single-character way to start a control sequence, as opposed to "ESC P". -// -// See the comment above _isC1Csi for more information on how this is impacted by codepages. +// - Convert a C1 control characters to their 7-bit equivalent. // // Arguments: -// - wch - Character to check. +// - wch - Character to convert. // Return Value: -// - True if it is. False if it isn't. -static constexpr bool _isC1Dcs(const wchar_t wch) noexcept +// - The 7-bit equivalent of the 8-bit control characters. +static constexpr wchar_t _c1To7Bit(const wchar_t wch) noexcept { - return wch == L'\x90'; + return wch - L'\x40'; } // Routine Description: @@ -144,7 +142,7 @@ static constexpr bool _isEscape(const wchar_t wch) noexcept } // Routine Description: -// - Determines if a character is a delimiter between two parameters in a "control sequence". +// - Determines if a character is a delimiter between two parameters in an escape sequence. // Arguments: // - wch - Character to check. // Return Value: @@ -213,17 +211,6 @@ static constexpr bool _isParameterInvalid(const wchar_t wch) noexcept return _isCsiInvalid(wch) || _isCsiPrivateMarker(wch); } -// Routine Description: -// - Determines if a character is a string terminator. -// Arguments: -// - wch - Character to check. -// Return Value: -// - True if it is. False if it isn't. -static constexpr bool _isStringTerminator(const wchar_t wch) noexcept -{ - return wch == L'\x9C'; -} - // Routine Description: // - Determines if a character is a string terminator indicator. // Arguments: @@ -287,17 +274,6 @@ static constexpr bool _isOscDelimiter(const wchar_t wch) noexcept return wch == L';'; // 0x3B } -// Routine Description: -// - Determines if a character should be initiate the end of an OSC sequence. -// Arguments: -// - wch - Character to check. -// Return Value: -// - True if it is. False if it isn't. -static constexpr bool _isOscTerminationInitiator(const wchar_t wch) noexcept -{ - return wch == AsciiChars::ESC; -} - // Routine Description: // - Determines if a character should be ignored in a operating system control sequence // Arguments: @@ -320,7 +296,7 @@ static constexpr bool _isOscInvalid(const wchar_t wch) noexcept // - True if it is. False if it isn't. static constexpr bool _isOscTerminator(const wchar_t wch) noexcept { - return wch == AsciiChars::BEL || _isStringTerminator(wch); // Bell character or C1 terminator + return wch == AsciiChars::BEL; // Bell character } // Routine Description: @@ -335,17 +311,6 @@ static constexpr bool _isDcsIndicator(const wchar_t wch) noexcept return wch == L'P'; // 0x50 } -// Routine Description: -// - Determines if a character should initiate the end of a DCS sequence. -// Arguments: -// - wch - Character to check. -// Return Value: -// - True if it is. False if it isn't. -static constexpr bool _isDcsTerminationInitiator(const wchar_t wch) noexcept -{ - return wch == AsciiChars::ESC; -} - // Routine Description: // - Determines if a character is valid for a DCS pass through sequence. // Arguments: @@ -358,6 +323,42 @@ static constexpr bool _isDcsPassThroughValid(const wchar_t wch) noexcept return wch >= AsciiChars::SPC && wch < AsciiChars::DEL; } +// Routine Description: +// - Determines if a character is "start of string" beginning +// indicator. +// Arguments: +// - wch - Character to check. +// Return Value: +// - True if it is. False if it isn't. +static constexpr bool _isSosIndicator(const wchar_t wch) noexcept +{ + return wch == L'X'; // 0x58 +} + +// Routine Description: +// - Determines if a character is "private message" beginning +// indicator. +// Arguments: +// - wch - Character to check. +// Return Value: +// - True if it is. False if it isn't. +static constexpr bool _isPmIndicator(const wchar_t wch) noexcept +{ + return wch == L'^'; // 0x5E +} + +// Routine Description: +// - Determines if a character is "application program command" beginning +// indicator. +// Arguments: +// - wch - Character to check. +// Return Value: +// - True if it is. False if it isn't. +static constexpr bool _isApcIndicator(const wchar_t wch) noexcept +{ + return wch == L'_'; // 0x5F +} + // Routine Description: // - Determines if a character indicates an action that should be taken in the ground state - // These are C0 characters and the C1 [single-character] CSI. @@ -367,7 +368,7 @@ static constexpr bool _isDcsPassThroughValid(const wchar_t wch) noexcept // - True if it is. False if it isn't. static constexpr bool _isActionableFromGround(const wchar_t wch) noexcept { - return (wch <= AsciiChars::US) || _isC1Csi(wch) || _isC1Dcs(wch) || _isDelete(wch); + return (wch <= AsciiChars::US) || _isC1ControlCharacter(wch) || _isDelete(wch); } #pragma warning(pop) @@ -926,12 +927,42 @@ void StateMachine::_EnterDcsTermination() noexcept _trace.TraceStateChange(L"DcsTermination"); } +// Routine Description: +// - Moves the state machine into the SosPmApcString state. +// This state is entered: +// 1. When the Sos character is seen after an Escape entry +// 2. When the Pm character is seen after an Escape entry +// 3. When the Apc character is seen after an Escape entry +// Arguments: +// - +// Return Value: +// - +void StateMachine::_EnterSosPmApcString() noexcept +{ + _state = VTStates::SosPmApcString; + _trace.TraceStateChange(L"SosPmApcString"); +} + +// Routine Description: +// - Moves the state machine into the SosPmApcStringTermination state. +// This state is entered: +// 1. When an ESC is seen in a SOS/PM/APC string. This escape will be followed by a +// '\', as to encode a 0x9C as a 7-bit ASCII char stream. +// Arguments: +// - +// Return Value: +// - +void StateMachine::_EnterSosPmApcTermination() noexcept +{ + _state = VTStates::SosPmApcTermination; + _trace.TraceStateChange(L"SosPmApcStringTermination"); +} + // Routine Description: // - Processes a character event into an Action that occurs while in the Ground state. // Events in this state will: // 1. Execute C0 control characters -// 2. Handle a C1 Control Sequence Introducer -// 3. Print all other characters +// 2. Print all other characters // Arguments: // - wch - Character that triggered the event // Return Value: @@ -943,14 +974,6 @@ void StateMachine::_EventGround(const wchar_t wch) { _ActionExecute(wch); } - else if (_isC1Csi(wch) && _isInAnsiMode) - { - _EnterCsiEntry(); - } - else if (_isC1Dcs(wch) && _isInAnsiMode) - { - _EnterDcsEntry(); - } else { _ActionPrint(wch); @@ -1019,6 +1042,10 @@ void StateMachine::_EventEscape(const wchar_t wch) { _EnterDcsEntry(); } + else if (_isSosIndicator(wch) || _isPmIndicator(wch) || _isApcIndicator(wch)) + { + _EnterSosPmApcString(); + } else { _ActionEscDispatch(wch); @@ -1299,7 +1326,7 @@ void StateMachine::_EventOscString(const wchar_t wch) _ActionOscDispatch(wch); _EnterGround(); } - else if (_isOscTerminationInitiator(wch)) + else if (_isEscape(wch)) { _EnterOscTermination(); } @@ -1322,13 +1349,6 @@ void StateMachine::_EventOscString(const wchar_t wch) // - wch - Character that triggered the event // Return Value: // - -void StateMachine::_EventOscTermination(const wchar_t wch) -{ - _trace.TraceOnEvent(L"OscTermination"); - - _ActionOscDispatch(wch); - _EnterGround(); -} // Routine Description: // - Processes a character event into an Action that occurs while in the Ss3Entry state. @@ -1497,24 +1517,16 @@ void StateMachine::_EventDcsEntry(const wchar_t wch) // Routine Description: // - Processes a character event into an Action that occurs while in the DcsIgnore state. -// Events in this state will: -// 1. Enter ground on a String terminator -// 2. Ignore everything else. +// In this state the entire DCS string is considered invalid and we will ignore everything. +// The termination state is handled outside when an ESC is seen. // Arguments: // - wch - Character that triggered the event // Return Value: // - -void StateMachine::_EventDcsIgnore(const wchar_t wch) noexcept +void StateMachine::_EventDcsIgnore() noexcept { _trace.TraceOnEvent(L"DcsIgnore"); - if (_isStringTerminator(wch)) - { - _EnterGround(); - } - else - { - _ActionIgnore(); - } + _ActionIgnore(); } // Routine Description: @@ -1603,10 +1615,9 @@ void StateMachine::_EventDcsParam(const wchar_t wch) // Routine Description: // - Processes a character event into an Action that occurs while in the DcsPassThrough state. // Events in this state will: -// 1. Enter ground on a String terminator -// 2. Pass through if character is valid. -// 3. If we see a ESC, enter the DcsTermination state. -// 4. Ignore everything else. +// 1. Pass through if character is valid. +// 2. If we see a ESC, enter the DcsTermination state. +// 3. Ignore everything else. // Arguments: // - wch - Character that triggered the event // Return Value: @@ -1614,16 +1625,11 @@ void StateMachine::_EventDcsParam(const wchar_t wch) void StateMachine::_EventDcsPassThrough(const wchar_t wch) { _trace.TraceOnEvent(L"DcsPassThrough"); - if (_isStringTerminator(wch)) - { - // TODO:GH#7316: The Dcs sequence has successfully terminated. This is where we'd be dispatching the DCS command. - _EnterGround(); - } if (_isC0Code(wch) || _isDcsPassThroughValid(wch)) { _ActionDcsPassThrough(wch); } - else if (_isDcsTerminationInitiator(wch)) + else if (_isEscape(wch)) { _EnterDcsTermination(); } @@ -1634,21 +1640,52 @@ void StateMachine::_EventDcsPassThrough(const wchar_t wch) } // Routine Description: -// - Handle the two-character termination of a DCS sequence. +// - Handle SOS/PM/APC string. // Events in this state will: -// 1. Enter ground on a string terminator -// 2. Pass on everything else as the start of a regular escape sequence +// 1. If we see a ESC, enter the SosPmApcTermination state. +// 2. Ignore everything else. // Arguments: // - wch - Character that triggered the event // Return Value: // - -void StateMachine::_EventDcsTermination(const wchar_t wch) +void StateMachine::_EventSosPmApcString(const wchar_t wch) noexcept { - _trace.TraceOnEvent(L"DcsTermination"); + _trace.TraceOnEvent(L"SosPmApcString"); + if (_isEscape(wch)) + { + _EnterSosPmApcTermination(); + } + else + { + _ActionIgnore(); + } +} +// Routine Description: +// - Handle "Variable Length String" termination. +// Events in this state will: +// 1. Trigger the corresponding action and enter ground if we see a string terminator, +// 2. Otherwise treat this as a normal escape character event. +// Arguments: +// - wch - Character that triggered the event +// Return Value: +// - +void StateMachine::_EventVariableLengthStringTermination(const wchar_t wch) +{ if (_isStringTerminatorIndicator(wch)) { - // TODO: The Dcs sequence has successfully terminated. This is where we'd be dispatching the DCS command. + if (_state == VTStates::OscTermination) + { + _ActionOscDispatch(wch); + } + else if (_state == VTStates::DcsTermination) + { + // TODO:GH#7316: The Dcs sequence has successfully terminated. This is where we'd be dispatching the DCS command. + } + else if (_state == VTStates::SosPmApcTermination) + { + // We don't support any SOS/PM/APC control string yet. + } _EnterGround(); } else @@ -1680,12 +1717,40 @@ void StateMachine::ProcessCharacter(const wchar_t wch) _ActionExecute(wch); _EnterGround(); } - else if (_isEscape(wch) && _state != VTStates::OscString && _state != VTStates::DcsPassThrough) + // Preprocess C1 control characters and treat them as ESC + their 7-bit equivalent. + else if (_isC1ControlCharacter(wch)) + { + // When we are in "Variable Length String" state, a C1 control character + // should effectively acts as an ESC and move us into the corresponding + // termination state. + if (_IsVariableLengthStringState()) + { + if (_state == VTStates::OscString) + { + _EnterOscTermination(); + } + else if (_state == VTStates::DcsPassThrough) + { + _EnterDcsTermination(); + } + else if (_state == VTStates::SosPmApcString) + { + _EnterSosPmApcTermination(); + } + + _EventVariableLengthStringTermination(_c1To7Bit(wch)); + } + // Enter Escape state and pass the converted 7-bit character. + else + { + _EnterEscape(); + _EventEscape(_c1To7Bit(wch)); + } + } + // Don't go to escape from the "Variable Length String" state - ESC (and C1 String Terminator) + // can be used to terminate variable length control string. + else if (_isEscape(wch) && !_IsVariableLengthStringState()) { - // Don't go to escape from the OSC string state - ESC can be used to - // terminate OSC strings. - // - // Same for DCS pass through state. _EnterEscape(); } else @@ -1712,7 +1777,7 @@ void StateMachine::ProcessCharacter(const wchar_t wch) case VTStates::OscString: return _EventOscString(wch); case VTStates::OscTermination: - return _EventOscTermination(wch); + return _EventVariableLengthStringTermination(wch); case VTStates::Ss3Entry: return _EventSs3Entry(wch); case VTStates::Ss3Param: @@ -1722,7 +1787,7 @@ void StateMachine::ProcessCharacter(const wchar_t wch) case VTStates::DcsEntry: return _EventDcsEntry(wch); case VTStates::DcsIgnore: - return _EventDcsIgnore(wch); + return _EventDcsIgnore(); case VTStates::DcsIntermediate: return _EventDcsIntermediate(wch); case VTStates::DcsParam: @@ -1730,7 +1795,11 @@ void StateMachine::ProcessCharacter(const wchar_t wch) case VTStates::DcsPassThrough: return _EventDcsPassThrough(wch); case VTStates::DcsTermination: - return _EventDcsTermination(wch); + return _EventVariableLengthStringTermination(wch); + case VTStates::SosPmApcString: + return _EventSosPmApcString(wch); + case VTStates::SosPmApcTermination: + return _EventVariableLengthStringTermination(wch); default: return; } @@ -1952,3 +2021,16 @@ void StateMachine::_AccumulateTo(const wchar_t wch, size_t& value) noexcept value = MAX_PARAMETER_VALUE; } } + +// Routine Description: +// - Determines if the engine is in "Variable Length String" state, which is a combination +// of all states that are expecting a string that has a undetermined length. +// +// Arguments: +// - +// Return Value: +// - True if it is. False if it isn't. +const bool StateMachine::_IsVariableLengthStringState() const noexcept +{ + return _state == VTStates::OscString || _state == VTStates::DcsPassThrough || _state == VTStates::SosPmApcString; +} diff --git a/src/terminal/parser/stateMachine.hpp b/src/terminal/parser/stateMachine.hpp index 03d134dfc..7c82061e0 100644 --- a/src/terminal/parser/stateMachine.hpp +++ b/src/terminal/parser/stateMachine.hpp @@ -86,6 +86,8 @@ namespace Microsoft::Console::VirtualTerminal void _EnterDcsIntermediate() noexcept; void _EnterDcsPassThrough() noexcept; void _EnterDcsTermination() noexcept; + void _EnterSosPmApcString() noexcept; + void _EnterSosPmApcTermination() noexcept; void _EventGround(const wchar_t wch); void _EventEscape(const wchar_t wch); @@ -96,18 +98,19 @@ namespace Microsoft::Console::VirtualTerminal void _EventCsiParam(const wchar_t wch); void _EventOscParam(const wchar_t wch) noexcept; void _EventOscString(const wchar_t wch); - void _EventOscTermination(const wchar_t wch); void _EventSs3Entry(const wchar_t wch); void _EventSs3Param(const wchar_t wch); void _EventVt52Param(const wchar_t wch); void _EventDcsEntry(const wchar_t wch); - void _EventDcsIgnore(const wchar_t wch) noexcept; + void _EventDcsIgnore() noexcept; void _EventDcsIntermediate(const wchar_t wch); void _EventDcsParam(const wchar_t wch); void _EventDcsPassThrough(const wchar_t wch); - void _EventDcsTermination(const wchar_t wch); + void _EventSosPmApcString(const wchar_t wch) noexcept; + void _EventVariableLengthStringTermination(const wchar_t wch); void _AccumulateTo(const wchar_t wch, size_t& value) noexcept; + const bool _IsVariableLengthStringState() const noexcept; enum class VTStates { @@ -129,7 +132,9 @@ namespace Microsoft::Console::VirtualTerminal DcsIntermediate, DcsParam, DcsPassThrough, - DcsTermination + DcsTermination, + SosPmApcString, + SosPmApcTermination }; Microsoft::Console::VirtualTerminal::ParserTracing _trace; diff --git a/src/terminal/parser/ut_parser/OutputEngineTest.cpp b/src/terminal/parser/ut_parser/OutputEngineTest.cpp index aafb0cafb..f93d45442 100644 --- a/src/terminal/parser/ut_parser/OutputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/OutputEngineTest.cpp @@ -56,7 +56,7 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final TEST_METHOD(TestEscapePath) { BEGIN_TEST_METHOD_PROPERTIES() - TEST_METHOD_PROPERTY(L"Data:uiTest", L"{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}") // one value for each type of state test below. + TEST_METHOD_PROPERTY(L"Data:uiTest", L"{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}") // one value for each type of state test below. END_TEST_METHOD_PROPERTIES() size_t uiTest; @@ -66,7 +66,7 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final StateMachine mach(std::move(engine)); // The OscString state shouldn't escape out after an ESC. - // Same for DcsPassThrough state. + // Same for DcsPassThrough and SosPmApcString state. bool shouldEscapeOut = true; switch (uiTest) @@ -181,6 +181,19 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final mach._state = StateMachine::VTStates::DcsTermination; break; } + case 18: + { + Log::Comment(L"Escape from SosPmApcString"); + shouldEscapeOut = false; + mach._state = StateMachine::VTStates::SosPmApcString; + break; + } + case 19: + { + Log::Comment(L"Escape from SosPmApcTermination"); + mach._state = StateMachine::VTStates::SosPmApcTermination; + break; + } } mach.ProcessCharacter(AsciiChars::ESC); @@ -405,6 +418,19 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); } + TEST_METHOD(TestC1Osc) + { + auto dispatch = std::make_unique(); + auto engine = std::make_unique(std::move(dispatch)); + StateMachine mach(std::move(engine)); + + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + mach.ProcessCharacter(L'\x9d'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscParam); + mach.ProcessCharacter(AsciiChars::BEL); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + } + TEST_METHOD(TestOscStringSimple) { auto dispatch = std::make_unique(); @@ -596,6 +622,35 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); } + TEST_METHOD(TestOscStringInvalidTermination) + { + auto dispatch = std::make_unique(); + auto engine = std::make_unique(std::move(dispatch)); + StateMachine mach(std::move(engine)); + + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L']'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscParam); + mach.ProcessCharacter(L'1'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscParam); + mach.ProcessCharacter(L';'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscString); + mach.ProcessCharacter(L's'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscString); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscTermination); + mach.ProcessCharacter(L'['); // This is not a string terminator. + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiEntry); + mach.ProcessCharacter(L'4'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiParam); + mach.ProcessCharacter(L';'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiParam); + mach.ProcessCharacter(L'm'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + } + TEST_METHOD(TestDcsEntry) { auto dispatch = std::make_unique(); @@ -752,6 +807,143 @@ class Microsoft::Console::VirtualTerminal::OutputEngineTest final mach.ProcessCharacter(L'\\'); VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); } + + TEST_METHOD(TestDcsInvalidTermination) + { + auto dispatch = std::make_unique(); + auto engine = std::make_unique(std::move(dispatch)); + StateMachine mach(std::move(engine)); + + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'P'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsEntry); + mach.ProcessCharacter(L'q'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsPassThrough); + mach.ProcessCharacter(L'#'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsPassThrough); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsTermination); + mach.ProcessCharacter(L'['); // This is not a string terminator. + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiEntry); + mach.ProcessCharacter(L'4'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiParam); + mach.ProcessCharacter(L';'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::CsiParam); + mach.ProcessCharacter(L'm'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + } + + TEST_METHOD(TestSosPmApcString) + { + auto dispatch = std::make_unique(); + auto engine = std::make_unique(std::move(dispatch)); + StateMachine mach(std::move(engine)); + + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'X'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'1'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'2'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcTermination); + mach.ProcessCharacter(L'\\'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'^'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'3'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'4'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcTermination); + mach.ProcessCharacter(L'\\'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'_'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'5'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'6'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcTermination); + mach.ProcessCharacter(L'\\'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + } + + TEST_METHOD(TestC1StringTerminator) + { + auto dispatch = std::make_unique(); + auto engine = std::make_unique(std::move(dispatch)); + StateMachine mach(std::move(engine)); + + // C1 ST should terminate OSC string. + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L']'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscParam); + mach.ProcessCharacter(L'1'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscParam); + mach.ProcessCharacter(L';'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscString); + mach.ProcessCharacter(L's'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::OscString); + mach.ProcessCharacter(L'\x9c'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + // C1 ST should terminate DCS passthrough string. + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'P'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsEntry); + mach.ProcessCharacter(L'q'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsPassThrough); + mach.ProcessCharacter(L'#'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::DcsPassThrough); + mach.ProcessCharacter(L'1'); + mach.ProcessCharacter(L'\x9c'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + // C1 ST should terminate SOS/PM/APC string. + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'X'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'1'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'\x9c'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'^'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'2'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'\x9c'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + + mach.ProcessCharacter(AsciiChars::ESC); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Escape); + mach.ProcessCharacter(L'_'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'3'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::SosPmApcString); + mach.ProcessCharacter(L'\x9c'); + VERIFY_ARE_EQUAL(mach._state, StateMachine::VTStates::Ground); + } }; class StatefulDispatch final : public TermDispatch From 5d823f538c685cbcf238a80c0163f7375d72c5ad Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Thu, 17 Sep 2020 09:38:01 -0700 Subject: [PATCH 3/7] Replace the "user docs" with references to the real docs (#7649) --- doc/cascadia/SettingsSchema.md | 212 +------- .../custom-icon-and-background-image.jpg | Bin 138399 -> 0 bytes doc/user-docs/ThirdPartyToolProfiles.md | 80 ++- doc/user-docs/UsingCommandlineArguments.md | 202 +------- doc/user-docs/UsingJsonSettings.md | 484 +----------------- doc/user-docs/index.md | 92 +--- 6 files changed, 41 insertions(+), 1029 deletions(-) delete mode 100644 doc/images/custom-icon-and-background-image.jpg diff --git a/doc/cascadia/SettingsSchema.md b/doc/cascadia/SettingsSchema.md index 6f5288910..e34b5ba0d 100644 --- a/doc/cascadia/SettingsSchema.md +++ b/doc/cascadia/SettingsSchema.md @@ -1,211 +1 @@ -# Settings.json Documentation - -## Globals - -Properties listed below affect the entire window, regardless of the profile settings. - -| Property | Necessity | Type | Default | Description | -| -------- | --------- | ---- | ------- | ----------- | -| `alwaysShowTabs` | _Required_ | Boolean | `true` | When set to `true`, tabs are always displayed. When set to `false` and `showTabsInTitlebar` is set to `false`, tabs only appear after typing Ctrl + T. | -| `copyOnSelect` | Optional | Boolean | `false` | When set to `true`, a selection is immediately copied to your clipboard upon creation. When set to `false`, the selection persists and awaits further action. | -| `copyFormatting` | Optional | Boolean, Array | `true` | When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied. | -| `largePasteWarning` | Optional | Boolean | `true` | When set to `true`, trying to paste text with more than 5 KiB of characters will display a warning asking you whether to continue or not with the paste. | -| `multiLinePasteWarning` | Optional | Boolean | `true` | When set to `true`, trying to paste text with a _new line_ character will display a warning asking you whether to continue or not with the paste. | -| `defaultProfile` | _Required_ | String | PowerShell guid | Sets the default profile. Opens by typing Ctrl + T or by clicking the '+' icon. The guid of the desired default profile is used as the value. | -| `initialCols` | _Required_ | Integer | `120` | The number of columns displayed in the window upon first load. | -| `initialPosition` | Optional | String | `","` | The position of the top left corner of the window upon first load. On a system with multiple displays, these coordinates are relative to the top left of the primary display. If `launchMode` is set to `"maximized"`, the window will be maximized on the monitor specified by those coordinates. | -| `initialRows` | _Required_ | Integer | `30` | The number of rows displayed in the window upon first load. | -| `launchMode` | Optional | String | `default` | Defines whether the Terminal will launch as maximized or not. Possible values: `"default"`, `"maximized"` | -| `theme` | _Required_ | String | `system` | Sets the theme of the application. Possible values: `"light"`, `"dark"`, `"system"` | -| `showTerminalTitleInTitlebar` | _Required_ | Boolean | `true` | When set to `true`, titlebar displays the title of the selected tab. When set to `false`, titlebar displays "Windows Terminal". | -| `showTabsInTitlebar` | Optional | Boolean | `true` | When set to `true`, the tabs are moved into the titlebar and the titlebar disappears. When set to `false`, the titlebar sits above the tabs. | -| `snapToGridOnResize` | Optional | Boolean | `false` | When set to `true`, the window will snap to the nearest character boundary on resize. When `false`, the window will resize "smoothly" | -| `tabWidthMode` | Optional | String | `equal` | Sets the width of the tabs. Possible values:
  • `"equal"`: sizes each tab to the same width
  • `"titleLength"`: sizes each tab to the length of its title
  • `"compact"`: sizes each tab to the length of its title when focused, and shrinks to the size of only the icon when the tab is unfocused.
| -| `wordDelimiters` | Optional | String |  /\()"'-:,.;<>~!@#$%^&*|+=[]{}~?│
_(`│` is `U+2502 BOX DRAWINGS LIGHT VERTICAL`)_ | Determines the delimiters used in a double click selection. | -| `confirmCloseAllTabs` | Optional | Boolean | `true` | When set to `true` closing a window with multiple tabs open WILL require confirmation. When set to `false` closing a window with multiple tabs open WILL NOT require confirmation. | -| `startOnUserLogin` | Optional | Boolean | `false` | When set to `true` enables the launch of Windows Terminal at startup. Setting to `false` will disable the startup task entry. Note: if the Windows Terminal startup task entry is disabled either by org policy or by user action this setting will have no effect. | -| `disabledProfileSources` | Optional | Array[String] | `[]` | Disables all the dynamic profile generators in this list, preventing them from adding their profiles to the list of profiles on startup. This array can contain any combination of `Windows.Terminal.Wsl`, `Windows.Terminal.Azure`, or `Windows.Terminal.PowershellCore`. For more information, see [UsingJsonSettings.md](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md#dynamic-profiles) | -| `experimental.rendering.forceFullRepaint` | Optional | Boolean | `false` | When set to true, we will redraw the entire screen each frame. When set to false, we will render only the updates to the screen between frames. | -| `experimental.rendering.software` | Optional | Boolean | `false` | When set to true, we will use the software renderer (a.k.a. WARP) instead of the hardware one. | - -## Profiles - -Properties listed below are specific to each unique profile. - -| Property | Necessity | Type | Default | Description | -| -------- | --------- | ---- | ------- | ----------- | -| `guid` | _Required_ | String | | Unique identifier of the profile. Written in registry format: `"{00000000-0000-0000-0000-000000000000}"`. | -| `name` | _Required_ | String | | Name of the profile. Displays in the dropdown menu.
Additionally, this value will be used as the "title" to pass to the shell on startup. Some shells (like `bash`) may choose to ignore this initial value, while others (`cmd`, `powershell`) may use this value over the lifetime of the application. This "title" behavior can be overridden by using `tabTitle`. | -| `acrylicOpacity` | Optional | Number | `0.5` | When `useAcrylic` is set to `true`, it sets the transparency of the window for the profile. Accepts floating point values from 0-1. | -| `antialiasingMode` | Optional | String | `"grayscale"` | Controls how text is antialiased in the renderer. Possible values are "grayscale", "cleartype" and "aliased". Note that changing this setting will require starting a new terminal instance. | -| `background` | Optional | String | | Sets the background color of the profile. Overrides `background` set in color scheme if `colorscheme` is set. Uses hex color format: `"#rrggbb"`. | -| `backgroundImage` | Optional | String | | Sets the file location of the Image to draw over the window background. | -| `backgroundImageAlignment` | Optional | String | `center` | Sets how the background image aligns to the boundaries of the window. Possible values: `"center"`, `"left"`, `"top"`, `"right"`, `"bottom"`, `"topLeft"`, `"topRight"`, `"bottomLeft"`, `"bottomRight"` | -| `backgroundImageOpacity` | Optional | Number | `1.0` | Sets the transparency of the background image. Accepts floating point values from 0-1. | -| `backgroundImageStretchMode` | Optional | String | `uniformToFill` | Sets how the background image is resized to fill the window. Possible values: `"none"`, `"fill"`, `"uniform"`, `"uniformToFill"` | -| `closeOnExit` | Optional | String | `graceful` | Sets how the profile reacts to termination or failure to launch. Possible values: `"graceful"` (close when `exit` is typed or the process exits normally), `"always"` (always close) and `"never"` (never close). `true` and `false` are accepted as synonyms for `"graceful"` and `"never"` respectively. | -| `colorScheme` | Optional | String | `Campbell` | Name of the terminal color scheme to use. Color schemes are defined under `schemes`. | -| `commandline` | Optional | String | | Executable used in the profile. | -| `cursorColor` | Optional | String | | Sets the cursor color of the profile. Overrides `cursorColor` set in color scheme if `colorscheme` is set. Uses hex color format: `"#rrggbb"`. | -| `cursorHeight` | Optional | Integer | | Sets the percentage height of the cursor starting from the bottom. Only works when `cursorShape` is set to `"vintage"`. Accepts values from 25-100. | -| `cursorShape` | Optional | String | `bar` | Sets the cursor shape for the profile. Possible values: `"vintage"` ( ▃ ), `"bar"` ( ┃ ), `"underscore"` ( ▁ ), `"filledBox"` ( █ ), `"emptyBox"` ( ▯ ) | -| `fontFace` | Optional | String | `Cascadia Mono` | Name of the font face used in the profile. We will try to fallback to Consolas if this can't be found or is invalid. | -| `fontSize` | Optional | Integer | `12` | Sets the font size. | -| `fontWeight` | Optional | String | `normal` | Sets the weight (lightness or heaviness of the strokes) for the given font. Possible values: `"thin"`, `"extra-light"`, `"light"`, `"semi-light"`, `"normal"`, `"medium"`, `"semi-bold"`, `"bold"`, `"extra-bold"`, `"black"`, `"extra-black"`, or the corresponding numeric representation of OpenType font weight. | -| `foreground` | Optional | String | | Sets the foreground color of the profile. Overrides `foreground` set in color scheme if `colorscheme` is set. Uses hex color format: `#rgb` or `"#rrggbb"`. | -| `hidden` | Optional | Boolean | `false` | If set to true, the profile will not appear in the list of profiles. This can be used to hide default profiles and dynamically generated profiles, while leaving them in your settings file. | -| `historySize` | Optional | Integer | `9001` | The number of lines above the ones displayed in the window you can scroll back to. | -| `icon` | Optional | String | | Image file location of the icon used in the profile. Displays within the tab and the dropdown menu. | -| `padding` | Optional | String | `8, 8, 8, 8` | Sets the padding around the text within the window. Can have three different formats: `"#"` sets the same padding for all sides, `"#, #"` sets the same padding for left-right and top-bottom, and `"#, #, #, #"` sets the padding individually for left, top, right, and bottom. | -| `scrollbarState` | Optional | String | `"visible"` | Defines the visibility of the scrollbar. Possible values: `"visible"`, `"hidden"` | -| `selectionBackground` | Optional | String | | Sets the selection background color of the profile. Overrides `selectionBackground` set in color scheme if `colorscheme` is set. Uses hex color format: `"#rrggbb"`. | -| `snapOnInput` | Optional | Boolean | `true` | When set to `true`, the window will scroll to the command input line when typing. When set to `false`, the window will not scroll when you start typing. | -| `altGrAliasing` | Optional | Boolean | `true` | By default Windows treats Ctrl+Alt as an alias for AltGr. When altGrAliasing is set to false, this behavior will be disabled. | -| `source` | Optional | String | | Stores the name of the profile generator that originated this profile. _There are no discoverable values for this field._ | -| `startingDirectory` | Optional | String | `%USERPROFILE%` | The directory the shell starts in when it is loaded. | -| `suppressApplicationTitle` | Optional | Boolean | `false` | When set to `true`, `tabTitle` overrides the default title of the tab and any title change messages from the application will be suppressed. When set to `false`, `tabTitle` behaves as normal. | -| `tabTitle` | Optional | String | | If set, will replace the `name` as the title to pass to the shell on startup. Some shells (like `bash`) may choose to ignore this initial value, while others (`cmd`, `powershell`) may use this value over the lifetime of the application. | -| `useAcrylic` | Optional | Boolean | `false` | When set to `true`, the window will have an acrylic background. When set to `false`, the window will have a plain, untextured background. The transparency only applies to focused windows due to OS limitation. | -| `experimental.retroTerminalEffect` | Optional | Boolean | `false` | When set to `true`, enable retro terminal effects. This is an experimental feature, and its continued existence is not guaranteed. | - -## Schemes - -Properties listed below are specific to each color scheme. [ColorTool](https://github.com/microsoft/terminal/tree/master/src/tools/ColorTool) is a great tool you can use to create and explore new color schemes. All colors use hex color format. - -| Property | Necessity | Type | Description | -| -------- | ---- | ----------- | ----------- | -| `name` | _Required_ | String | Name of the color scheme. | -| `foreground` | _Required_ | String | Sets the foreground color of the color scheme. | -| `background` | _Required_ | String | Sets the background color of the color scheme. | -| `selectionBackground` | Optional | String | Sets the selection background color of the color scheme. | -| `cursorColor` | Optional | String | Sets the cursor color of the color scheme. | -| `black` | _Required_ | String | Sets the color used as ANSI black. | -| `blue` | _Required_ | String | Sets the color used as ANSI blue. | -| `brightBlack` | _Required_ | String | Sets the color used as ANSI bright black. | -| `brightBlue` | _Required_ | String | Sets the color used as ANSI bright blue. | -| `brightCyan` | _Required_ | String | Sets the color used as ANSI bright cyan. | -| `brightGreen` | _Required_ | String | Sets the color used as ANSI bright green. | -| `brightPurple` | _Required_ | String | Sets the color used as ANSI bright purple. | -| `brightRed` | _Required_ | String | Sets the color used as ANSI bright red. | -| `brightWhite` | _Required_ | String | Sets the color used as ANSI bright white. | -| `brightYellow` | _Required_ | String | Sets the color used as ANSI bright yellow. | -| `cyan` | _Required_ | String | Sets the color used as ANSI cyan. | -| `green` | _Required_ | String | Sets the color used as ANSI green. | -| `purple` | _Required_ | String | Sets the color used as ANSI purple. | -| `red` | _Required_ | String | Sets the color used as ANSI red. | -| `white` | _Required_ | String | Sets the color used as ANSI white. | -| `yellow` | _Required_ | String | Sets the color used as ANSI yellow. | - -## Keybindings - -Properties listed below are specific to each custom key binding. - -| Property | Necessity | Type | Description | -| -------- | ---- | ----------- | ----------- | -| `command` | _Required_ | String | The command executed when the associated key bindings are pressed. | -| `keys` | _Required_ | Array[String] or String | Defines the key combinations used to call the command. | -| `action` | Optional | String | Adds additional functionality to certain commands. | - -### Implemented Commands and Actions - -Commands listed below are per the implementation in [`src/cascadia/TerminalApp/AppKeyBindingsSerialization.cpp`](https://github.com/microsoft/terminal/blob/master/src/cascadia/TerminalApp/AppKeyBindingsSerialization.cpp). - -Keybindings can be structured in the following manners: - -For commands without arguments: -
-`{ "command": "commandName", "keys": [ "modifiers+key" ] }` - -For commands with arguments: -
-`{ "command": { "action": "commandName", "argument": "value" }, "keys": ["modifiers+key"] }` - -| Command | Command Description | Action (*=required) | Action Arguments | Argument Descriptions | -| ------- | ------------------- | ------ | ---------------- | ----------------- | -| `adjustFontSize` | Change the text size by a specified point amount. | `delta` | integer | Amount of size change per command invocation. | -| `closePane` | Close the active pane. | | | | -| `closeTab` | Close the current tab. | | | | -| `closeWindow` | Close the current window and all tabs within it. | | | | -| `copy` | Copy the selected terminal content to your Windows Clipboard. | 1. `singleLine`
2. `copyFormatting` | 1. boolean
2. boolean, array | 1. When `true`, the copied content will be copied as a single line. When `false`, newlines persist from the selected text.
2. When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied. Not setting this value inherits the behavior of the `copyFormatting` global setting. | -| `duplicateTab` | Make a copy and open the current tab. | | | | -| `find` | Open the search dialog box. | | | | -| `moveFocus` | Focus on a different pane depending on direction. | `direction`* | `left`, `right`, `up`, `down` | Direction in which the focus will move. | -| `newTab` | Create a new tab. Without any arguments, this will open the default profile in a new tab. | 1. `commandLine`
2. `startingDirectory`
3. `tabTitle`
4. `index`
5. `profile` | 1. string
2. string
3. string
4. integer
5. string | 1. Executable run within the tab.
2. Directory in which the tab will open.
3. Title of the new tab.
4. Profile that will open based on its position in the dropdown (starting at 0).
5. Profile that will open based on its GUID or name. | -| `nextTab` | Open the tab to the right of the current one. | | | | -| `openNewTabDropdown` | Open the dropdown menu. | | | | -| `openSettings` | Open the settings file. | | | | -| `paste` | Insert the content that was copied onto the clipboard. | | | | -| `prevTab` | Open the tab to the left of the current one. | | | | -| `resetFontSize` | Reset the text size to the default value. | | | | -| `resizePane` | Change the size of the active pane. | `direction`* | `left`, `right`, `up`, `down` | Direction in which the pane will be resized. | -| `scrollDown` | Move the screen down. | | | | -| `scrollUp` | Move the screen up. | | | | -| `scrollUpPage` | Move the screen up a whole page. | | | | -| `scrollDownPage` | Move the screen down a whole page. | | | | -| `sendInput` | Sends some text input to the shell. | `input` | string | The text input to feed into the shell.
ANSI escape sequences may be used. Escape codes like `\x1b` must be written as `\u001b`.
For instance the input `"text\n"` will write "text" followed by a newline. `"\u001b[D"` will behave as if the left arrow button had been pressed. | -| `splitPane` | Halve the size of the active pane and open another. Without any arguments, this will open the default profile in the new pane. | 1. `split`*
2. `commandLine`
3. `startingDirectory`
4. `tabTitle`
5. `index`
6. `profile`
7. `splitMode` | 1. `vertical`, `horizontal`, `auto`
2. string
3. string
4. string
5. integer
6. string
7. string | 1. How the pane will split. `auto` will split in the direction that provides the most surface area.
2. Executable run within the pane.
3. Directory in which the pane will open.
4. Title of the tab when the new pane is focused.
5. Profile that will open based on its position in the dropdown (starting at 0).
6. Profile that will open based on its GUID or name.
7. Controls how the pane splits. Only accepts `duplicate` which will duplicate the focused pane's profile into a new pane. | -| `switchToTab` | Open a specific tab depending on index. | `index`* | integer | Tab that will open based on its position in the tab bar (starting at 0). | -| `toggleFullscreen` | Switch between fullscreen and default window sizes. | | | | -| `unbound` | Unbind the associated keys from any command. | | | | - -### Accepted Modifiers and Keys - -#### Modifiers -`ctrl+`, `shift+`, `alt+` - -#### Keys - -| Type | Keys | -| ---- | ---- | -| Function and Alphanumeric Keys | `f1-f24`, `a-z`, `0-9` | -| Symbols | ``` ` ```, `-`, `=`, `[`, `]`, `\`, `;`, `'`, `,`, `.`, `/` | -| Arrow Keys | `down`, `left`, `right`, `up`, `pagedown`, `pageup`, `pgdn`, `pgup`, `end`, `home`, `plus`, `app`, `menu` | -| Action Keys | `tab`, `enter`, `esc`, `escape`, `space`, `backspace`, `delete`, `insert` | -| Numpad Keys | `numpad_0-numpad_9`, `numpad0-numpad9`, `numpad_add`, `numpad_plus`, `numpad_decimal`, `numpad_period`, `numpad_divide`, `numpad_minus`, `numpad_subtract`, `numpad_multiply` | - -## Background Images and Icons - -Some Terminal settings allow you to specify custom background images and icons. It is recommended that custom images and icons are stored in system-provided folders and are referred to using the correct [URI Schemes](https://docs.microsoft.com/en-us/windows/uwp/app-resources/uri-schemes). URI Schemes provide a way to reference files independent of their physical paths (which may change in the future). - -The most useful URI schemes to remember when customizing background images and icons are: - -| URI Scheme | Corresponding Physical Path | Use / description | -| --- | --- | ---| -| `ms-appdata:///Local/` | `%localappdata%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\` | Per-machine files | -| `ms-appdata:///Roaming/` | `%localappdata%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\RoamingState\` | Common files | - -> ⚠ Note: Do not rely on file references using the `ms-appx` URI Scheme (i.e. icons). These files are considered an internal implementation detail and may change name/location or may be omitted in the future. - -### Icons - -Terminal displays icons for each of your profiles which Terminal generates for any built-in shells - PowerShell Core, PowerShell, and any installed Linux/WSL distros. Each profile refers to a stock icon via the `ms-appx` URI Scheme. - -> ⚠ Note: Do not rely on the files referenced by the `ms-appx` URI Scheme - they are considered an internal implementation detail and may change name/location or may be omitted in the future. - -You can refer to you own icons if you wish, e.g.: - -```json - "icon" : "C:\\Users\\richturn\\OneDrive\\WindowsTerminal\\icon-ubuntu-32.png", -``` - -> 👉 Tip: Icons should be sized to 32x32px in an appropriate raster image format (e.g. .PNG, .GIF, or .ICO) to avoid having to scale your icons during runtime (causing a noticeable delay and loss of quality.) - -### Custom Background Images - -You can apply a background image to each of your profiles, allowing you to configure/brand/style each of your profiles independently from one another if you wish. - -To do so, specify your preferred `backgroundImage`, position it using `backgroundImageAlignment`, set its opacity with `backgroundImageOpacity`, and/or specify how your image fill the available space using `backgroundImageStretchMode`. - -For example: -```json - "backgroundImage": "C:\\Users\\richturn\\OneDrive\\WindowsTerminal\\bg-ubuntu-256.png", - "backgroundImageAlignment": "bottomRight", - "backgroundImageOpacity": 0.1, - "backgroundImageStretchMode": "none" -``` - -> 👉 Tip: You can easily roam your collection of images and icons across all your machines by storing your icons and images in OneDrive (as shown above). - -With these settings, your Terminal's Ubuntu profile would look similar to this: - -![Custom icon and background image](../images/custom-icon-and-background-image.jpg) +⚠ This document has moved to [the Customize Settings section of the Windows Terminal documentation](https://docs.microsoft.com/windows/terminal/customize-settings/global-settings). diff --git a/doc/images/custom-icon-and-background-image.jpg b/doc/images/custom-icon-and-background-image.jpg deleted file mode 100644 index 540a8c7c7e2d3c7e4aa3bc6ba0320c5efb800b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138399 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�MXe-7oQ_R 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 NOTE: If you're running the Terminal built straight from the repo, you'll need -> to use `wtd.exe` and `wtd` instead of `wt.exe` and `wt`. - -1. [Commandline Reference](#Reference) -1. [Commandline Examples](#Examples) - -## Reference - -### Options - -#### `--help,-h,-?,/?,` - -Display the help message. - -## Subcommands - -#### `new-tab` - -`new-tab [terminal_parameters]` - -Opens a new tab with the given customizations. On its _first_ invocation, also -opens a new window. Subsequent `new-tab` commands will all open new tabs in the -same window. [[1](#footnote-1)] - -**Parameters**: - -* `[terminal_parameters]`: See [[terminal_parameters]](#terminal_parameters). - -#### `split-pane` - -`split-pane [-H,--horizontal|-V,--vertical] [terminal_parameters]` - -Creates a new pane in the currently focused tab by splitting the given pane -vertically or horizontally. [[1](#footnote-1)] - -**Parameters**: - -* `-H,--horizontal`, `-V,--vertical`: Used to indicate which direction to split - the pane. `-V` is "vertically" (think `[|]`), and `-H` is "horizontally" - (think `[-]`). If omitted, defaults to "auto", which splits the current pane - in whatever the larger dimension is. If both `-H` and `-V` are provided, - defaults to vertical. -* `[terminal_parameters]`: See [[terminal_parameters]](#terminal_parameters). - -#### `focus-tab` - -`focus-tab [--target,-t tab-index]|[--next,-n]|[--previous,-p]` - -Moves focus to a given tab. - -**Parameters**: - -* `--target,-t tab-index`: moves focus to the tab at index `tab-index`. If - omitted, defaults to `0` (the first tab). Will display an error if combined - with either of `--next` or `--previous`. -* `-n,--next`: Move focus to the next tab. Will display an error if combined - with either of `--previous` or `--target`. -* `-p,--previous`: Move focus to the previous tab. Will display an error if - combined with either of `--next` or `--target`. - -#### `[terminal_parameters]` - -Some of the preceding commands are used to create a new terminal instance. -These commands are listed above as accepting `[terminal_parameters]` as a -parameter. For these commands, `[terminal_parameters]` can be any of the -following: - -`[--profile,-p profile-name] [--startingDirectory,-d starting-directory] [commandline]` - -* `--profile,-p profile-name`: Use the given profile to open the new tab/pane, - where `profile-name` is the `name` or `guid` of a profile. If `profile-name` - does not match _any_ profiles, uses the default. -* `--startingDirectory,-d starting-directory`: Overrides the value of - `startingDirectory` of the specified profile, to start in `starting-directory` - instead. -* `commandline`: A commandline to replace the default commandline of the - selected profile. If the user wants to use a `;` in this commandline, it - should be escaped as `\;`. - -### Notes - -* [1]: If you try to run a `wt` commandline while running in a Windows Terminal window, the commandline will _always_ create a new window by default. Being able to run `wt` commandlines in the _current_ window is planned in the future - for more information, refer to [#4472]. - -## Examples - -### Open Windows Terminal in the current directory - -```powershell -wt -d . -``` - -This will launch a new Windows Terminal window in the current working directory. -It will use your default profile, but instead of using the `startingDirectory` -property from that it will use the current path. This is especially useful for -launching the Windows Terminal in a directory you currently have open in an -`explorer.exe` window. - -### Opening with multiple panes - -If you want to open with multiple panes in the same tab all at once, you can use -the `split-pane` command to create new panes. - -Consider the following commandline: - -```powershell -wt ; split-pane -p "Windows PowerShell" ; split-pane -H wsl.exe -``` - -This creates a new Windows Terminal window with one tab, and 3 panes: - -* `wt`: Creates the new tab with the default profile -* `split-pane -p "Windows PowerShell"`: This will create a new pane, split from - the parent with the default profile. This pane will open with the "Windows - PowerShell" profile -* `split-pane -H wsl.exe`: This will create a third pane, split _horizontally_ - from the "Windows PowerShell" pane. It will be running the default profile, - and will use `wsl.exe` as the commandline (instead of the default profile's - `commandline`). - - -### Using multiple commands from PowerShell - -The Windows Terminal uses the semicolon character `;` as a delimiter for -separating subcommands in the `wt` commandline. Unfortunately, `powershell` also -uses `;` as a command separator. To work around this you can use the following -tricks to help run multiple wt sub commands from powershell. In all the -following examples, we'll be creating a new Terminal window with three panes - -one running `cmd`, one with `powershell`, and a last one running `wsl`. - -In each of the following examples, we're using the `Start-Process` command to -run `wt`. For more information on why we're using `Start-Process`, see ["Using -`start`"](#using-start) below. - -#### Single quoted parameters (if you aren't calculating anything): - -In this example, we'll wrap all the parameters to `wt` in single quotes (`'`) - -```PowerShell -start wt 'new-tab "cmd"; split-pane -p "Windows PowerShell" ; split-pane -H wsl.exe' -``` - -#### Escaped quotes (if you need variables): - -If you'd like to pass a value contained in a variable to the `wt` commandline, -instead use the following syntax: - -```PowerShell -$ThirdPane = "wsl.exe" -start wt "new-tab cmd; split-pane -p `"Windows PowerShell`" ; split-pane -H $ThirdPane" -``` - -Note the usage of `` ` `` to escape the double-quotes (`"`) around "Windows -Powershell" in the `-p` parameter to the `split-pane` sub-command. - -#### Using `start` - -All the above examples explicitly used `start` to launch the Terminal. - -In the following examples, we're going to not use `start` to run the -commandline. Instead, we'll try two other methods of escaping the commandline: -* Only escaping the semicolons so that `powershell` will ignore them and pass - them straight to `wt`. -* Using `--%`, so powershell will treat the rest of the commandline as arguments - to the application. - -```PowerShell -wt new-tab "cmd" `; split-pane -p "Windows PowerShell" `; split-pane -H wsl.exe -``` - -```Powershell -wt --% new-tab cmd ; split-pane -p "Windows PowerShell" ; split-pane -H wsl.exe -``` - -In both these examples, the newly created Windows Terminal window will create -the window by correctly parsing all the provided commandline arguments. - -However, these methods are _not_ recommended currently, as Powershell will wait -for the newly-created Terminal window to be closed before returning control to -Powershell. By default, Powershell will always wait for Windows Store -applications (like the Windows Terminal) to close before returning to the -prompt. Note that this is different than the behavior of `cmd`, which will return -to the prompt immediately. See -[Powershell/PowerShell#9970](https://github.com/PowerShell/PowerShell/issues/9970) -for more details on this bug. - - -[#4023]: https://github.com/microsoft/terminal/pull/4023 -[#4472]: https://github.com/microsoft/terminal/issues/4472 +⚠ This document has moved to [Using command-line arguments for Windows Terminal](https://docs.microsoft.com/windows/terminal/command-line-arguments). diff --git a/doc/user-docs/UsingJsonSettings.md b/doc/user-docs/UsingJsonSettings.md index 5fab48d28..dc967085e 100644 --- a/doc/user-docs/UsingJsonSettings.md +++ b/doc/user-docs/UsingJsonSettings.md @@ -1,483 +1 @@ -# Editing Windows Terminal JSON Settings - -One way (currently the only way) to configure Windows Terminal is by editing the -`settings.json` settings file. At the time of writing you can open the settings -file in your default editor by selecting `Settings` from the WT pull down menu. - -The settings are stored in the file `$env:LocalAppData\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json`. - -As of [#2515](https://github.com/microsoft/terminal/pull/2515), the settings are -split into _two_ files: a hardcoded `defaults.json`, and `settings.json`, which -contains the user settings. Users should only be concerned with the contents of -the `settings.json`, which contains their customizations. The `defaults.json` -file is only provided as a reference of what the default settings are. For more -details on how these two files work, see [Settings -Layering](#settings-layering). To view the default settings file, click on the -"Settings" button while holding the Alt key. - -Details of specific settings can be found [here](../cascadia/SettingsSchema.md). -A general introduction is provided below. - -The settings are grouped under four headings: - -1. Global: Settings that apply to the whole application e.g. Default profile, initial size etc. -2. Key Bindings: Actually a sub field of the global settings, but worth discussing separately -3. Profiles: A group of settings to be applied to a tab when it is opened using that profile. E.g. shell to use, cursor shape etc. -4. Schemes: Sets of colors for background, text etc. that can be used by profiles - -## Global Settings - -These settings define startup defaults, and application-wide settings that might -not affect a particular terminal instance. - -* Theme -* Title Bar options -* Initial size -* Default profile used when the Windows Terminal is started - -Example settings include - -```json -{ - "defaultProfile" : "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}", - "initialCols" : 120, - "initialRows" : 50, - "theme" : "system", - "keybindings" : [] - ... -} -``` - -These global properties should exist in the root json object. - -## Key Bindings - -This is an array of key chords and shortcuts to invoke various commands. -Each command can have more than one key binding. - -> 👉 **Note**: Key bindings is a subfield of the global settings and -> key bindings apply to all profiles in the same manner. - -For example, here's a sample of the default keybindings: - -```json -{ - "keybindings": - [ - { "command": "closePane", "keys": ["ctrl+shift+w"] }, - { "command": "copy", "keys": ["ctrl+shift+c"] }, - { "command": "newTab", "keys": ["ctrl+shift+t"] }, - // etc. - ] -} -``` - -You can also use a single key chord string as the value of `"keys"`. -It will be treated as a chord of length one. -This will allow you to simplify the above snippet as follows: - -```json -{ - "keybindings": - [ - { "command": "closePane", "keys": "ctrl+shift+w" }, - { "command": "copy", "keys": "ctrl+shift+c" }, - { "command": "newTab", "keys": "ctrl+shift+t" }, - // etc. - ] -} -``` - -A list of default key bindings is available [here](https://github.com/microsoft/terminal/blob/master/src/cascadia/TerminalApp/defaults.json#L204). - -### Unbinding keys - -If you ever come across a key binding that you're unhappy with, it's possible to -easily change the keybindings. For example, vim uses Ctrl+^ as a -binding for "switch to previous buffer", which conflicts with the Terminal's -default keybinding for "open a new tab with the sixth profile". If you'd like to -unbind that keybinding, and allow the keystroke to fall through to vim, you can -add the following to your keybindings: - -```json -{ - "command" : null, "keys" : ["ctrl+shift+6"] -}, -``` - -This will _unbind_ Ctrl+Shift+6, allowing vim to use the keystroke -instead of the terminal. - -### Binding multiple keys - -You can have multiple key chords bound to the same action. To do this, simply -add multiple bindings for the same action. For example: - -```json - "keybindings" : - [ - { "command": "copy", "keys": "ctrl+shift+c" }, - { "command": "copy", "keys": "ctrl+c" }, - { "command": "copy", "keys": "enter" } - ] -``` - -In this snippet, all three of ctrl+shift+c, ctrl+c and enter are bound to `copy`. - -## Profiles - -A profile contains the settings applied when a new WT tab is opened. Each -profile is identified by a GUID and contains a number of other fields. - -> 👉 **Note**: The `guid` property is the unique identifier for a profile. If -> multiple profiles all have the same `guid` value, you may see unexpected -> behavior. - -* Which command to execute on startup - this can include arguments. -* Starting directory -* Which color scheme to use (see Schemes below) -* Font face and size -* Various settings to control appearance. E.g. Opacity, icon, cursor appearance, display name etc. -* Other behavioral settings. E.g. Close on exit, snap on input, ..... - -Example settings include - -```json - "closeOnExit" : true, - "colorScheme" : "Campbell", - "commandline" : "wsl.exe -d Debian", - "cursorColor" : "#FFFFFF", - "cursorShape" : "bar", - "fontFace" : "Hack", - "fontSize" : 9, - "guid" : "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}", - "name" : "Debian", - "startingDirectory" : "%USERPROFILE%\\wslhome" - .... -``` - -> 👉 **Note**: To use backslashes in any path field, you'll need to escape them following JSON escaping rules (like shown above). As an alternative, you can use forward slashes ("%USERPROFILE%/wslhome"). - -The profile GUID is used to reference the default profile in the global settings. - -The values for background image stretch mode are documented [here](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.stretch). - -### Hiding a profile - -If you want to remove a profile from the list of profiles in the new tab -dropdown, but keep the profile around in your `settings.json` file, you can add -the property `"hidden": true` to the profile's json. This can also be used to -remove the default `cmd` and PowerShell profiles, if the user does not wish to -see them. - -## Color Schemes - -Each scheme defines the color values to be used for various terminal escape sequences. -Each schema is identified by the name field. Examples include - -```json - "name" : "Campbell", - "background" : "#0C0C0C", - "black" : "#0C0C0C", - "blue" : "#0037DA", - "foreground" : "#F2F2F2", - "green" : "#13A10E", - "red" : "#C50F1F", - "white" : "#CCCCCC", - "yellow" : "#C19C00" - ... -``` - -The schema name can then be referenced in one or more profiles. - -## Settings layering - -The runtime settings are actually constructed from _three_ sources: - -* The default settings, which are hardcoded into the application, and available - in `defaults.json`. This includes the default keybindings, color schemes, and - profiles for both Windows PowerShell and Command Prompt (`cmd.exe`). -* Dynamic Profiles, which are generated at runtime. These include Powershell - Core, the Azure Cloud Shell connector, and profiles for and WSL distros. -* The user settings from `settings.json`. - -Settings from each of these sources are "layered" upon the settings from -previous sources. In this manner, the user settings in `settings.json` can -contain _only the changes from the default settings_. For example, if a user -would like to only change the color scheme of the default `cmd` profile to -"Solarized Dark", you could change your cmd profile to the following: - -```js - { - // Make changes here to the cmd.exe profile - "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", - "colorScheme": "Solarized Dark" - } -``` - -Here, we know we're changing the `cmd` profile, because the `guid` -`"{0caa0dad-35be-5f56-a8ff-afceeeaa6101}"` is `cmd`'s unique GUID. Any profiles -with that GUID will all be treated as the same object. Any changes in that -profile will overwrite those from the defaults. - -Similarly, you can overwrite settings from a color scheme by defining a color -scheme in `settings.json` with the same name as a default color scheme. - -If you'd like to unbind a keystroke that's bound to an action in the default -keybindings, you can set the `"command"` to `"unbound"` or `null`. This will -allow the keystroke to fallthrough to the commandline application instead of -performing the default action. - -### Dynamic Profiles - -When dynamic profiles are created at runtime, they'll be added to the -`settings.json` file. You can identify these profiles by the presence of a -`"source"` property. These profiles are tied to their source - if you uninstall -a linux distro, then the profile will remain in your `settings.json` file, but -the profile will be hidden. - -The Windows Terminal uses the `guid` property of these dynamically-generated -profiles to uniquely identify them. If you try to change the `guid` of a -dynamically-generated profile, the Terminal will automatically recreate a new -entry for that profile. - -If you'd like to disable a particular dynamic profile source, you can add that -`source` to the global `"disabledProfileSources"` array. For example, if you'd -like to hide all the WSL profiles, you could add the following setting: - -```json - - "disabledProfileSources": ["Windows.Terminal.WSL"], - ... - -``` - -> 👉 **NOTE**: On launch, if a dynamic profile generator is enabled, it will -> always add new profiles it detects to your list of profiles. If you delete a -> dynamically generated profile from your list of profiles, it will just get -> re-added the next time the Terminal is launched! To remove a dynamic profile -> from your list of profiles, make sure to set `"hidden": true` in the profile. - -### Default settings - -In [#2325](https://github.com/microsoft/terminal/issues/2325), we introduced the -concept of "Default Profile Settings". These are settings that will apply to all -of your profiles by default. Profiles can still override these settings -individually. With default profile settings, you can easily make changes to all -your profiles at once. For example, given the following settings: - -```json - "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "profiles": - [ - { - "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "name": "Windows PowerShell", - "commandline": "powershell.exe", - "fontFace": "Cascadia Code", - "fontSize": 14 - }, - { - "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", - "name": "cmd", - "commandline": "cmd.exe", - "fontFace": "Cascadia Code", - "fontSize": 14 - }, - { - "commandline" : "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat", - "name" : "cmder", - "startingDirectory" : "%USERPROFILE%", - "fontFace": "Cascadia Code", - "fontSize": 14 - } - ], -``` - -All three of these profiles are using "Cascadia Code" as their `"fontFace"`, and -14 as their `fontSize`. With default profile settings, you can easily set these -properties for all your profiles, like so: - -```json - "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "profiles": { - "defaults": - { - "fontFace": "Cascadia Code", - "fontSize": 14 - }, - "list": [ - { - "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "name": "Windows PowerShell", - "commandline": "powershell.exe" - }, - { - "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", - "name": "cmd", - "commandline": "cmd.exe" - }, - { - "commandline" : "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat", - "name" : "cmder", - "startingDirectory" : "%USERPROFILE%" - } - ] - }, -``` - -Note that the `profiles` property has changed in this example from a _list_ of -profiles, to an _object_ with two properties: - -* a `list` that contains the list of all the profiles -* the new `defaults` object, which contains all the settings that should apply to - every profile. - -What if I wanted a profile to have a different value for a property other than -the default? Simply set the property in the profile's entry to override the -value from `defaults`. Let's say you want the `cmd` profile to have _"Consolas"_ -as the font, but the rest of your profiles to still have _"Cascadia Code"_. You -could achieve that with the following: - -```json - "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "profiles": { - "defaults": - { - "fontFace": "Cascadia Code", - "fontSize": 14 - }, - "list": [ - { - "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", - "name": "Windows PowerShell", - "commandline": "powershell.exe" - }, - { - "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", - "name": "cmd", - "commandline": "cmd.exe", - "fontFace": "Consolas" - }, - { - "commandline" : "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat", - "name" : "cmder", - "startingDirectory" : "%USERPROFILE%" - } - ] - }, -``` - -In the above settings, the `"fontFace"` in the `cmd.exe` profile overrides the -`"fontFace"` from the `defaults`. - -## Configuration Examples - -### Add a custom background to the WSL Debian terminal profile - -1. Download the [Debian JPG logo](https://www.debian.org/logos/openlogo-100.jpg) -2. Put the image in the - `$env:LocalAppData\Packages\Microsoft.WindowsTerminal_\LocalState\` - directory (same directory as your `settings.json` file). - - __NOTE__: You can put the image anywhere you like, the above suggestion happens to be convenient. -3. Open your WT json properties file. -4. Under the Debian Linux profile, add the following fields: - -```json - "backgroundImage": "ms-appdata:///Local/openlogo-100.jpg", - "backgroundImageOpacity": 1, - "backgroundImageStretchMode" : "none", - "backgroundImageAlignment" : "topRight", -``` - -5. Make sure that `useAcrylic` is `false`. -6. Save the file. -7. Jump over to WT and verify your changes. - -Notes: - -1. You will need to experiment with different color settings -and schemes to make your terminal text visible on top of your image -2. If you store the image in the UWP directory (the same directory as your settings.json file), -then you should use the URI style path name given in the above example. -More information about UWP URI schemes [here](https://docs.microsoft.com/en-us/windows/uwp/app-resources/uri-schemes). -3. Instead of using a UWP URI you can use a: - 1. URL such as -`http://open.esa.int/files/2017/03/Mayer_and_Bond_craters_seen_by_SMART-1-350x346.jpg` - 2. Local file location such as `C:\Users\Public\Pictures\openlogo.jpg` - -### Adding Copy and Paste Keybindings - -As of [#1093](https://github.com/microsoft/terminal/pull/1093) (first available -in Windows Terminal v0.3), the Windows Terminal now supports copy and paste -keyboard shortcuts. However, if you installed and ran the terminal before that, -you won't automatically get the new keybindings added to your settings. If you'd -like to add shortcuts for copy and paste, you can do so by inserting the -following objects into your `globals.keybindings` array: - -```json -{ "command": "copy", "keys": ["ctrl+shift+c"] }, -{ "command": "paste", "keys": ["ctrl+shift+v"] } -``` - -> 👉 **Note**: you can also add a keybinding for the `copy` command with the argument `"trimWhitespace": true`. This removes newlines as the text is copied to your clipboard. - -This will add copy and paste on ctrl+shift+c -and ctrl+shift+v respectively. - -You can set the keybindings to whatever you'd like. If you prefer -ctrl+c to copy, then set the `keys` to `"ctrl+c"`. - -You can even set multiple keybindings for a single action if you'd like. For example: - -```json - - { - "command" : "paste", - "keys" : - [ - "ctrl+shift+v" - ] - }, - { - "command" : "paste", - "keys" : - [ - "shift+insert" - ] - } -``` - -will bind both ctrl+shift+v and -shift+Insert to `paste`. - -> 👉 **Note**: If you set your copy keybinding to `"ctrl+c"`, you'll only be able to send -an interrupt to the commandline application using Ctrl+C when there's -no text selection. Additionally, if you set `paste` to `"ctrl+v"`, commandline -applications won't be able to read a ctrl+v from the input. For these reasons, -we suggest `"ctrl+shift+c"` and `"ctrl+shift+v"` - -### Setting the `startingDirectory` of WSL Profiles to `~` - -By default, the `startingDirectory` of a profile is `%USERPROFILE%` -(`C:\Users\`). This is a Windows path. However, for WSL, you might -want to use the WSL home path instead. At the time of writing (26decf1 / Nov. -1st, 2019), `startingDirectory` only accepts a Windows-style path, so setting it -to start within the WSL distro can be a little tricky. - -Fortunately, with Windows 1903, the filesystems of WSL distros can easily be -addressed using the `\\wsl$\` prefix. For any WSL distro whose name is -`DistroName`, you can use `\\wsl$\DistroName` as a Windows path that points to -the root of that distro's filesystem. - -For example, the following works as a profile to launch the "Ubuntu-18.04" -distro in it's home path: - -```json -{ - "name": "Ubuntu-18.04", - "commandline" : "wsl -d Ubuntu-18.04", - "startingDirectory" : "//wsl$/Ubuntu-18.04/home/", -} -``` +⚠ This document has moved to [the Customize Settings section of the Windows Terminal documentation](https://docs.microsoft.com/windows/terminal/customize-settings/global-settings). diff --git a/doc/user-docs/index.md b/doc/user-docs/index.md index 80e48522d..63e4df920 100644 --- a/doc/user-docs/index.md +++ b/doc/user-docs/index.md @@ -1,91 +1 @@ -# Windows Terminal User Documentation - -NOTE: At the time of writing Windows Terminal is still under active development and many things will -change. If you notice an error in the docs, please raise an issue. Or better yet, please file a PR with an appropriate update! - -## Installing Windows Terminal - -### From Source Code - -To compile Windows Terminal yourself using the source code, follow the instructions in the [README](/README.md#developer-guidance). - -### From the Microsoft Store - -1. Make sure you have upgraded to the current Windows 10 release (at least build `1903`). To determine your build number, see [winver](https://docs.microsoft.com/en-us/windows/client-management/windows-version-search). -2. Open the Windows Terminal listing in the [Microsoft Store](https://aka.ms/install-terminal). -3. Review the minimum system requirements to confirm you can successfully install Windows Terminal. -4. Click `Get` to begin the installation process. - -## Starting Windows Terminal - -1. Locate the _Windows Terminal_ app in your Start menu. -2. Click _Windows Terminal_ to launch the app. If you need administrative privileges, right-click the entry and click `Run as administrator`. Alternatively, you can highlight the app and press `Ctrl`+`Shift`+`Enter`. - -NOTE: The default shell is PowerShell; you can change this using the _Running a Different Shell_ procedure. - -### Command line options - -Windows Terminal has implemented a rich set of command-line options in part as response to issue [#607](https://github.com/microsoft/terminal/issues/607). See [UsingCommandlineArguments.md](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingCommandlineArguments.md) for details. - -## Multiple Tabs - -Additional shells can be started by hitting the `+` button from the tab bar -- a new instance of the -default shell is displayed (default shortcut: Ctrl+Shift+1). - -## Running a Different Shell - -Note: This section assumes you already have _Windows Subsystem for Linux_ (WSL) installed. For more information, see [the installation guide](https://docs.microsoft.com/en-us/windows/wsl/install-win10). - -Windows Terminal uses PowerShell as its default shell. You can also use Windows Terminal to launch other shells, such as `cmd.exe` or WSL's `bash`: - -1. In the tab bar, click the `⌵` button to view the available shells. -2. Choose your shell from the dropdown list. The new shell session will open in a new tab. - -To customize the shell list, see the _Configuring Windows Terminal_ section below. - -## Starting a new PowerShell tab with admin privilege - -There is no current plan to support this feature for security reasons. See issue [#632](https://github.com/microsoft/terminal/issues/632) - -## Selecting and Copying Text in Windows Terminal - -As in ConHost, a selection can be made by left-clicking and dragging the mouse across the terminal. This is a line selection by default, meaning that the selection will wrap to the end of the line and the beginning of the next one. You can select in block mode by holding down the Alt key when starting a selection. - -To copy the text to your clipboard, you can right-click the terminal when a selection is active. As of [#1224](https://github.com/microsoft/terminal/pull/1224) (first available in Windows Terminal v0.4), the Windows Terminal now supports HTML copy. The HTML is automatically copied to your clipboard along with the regular text in any copy operation. - -If there is not an active selection, a right-click will paste the text content from your clipboard to the terminal. - -Copy and paste operations can also be keybound. For more information on how to bind keys, see [Using Json Settings](UsingJsonSettings.md#adding-copy-and-paste-keybindings). - -> 👉 **Note**: If you have the `copyOnSelect` global setting enabled, a selection will persist and immediately copy the selected text to your clipboard. Right-clicking will always paste your clipboard data. - -## Add a "Open Windows Terminal Here" to File Explorer - -Not currently supported "out of the box" (See issue [#1060](https://github.com/microsoft/terminal/issues/1060)). However, you can open Windows Terminal in current directory by typing `wt -d .` in the Explorer address bar. - -## Configuring Windows Terminal - -All Windows Terminal settings are currently managed using the `settings.json` file, located within `$env:LocalAppData\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState`. - -To open the settings file from Windows Terminal: - -1. Click the `⌵` button in the top bar. -2. From the dropdown list, click `Settings`. You can also use a shortcut: Ctrl+,. -3. Your default `json` editor will open the settings file. - -For an introduction to the various settings, see [Using Json Settings](UsingJsonSettings.md). The list of valid settings can be found in the [settings.json documentation](../cascadia/SettingsSchema.md) section. - -## Tips and Tricks - -1. In PowerShell you can discover if the Windows Terminal is being used by checking for the existence of the environment variable `WT_SESSION`. - - Under pwsh you can also use -`(Get-Process -Id $pid).Parent.ProcessName -eq 'WindowsTerminal'` - - (ref [https://twitter.com/r_keith_hill/status/1142871145852440576](https://twitter.com/r_keith_hill/status/1142871145852440576)) - -2. Terminal zoom can be changed by holding Ctrl and scrolling with mouse. -3. Background opacity can be changed by holding Ctrl+Shift and scrolling with mouse. Note that acrylic transparency is limited by the OS only to focused windows. -4. Open Windows Terminal in current directory by typing `wt -d .` in the address bar. -5. Pin the Windows Terminal to the taskbar. Now it can be launched using the Windows shortcut Win+Number (e.g. Win+1 or any other number based on the position in the taskbar!). Press Win+Shift+Number to always launch a new window. -6. Please add more Tips and Tricks. +⚠ Our user-facing documentation has moved to the [Windows Terminal documentation page](https://docs.microsoft.com/windows/terminal/). From c0335940a00a0b67045cc1aaa13ff51d08b754e0 Mon Sep 17 00:00:00 2001 From: James Holderness Date: Thu, 17 Sep 2020 17:52:42 +0100 Subject: [PATCH 4/7] Fix failing HyperlinkIdConsistency unit test (#7655) ## Summary of the Pull Request This fixes a typo in the `HyperlinkIdConsistency` unit test which was causing that test to fail. It was mistakenly using a `/` instead of `\` for the string terminator sequences. ## References The test initially worked because of a bug in the state machine parser, but that bug was recently fixed in PR #7340. ## PR Checklist * [x] Closes #7654 * [x] CLA signed. * [x] Tests passed * [ ] Documentation updated. * [ ] Schema updated. * [ ] I've discussed this with core contributors already. If not checked, I'm ready to accept this work might be rejected in favor of a different grand plan. ## Validation Steps Performed I've run the test again and it now passes. --- src/cascadia/UnitTests_TerminalCore/ConptyRoundtripTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/UnitTests_TerminalCore/ConptyRoundtripTests.cpp b/src/cascadia/UnitTests_TerminalCore/ConptyRoundtripTests.cpp index 204e2fb93..ad811645a 100644 --- a/src/cascadia/UnitTests_TerminalCore/ConptyRoundtripTests.cpp +++ b/src/cascadia/UnitTests_TerminalCore/ConptyRoundtripTests.cpp @@ -3491,7 +3491,7 @@ void ConptyRoundtripTests::HyperlinkIdConsistency() _flushFirstFrame(); - hostSm.ProcessString(L"\x1b]8;;http://example.com\x1b/Link\x1b]8;;\x1b/"); + hostSm.ProcessString(L"\x1b]8;;http://example.com\x1b\\Link\x1b]8;;\x1b\\"); // For self-generated IDs, conpty will send a custom ID of the form // {sessionID}-{self-generated ID} From b70ffdf79077b6acf3f7377f20ffe61b6c11e895 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 17 Sep 2020 11:27:46 -0700 Subject: [PATCH 5/7] Update ColorScheme with Json Serializer and color table API (#7609) Add `ToJson()` to the `ConversionTrait`s in JsonUtils. This can be used to serialize settings objects into JSON. As a proof of concept, `ToJson` and `UpdateJson` were added to `ColorScheme`. Getters and setters for members and colors in the color table were added and polished. ## References #1564 - Settings UI `ColorScheme` is a particularly easy example of serialization because it has _no fallback_. Added a few tests for JSON serializers. --- .../actions/spell-check/dictionary/apis.txt | 1 + .../ColorSchemeTests.cpp | 58 ++++----- src/cascadia/TerminalApp/ColorScheme.cpp | 96 +++++++------- src/cascadia/TerminalApp/ColorScheme.h | 22 ++-- src/cascadia/TerminalApp/ColorScheme.idl | 12 +- src/cascadia/TerminalApp/JsonUtils.h | 118 ++++++++++++++++++ .../TerminalSettingsSerializationHelpers.h | 15 +++ src/cascadia/inc/cppwinrt_utils.h | 12 ++ src/cascadia/ut_app/JsonTests.cpp | 6 +- src/cascadia/ut_app/JsonUtilsTests.cpp | 83 +++++++++++- 10 files changed, 325 insertions(+), 98 deletions(-) diff --git a/.github/actions/spell-check/dictionary/apis.txt b/.github/actions/spell-check/dictionary/apis.txt index 6e450ee12..2ce6c20c3 100644 --- a/.github/actions/spell-check/dictionary/apis.txt +++ b/.github/actions/spell-check/dictionary/apis.txt @@ -3,6 +3,7 @@ ACCESSDENIED alignof bitfield bitfields +COLORPROPERTY CLASSNOTAVAILABLE environstrings EXPCMDFLAGS diff --git a/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp b/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp index 396418254..ac8d9a84d 100644 --- a/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp @@ -131,11 +131,11 @@ namespace TerminalAppLocalTests const auto scheme2Json = VerifyParseSucceeded(scheme2String); auto scheme0 = ColorScheme::FromJson(scheme0Json); - VERIFY_ARE_EQUAL(L"scheme0", scheme0->_schemeName); - VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 0), scheme0->_selectionBackground); - VERIFY_ARE_EQUAL(ARGB(0, 1, 0, 1), scheme0->_cursorColor); + VERIFY_ARE_EQUAL(L"scheme0", scheme0->_Name); + VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 0), scheme0->_SelectionBackground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 0, 1), scheme0->_CursorColor); VERIFY_ARE_EQUAL(ARGB(0, 1, 0, 0), scheme0->_table[XTERM_RED_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 1, 0), scheme0->_table[XTERM_GREEN_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 1), scheme0->_table[XTERM_BLUE_ATTR]); @@ -144,10 +144,10 @@ namespace TerminalAppLocalTests L"Layering scheme1 on top of scheme0")); scheme0->LayerJson(scheme1Json); - VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 0), scheme0->_selectionBackground); - VERIFY_ARE_EQUAL(ARGB(0, 4, 0, 4), scheme0->_cursorColor); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 0), scheme0->_SelectionBackground); + VERIFY_ARE_EQUAL(ARGB(0, 4, 0, 4), scheme0->_CursorColor); VERIFY_ARE_EQUAL(ARGB(0, 2, 0, 0), scheme0->_table[XTERM_RED_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 1, 0), scheme0->_table[XTERM_GREEN_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 2), scheme0->_table[XTERM_BLUE_ATTR]); @@ -156,10 +156,10 @@ namespace TerminalAppLocalTests L"Layering scheme2Json on top of (scheme0+scheme1)")); scheme0->LayerJson(scheme2Json); - VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 0), scheme0->_selectionBackground); - VERIFY_ARE_EQUAL(ARGB(0, 6, 0, 6), scheme0->_cursorColor); + VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 0), scheme0->_SelectionBackground); + VERIFY_ARE_EQUAL(ARGB(0, 6, 0, 6), scheme0->_CursorColor); VERIFY_ARE_EQUAL(ARGB(0, 3, 0, 0), scheme0->_table[XTERM_RED_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 3, 0), scheme0->_table[XTERM_GREEN_ATTR]); VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 2), scheme0->_table[XTERM_BLUE_ATTR]); @@ -218,8 +218,8 @@ namespace TerminalAppLocalTests VERIFY_IS_NULL(settings->_FindMatchingColorScheme(scheme1Json)); VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme2Json)); VERIFY_IS_NULL(settings->_FindMatchingColorScheme(scheme3Json)); - VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_Background); } settings->_LayerOrCreateColorScheme(scheme1Json); @@ -238,10 +238,10 @@ namespace TerminalAppLocalTests VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme1Json)); VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme2Json)); VERIFY_IS_NULL(settings->_FindMatchingColorScheme(scheme3Json)); - VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_Background); } settings->_LayerOrCreateColorScheme(scheme2Json); @@ -259,10 +259,10 @@ namespace TerminalAppLocalTests VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme1Json)); VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme2Json)); VERIFY_IS_NULL(settings->_FindMatchingColorScheme(scheme3Json)); - VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_Background); } settings->_LayerOrCreateColorScheme(scheme3Json); @@ -283,12 +283,12 @@ namespace TerminalAppLocalTests VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme1Json)); VERIFY_IS_NOT_NULL(settings->_FindMatchingColorScheme(scheme2Json)); VERIFY_IS_NULL(settings->_FindMatchingColorScheme(scheme3Json)); - VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_defaultBackground); - VERIFY_ARE_EQUAL(ARGB(0, 6, 6, 6), scheme2->_defaultForeground); - VERIFY_ARE_EQUAL(ARGB(0, 7, 7, 7), scheme2->_defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), scheme0->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), scheme0->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), scheme1->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), scheme1->_Background); + VERIFY_ARE_EQUAL(ARGB(0, 6, 6, 6), scheme2->_Foreground); + VERIFY_ARE_EQUAL(ARGB(0, 7, 7, 7), scheme2->_Background); } } } diff --git a/src/cascadia/TerminalApp/ColorScheme.cpp b/src/cascadia/TerminalApp/ColorScheme.cpp index ed04b51c7..4c4ee9cca 100644 --- a/src/cascadia/TerminalApp/ColorScheme.cpp +++ b/src/cascadia/TerminalApp/ColorScheme.cpp @@ -20,6 +20,7 @@ static constexpr std::string_view ForegroundKey{ "foreground" }; static constexpr std::string_view BackgroundKey{ "background" }; static constexpr std::string_view SelectionBackgroundKey{ "selectionBackground" }; static constexpr std::string_view CursorColorKey{ "cursorColor" }; + static constexpr std::array TableColors = { "black", "red", @@ -40,26 +41,19 @@ static constexpr std::array TableColors = { }; ColorScheme::ColorScheme() : - _schemeName{ L"" }, - _table{}, - _defaultForeground{ DEFAULT_FOREGROUND_WITH_ALPHA }, - _defaultBackground{ DEFAULT_BACKGROUND_WITH_ALPHA }, - _selectionBackground{ DEFAULT_FOREGROUND }, - _cursorColor{ DEFAULT_CURSOR_COLOR } + _Foreground{ DEFAULT_FOREGROUND_WITH_ALPHA }, + _Background{ DEFAULT_BACKGROUND_WITH_ALPHA }, + _SelectionBackground{ DEFAULT_FOREGROUND }, + _CursorColor{ DEFAULT_CURSOR_COLOR } { } ColorScheme::ColorScheme(winrt::hstring name, Color defaultFg, Color defaultBg, Color cursorColor) : - _schemeName{ name }, - _table{}, - _defaultForeground{ defaultFg }, - _defaultBackground{ defaultBg }, - _selectionBackground{ DEFAULT_FOREGROUND }, - _cursorColor{ cursorColor } -{ -} - -ColorScheme::~ColorScheme() + _Name{ name }, + _Foreground{ defaultFg }, + _Background{ defaultBg }, + _SelectionBackground{ DEFAULT_FOREGROUND }, + _CursorColor{ cursorColor } { } @@ -89,7 +83,7 @@ bool ColorScheme::ShouldBeLayered(const Json::Value& json) const std::wstring nameFromJson{}; if (JsonUtils::GetValueForKey(json, NameKey, nameFromJson)) { - return nameFromJson == _schemeName; + return nameFromJson == _Name; } return false; } @@ -106,50 +100,60 @@ bool ColorScheme::ShouldBeLayered(const Json::Value& json) const // void ColorScheme::LayerJson(const Json::Value& json) { - JsonUtils::GetValueForKey(json, NameKey, _schemeName); - JsonUtils::GetValueForKey(json, ForegroundKey, _defaultForeground); - JsonUtils::GetValueForKey(json, BackgroundKey, _defaultBackground); - JsonUtils::GetValueForKey(json, SelectionBackgroundKey, _selectionBackground); - JsonUtils::GetValueForKey(json, CursorColorKey, _cursorColor); + JsonUtils::GetValueForKey(json, NameKey, _Name); + JsonUtils::GetValueForKey(json, ForegroundKey, _Foreground); + JsonUtils::GetValueForKey(json, BackgroundKey, _Background); + JsonUtils::GetValueForKey(json, SelectionBackgroundKey, _SelectionBackground); + JsonUtils::GetValueForKey(json, CursorColorKey, _CursorColor); - int i = 0; - for (const auto& current : TableColors) + for (unsigned int i = 0; i < TableColors.size(); ++i) { - JsonUtils::GetValueForKey(json, current, _table.at(i)); - i++; + JsonUtils::GetValueForKey(json, til::at(TableColors, i), _table.at(i)); } } -winrt::hstring ColorScheme::Name() const noexcept +// Method Description: +// - Create a new serialized JsonObject from an instance of this class +// Arguments: +// - +// Return Value: +// +Json::Value ColorScheme::ToJson() { - return _schemeName; + Json::Value json{ Json::ValueType::objectValue }; + + JsonUtils::SetValueForKey(json, NameKey, _Name); + JsonUtils::SetValueForKey(json, ForegroundKey, _Foreground); + JsonUtils::SetValueForKey(json, BackgroundKey, _Background); + JsonUtils::SetValueForKey(json, SelectionBackgroundKey, _SelectionBackground); + JsonUtils::SetValueForKey(json, CursorColorKey, _CursorColor); + + for (unsigned int i = 0; i < TableColors.size(); ++i) + { + JsonUtils::SetValueForKey(json, til::at(TableColors, i), _table.at(i)); + } + + return json; } winrt::com_array ColorScheme::Table() const noexcept { - winrt::com_array result{ COLOR_TABLE_SIZE }; + winrt::com_array result{ base::checked_cast(_table.size()) }; std::transform(_table.begin(), _table.end(), result.begin(), [](til::color c) -> Color { return c; }); return result; } -Color ColorScheme::Foreground() const noexcept +// Method Description: +// - Set a color in the color table +// Arguments: +// - index: the index of the desired color within the table +// - value: the color value we are setting the color table color to +// Return Value: +// - none +void ColorScheme::SetColorTableEntry(uint8_t index, const winrt::Windows::UI::Color& value) noexcept { - return _defaultForeground; -} - -Color ColorScheme::Background() const noexcept -{ - return _defaultBackground; -} - -Color ColorScheme::SelectionBackground() const noexcept -{ - return _selectionBackground; -} - -Color ColorScheme::CursorColor() const noexcept -{ - return _cursorColor; + THROW_HR_IF(E_INVALIDARG, index > _table.size() - 1); + _table[index] = value; } // Method Description: diff --git a/src/cascadia/TerminalApp/ColorScheme.h b/src/cascadia/TerminalApp/ColorScheme.h index 522b4faf6..68456dc15 100644 --- a/src/cascadia/TerminalApp/ColorScheme.h +++ b/src/cascadia/TerminalApp/ColorScheme.h @@ -34,28 +34,26 @@ namespace winrt::TerminalApp::implementation public: ColorScheme(); ColorScheme(hstring name, Windows::UI::Color defaultFg, Windows::UI::Color defaultBg, Windows::UI::Color cursorColor); - ~ColorScheme(); static com_ptr FromJson(const Json::Value& json); bool ShouldBeLayered(const Json::Value& json) const; void LayerJson(const Json::Value& json); - hstring Name() const noexcept; - com_array Table() const noexcept; - Windows::UI::Color Foreground() const noexcept; - Windows::UI::Color Background() const noexcept; - Windows::UI::Color SelectionBackground() const noexcept; - Windows::UI::Color CursorColor() const noexcept; + Json::Value ToJson(); static std::optional GetNameFromJson(const Json::Value& json); + com_array Table() const noexcept; + void SetColorTableEntry(uint8_t index, const winrt::Windows::UI::Color& value) noexcept; + + GETSET_PROPERTY(winrt::hstring, Name); + GETSET_COLORPROPERTY(Foreground); // defined in constructor + GETSET_COLORPROPERTY(Background); // defined in constructor + GETSET_COLORPROPERTY(SelectionBackground); // defined in constructor + GETSET_COLORPROPERTY(CursorColor); // defined in constructor + private: - hstring _schemeName; std::array _table; - til::color _defaultForeground; - til::color _defaultBackground; - til::color _selectionBackground; - til::color _cursorColor; friend class TerminalAppLocalTests::SettingsTests; friend class TerminalAppLocalTests::ColorSchemeTests; diff --git a/src/cascadia/TerminalApp/ColorScheme.idl b/src/cascadia/TerminalApp/ColorScheme.idl index a7ec72276..f1603f8a3 100644 --- a/src/cascadia/TerminalApp/ColorScheme.idl +++ b/src/cascadia/TerminalApp/ColorScheme.idl @@ -5,15 +5,15 @@ namespace TerminalApp { [default_interface] runtimeclass ColorScheme { ColorScheme(); - ColorScheme(String name, Windows.UI.Color defaultFg, Windows.UI.Color defaultBg, Windows.UI.Color cursorColor); - String Name { get; }; + String Name; - Windows.UI.Color Foreground { get; }; - Windows.UI.Color Background { get; }; - Windows.UI.Color SelectionBackground { get; }; - Windows.UI.Color CursorColor { get; }; + Windows.UI.Color Foreground; + Windows.UI.Color Background; + Windows.UI.Color SelectionBackground; + Windows.UI.Color CursorColor; Windows.UI.Color[] Table { get; }; + void SetColorTableEntry(UInt8 index, Windows.UI.Color value); } } diff --git a/src/cascadia/TerminalApp/JsonUtils.h b/src/cascadia/TerminalApp/JsonUtils.h index 5e639ecc7..11c1a40d1 100644 --- a/src/cascadia/TerminalApp/JsonUtils.h +++ b/src/cascadia/TerminalApp/JsonUtils.h @@ -103,6 +103,8 @@ namespace TerminalApp::JsonUtils T FromJson(const Json::Value&); bool CanConvert(const Json::Value& json); + Json::Value ToJson(const T& val); + std::string TypeDescription() const { return ""; } }; @@ -119,6 +121,11 @@ namespace TerminalApp::JsonUtils return json.isString(); } + Json::Value ToJson(const std::string& val) + { + return val; + } + std::string TypeDescription() const { return "string"; @@ -138,6 +145,11 @@ namespace TerminalApp::JsonUtils return json.isString(); } + Json::Value ToJson(const std::wstring& val) + { + return til::u16u8(val); + } + std::string TypeDescription() const { return "string"; @@ -153,6 +165,11 @@ namespace TerminalApp::JsonUtils { return winrt::hstring{ til::u8u16(Detail::GetStringView(json)) }; } + + Json::Value ToJson(const winrt::hstring& val) + { + return til::u16u8(val); + } }; #endif @@ -169,6 +186,11 @@ namespace TerminalApp::JsonUtils return json.isBool(); } + Json::Value ToJson(const bool val) + { + return val; + } + std::string TypeDescription() const { return "true | false"; @@ -188,6 +210,11 @@ namespace TerminalApp::JsonUtils return json.isInt(); } + Json::Value ToJson(const int& val) + { + return val; + } + std::string TypeDescription() const { return "number"; @@ -207,6 +234,11 @@ namespace TerminalApp::JsonUtils return json.isUInt(); } + Json::Value ToJson(const unsigned int& val) + { + return val; + } + std::string TypeDescription() const { return "number (>= 0)"; @@ -226,6 +258,11 @@ namespace TerminalApp::JsonUtils return json.isNumeric(); } + Json::Value ToJson(const float& val) + { + return val; + } + std::string TypeDescription() const { return "number"; @@ -245,6 +282,11 @@ namespace TerminalApp::JsonUtils return json.isNumeric(); } + Json::Value ToJson(const double& val) + { + return val; + } + std::string TypeDescription() const { return "number"; @@ -270,6 +312,11 @@ namespace TerminalApp::JsonUtils return string.length() == 38 && string.front() == '{' && string.back() == '}'; } + Json::Value ToJson(const GUID& val) + { + return til::u16u8(::Microsoft::Console::Utils::GuidToString(val)); + } + std::string TypeDescription() const { return "guid"; @@ -291,6 +338,11 @@ namespace TerminalApp::JsonUtils return ConversionTrait{}.CanConvert(json); } + Json::Value ToJson(const winrt::guid& val) + { + return ConversionTrait{}.ToJson(val); + } + std::string TypeDescription() const { return ConversionTrait{}.TypeDescription(); @@ -316,6 +368,11 @@ namespace TerminalApp::JsonUtils return (string.length() == 7 || string.length() == 4) && string.front() == '#'; } + Json::Value ToJson(const til::color& val) + { + return til::u16u8(val.ToHexString(true)); + } + std::string TypeDescription() const { return "color (#rrggbb, #rgb)"; @@ -336,6 +393,11 @@ namespace TerminalApp::JsonUtils return ConversionTrait{}.CanConvert(json); } + Json::Value ToJson(const winrt::Windows::UI::Color& val) + { + return ConversionTrait{}.ToJson(val); + } + std::string TypeDescription() const { return ConversionTrait{}.TypeDescription(); @@ -370,6 +432,18 @@ namespace TerminalApp::JsonUtils return json.isString(); } + Json::Value ToJson(const T& val) + { + for (const auto& pair : TBase::mappings) + { + if (pair.second == val) + { + return { pair.first.data() }; + } + } + FAIL_FAST(); + } + std::string TypeDescription() const { std::vector names; @@ -427,6 +501,35 @@ namespace TerminalApp::JsonUtils return AllClear; } + Json::Value ToJson(const T& val) + { + if (val == AllClear) + { + return BaseEnumMapper::ToJson(AllClear); + } + else if (val == AllSet) + { + return BaseEnumMapper::ToJson(AllSet); + } + else if (WI_IsSingleFlagSet(val)) + { + return BaseEnumMapper::ToJson(val); + } + else + { + Json::Value json{ Json::ValueType::arrayValue }; + for (const auto& pair : TBase::mappings) + { + if (pair.second != AllClear && + (val & pair.second) == pair.second) + { + json.append(BaseEnumMapper::ToJson(pair.second)); + } + } + return json; + } + } + bool CanConvert(const Json::Value& json) { return BaseEnumMapper::CanConvert(json) || json.isArray(); @@ -574,6 +677,21 @@ namespace TerminalApp::JsonUtils GetValueForKey(json, key1, val1); GetValuesForKeys(json, std::forward(args)...); } + + // SetValueForKey, type-deduced, manual converter + template + void SetValueForKey(Json::Value& json, std::string_view key, const T& target, Converter&& conv) + { + // demand guarantees that it will return a value or throw an exception + *json.demand(&*key.cbegin(), (&*key.cbegin()) + key.size()) = conv.ToJson(target); + } + + // SetValueForKey, type-deduced, with automatic converter + template + void SetValueForKey(Json::Value& json, std::string_view key, const T& target) + { + SetValueForKey(json, key, target, ConversionTrait::Type>{}); + } }; #define JSON_ENUM_MAPPER(...) \ diff --git a/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h index 47e2c6810..3a3eb4f5f 100644 --- a/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h +++ b/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h @@ -268,6 +268,21 @@ struct ::TerminalApp::JsonUtils::ConversionTrait<::winrt::TerminalApp::LaunchPos return json.isString(); } + Json::Value ToJson(const ::winrt::TerminalApp::LaunchPosition& val) + { + std::stringstream ss; + if (val.X) + { + ss << val.X.Value(); + } + ss << ","; + if (val.Y) + { + ss << val.Y.Value(); + } + return ss.str(); + } + std::string TypeDescription() const { return "x, y"; diff --git a/src/cascadia/inc/cppwinrt_utils.h b/src/cascadia/inc/cppwinrt_utils.h index dcc53ef23..72f0526d3 100644 --- a/src/cascadia/inc/cppwinrt_utils.h +++ b/src/cascadia/inc/cppwinrt_utils.h @@ -107,6 +107,18 @@ public: \ private: \ type _##name{ __VA_ARGS__ }; +// Use this macro to quick implement both the getter and setter for a color property. +// This should only be used for color types where there's no logic in the +// getter/setter beyond just accessing/updating the value. +// This takes advantage of til::color +#define GETSET_COLORPROPERTY(name, ...) \ +public: \ + winrt::Windows::UI::Color name() const noexcept { return _##name; } \ + void name(const winrt::Windows::UI::Color& value) noexcept { _##name = value; } \ + \ +private: \ + til::color _##name{ __VA_ARGS__ }; + // Use this macro to quickly implement both the getter and setter for an // observable property. This is similar to the GETSET_PROPERTY macro above, // except this will also raise a PropertyChanged event with the name of the diff --git a/src/cascadia/ut_app/JsonTests.cpp b/src/cascadia/ut_app/JsonTests.cpp index d36f97123..178ccd8cf 100644 --- a/src/cascadia/ut_app/JsonTests.cpp +++ b/src/cascadia/ut_app/JsonTests.cpp @@ -87,7 +87,7 @@ namespace TerminalAppUnitTests "\"purple\" : \"#881798\"," "\"red\" : \"#C50F1F\"," "\"selectionBackground\" : \"#131313\"," - "\"white\" : \"#CCC\"," + "\"white\" : \"#CCCCCC\"," "\"yellow\" : \"#C19C00\"" "}" }; @@ -110,6 +110,10 @@ namespace TerminalAppUnitTests const til::color actual{ scheme->Table().at(static_cast(i)) }; VERIFY_ARE_EQUAL(expected, actual); } + + Log::Comment(L"Roundtrip Test for Color Scheme"); + Json::Value outJson{ scheme->ToJson() }; + VERIFY_ARE_EQUAL(schemeObject, outJson); } void JsonTests::ProfileGeneratesGuid() diff --git a/src/cascadia/ut_app/JsonUtilsTests.cpp b/src/cascadia/ut_app/JsonUtilsTests.cpp index 44d2c02fe..b9bc020ec 100644 --- a/src/cascadia/ut_app/JsonUtilsTests.cpp +++ b/src/cascadia/ut_app/JsonUtilsTests.cpp @@ -293,11 +293,24 @@ namespace TerminalAppUnitTests // versions. template - static void TryBasicType(TExpected&& expected, TJson&& json) + static void TryBasicType(TExpected&& expected, TJson&& json, std::optional overrideToJsonOutput = std::nullopt) { + // test FromJson Json::Value jsonObject{ json }; const auto value{ GetValue(jsonObject) }; VERIFY_ARE_EQUAL(expected, value, NoThrowString{}.Format(L"(type: %hs)", typeid(TExpected).name())); + + // test ToJson + { + const std::string key{ "myKey" }; + + Json::Value expectedJson{}; + expectedJson[key] = til::coalesce_value(overrideToJsonOutput, jsonObject); + + Json::Value toJsonResult{}; + SetValueForKey(toJsonResult, key, expected); + VERIFY_ARE_EQUAL(expectedJson, toJsonResult); + } } void JsonUtilsTests::BasicTypeConversion() @@ -305,7 +318,7 @@ namespace TerminalAppUnitTests // Battery of all basic types ;P TryBasicType(std::string{ "hello" }, "hello"); TryBasicType(int{ -1024 }, -1024); - TryBasicType(unsigned int{ 1024 }, 1024); + TryBasicType(std::numeric_limits::max(), std::numeric_limits::max()); TryBasicType(false, false); TryBasicType(1.0f, 1.0f); @@ -318,9 +331,10 @@ namespace TerminalAppUnitTests // double -> float TryBasicType(1.0f, 1.0); - TryBasicType(til::color{ 0xab, 0xcd, 0xef }, "#abcdef"); + TryBasicType(til::color{ 0xab, 0xcd, 0xef }, "#ABCDEF"); + TryBasicType(til::color{ 0xcc, 0xcc, 0xcc }, "#CCC", "#CCCCCC"); - static const std::string testGuidString{ "{AA8147AA-E289-4508-BE83-FB68361EF2F3}" }; // can't use a string_view; jsoncpp hates it + static const std::string testGuidString{ "{aa8147aa-e289-4508-be83-fb68361ef2f3}" }; // can't use a string_view; jsoncpp hates it static const GUID testGuid{ 0xaa8147aa, 0xe289, 0x4508, { 0xbe, 0x83, 0xfb, 0x68, 0x36, 0x1e, 0xf2, 0xf3 } }; TryBasicType(testGuid, testGuidString); @@ -371,6 +385,19 @@ namespace TerminalAppUnitTests // Unknown value should produce something? Json::Value stringUnknown{ "unknown" }; VERIFY_THROWS_SPECIFIC(GetValue(stringUnknown), DeserializationError, _ReturnTrueForException); + + // SetValueForKey + { + const std::string key{ "myKey" }; + const auto val{ JsonTestEnum::Third }; + + Json::Value expected{}; + expected[key] = "third"; + + Json::Value json{}; + SetValueForKey(json, key, val); + VERIFY_ARE_EQUAL(expected, json); + } } void JsonUtilsTests::FlagMapper() @@ -385,16 +412,64 @@ namespace TerminalAppUnitTests Json::Value stringAll{ "all" }; VERIFY_ARE_EQUAL(JsonTestFlags::All, GetValue(stringAll)); + { + const std::string key{ "myKey" }; + const auto val{ JsonTestFlags::Third }; + + Json::Value expected{}; + expected[key] = "third"; + + Json::Value json{}; + SetValueForKey(json, key, val); + VERIFY_ARE_EQUAL(expected, json); + } + + { + const std::string key{ "myKey" }; + const auto val{ JsonTestFlags::All }; + + Json::Value expected{}; + expected[key] = "all"; + + Json::Value json{}; + SetValueForKey(json, key, val); + VERIFY_ARE_EQUAL(expected, json); + } + // Multiple flags Json::Value arrayFirstSecond{ Json::arrayValue }; arrayFirstSecond.append({ "first" }); arrayFirstSecond.append({ "second" }); VERIFY_ARE_EQUAL(JsonTestFlags::First | JsonTestFlags::Second, GetValue(arrayFirstSecond)); + { + const std::string key{ "myKey" }; + const auto val{ JsonTestFlags::First | JsonTestFlags::Second }; + + Json::Value expected{}; + expected[key] = arrayFirstSecond; + + Json::Value json{}; + SetValueForKey(json, key, val); + VERIFY_ARE_EQUAL(expected, json); + } + // No flags Json::Value emptyArray{ Json::arrayValue }; VERIFY_ARE_EQUAL(JsonTestFlags::None, GetValue(emptyArray)); + { + const std::string key{ "myKey" }; + const auto val{ JsonTestFlags::None }; + + Json::Value expected{}; + expected[key] = "none"; + + Json::Value json{}; + SetValueForKey(json, key, val); + VERIFY_ARE_EQUAL(expected, json); + } + // Stacking Always + Any Json::Value arrayAllFirst{ Json::arrayValue }; arrayAllFirst.append({ "all" }); From d1981b531f25fd2f94908411c12626c2f545f9f6 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Thu, 17 Sep 2020 12:41:22 -0700 Subject: [PATCH 6/7] Update Cascadia Code to 2009.14 (#7648) 2009.14 brings support for the Salishan language family and some bug fixes. --- res/Cascadia.ttf | Bin 342160 -> 353628 bytes res/CascadiaMono.ttf | Bin 323340 -> 334356 bytes res/README.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/Cascadia.ttf b/res/Cascadia.ttf index c3963842af07496265414657fcc72e827ab9135b..a46d5b2feeada005c96d965d1304ddb769be2eae 100644 GIT binary patch delta 41348 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 delta 30963 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 Oo}p06_8G5PN|*sjUN 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%0DePO6C4E2o#`|;Bo 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 diff --git a/res/README.md b/res/README.md index 4cbaf4db4..c8123496f 100644 --- a/res/README.md +++ b/res/README.md @@ -17,5 +17,5 @@ Please consult the [license](https://raw.githubusercontent.com/microsoft/cascadi ### Fonts Included -* Cascadia Code, Cascadia Mono (2008.25) - * from microsoft/cascadia-code@678eea921b0c8b921b9fb009bb16d3d2ca5b8112 +* Cascadia Code, Cascadia Mono (2009.14) + * from microsoft/cascadia-code@716c6e6f24ce8e23e28936db9a106a6129ca9931 From 468c8c6728d0dd24671daeb436426d24e4d8cc00 Mon Sep 17 00:00:00 2001 From: Leon Liang Date: Thu, 17 Sep 2020 17:13:11 -0700 Subject: [PATCH 7/7] Give Tab ownership of its SwitchToTab command (#7659) Currently, `CommandPalette` creates and maintains the `SwitchToTab` commands used for the ATS. When `Command` goes into the TerminalSettingsModel, the palette won't be able to access `Command`'s implementation type, making it difficult for `CommandPalette` to tell `Command` to listen to `Tab` for changes. This PR changes the relationship up so `Tab` now manages its `SwitchToTab` command, and `CommandPalette` just plops the command from `Tab` into its list. --- src/cascadia/TerminalApp/CommandPalette.cpp | 92 +-------------------- src/cascadia/TerminalApp/CommandPalette.h | 2 - src/cascadia/TerminalApp/Tab.cpp | 38 +++++++++ src/cascadia/TerminalApp/Tab.h | 9 ++ src/cascadia/TerminalApp/Tab.idl | 4 + src/cascadia/TerminalApp/TerminalPage.cpp | 19 +++++ src/cascadia/TerminalApp/TerminalPage.h | 1 + 7 files changed, 72 insertions(+), 93 deletions(-) diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp index 307ca975b..82fb48ed9 100644 --- a/src/cascadia/TerminalApp/CommandPalette.cpp +++ b/src/cascadia/TerminalApp/CommandPalette.cpp @@ -975,30 +975,17 @@ namespace winrt::TerminalApp::implementation { case CollectionChange::ItemChanged: { - winrt::com_ptr item; - item.copy_from(winrt::get_self(_allTabActions.GetAt(idx))); - item->propertyChangedRevoker.revoke(); - - auto tab = tabList.GetAt(idx); - GenerateCommandForTab(idx, false, tab); - UpdateTabIndices(idx); break; } case CollectionChange::ItemInserted: { auto tab = tabList.GetAt(idx); - GenerateCommandForTab(idx, true, tab); - UpdateTabIndices(idx); + _allTabActions.InsertAt(idx, tab.SwitchToTabCommand()); break; } case CollectionChange::ItemRemoved: { - winrt::com_ptr item; - item.copy_from(winrt::get_self(_allTabActions.GetAt(idx))); - item->propertyChangedRevoker.revoke(); - _allTabActions.RemoveAt(idx); - UpdateTabIndices(idx); break; } } @@ -1007,83 +994,6 @@ namespace winrt::TerminalApp::implementation } } - // Method Description: - // - In the case where a tab is removed or reordered, the given indices of - // the tab switch commands following the removed/reordered tab will get out of sync by 1 - // (e.g. if tab 1 is removed, tabs 2,3,4,... need to become tabs 1,2,3,...) - // This function just loops through the tabs following startIdx and adjusts their given indices. - // Arguments: - // - startIdx: The index to start the update loop at. - // Return Value: - // - - void CommandPalette::UpdateTabIndices(const uint32_t startIdx) - { - for (auto i = startIdx; i < _allTabActions.Size(); ++i) - { - auto command = _allTabActions.GetAt(i); - - command.Action().Args().as()->TabIndex(i); - } - } - - // Method Description: - // - Create a tab switching command based on the given tab object and insert/update the command - // at the given index. The command will call a SwitchToTab action on the given idx. - // Arguments: - // - idx: The index to insert or update the tab switch command. - // - tab: The tab object to refer to when creating the tab switch command. - // Return Value: - // - - void CommandPalette::GenerateCommandForTab(const uint32_t idx, bool inserted, TerminalApp::Tab& tab) - { - auto focusTabAction = winrt::make_self(); - auto args = winrt::make_self(); - args->TabIndex(idx); - - focusTabAction->Action(ShortcutAction::SwitchToTab); - focusTabAction->Args(*args); - - auto command = winrt::make_self(); - command->Action(*focusTabAction); - command->Name(tab.Title()); - command->IconSource(tab.IconSource()); - - // Listen for changes to the Tab so we can update this Command's attributes accordingly. - auto weakThis{ get_weak() }; - auto weakCommand{ command->get_weak() }; - command->propertyChangedRevoker = tab.PropertyChanged(winrt::auto_revoke, [weakThis, weakCommand, tab](auto&&, const Windows::UI::Xaml::Data::PropertyChangedEventArgs& args) { - auto palette{ weakThis.get() }; - auto command{ weakCommand.get() }; - - if (palette && command) - { - if (args.PropertyName() == L"Title") - { - if (command->Name() != tab.Title()) - { - command->Name(tab.Title()); - } - } - if (args.PropertyName() == L"IconSource") - { - if (command->IconSource() != tab.IconSource()) - { - command->IconSource(tab.IconSource()); - } - } - } - }); - - if (inserted) - { - _allTabActions.InsertAt(idx, *command); - } - else - { - _allTabActions.SetAt(idx, *command); - } - } - void CommandPalette::EnableTabSwitcherMode(const bool searchMode, const uint32_t startIdx) { _switcherStartIdx = startIdx; diff --git a/src/cascadia/TerminalApp/CommandPalette.h b/src/cascadia/TerminalApp/CommandPalette.h index 65dd39ab5..c1e1830dd 100644 --- a/src/cascadia/TerminalApp/CommandPalette.h +++ b/src/cascadia/TerminalApp/CommandPalette.h @@ -87,8 +87,6 @@ namespace winrt::TerminalApp::implementation Microsoft::Terminal::TerminalControl::IKeyBindings _bindings; // Tab Switcher - void GenerateCommandForTab(const uint32_t idx, bool inserted, winrt::TerminalApp::Tab& tab); - void UpdateTabIndices(const uint32_t startIdx); Windows::Foundation::Collections::IVector _allTabActions{ nullptr }; uint32_t _switcherStartIdx; void _anchorKeyUpHandler(); diff --git a/src/cascadia/TerminalApp/Tab.cpp b/src/cascadia/TerminalApp/Tab.cpp index 43f294407..f7d33efd7 100644 --- a/src/cascadia/TerminalApp/Tab.cpp +++ b/src/cascadia/TerminalApp/Tab.cpp @@ -8,6 +8,8 @@ #include "Tab.g.cpp" #include "Utils.h" #include "ColorHelper.h" +#include "ActionAndArgs.h" +#include "ActionArgs.h" using namespace winrt; using namespace winrt::Windows::UI::Xaml; @@ -34,6 +36,7 @@ namespace winrt::TerminalApp::implementation _activePane = _rootPane; _MakeTabViewItem(); + _MakeSwitchToTabCommand(); } // Method Description: @@ -229,6 +232,9 @@ namespace winrt::TerminalApp::implementation // The TabViewItem Icon needs MUX while the IconSourceElement in the CommandPalette needs WUX... IconSource(GetColoredIcon(_lastIconPath)); _tabViewItem.IconSource(GetColoredIcon(_lastIconPath)); + + // Update SwitchToTab command's icon + SwitchToTabCommand().IconSource(IconSource()); } } @@ -266,6 +272,9 @@ namespace winrt::TerminalApp::implementation // Bubble our current tab text to anyone who's listening for changes. Title(GetActiveTitle()); + // Update SwitchToTab command's name + SwitchToTabCommand().Name(Title()); + // Update the UI to reflect the changed _UpdateTabHeader(); } @@ -1026,6 +1035,35 @@ namespace winrt::TerminalApp::implementation return _zoomedPane != nullptr; } + // Method Description: + // - Initializes a SwitchToTab command object for this Tab instance. + // Arguments: + // - + // Return Value: + // - + void Tab::_MakeSwitchToTabCommand() + { + auto focusTabAction = winrt::make_self(); + auto args = winrt::make_self(); + args->TabIndex(_TabViewIndex); + + focusTabAction->Action(ShortcutAction::SwitchToTab); + focusTabAction->Args(*args); + + winrt::TerminalApp::Command command; + command.Action(*focusTabAction); + command.Name(Title()); + command.IconSource(IconSource()); + + SwitchToTabCommand(command); + } + + void Tab::UpdateTabViewIndex(const uint32_t idx) + { + TabViewIndex(idx); + SwitchToTabCommand().Action().Args().as()->TabIndex(idx); + } + DEFINE_EVENT(Tab, ActivePaneChanged, _ActivePaneChangedHandlers, winrt::delegate<>); DEFINE_EVENT(Tab, ColorSelected, _colorSelected, winrt::delegate); DEFINE_EVENT(Tab, ColorCleared, _colorCleared, winrt::delegate<>); diff --git a/src/cascadia/TerminalApp/Tab.h b/src/cascadia/TerminalApp/Tab.h index 2cc39b233..3b52488f5 100644 --- a/src/cascadia/TerminalApp/Tab.h +++ b/src/cascadia/TerminalApp/Tab.h @@ -68,6 +68,8 @@ namespace winrt::TerminalApp::implementation int GetLeafPaneCount() const noexcept; + void UpdateTabViewIndex(const uint32_t idx); + WINRT_CALLBACK(Closed, winrt::Windows::Foundation::EventHandler); WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler); DECLARE_EVENT(ActivePaneChanged, _ActivePaneChangedHandlers, winrt::delegate<>); @@ -76,6 +78,11 @@ namespace winrt::TerminalApp::implementation OBSERVABLE_GETSET_PROPERTY(winrt::hstring, Title, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::Windows::UI::Xaml::Controls::IconSource, IconSource, _PropertyChangedHandlers, nullptr); + OBSERVABLE_GETSET_PROPERTY(winrt::TerminalApp::Command, SwitchToTabCommand, _PropertyChangedHandlers, nullptr); + + // The TabViewIndex is the index this Tab object resides in TerminalPage's _tabs vector. + // This is needed since Tab is going to be managing its own SwitchToTab command. + OBSERVABLE_GETSET_PROPERTY(uint32_t, TabViewIndex, _PropertyChangedHandlers, 0); private: std::shared_ptr _rootPane{ nullptr }; @@ -114,6 +121,8 @@ namespace winrt::TerminalApp::implementation void _ApplyTabColor(const winrt::Windows::UI::Color& color); void _ClearTabBackgroundColor(); + void _MakeSwitchToTabCommand(); + friend class ::TerminalAppLocalTests::TabTests; }; } diff --git a/src/cascadia/TerminalApp/Tab.idl b/src/cascadia/TerminalApp/Tab.idl index 5aba64605..ceb52a55f 100644 --- a/src/cascadia/TerminalApp/Tab.idl +++ b/src/cascadia/TerminalApp/Tab.idl @@ -1,11 +1,15 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +import "Command.idl"; + namespace TerminalApp { [default_interface] runtimeclass Tab : Windows.UI.Xaml.Data.INotifyPropertyChanged { String Title { get; }; Windows.UI.Xaml.Controls.IconSource IconSource { get; }; + Command SwitchToTabCommand { get; }; + UInt32 TabViewIndex { get; }; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 3f9cc740f..8dc7142a3 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -166,6 +166,7 @@ namespace winrt::TerminalApp::implementation auto tab = tabs.GetAt(from.value()); tabs.RemoveAt(from.value()); tabs.InsertAt(to.value(), tab); + page->_UpdateTabIndices(); } page->_rearranging = false; @@ -687,6 +688,9 @@ namespace winrt::TerminalApp::implementation auto newTabImpl = winrt::make_self(profileGuid, term); _tabs.Append(*newTabImpl); + // Give the tab its index in the _tabs vector so it can manage its own SwitchToTab command. + newTabImpl->UpdateTabViewIndex(_tabs.Size() - 1); + // Hookup our event handlers to the new terminal _RegisterTerminalEvents(term, *newTabImpl); @@ -1066,6 +1070,7 @@ namespace winrt::TerminalApp::implementation _tabs.RemoveAt(tabIndex); _tabView.TabItems().RemoveAt(tabIndex); + _UpdateTabIndices(); // To close the window here, we need to close the hosting window. if (_tabs.Size() == 0) @@ -2519,6 +2524,20 @@ namespace winrt::TerminalApp::implementation return _isAlwaysOnTop; } + // Method Description: + // - Updates all tabs with their current index in _tabs. + // Arguments: + // - + // Return Value: + // - + void TerminalPage::_UpdateTabIndices() + { + for (uint32_t i = 0; i < _tabs.Size(); ++i) + { + _GetStrongTabImpl(i)->UpdateTabViewIndex(i); + } + } + // -------------------------------- WinRT Events --------------------------------- // Winrt events need a method for adding a callback to the event and removing the callback. // These macros will define them both for you. diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index e7ff1365c..540921c0c 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -93,6 +93,7 @@ namespace winrt::TerminalApp::implementation Windows::Foundation::Collections::IObservableVector _tabs; winrt::com_ptr _GetStrongTabImpl(const uint32_t index) const; winrt::com_ptr _GetStrongTabImpl(const ::winrt::TerminalApp::Tab& tab) const; + void _UpdateTabIndices(); bool _isInFocusMode{ false }; bool _isFullscreen{ false };