From da1c5597cd7f10dc3edf02dfd6ca007e0f9f70d3 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Mon, 11 May 2026 19:08:57 -0500 Subject: [PATCH] Only set startingTitle once, clear up title fallback handling (#20214) This commit ensures that we only set the starting title once when we open a new terminal pane. It also consolidates all title selection into Terminal::GetConsoleTitle, which is now used in the TitleChanged event. TitleChanged no longer stores a separate copy of the starting title if an application attempts to _clear_ the title; that seems like a poorer implementation of what we already had. This supersedes work in #20204. Closes #19340 Closes #20204 Co-authored-by: imsh (cherry picked from commit b991eb048ed2ce8de40d551a217fbf32351b200a) Service-Card-Id: PVTI_lADOAF3p4s4BQX0-zgmWldU Service-Version: 1.25 --- src/cascadia/TerminalCore/Terminal.cpp | 6 +++++- src/cascadia/TerminalCore/Terminal.hpp | 2 +- src/cascadia/TerminalCore/TerminalApi.cpp | 8 ++++++-- src/cascadia/TerminalCore/terminalrenderdata.cpp | 11 +++++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index afdb6b4f45..756ca2cefb 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -98,7 +98,6 @@ void Terminal::UpdateSettings(ICoreSettings settings) _answerbackMessage = settings.AnswerbackMessage(); _wordDelimiters = settings.WordDelimiters(); _suppressApplicationTitle = settings.SuppressApplicationTitle(); - _startingTitle = settings.StartingTitle(); _trimBlockSelection = settings.TrimBlockSelection(); _autoMarkPrompts = settings.AutoMarkPrompts(); _rainbowSuggestions = settings.RainbowSuggestions(); @@ -124,6 +123,11 @@ void Terminal::UpdateSettings(ICoreSettings settings) // Save the changes made above and in UpdateAppearance as the new default render settings. GetRenderSettings().SaveDefaultSettings(); + if (!_startingTitle) + { + _startingTitle = settings.StartingTitle(); + } + if (!_startingTabColor && settings.StartingTabColor()) { _startingTabColor = settings.StartingTabColor().Value(); diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 6c32070e2b..f3330544fc 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -349,7 +349,7 @@ private: ::Microsoft::Console::VirtualTerminal::TerminalInput _terminalInput; std::optional _title; - std::wstring _startingTitle; + std::optional _startingTitle; std::optional _startingTabColor; std::vector _searchHighlights; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 393dd9fe42..3030e3b8ba 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -91,8 +91,12 @@ void Terminal::SetWindowTitle(const std::wstring_view title) _assertLocked(); if (!_suppressApplicationTitle) { - _title.emplace(title.empty() ? _startingTitle : title); - _pfnTitleChanged(_title.value()); + _title.reset(); + if (!title.empty()) + { + _title.emplace(title); + } + _pfnTitleChanged(GetConsoleTitle()); } } diff --git a/src/cascadia/TerminalCore/terminalrenderdata.cpp b/src/cascadia/TerminalCore/terminalrenderdata.cpp index 42e24c9f94..6422734f96 100644 --- a/src/cascadia/TerminalCore/terminalrenderdata.cpp +++ b/src/cascadia/TerminalCore/terminalrenderdata.cpp @@ -184,11 +184,18 @@ void Terminal::SelectNewRegion(const til::point coordStart, const til::point coo std::wstring_view Terminal::GetConsoleTitle() const noexcept { _assertLocked(); - if (_title.has_value()) + + if (_title) { return *_title; } - return _startingTitle; + + if (_startingTitle) + { + return *_startingTitle; + } + + return {}; } // Method Description: