Remove startOnUserLogin from the settings; use OS APIs only (#18530)

Before we had a Settings UI, we added support for a setting called
`startOnUserLogin`. It was a boolean, and on startup we would try to
yeet the value of that setting into the Windows API responsible for
registering us as a startup task.

Unfortunately, we failed to take into account a few things.

- Startup tasks can be independently controlled by the user in Windows
Settings or by an enterprise using enterprise policy
- This control is not limited to *disabling* the task; it also supports
enabling it!

Users could enable our startup task outside the settings file and we
would never know it. We would load up, see that `startOnUserLogin` was
`false`, and go disable the task again. 🤦

Conversely, if the user disables our task outside the app _we can never
enable it from inside the app._ If an enterprise has configured it
either direction, we can't change it either.

The best way forward is to remove it from our settings model and only
ever interact with the Windows API.

This pull request replaces `startOnUserLogin` with a rich settings
experience that will reflect the current and final state of the task as
configured through Windows. Terminal will enable it if it can and
display a message if it can't.

My first attempt at this PR (which you can read in the commit history)
made us try harder to sync the state between the settings model and the
OS; we would propagate the disabled state back to the user setting when
the task was disabled in the OS or if we failed to enable it when the
user asked for it. That was fragile and didn't support reporting the
state in the settings UI, and it seems like it would be confusing for a
setting to silently turn itself back off anyway...

Closes #12564
This commit is contained in:
Dustin L. Howett 2025-02-20 16:53:33 -06:00 committed by GitHub
parent b6b8caba1e
commit a46fac25d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 170 additions and 95 deletions

View File

@ -2480,11 +2480,6 @@
"minimum": 1, "minimum": 1,
"type": "integer" "type": "integer"
}, },
"startOnUserLogin": {
"default": false,
"description": "When set to true, this enables the launch of Terminal at startup. Setting this to false will disable the startup task entry. If the Terminal startup task entry is disabled either by org policy or by user action this setting will have no effect.",
"type": "boolean"
},
"firstWindowPreference": { "firstWindowPreference": {
"default": "defaultProfile", "default": "defaultProfile",
"description": "Defines what behavior the terminal takes when it starts. \"defaultProfile\" will have the terminal launch with one tab of the default profile, and \"persistedWindowLayout\" will cause the terminal to save its layout on close and reload it on open.", "description": "Defines what behavior the terminal takes when it starts. \"defaultProfile\" will have the terminal launch with one tab of the default profile, and \"persistedWindowLayout\" will cause the terminal to save its layout on close and reload it on open.",

View File

@ -81,8 +81,6 @@ static winrt::hstring _GetErrorText(SettingsLoadErrors error)
return _GetMessageText(static_cast<uint32_t>(error), settingsLoadErrorsLabels); return _GetMessageText(static_cast<uint32_t>(error), settingsLoadErrorsLabels);
} }
static constexpr std::wstring_view StartupTaskName = L"StartTerminalOnLoginTask";
namespace winrt::TerminalApp::implementation namespace winrt::TerminalApp::implementation
{ {
// Function Description: // Function Description:
@ -353,40 +351,6 @@ namespace winrt::TerminalApp::implementation
} }
CATCH_LOG() CATCH_LOG()
safe_void_coroutine AppLogic::_ApplyStartupTaskStateChange()
try
{
// First, make sure we're running in a packaged context. This method
// won't work, and will crash mysteriously if we're running unpackaged.
if (!IsPackaged())
{
co_return;
}
const auto tryEnableStartupTask = _settings.GlobalSettings().StartOnUserLogin();
const auto task = co_await StartupTask::GetAsync(StartupTaskName);
switch (task.State())
{
case StartupTaskState::Disabled:
if (tryEnableStartupTask)
{
co_await task.RequestEnableAsync();
}
break;
case StartupTaskState::DisabledByUser:
// TODO: GH#6254: define UX for other StartupTaskStates
break;
case StartupTaskState::Enabled:
if (!tryEnableStartupTask)
{
task.Disable();
}
break;
}
}
CATCH_LOG();
// Method Description: // Method Description:
// - Reloads the settings from the settings.json file. // - Reloads the settings from the settings.json file.
// - When this is called the first time, this initializes our settings. See // - When this is called the first time, this initializes our settings. See
@ -446,7 +410,6 @@ namespace winrt::TerminalApp::implementation
// TerminalSettings object. // TerminalSettings object.
_ApplyLanguageSettingChange(); _ApplyLanguageSettingChange();
_ApplyStartupTaskStateChange();
_ProcessLazySettingsChanges(); _ProcessLazySettingsChanges();
auto warnings{ winrt::multi_threaded_vector<SettingsLoadWarnings>() }; auto warnings{ winrt::multi_threaded_vector<SettingsLoadWarnings>() };
@ -473,7 +436,6 @@ namespace winrt::TerminalApp::implementation
// Both LoadSettings and ReloadSettings are supposed to call this function, // Both LoadSettings and ReloadSettings are supposed to call this function,
// but LoadSettings skips it, so that the UI starts up faster. // but LoadSettings skips it, so that the UI starts up faster.
// Now that the UI is present we can do them with a less significant UX impact. // Now that the UI is present we can do them with a less significant UX impact.
_ApplyStartupTaskStateChange();
_ProcessLazySettingsChanges(); _ProcessLazySettingsChanges();
FILETIME creationTime, exitTime, kernelTime, userTime, now; FILETIME creationTime, exitTime, kernelTime, userTime, now;

