diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 3d208c749..98d28d6b2 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -854,6 +854,37 @@ namespace winrt::TerminalApp::implementation { _lastTabClosedHandlers(*this, nullptr); } + else if (_isFullscreen) + { + // GH#5799 - If we're fullscreen, the TabView isn't visible. If it's + // not Visible, it's _not_ going to raise a SelectionChanged event, + // which is what we usually use to focus another tab. Instead, we'll + // have to do it manually here. + // + // We can't use + // auto selectedIndex = _tabView.SelectedIndex(); + // Because this will always return -1 in this scenario unfortunately. + // + // So, what we're going to try to do is move the focus to the tab + // to the left, within the bounds of how many tabs we have. + // + // EX: we have 4 tabs: [A, B, C, D]. If we close: + // * A (tabIndex=0): We'll want to focus tab B (now in index 0) + // * B (tabIndex=1): We'll want to focus tab A (now in index 0) + // * C (tabIndex=2): We'll want to focus tab B (now in index 1) + // * D (tabIndex=3): We'll want to focus tab C (now in index 2) + const auto newSelectedIndex = std::clamp(tabIndex - 1, 0, _tabs.Size()); + // _UpdatedSelectedTab will do the work of setting up the new tab as + // the focused one, and unfocusing all the others. + _UpdatedSelectedTab(newSelectedIndex); + + // Also, we need to _manually_ set the SelectedItem of the tabView + // here. If we don't, then the TabView will technically not have a + // selected item at all, which can make things like ClosePane not + // work correctly. + auto newSelectedTab{ _GetStrongTabImpl(newSelectedIndex) }; + _tabView.SelectedItem(newSelectedTab->GetTabViewItem()); + } } // Method Description: