From a1e07c56f3eea328910f42fa10bf628e5447e6b3 Mon Sep 17 00:00:00 2001 From: khvitaly Date: Fri, 25 Dec 2020 18:10:33 +0200 Subject: [PATCH 1/2] Prevent tab switcher from increasing Tab refcount --- src/cascadia/TerminalApp/CommandPalette.cpp | 5 ++++- src/cascadia/TerminalApp/TabPaletteItem.cpp | 20 +------------------- src/cascadia/TerminalApp/TabPaletteItem.h | 7 +++++-- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp index add9138eafd..6fee50f9a45 100644 --- a/src/cascadia/TerminalApp/CommandPalette.cpp +++ b/src/cascadia/TerminalApp/CommandPalette.cpp @@ -690,7 +690,10 @@ namespace winrt::TerminalApp::implementation { if (const auto tabPaletteItem{ filteredCommand.Item().try_as() }) { - _SwitchToTabRequestedHandlers(*this, tabPaletteItem.Tab()); + if (const auto tab{ tabPaletteItem.Tab() }) + { + _SwitchToTabRequestedHandlers(*this, tab); + } } } } diff --git a/src/cascadia/TerminalApp/TabPaletteItem.cpp b/src/cascadia/TerminalApp/TabPaletteItem.cpp index f7f1fd456dc..4716321ef7c 100644 --- a/src/cascadia/TerminalApp/TabPaletteItem.cpp +++ b/src/cascadia/TerminalApp/TabPaletteItem.cpp @@ -19,27 +19,9 @@ using namespace winrt::Microsoft::Terminal::Settings::Model; namespace winrt::TerminalApp::implementation { TabPaletteItem::TabPaletteItem(winrt::TerminalApp::TabBase const& tab) : - _Tab(tab) + _tab(tab) { Name(tab.Title()); Icon(tab.Icon()); - - _tabChangedRevoker = tab.PropertyChanged(winrt::auto_revoke, [weakThis{ get_weak() }](auto& sender, auto& e) { - auto item{ weakThis.get() }; - auto senderTab{ sender.try_as() }; - - if (item && senderTab) - { - auto changedProperty = e.PropertyName(); - if (changedProperty == L"Title") - { - item->Name(senderTab.Title()); - } - else if (changedProperty == L"Icon") - { - item->Icon(senderTab.Icon()); - } - } - }); } } diff --git a/src/cascadia/TerminalApp/TabPaletteItem.h b/src/cascadia/TerminalApp/TabPaletteItem.h index 4a498e6f766..82053cf8ee8 100644 --- a/src/cascadia/TerminalApp/TabPaletteItem.h +++ b/src/cascadia/TerminalApp/TabPaletteItem.h @@ -14,10 +14,13 @@ namespace winrt::TerminalApp::implementation TabPaletteItem() = default; TabPaletteItem(winrt::TerminalApp::TabBase const& tab); - GETSET_PROPERTY(winrt::TerminalApp::TabBase, Tab, nullptr); + winrt::TerminalApp::TabBase Tab() const noexcept + { + return _tab.get(); + } private: - Windows::UI::Xaml::Data::INotifyPropertyChanged::PropertyChanged_revoker _tabChangedRevoker; + winrt::weak_ref _tab; }; } From a5842d81d96b8490fcb6d5ec5b53b959cd066680 Mon Sep 17 00:00:00 2001 From: khvitaly Date: Mon, 4 Jan 2021 20:23:02 +0200 Subject: [PATCH 2/2] Restore PropertyChanged registration on tab --- src/cascadia/TerminalApp/TabPaletteItem.cpp | 18 ++++++++++++++++++ src/cascadia/TerminalApp/TabPaletteItem.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/cascadia/TerminalApp/TabPaletteItem.cpp b/src/cascadia/TerminalApp/TabPaletteItem.cpp index 4716321ef7c..baf42fc06c0 100644 --- a/src/cascadia/TerminalApp/TabPaletteItem.cpp +++ b/src/cascadia/TerminalApp/TabPaletteItem.cpp @@ -23,5 +23,23 @@ namespace winrt::TerminalApp::implementation { Name(tab.Title()); Icon(tab.Icon()); + + _tabChangedRevoker = tab.PropertyChanged(winrt::auto_revoke, [weakThis{ get_weak() }](auto& sender, auto& e) { + auto item{ weakThis.get() }; + auto senderTab{ sender.try_as() }; + + if (item && senderTab) + { + auto changedProperty = e.PropertyName(); + if (changedProperty == L"Title") + { + item->Name(senderTab.Title()); + } + else if (changedProperty == L"Icon") + { + item->Icon(senderTab.Icon()); + } + } + }); } } diff --git a/src/cascadia/TerminalApp/TabPaletteItem.h b/src/cascadia/TerminalApp/TabPaletteItem.h index 82053cf8ee8..e5c55798974 100644 --- a/src/cascadia/TerminalApp/TabPaletteItem.h +++ b/src/cascadia/TerminalApp/TabPaletteItem.h @@ -21,6 +21,7 @@ namespace winrt::TerminalApp::implementation private: winrt::weak_ref _tab; + Windows::UI::Xaml::Data::INotifyPropertyChanged::PropertyChanged_revoker _tabChangedRevoker; }; }