View File

@ -76,7 +76,6 @@ namespace winrt::TerminalApp::implementation
TerminalApp::ContentManager _contentManager{ winrt::make<implementation::ContentManager>() }; TerminalApp::ContentManager _contentManager{ winrt::make<implementation::ContentManager>() };
void _ApplyLanguageSettingChange() noexcept; void _ApplyLanguageSettingChange() noexcept;
safe_void_coroutine _ApplyStartupTaskStateChange();
[[nodiscard]] HRESULT _TryLoadSettings() noexcept; [[nodiscard]] HRESULT _TryLoadSettings() noexcept;
void _ProcessLazySettingsChanges(); void _ProcessLazySettingsChanges();

View File

@ -5,6 +5,7 @@
#include "Launch.h" #include "Launch.h"
#include "Launch.g.cpp" #include "Launch.g.cpp"
#include "EnumEntry.h" #include "EnumEntry.h"
#include "LaunchViewModel.h"
#include <LibraryResources.h> #include <LibraryResources.h>
@ -40,5 +41,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void Launch::OnNavigatedTo(const NavigationEventArgs& e) void Launch::OnNavigatedTo(const NavigationEventArgs& e)
{ {
_ViewModel = e.Parameter().as<Editor::LaunchViewModel>(); _ViewModel = e.Parameter().as<Editor::LaunchViewModel>();
auto innerViewModel{ winrt::get_self<Editor::implementation::LaunchViewModel>(_ViewModel) };
/* coroutine dispatch */ innerViewModel->PrepareStartOnUserLoginSettings();
} }
} }

View File

@ -163,8 +163,11 @@
</local:SettingContainer> </local:SettingContainer>
<!-- Start on User Login --> <!-- Start on User Login -->
<local:SettingContainer x:Uid="Globals_StartOnUserLogin"> <local:SettingContainer x:Uid="Globals_StartOnUserLogin"
<ToggleSwitch IsOn="{x:Bind ViewModel.StartOnUserLogin, Mode=TwoWay}" HelpText="{x:Bind ViewModel.StartOnUserLoginStatefulHelpText, Mode=OneWay}"
Visibility="{x:Bind ViewModel.StartOnUserLoginAvailable, Mode=OneTime}">
<ToggleSwitch IsEnabled="{x:Bind ViewModel.StartOnUserLoginConfigurable, Mode=OneWay}"
IsOn="{x:Bind ViewModel.StartOnUserLogin, Mode=TwoWay}"
Style="{StaticResource ToggleSwitchInExpanderStyle}" /> Style="{StaticResource ToggleSwitchInExpanderStyle}" />
</local:SettingContainer> </local:SettingContainer>

View File

