diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp index 6a477a3a1c..ba0a4cb7c7 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp @@ -223,6 +223,14 @@ Model::WindowSettings CascadiaSettings::WindowSettings(const winrt::hstring& win { return it; } + + // The "_quake" window is special: even if the user never defined a + // "_quake" entry, we still hand back a synthesized WindowSettings that's + // initialized for quake mode (see the SettingsLoader-consuming ctor). + if (_quakeWindowSettings && windowName == L"_quake") + { + return *_quakeWindowSettings; + } } return *_baseWindowSettings; } diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h index 766d3808e2..24962ce8e2 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h @@ -243,6 +243,11 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation winrt::com_ptr _baseWindowSettings = winrt::make_self(); Windows::Foundation::Collections::IMap _windows{ winrt::single_threaded_map() }; + // The special "_quake" window always exists, even if the user never + // defined one in their settings. When that's the case, this holds a + // synthesized "fake" WindowSettings initialized for quake mode. It is + // deliberately kept out of _windows so it's never written back to disk. + winrt::com_ptr _quakeWindowSettings{ nullptr }; winrt::com_ptr _baseLayerProfile = winrt::make_self(); winrt::Windows::Foundation::Collections::IObservableVector _allProfiles = winrt::single_threaded_observable_vector(); diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp index 096bcc686f..25b2dd9277 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp @@ -1516,6 +1516,22 @@ CascadiaSettings::CascadiaSettings(SettingsLoader&& loader) : _windows.Insert(name, *window); } + // The "_quake" window is always treated specially. Even if the user never + // defined a "_quake" entry in their settings, we still want it to behave + // like a quake-mode window (docked to the top of the screen, in focus + // mode). If we didn't load one, synthesize a "fake" one that inherits from + // the base window settings but is initialized for quake mode. We keep it out + // of _windows so it isn't serialized back to the user's settings file. + if (!_windows.HasKey(L"_quake")) + { + auto quake{ winrt::make_self() }; + quake->Name(L"_quake"); + quake->InitializeForQuakeMode(); + quake->AddLeastImportantParent(_baseWindowSettings); + quake->_FinalizeInheritance(); + _quakeWindowSettings = std::move(quake); + } + _resolveDefaultProfile(); _resolveNewTabMenuProfiles(); _validateSettings(); @@ -1777,6 +1793,11 @@ void CascadiaSettings::_resolveDefaultProfile() const { _resolveDefaultProfileForWindow(window, firstProfileGuid); } + + if (_quakeWindowSettings) + { + _resolveDefaultProfileForWindow(*_quakeWindowSettings, firstProfileGuid); + } } bool CascadiaSettings::_resolveDefaultProfileForWindow(const Model::WindowSettings& window, @@ -1809,6 +1830,11 @@ void CascadiaSettings::_resolveNewTabMenuProfiles() const { _resolveNewTabMenuProfilesForWindow(window); } + + if (_quakeWindowSettings) + { + _resolveNewTabMenuProfilesForWindow(*_quakeWindowSettings); + } } // Method Description: