From e9a8301e7367567bc7ccd3c445f9788d7f4ca046 Mon Sep 17 00:00:00 2001 From: KavishaHaswani <141186389+KavishaHaswani@users.noreply.github.com> Date: Thu, 15 Jan 2026 05:40:04 +0530 Subject: [PATCH] Fix initial position parsing from -pos tag (#19409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary of the Pull Request Fixes #4247. Improves consistency in -pos tag parsing by supporting single-value input for both axes. ## References and Relevant Issues #4247 ## Detailed Description of the Pull Request / Additional comments The change aligns -pos behavior with padding-style logic. Existing comma-separated behavior remains unchanged. - A single value like "number" now sets both x and y positions to that value — similar to how padding behaves. - A value like "number," (with a trailing comma) continues to set only x, leaving y unchanged. ## Validation Steps Performed - Ran all unit and integration tests - Added unit test to verify single-value and comma-separated inputs ## PR Checklist - [x] Closes #4247 - [x] Tests added/passed - [x] Documentation updated https://github.com/MicrosoftDocs/terminal/pull/890 --------- Co-authored-by: Carlos Zamora --- .../spec.md | 1 + .../ModelSerializationHelpers.h | 8 +++- .../TerminalSettingsTests.cpp | 47 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/doc/specs/#1043 - Set the initial position of the Terminal/spec.md b/doc/specs/#1043 - Set the initial position of the Terminal/spec.md index a6dcc7fd7b..9d7966a491 100644 --- a/doc/specs/#1043 - Set the initial position of the Terminal/spec.md +++ b/doc/specs/#1043 - Set the initial position of the Terminal/spec.md @@ -27,6 +27,7 @@ Two new properties should be added in the json settings file: 2. Both X value and Y values are optional. If any one of them is missing, or the value is invalid, system default value will be used. Examples: + "1000" equals (1000, 1000) ", 1000" equals (default, 1000) "1000, " equals (1000, default) "," equals (default, default) diff --git a/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h index d8c9201f66..ed8afad042 100644 --- a/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h @@ -16,10 +16,10 @@ Abstract: // - Helper for converting a pair of comma separated, potentially absent integer values // into the corresponding left and right values. The leftValue and rightValue functions // will be called back with the associated parsed integer value, assuming it's present. -// (100, 100): leftValue and rightValue functions both called back with 100. +// (100, 100), (100): leftValue and rightValue functions both called back with 100. // (100, ), (100, abc): leftValue function called back with 100 // (, 100), (abc, 100): rightValue function called back with 100 -// (,): no function called back +// (,), (abc): no function called back // (100, 100, 100): we only read the first two values, this is equivalent to (100, 100) // Arguments: // - string: The string to parse @@ -45,6 +45,10 @@ _TIL_INLINEPREFIX void ParseCommaSeparatedPair(const std::string& string, if (index == 0) { leftValue(value); + if (string.find(',') == std::string::npos) + { + rightValue(value); + } } if (index == 1) diff --git a/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp b/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp index 36dfd21eae..90aba8669d 100644 --- a/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp @@ -7,6 +7,7 @@ #include #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/ModelSerializationHelpers.h" #include "TestUtils.h" using namespace Microsoft::Console; @@ -52,6 +53,7 @@ namespace SettingsModelUnitTests TEST_METHOD(MakeSettingsForDefaultProfileThatDoesntExist); TEST_METHOD(TestLayerProfileOnColorScheme); TEST_METHOD(TestCommandlineToTitlePromotion); + TEST_METHOD(TestInitialPositionParsing); }; // CascadiaSettings::_normalizeCommandLine abuses some aspects from CommandLineToArgvW @@ -891,4 +893,49 @@ namespace SettingsModelUnitTests VERIFY_ARE_EQUAL(L"", settingsStruct.DefaultSettings()->StartingTitle()); } } + void TerminalSettingsTests::TestInitialPositionParsing() + { + { + const auto pos = LaunchPositionFromString("50"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.X.Value())); + VERIFY_ARE_EQUAL(50, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("100,"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.X.Value())); + VERIFY_IS_TRUE(pos.Y == nullptr); + } + + { + const auto pos = LaunchPositionFromString(",100"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("50,50"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.X.Value())); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("abc,100"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("abc"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y == nullptr); + } + } }