@ -14,6 +14,8 @@ using namespace winrt::Windows::Foundation;
using namespace winrt::Microsoft::Terminal::Settings::Model; using namespace winrt::Microsoft::Terminal::Settings::Model;
using namespace winrt::Windows::UI::Xaml::Data; using namespace winrt::Windows::UI::Xaml::Data;
static constexpr std::wstring_view StartupTaskName = L"StartTerminalOnLoginTask";
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{ {
// For ComboBox an empty SelectedItem string denotes no selection. // For ComboBox an empty SelectedItem string denotes no selection.
@ -365,4 +367,86 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{ {
return _Settings.DefaultTerminals(); return _Settings.DefaultTerminals();
} }
bool LaunchViewModel::StartOnUserLoginAvailable()
{
return IsPackaged();
}
safe_void_coroutine LaunchViewModel::PrepareStartOnUserLoginSettings()
{
if (!StartOnUserLoginAvailable())
{
co_return;
}
auto strongThis{ get_strong() };
auto task{ co_await winrt::Windows::ApplicationModel::StartupTask::GetAsync(StartupTaskName) };
_startOnUserLoginTask = std::move(task);
_NotifyChanges(L"StartOnUserLoginConfigurable", L"StartOnUserLoginStatefulHelpText", L"StartOnUserLogin");
}
bool LaunchViewModel::StartOnUserLoginConfigurable()
{
if (!_startOnUserLoginTask)
{
return false;
}
namespace WAM = winrt::Windows::ApplicationModel;
const auto state{ _startOnUserLoginTask.State() };
// Terminal cannot change the state of the login task if it is any of the "ByUser" or "ByPolicy" states.
return state == WAM::StartupTaskState::Disabled || state == WAM::StartupTaskState::Enabled;
}
winrt::hstring LaunchViewModel::StartOnUserLoginStatefulHelpText()
{
if (_startOnUserLoginTask)
{
namespace WAM = winrt::Windows::ApplicationModel;
switch (_startOnUserLoginTask.State())
{
case WAM::StartupTaskState::EnabledByPolicy:
case WAM::StartupTaskState::DisabledByPolicy:
return winrt::hstring{ L"\uE72E " } /*lock icon*/ + RS_(L"Globals_StartOnUserLogin_UnavailableByPolicy");
case WAM::StartupTaskState::DisabledByUser:
return RS_(L"Globals_StartOnUserLogin_DisabledByUser");
case WAM::StartupTaskState::Enabled:
case WAM::StartupTaskState::Disabled:
default:
break; // fall through to the common case (no task, not configured, etc.)
}
}
return RS_(L"Globals_StartOnUserLogin/HelpText");
}
bool LaunchViewModel::StartOnUserLogin()
{
if (!_startOnUserLoginTask)
{
return false;
}
namespace WAM = winrt::Windows::ApplicationModel;
const auto state{ _startOnUserLoginTask.State() };
return state == WAM::StartupTaskState::Enabled || state == WAM::StartupTaskState::EnabledByPolicy;
}
safe_void_coroutine LaunchViewModel::StartOnUserLogin(bool enable)
{
if (!_startOnUserLoginTask)
{
co_return;
}
auto strongThis{ get_strong() };
if (enable)
{
co_await _startOnUserLoginTask.RequestEnableAsync();
}
else
{
_startOnUserLoginTask.Disable();
}
// Any of these could have changed in response to an attempt to enable (e.g. it was disabled in task manager since our last check)
_NotifyChanges(L"StartOnUserLoginConfigurable", L"StartOnUserLoginStatefulHelpText", L"StartOnUserLogin");
}
} }

View File

