diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index a6f15bea939..30a1733a0c6 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -4,6 +4,7 @@ #include "pch.h" #include "AppLogic.h" #include "AppLogic.g.cpp" +#include "wtypes.h" #include #include @@ -636,11 +637,39 @@ namespace winrt::TerminalApp::implementation LoadSettings(); } + UINT dpi = USER_DEFAULT_SCREEN_DPI; + int _width = 0; + int _height = 0; + GetDesktopResolution(_width, _height); const auto initialPosition{ _settings.GlobalSettings().InitialPosition() }; - return { - initialPosition.X ? initialPosition.X.Value() : defaultInitialX, - initialPosition.Y ? initialPosition.Y.Value() : defaultInitialY - }; + const auto CentreOnLaunch{ _settings.GlobalSettings().CentreOnLaunch() }; + const auto dimensions = GetLaunchDimensions(dpi); + const auto appWidth = dimensions.Width; + const auto appHeight = dimensions.Height; + + if (CentreOnLaunch) + { + return { + (_width / 2) - (static_cast(appWidth) / 2), + (_height / 2) - (static_cast(appHeight) / 2) + }; + } + else + { + return { + initialPosition.X ? initialPosition.X.Value() : defaultInitialX, + initialPosition.Y ? initialPosition.Y.Value() : defaultInitialY + }; + } + } + + void AppLogic::GetDesktopResolution(int& width, int& height) + { + RECT desktop; + const HWND hDesktop = GetDesktopWindow(); + GetWindowRect(hDesktop, &desktop); + width = desktop.right; + height = desktop.bottom; } winrt::Windows::UI::Xaml::ElementTheme AppLogic::GetRequestedTheme() diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index c11c1a5fc24..bd81659d5a2 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -34,6 +34,7 @@ namespace winrt::TerminalApp::implementation bool Fullscreen() const; bool AlwaysOnTop() const; + void GetDesktopResolution(int& horizontal, int& vertical); Windows::Foundation::Size GetLaunchDimensions(uint32_t dpi); TerminalApp::InitialPosition GetInitialPosition(int64_t defaultInitialX, int64_t defaultInitialY); winrt::Windows::UI::Xaml::ElementTheme GetRequestedTheme(); diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp index 28a1f1aa529..e1168e090d5 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp @@ -23,6 +23,7 @@ static constexpr std::string_view AlwaysShowTabsKey{ "alwaysShowTabs" }; static constexpr std::string_view InitialRowsKey{ "initialRows" }; static constexpr std::string_view InitialColsKey{ "initialCols" }; static constexpr std::string_view InitialPositionKey{ "initialPosition" }; +static constexpr std::string_view CentreOnLaunchKey{ "centreOnLaunch" }; static constexpr std::string_view ShowTitleInTitlebarKey{ "showTerminalTitleInTitlebar" }; static constexpr std::string_view ThemeKey{ "theme" }; static constexpr std::string_view TabWidthModeKey{ "tabWidthMode" }; @@ -104,6 +105,7 @@ winrt::com_ptr GlobalAppSettings::Copy() const globals->_WarnAboutLargePaste = _WarnAboutLargePaste; globals->_WarnAboutMultiLinePaste = _WarnAboutMultiLinePaste; globals->_InitialPosition = _InitialPosition; + globals->_CentreOnLaunch = _CentreOnLaunch; globals->_LaunchMode = _LaunchMode; globals->_SnapToGridOnResize = _SnapToGridOnResize; globals->_ForceFullRepaintRendering = _ForceFullRepaintRendering; @@ -257,6 +259,8 @@ void GlobalAppSettings::LayerJson(const Json::Value& json) JsonUtils::GetValueForKey(json, InitialPositionKey, _InitialPosition); + JsonUtils::GetValueForKey(json, CentreOnLaunchKey, _CentreOnLaunch); + JsonUtils::GetValueForKey(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); JsonUtils::GetValueForKey(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); @@ -369,6 +373,7 @@ Json::Value GlobalAppSettings::ToJson() const JsonUtils::SetValueForKey(json, InitialRowsKey, _InitialRows); JsonUtils::SetValueForKey(json, InitialColsKey, _InitialCols); JsonUtils::SetValueForKey(json, InitialPositionKey, _InitialPosition); + JsonUtils::SetValueForKey(json, CentreOnLaunchKey, _CentreOnLaunch); JsonUtils::SetValueForKey(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); JsonUtils::SetValueForKey(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); JsonUtils::SetValueForKey(json, WordDelimitersKey, _WordDelimiters); diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h index 29c4fbda7e0..8c4c9d150b1 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h @@ -75,6 +75,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation GETSET_SETTING(bool, WarnAboutLargePaste, true); GETSET_SETTING(bool, WarnAboutMultiLinePaste, true); GETSET_SETTING(Model::LaunchPosition, InitialPosition, nullptr, nullptr); + GETSET_SETTING(bool, CentreOnLaunch, false); GETSET_SETTING(Model::LaunchMode, LaunchMode, LaunchMode::DefaultMode); GETSET_SETTING(bool, SnapToGridOnResize, true); GETSET_SETTING(bool, ForceFullRepaintRendering, false); diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl index 6d427b4ec5b..ef99022bfef 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl @@ -95,6 +95,10 @@ namespace Microsoft.Terminal.Settings.Model void ClearInitialPosition(); LaunchPosition InitialPosition; + Boolean HasCentreOnLaunch(); + void ClearCentreOnLaunch(); + Boolean CentreOnLaunch; + Boolean HasLaunchMode(); void ClearLaunchMode(); LaunchMode LaunchMode;