@ -6,6 +6,7 @@
#include "LaunchViewModel.g.h" #include "LaunchViewModel.g.h"
#include "ViewModelHelpers.h" #include "ViewModelHelpers.h"
#include "Utils.h" #include "Utils.h"
#include <cppwinrt_utils.h>
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{ {
@ -51,10 +52,16 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
GETSET_BINDABLE_ENUM_SETTING(WindowingBehavior, Model::WindowingMode, _Settings.GlobalSettings().WindowingBehavior); GETSET_BINDABLE_ENUM_SETTING(WindowingBehavior, Model::WindowingMode, _Settings.GlobalSettings().WindowingBehavior);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), CenterOnLaunch); PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), CenterOnLaunch);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), StartOnUserLogin);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), InitialRows); PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), InitialRows);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), InitialCols); PERMANENT_OBSERVABLE_PROJECTED_SETTING(_Settings.GlobalSettings(), InitialCols);
bool StartOnUserLoginAvailable();
safe_void_coroutine PrepareStartOnUserLoginSettings();
bool StartOnUserLoginConfigurable();
winrt::hstring StartOnUserLoginStatefulHelpText();
bool StartOnUserLogin();
safe_void_coroutine StartOnUserLogin(bool enable);
private: private:
Model::CascadiaSettings _Settings; Model::CascadiaSettings _Settings;
winrt::Windows::Foundation::Collections::IObservableVector<winrt::hstring> _languageList; winrt::Windows::Foundation::Collections::IObservableVector<winrt::hstring> _languageList;
@ -63,6 +70,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
winrt::Windows::Foundation::Collections::IObservableVector<winrt::Microsoft::Terminal::Settings::Editor::EnumEntry> _LaunchModeList; winrt::Windows::Foundation::Collections::IObservableVector<winrt::Microsoft::Terminal::Settings::Editor::EnumEntry> _LaunchModeList;
winrt::Windows::Foundation::Collections::IMap<Model::LaunchMode, winrt::Microsoft::Terminal::Settings::Editor::EnumEntry> _LaunchModeMap; winrt::Windows::Foundation::Collections::IMap<Model::LaunchMode, winrt::Microsoft::Terminal::Settings::Editor::EnumEntry> _LaunchModeMap;
winrt::Windows::ApplicationModel::StartupTask _startOnUserLoginTask{ nullptr };
}; };
}; };

View File

@ -9,8 +9,6 @@ namespace Microsoft.Terminal.Settings.Editor
{ {
runtimeclass LaunchViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged runtimeclass LaunchViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged
{ {
LaunchViewModel(Microsoft.Terminal.Settings.Model.CascadiaSettings settings);
static String LanguageDisplayConverter(String tag); static String LanguageDisplayConverter(String tag);
Boolean LanguageSelectorAvailable { get; }; Boolean LanguageSelectorAvailable { get; };
Windows.Foundation.Collections.IObservableVector<String> LanguageList { get; }; Windows.Foundation.Collections.IObservableVector<String> LanguageList { get; };
@ -41,8 +39,12 @@ namespace Microsoft.Terminal.Settings.Editor
IObservableVector<Microsoft.Terminal.Settings.Editor.EnumEntry> WindowingBehaviorList { get; }; IObservableVector<Microsoft.Terminal.Settings.Editor.EnumEntry> WindowingBehaviorList { get; };
PERMANENT_OBSERVABLE_PROJECTED_SETTING(Boolean, CenterOnLaunch); PERMANENT_OBSERVABLE_PROJECTED_SETTING(Boolean, CenterOnLaunch);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(Boolean, StartOnUserLogin);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(Int32, InitialRows); PERMANENT_OBSERVABLE_PROJECTED_SETTING(Int32, InitialRows);
PERMANENT_OBSERVABLE_PROJECTED_SETTING(Int32, InitialCols); PERMANENT_OBSERVABLE_PROJECTED_SETTING(Int32, InitialCols);
Boolean StartOnUserLogin { get; set; };
Boolean StartOnUserLoginAvailable { get; };
Boolean StartOnUserLoginConfigurable { get; };
String StartOnUserLoginStatefulHelpText { get; };
} }
} }

View File

@ -2332,4 +2332,12 @@
<value>None</value> <value>None</value>
<comment>Text displayed when the tab title is not defined.</comment> <comment>Text displayed when the tab title is not defined.</comment>
</data> </data>
<data name="Globals_StartOnUserLogin_DisabledByUser" xml:space="preserve">
<value>Automatic startup has been disabled in the Startup Apps section of Windows settings.</value>
<comment>{Locked="Windows"}This is displayed in concordance with Globals_StartOnUserLogin if the user has disabled the setting outside of the application.</comment>
</data>
<data name="Globals_StartOnUserLogin_UnavailableByPolicy" xml:space="preserve">
<value>This option is managed by enterprise policy and cannot be changed here.</value>
<comment>This is displayed in concordance with Globals_StartOnUserLogin if the enterprise administrator has taken control of this setting.</comment>
</data>
</root> </root>

View File

@ -46,7 +46,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
L"HelpText", L"HelpText",
xaml_typename<hstring>(), xaml_typename<hstring>(),
xaml_typename<Editor::SettingContainer>(), xaml_typename<Editor::SettingContainer>(),
PropertyMetadata{ box_value(L"") }); PropertyMetadata{ box_value(L""), PropertyChangedCallback{ &SettingContainer::_OnHelpTextChanged } });
} }
if (!_FontIconGlyphProperty) if (!_FontIconGlyphProperty)
{ {
@ -126,48 +126,15 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
get_self<SettingContainer>(obj)->_UpdateOverrideSystem(); get_self<SettingContainer>(obj)->_UpdateOverrideSystem();
} }
void SettingContainer::OnApplyTemplate() void SettingContainer::_OnHelpTextChanged(const DependencyObject& d, const DependencyPropertyChangedEventArgs& /*args*/)
{ {
if (const auto& child{ GetTemplateChild(L"ResetButton") }) // update visibility for override message and reset button
{ const auto& obj{ d.try_as<Editor::SettingContainer>() };
if (const auto& button{ child.try_as<Controls::Button>() }) get_self<SettingContainer>(obj)->_UpdateHelpText();
{ }
// Apply click handler for the reset button.
// When clicked, we dispatch the bound ClearSettingValue event,
// resulting in inheriting the setting value from the parent.
button.Click([=](auto&&, auto&&) {
ClearSettingValue.raise(*this, nullptr);
// move the focus to the child control
if (const auto& content{ Content() })
{
if (const auto& control{ content.try_as<Controls::Control>() })
{
control.Focus(FocusState::Programmatic);
return;
}
else if (const auto& panel{ content.try_as<Controls::Panel>() })
{
for (const auto& panelChild : panel.Children())
{
if (const auto& panelControl{ panelChild.try_as<Controls::Control>() })
{
panelControl.Focus(FocusState::Programmatic);
return;
}
}
}
// if we get here, we didn't find something to reasonably focus to.
}
});
// apply name (automation property)
Automation::AutomationProperties::SetName(child, RS_(L"SettingContainer_OverrideMessageBaseLayer"));
}
}
_UpdateOverrideSystem();
void SettingContainer::_UpdateHelpText()
{
// Get the correct base to apply automation properties to // Get the correct base to apply automation properties to
std::vector<DependencyObject> base; std::vector<DependencyObject> base;
base.reserve(2); base.reserve(2);
@ -215,6 +182,50 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
} }
} }
void SettingContainer::OnApplyTemplate()
{
if (const auto& child{ GetTemplateChild(L"ResetButton") })
{
if (const auto& button{ child.try_as<Controls::Button>() })
{
// Apply click handler for the reset button.
// When clicked, we dispatch the bound ClearSettingValue event,
// resulting in inheriting the setting value from the parent.
button.Click([=](auto&&, auto&&) {
ClearSettingValue.raise(*this, nullptr);
// move the focus to the child control
if (const auto& content{ Content() })
{
if (const auto& control{ content.try_as<Controls::Control>() })
{
control.Focus(FocusState::Programmatic);
return;
}
else if (const auto& panel{ content.try_as<Controls::Panel>() })
{
for (const auto& panelChild : panel.Children())
{
if (const auto& panelControl{ panelChild.try_as<Controls::Control>() })
{
panelControl.Focus(FocusState::Programmatic);
return;
}
}
}
// if we get here, we didn't find something to reasonably focus to.
}
});
// apply name (automation property)
Automation::AutomationProperties::SetName(child, RS_(L"SettingContainer_OverrideMessageBaseLayer"));
}
}
_UpdateOverrideSystem();
_UpdateHelpText();
}
void SettingContainer::SetExpanded(bool expanded) void SettingContainer::SetExpanded(bool expanded)
{ {
if (const auto& child{ GetTemplateChild(L"Expander") }) if (const auto& child{ GetTemplateChild(L"Expander") })

View File

@ -47,9 +47,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
static void _InitializeProperties(); static void _InitializeProperties();
static void _OnCurrentValueChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& e); static void _OnCurrentValueChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& e);
static void _OnHasSettingValueChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& e); static void _OnHasSettingValueChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& e);
static void _OnHelpTextChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& e);
static hstring _GenerateOverrideMessage(const IInspectable& settingOrigin); static hstring _GenerateOverrideMessage(const IInspectable& settingOrigin);
hstring _GenerateAccessibleName(); hstring _GenerateAccessibleName();
void _UpdateOverrideSystem(); void _UpdateOverrideSystem();
void _UpdateHelpText();
void _UpdateCurrentValueAutoProp(); void _UpdateCurrentValueAutoProp();
}; };
} }

View File

@ -176,6 +176,7 @@
<Setter Property="LineHeight" Value="16" /> <Setter Property="LineHeight" Value="16" />
<Setter Property="Foreground" Value="{ThemeResource SubgroupHeaderBrush}" /> <Setter Property="Foreground" Value="{ThemeResource SubgroupHeaderBrush}" />
<Setter Property="TextWrapping" Value="WrapWholeWords" /> <Setter Property="TextWrapping" Value="WrapWholeWords" />
<Setter Property="FontFamily" Value="Segoe UI, Segoe Fluent Icons, Segoe MDL2 Assets" />
</Style> </Style>
<DataTemplate x:Key="ExpanderSettingContainerStringPreviewTemplate"> <DataTemplate x:Key="ExpanderSettingContainerStringPreviewTemplate">

View File

@ -84,7 +84,6 @@ namespace Microsoft.Terminal.Settings.Model
INHERITABLE_SETTING(Microsoft.Terminal.Control.TextMeasurement, TextMeasurement); INHERITABLE_SETTING(Microsoft.Terminal.Control.TextMeasurement, TextMeasurement);
INHERITABLE_SETTING(Boolean, UseBackgroundImageForWindow); INHERITABLE_SETTING(Boolean, UseBackgroundImageForWindow);
INHERITABLE_SETTING(Boolean, DebugFeaturesEnabled); INHERITABLE_SETTING(Boolean, DebugFeaturesEnabled);
INHERITABLE_SETTING(Boolean, StartOnUserLogin);
INHERITABLE_SETTING(Boolean, AlwaysOnTop); INHERITABLE_SETTING(Boolean, AlwaysOnTop);
INHERITABLE_SETTING(Boolean, AutoHideWindow); INHERITABLE_SETTING(Boolean, AutoHideWindow);
INHERITABLE_SETTING(TabSwitcherMode, TabSwitcherMode); INHERITABLE_SETTING(TabSwitcherMode, TabSwitcherMode);

View File

@ -51,7 +51,6 @@ Author(s):
X(Model::LaunchMode, LaunchMode, "launchMode", LaunchMode::DefaultMode) \ X(Model::LaunchMode, LaunchMode, "launchMode", LaunchMode::DefaultMode) \
X(bool, SnapToGridOnResize, "snapToGridOnResize", true) \ X(bool, SnapToGridOnResize, "snapToGridOnResize", true) \
X(bool, DebugFeaturesEnabled, "debugFeatures", debugFeaturesDefault) \ X(bool, DebugFeaturesEnabled, "debugFeatures", debugFeaturesDefault) \
X(bool, StartOnUserLogin, "startOnUserLogin", false) \
X(bool, AlwaysOnTop, "alwaysOnTop", false) \ X(bool, AlwaysOnTop, "alwaysOnTop", false) \
X(bool, AutoHideWindow, "autoHideWindow", false) \ X(bool, AutoHideWindow, "autoHideWindow", false) \
X(Model::TabSwitcherMode, TabSwitcherMode, "tabSwitcherMode", Model::TabSwitcherMode::InOrder) \ X(Model::TabSwitcherMode, TabSwitcherMode, "tabSwitcherMode", Model::TabSwitcherMode::InOrder) \

View File

@ -25,7 +25,6 @@
// Miscellaneous // Miscellaneous
"confirmCloseAllTabs": true, "confirmCloseAllTabs": true,
"startOnUserLogin": false,
"theme": "dark", "theme": "dark",
"snapToGridOnResize": true, "snapToGridOnResize": true,
"disableAnimations": false, "disableAnimations": false,

View File

@ -117,7 +117,6 @@ namespace SettingsModelUnitTests
"tabWidthMode": "equal", "tabWidthMode": "equal",
"tabSwitcherMode": "mru", "tabSwitcherMode": "mru",
"startOnUserLogin": false,
"theme": "system", "theme": "system",
"snapToGridOnResize": true, "snapToGridOnResize": true,
"disableAnimations": false, "disableAnimations": false,