diff --git a/OpenConsole.sln b/OpenConsole.sln index 7683c8797..722804733 100644 --- a/OpenConsole.sln +++ b/OpenConsole.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2008 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29001.49 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Terminal", "Terminal", "{59840756-302F-44DF-AA47-441A9D673202}" EndProject @@ -202,8 +202,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TerminalSettings", "src\cas EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "OpenConsolePackage", "pkg\appx\OpenConsolePackage.wapproj", "{2D310963-F3E0-4EE5-8AC6-FBC94DCC3310}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.UI.Xaml.Markup", "src\cascadia\Microsoft.UI.Xaml.Markup\Microsoft.UI.Xaml.Markup.vcxproj", "{015A0047-772D-4F1A-88C9-45C18F0ADFB6}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests_TerminalCore", "src\cascadia\UnitTests_TerminalCore\UnitTests.vcxproj", "{2C2BEEF4-9333-4D05-B12A-1905CBF112F9}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Internal", "src\internal\internal.vcxproj", "{EF3E32A7-5FF6-42B4-B6E2-96CD7D033F00}" @@ -1050,24 +1048,6 @@ Global {2D310963-F3E0-4EE5-8AC6-FBC94DCC3310}.Release|x86.ActiveCfg = Release|x86 {2D310963-F3E0-4EE5-8AC6-FBC94DCC3310}.Release|x86.Build.0 = Release|x86 {2D310963-F3E0-4EE5-8AC6-FBC94DCC3310}.Release|x86.Deploy.0 = Release|x86 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|ARM64.ActiveCfg = Release|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|ARM64.Build.0 = Release|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|x64.ActiveCfg = Release|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|x64.Build.0 = Release|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|x86.ActiveCfg = Release|Win32 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.AuditMode|x86.Build.0 = Release|Win32 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|ARM64.Build.0 = Debug|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|x64.ActiveCfg = Debug|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|x64.Build.0 = Debug|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|x86.ActiveCfg = Debug|Win32 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Debug|x86.Build.0 = Debug|Win32 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|ARM64.ActiveCfg = Release|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|ARM64.Build.0 = Release|ARM64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|x64.ActiveCfg = Release|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|x64.Build.0 = Release|x64 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|x86.ActiveCfg = Release|Win32 - {015A0047-772D-4F1A-88C9-45C18F0ADFB6}.Release|x86.Build.0 = Release|Win32 {2C2BEEF4-9333-4D05-B12A-1905CBF112F9}.AuditMode|ARM64.ActiveCfg = AuditMode|ARM64 {2C2BEEF4-9333-4D05-B12A-1905CBF112F9}.AuditMode|ARM64.Build.0 = AuditMode|ARM64 {2C2BEEF4-9333-4D05-B12A-1905CBF112F9}.AuditMode|x64.ActiveCfg = AuditMode|x64 @@ -1173,7 +1153,6 @@ Global {CA5CAD1A-44BD-4AC7-AC72-F16E576FDD12} = {59840756-302F-44DF-AA47-441A9D673202} {CA5CAD1A-D7EC-4107-B7C6-79CB77AE2907} = {59840756-302F-44DF-AA47-441A9D673202} {2D310963-F3E0-4EE5-8AC6-FBC94DCC3310} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB} - {015A0047-772D-4F1A-88C9-45C18F0ADFB6} = {59840756-302F-44DF-AA47-441A9D673202} {2C2BEEF4-9333-4D05-B12A-1905CBF112F9} = {59840756-302F-44DF-AA47-441A9D673202} {EF3E32A7-5FF6-42B4-B6E2-96CD7D033F00} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB} {16376381-CE22-42BE-B667-C6B35007008D} = {81C352DB-1818-45B7-A284-18E259F1CC87} diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.def b/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.def deleted file mode 100644 index 8c1a02932..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.def +++ /dev/null @@ -1,3 +0,0 @@ -EXPORTS -DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE -DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.vcxproj b/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.vcxproj deleted file mode 100644 index a5a61ab39..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/Microsoft.UI.Xaml.Markup.vcxproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - DynamicLibrary - Console - - true - - - - - {015a0047-772d-4f1a-88c9-45c18f0adfb6} - Microsoft.UI.Xaml.Markup - Microsoft.UI.Xaml.Markup - - - - - $(OutDir)\$(TargetName)$(TargetExt) - WindowsApp.lib;Kernel32.lib;User32.lib;%(AdditionalDependencies) - - - - - - - XamlApplication.idl - - - - - - Create - - - XamlApplication.idl - - - - - - - - - - - - - - - - - true - - - - - - diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/ReadMe.md b/src/cascadia/Microsoft.UI.Xaml.Markup/ReadMe.md deleted file mode 100644 index 089dc8d5c..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/ReadMe.md +++ /dev/null @@ -1,22 +0,0 @@ -# Xaml Application for Win32 - -This project implements an Xaml application that is suited for Win32 projects. -A pseudo implementation of this object is: -``` -namespace Microsoft.UI.Xaml.Markup -{ - interface IXamlMetadataProviderContainer - { - Windows.Foundation.Collections.IVector Providers { get; }; - }; - - class XamlApplication : Windows.UI.Xaml.Application, IXamlMetadataProviderContainer, IDisposable - { - XamlApplication() - { - WindowsXamlManager.InitializeForThread(); - } - } -} -``` - diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.cpp b/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.cpp deleted file mode 100644 index e37a1bd0e..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#include "pch.h" - -#include "XamlApplication.h" - -#include "XamlApplication.g.cpp" - -namespace xaml = ::winrt::Windows::UI::Xaml; - -extern "C" { -WINBASEAPI HMODULE WINAPI LoadLibraryExW(_In_ LPCWSTR lpLibFileName, _Reserved_ HANDLE hFile, _In_ DWORD dwFlags); -WINBASEAPI HMODULE WINAPI GetModuleHandleW(_In_opt_ LPCWSTR lpModuleName); -WINUSERAPI BOOL WINAPI PeekMessageW(_Out_ LPMSG lpMsg, _In_opt_ HWND hWnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _In_ UINT wRemoveMsg); -WINUSERAPI LRESULT WINAPI DispatchMessageW(_In_ CONST MSG* lpMsg); -} - -namespace winrt::Microsoft::UI::Xaml::Markup::implementation -{ - XamlApplication::XamlApplication(winrt::Windows::UI::Xaml::Markup::IXamlMetadataProvider parentProvider) - { - m_providers.Append(parentProvider); - } - - XamlApplication::XamlApplication() - { - } - - void XamlApplication::Close() - { - if (m_bIsClosed) - { - return; - } - - m_bIsClosed = true; - - m_providers.Clear(); - - Exit(); - { - MSG msg = {}; - while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) - { - ::DispatchMessageW(&msg); - } - } - } - - XamlApplication::~XamlApplication() - { - Close(); - } - - xaml::Markup::IXamlType XamlApplication::GetXamlType(xaml::Interop::TypeName const& type) - { - for (const auto& provider : m_providers) - { - const auto xamlType = provider.GetXamlType(type); - if (xamlType != nullptr) - { - return xamlType; - } - } - - return nullptr; - } - - xaml::Markup::IXamlType XamlApplication::GetXamlType(winrt::hstring const& fullName) - { - for (const auto& provider : m_providers) - { - const auto xamlType = provider.GetXamlType(fullName); - if (xamlType != nullptr) - { - return xamlType; - } - } - - return nullptr; - } - - winrt::com_array XamlApplication::GetXmlnsDefinitions() - { - std::list definitions; - for (const auto& provider : m_providers) - { - auto defs = provider.GetXmlnsDefinitions(); - for (const auto& def : defs) - { - definitions.insert(definitions.begin(), def); - } - } - - return winrt::com_array(definitions.begin(), definitions.end()); - } - - winrt::Windows::Foundation::Collections::IVector XamlApplication::Providers() - { - return m_providers; - } -} - -namespace winrt::Microsoft::UI::Xaml::Markup::factory_implementation -{ - XamlApplication::XamlApplication() - { - // Workaround a bug where twinapi.appcore.dll and threadpoolwinrt.dll gets loaded after it has been unloaded - // because of a call to GetActivationFactory - const wchar_t* preloadDlls[] = { - L"twinapi.appcore.dll", - L"threadpoolwinrt.dll", - }; - for (auto dllName : preloadDlls) - { - const auto module = ::LoadLibraryExW(dllName, nullptr, 0); - m_preloadInstances.push_back(module); - } - } - - XamlApplication::~XamlApplication() - { - for (auto module : m_preloadInstances) - { - ::FreeLibrary(module); - } - m_preloadInstances.clear(); - } -} diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.h b/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.h deleted file mode 100644 index 59f81f33e..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#pragma once - -#include "XamlApplication.g.h" -#include -#include -#include -#include - -namespace winrt::Microsoft::UI::Xaml::Markup::implementation -{ - class XamlApplication : public XamlApplicationT - { - public: - XamlApplication(); - XamlApplication(winrt::Windows::UI::Xaml::Markup::IXamlMetadataProvider parentProvider); - ~XamlApplication(); - - void Close(); - - winrt::Windows::UI::Xaml::Markup::IXamlType GetXamlType(winrt::Windows::UI::Xaml::Interop::TypeName const& type); - winrt::Windows::UI::Xaml::Markup::IXamlType GetXamlType(winrt::hstring const& fullName); - winrt::com_array GetXmlnsDefinitions(); - - winrt::Windows::Foundation::Collections::IVector Providers(); - - private: - winrt::Windows::Foundation::Collections::IVector m_providers = winrt::single_threaded_vector(); - bool m_bIsClosed = false; - }; -} - -namespace winrt::Microsoft::UI::Xaml::Markup::factory_implementation -{ - class XamlApplication : public XamlApplicationT - { - public: - XamlApplication(); - ~XamlApplication(); - - private: - std::vector m_preloadInstances; - }; -} diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.idl b/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.idl deleted file mode 100644 index 19ba61752..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/XamlApplication.idl +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -namespace Microsoft.UI.Xaml.Markup -{ - interface IXamlMetadataProviderContainer - { - Windows.Foundation.Collections.IVector Providers { get; }; - }; - - [default_interface] - unsealed runtimeclass XamlApplication : Windows.UI.Xaml.Application, IXamlMetadataProviderContainer, Windows.Foundation.IClosable - { - XamlApplication(); - protected XamlApplication(Windows.UI.Xaml.Markup.IXamlMetadataProvider parentProvider); - } -} diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/packages.config b/src/cascadia/Microsoft.UI.Xaml.Markup/packages.config deleted file mode 100644 index 4f7a6f98a..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/pch.cpp b/src/cascadia/Microsoft.UI.Xaml.Markup/pch.cpp deleted file mode 100644 index 3c27d44d5..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/pch.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#include "pch.h" diff --git a/src/cascadia/Microsoft.UI.Xaml.Markup/pch.h b/src/cascadia/Microsoft.UI.Xaml.Markup/pch.h deleted file mode 100644 index 723474601..000000000 --- a/src/cascadia/Microsoft.UI.Xaml.Markup/pch.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#pragma once - -#include -// Exclude rarely-used stuff from Windows headers -#define WIN32_LEAN_AND_MEAN -#include -// This is inexplicable, but for whatever reason, cppwinrt conflicts with the -// SDK definition of this function, so the only fix is to undef it. -// from WinBase.h -// Windows::UI::Xaml::Media::Animation::IStoryboard::GetCurrentTime -#ifdef GetCurrentTime -#undef GetCurrentTime -#endif - -// To enable support for non-WinRT interfaces, unknwn.h must be included before any C++/WinRT headers. -#include - -#include diff --git a/src/cascadia/TerminalApp/App.base.h b/src/cascadia/TerminalApp/App.base.h new file mode 100644 index 000000000..6b85d91bf --- /dev/null +++ b/src/cascadia/TerminalApp/App.base.h @@ -0,0 +1,40 @@ +#pragma once + +namespace winrt::TerminalApp::implementation +{ + template + struct App_baseWithProvider : public App_base + { + using IXamlType = ::winrt::Windows::UI::Xaml::Markup::IXamlType; + + IXamlType GetXamlType(::winrt::Windows::UI::Xaml::Interop::TypeName const& type) + { + return AppProvider()->GetXamlType(type); + } + + IXamlType GetXamlType(::winrt::hstring const& fullName) + { + return AppProvider()->GetXamlType(fullName); + } + + ::winrt::com_array<::winrt::Windows::UI::Xaml::Markup::XmlnsDefinition> GetXmlnsDefinitions() + { + return AppProvider()->GetXmlnsDefinitions(); + } + + private: + bool _contentLoaded{ false }; + std::shared_ptr _appProvider; + std::shared_ptr AppProvider() + { + if (!_appProvider) + { + _appProvider = std::make_shared(); + } + return _appProvider; + } + }; + + template + using AppT2 = App_baseWithProvider; +} diff --git a/src/cascadia/TerminalApp/App.cpp b/src/cascadia/TerminalApp/App.cpp index 21c0ceebc..e78dd8215 100644 --- a/src/cascadia/TerminalApp/App.cpp +++ b/src/cascadia/TerminalApp/App.cpp @@ -34,12 +34,6 @@ namespace winrt namespace winrt::TerminalApp::implementation { App::App() : - App(winrt::TerminalApp::XamlMetaDataProvider()) - { - } - - App::App(Windows::UI::Xaml::Markup::IXamlMetadataProvider const& parentProvider) : - base_type(parentProvider), _settings{}, _tabs{}, _loadedInitialSettings{ false }, @@ -67,13 +61,13 @@ namespace winrt::TerminalApp::implementation // - // Return Value: // - - void App::Create() + void App::Create(uint64_t hWnd) { // Assert that we've already loaded our settings. We have to do // this as a MTA, before the app is Create()'d WINRT_ASSERT(_loadedInitialSettings); TraceLoggingRegister(g_hTerminalAppProvider); - _Create(); + _Create(hWnd); } App::~App() @@ -87,7 +81,7 @@ namespace winrt::TerminalApp::implementation // * Creates the tab content area, which is where we'll display the tabs/panes. // * Initializes the first terminal control, using the default profile, // and adds it to our list of tabs. - void App::_Create() + void App::_Create(uint64_t parentHwnd) { _tabView = MUX::Controls::TabView{}; @@ -106,7 +100,6 @@ namespace winrt::TerminalApp::implementation // another for the settings button. auto tabsColDef = Controls::ColumnDefinition(); auto newTabBtnColDef = Controls::ColumnDefinition(); - newTabBtnColDef.Width(GridLengthHelper::Auto()); _tabRow.ColumnDefinitions().Append(tabsColDef); @@ -119,11 +112,10 @@ namespace winrt::TerminalApp::implementation _root.RowDefinitions().Append(tabBarRowDef); _root.RowDefinitions().Append(Controls::RowDefinition{}); - if (_settings->GlobalSettings().GetShowTabsInTitlebar() == false) - { - _root.Children().Append(_tabRow); - Controls::Grid::SetRow(_tabRow, 0); - } + _root.Children().Append(_tabRow); + + Controls::Grid::SetRow(_tabRow, 0); + _root.Children().Append(_tabContent); Controls::Grid::SetRow(_tabContent, 1); Controls::Grid::SetColumn(_tabView, 0); @@ -147,7 +139,20 @@ namespace winrt::TerminalApp::implementation _CreateNewTabFlyout(); _tabRow.Children().Append(_tabView); - _tabRow.Children().Append(_newTabButton); + + if (_settings->GlobalSettings().GetShowTabsInTitlebar()) + { + _minMaxCloseControl = winrt::TerminalApp::MinMaxCloseControl(parentHwnd); + Controls::Grid::SetRow(_minMaxCloseControl, 0); + Controls::Grid::SetColumn(_minMaxCloseControl, 1); + _minMaxCloseControl.Content().Children().Append(_newTabButton); + + _tabRow.Children().Append(_minMaxCloseControl); + } + else + { + _tabRow.Children().Append(_newTabButton); + } _tabContent.VerticalAlignment(VerticalAlignment::Stretch); _tabContent.HorizontalAlignment(HorizontalAlignment::Stretch); @@ -466,6 +471,16 @@ namespace winrt::TerminalApp::implementation winrt::Windows::System::Launcher::LaunchUriAsync({ L"https://github.com/microsoft/Terminal/issues" }); } + Windows::UI::Xaml::Controls::Border App::GetDragBar() noexcept + { + if (_minMaxCloseControl) + { + return _minMaxCloseControl.DragBar(); + } + + return nullptr; + } + // Method Description: // - Called when the about button is clicked. See _ShowAboutDialog for more info. // Arguments: diff --git a/src/cascadia/TerminalApp/App.h b/src/cascadia/TerminalApp/App.h index ba7e534f0..2e88f5244 100644 --- a/src/cascadia/TerminalApp/App.h +++ b/src/cascadia/TerminalApp/App.h @@ -6,6 +6,7 @@ #include "Tab.h" #include "CascadiaSettings.h" #include "App.g.h" +#include "App.base.h" #include "../../cascadia/inc/cppwinrt_utils.h" #include @@ -18,18 +19,18 @@ namespace winrt::TerminalApp::implementation { - // We dont use AppT as it does not provide access to protected constructors - template - using AppT_Override = App_base; - - struct App : AppT_Override + struct App : AppT2 { public: App(); Windows::UI::Xaml::UIElement GetRoot() noexcept; Windows::UI::Xaml::UIElement GetTabs() noexcept; - void Create(); + + // Gets the current dragglable area in the non client region of the top level window + Windows::UI::Xaml::Controls::Border GetDragBar() noexcept; + + void Create(uint64_t hParentWnd); void LoadSettings(); Windows::Foundation::Point GetLaunchDimensions(uint32_t dpi); @@ -44,8 +45,6 @@ namespace winrt::TerminalApp::implementation DECLARE_EVENT(LastTabClosed, _lastTabClosedHandlers, winrt::TerminalApp::LastTabClosedEventArgs); private: - App(Windows::UI::Xaml::Markup::IXamlMetadataProvider const& parentProvider); - // If you add controls here, but forget to null them either here or in // the ctor, you're going to have a bad time. It'll mysteriously fail to // activate the app. @@ -57,6 +56,7 @@ namespace winrt::TerminalApp::implementation Windows::UI::Xaml::Controls::Grid _tabRow{ nullptr }; Windows::UI::Xaml::Controls::Grid _tabContent{ nullptr }; Windows::UI::Xaml::Controls::SplitButton _newTabButton{ nullptr }; + winrt::TerminalApp::MinMaxCloseControl _minMaxCloseControl{ nullptr }; std::vector> _tabs; @@ -71,7 +71,7 @@ namespace winrt::TerminalApp::implementation std::atomic _settingsReloadQueued{ false }; - void _Create(); + void _Create(uint64_t parentHWnd); void _CreateNewTabFlyout(); fire_and_forget _ShowDialog(const winrt::Windows::Foundation::IInspectable& titleElement, diff --git a/src/cascadia/TerminalApp/App.idl b/src/cascadia/TerminalApp/App.idl index 24570bdf5..a709fcf43 100644 --- a/src/cascadia/TerminalApp/App.idl +++ b/src/cascadia/TerminalApp/App.idl @@ -5,7 +5,7 @@ namespace TerminalApp { delegate void LastTabClosedEventArgs(); [default_interface] - runtimeclass App : Microsoft.UI.Xaml.Markup.XamlApplication + runtimeclass App : Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication { App(); @@ -14,12 +14,13 @@ namespace TerminalApp // then it might look like TermApp just failed to activate, which will // cause you to chase down the rabbit hole of "why is TermApp not // registered?" when it definitely is. - void Create(); + void Create(UInt64 hParentWnd); void LoadSettings(); Windows.UI.Xaml.UIElement GetRoot(); Windows.UI.Xaml.UIElement GetTabs(); + Windows.UI.Xaml.Controls.Border GetDragBar{ get; }; Windows.Foundation.Point GetLaunchDimensions(UInt32 dpi); Boolean GetShowTabsInTitlebar(); @@ -28,11 +29,5 @@ namespace TerminalApp event LastTabClosedEventArgs LastTabClosed; String GetTitle(); - - // IXamlMetadataProvider, Xaml.Application: - // Application's composing initializer will register the composing class - // as the toplevel "active" Xaml application. This Application (through IXamlMetadataProvider) - // will be queried for all unknown types during all Xaml and XBF (Xaml Binary Format) parse - // operations. } } diff --git a/src/cascadia/TerminalApp/App.xaml b/src/cascadia/TerminalApp/App.xaml index 6b243b00b..4cb4d0eea 100644 --- a/src/cascadia/TerminalApp/App.xaml +++ b/src/cascadia/TerminalApp/App.xaml @@ -1,18 +1,18 @@ - - + @@ -60,5 +60,5 @@ the MIT License. See LICENSE in the project root for license information. --> - - + + diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.cpp b/src/cascadia/TerminalApp/MinMaxCloseControl.cpp new file mode 100644 index 000000000..08d59f23b --- /dev/null +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.cpp @@ -0,0 +1,58 @@ +// +// MinMaxCloseControl.xaml.cpp +// Implementation of the MinMaxCloseControl class +// + +#include "pch.h" + +#include "MinMaxCloseControl.h" + +#include "MinMaxCloseControl.g.cpp" + +namespace winrt::TerminalApp::implementation +{ + MinMaxCloseControl::MinMaxCloseControl(uint64_t hWnd) : + _window(reinterpret_cast(hWnd)) + { + const winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///MinMaxCloseControl.xaml" }; + winrt::Windows::UI::Xaml::Application::LoadComponent(*this, resourceLocator, winrt::Windows::UI::Xaml::Controls::Primitives::ComponentResourceLocation::Nested); + } + + void MinMaxCloseControl::_OnMaximize(byte flag) + { + POINT point1 = {}; + ::GetCursorPos(&point1); + const LPARAM lParam = MAKELPARAM(point1.x, point1.y); + WINDOWPLACEMENT placement = { sizeof(placement) }; + ::GetWindowPlacement(_window, &placement); + if (placement.showCmd == SW_SHOWNORMAL) + { + ::PostMessage(_window, WM_SYSCOMMAND, SC_MAXIMIZE | flag, lParam); + } + else if (placement.showCmd == SW_SHOWMAXIMIZED) + { + ::PostMessage(_window, WM_SYSCOMMAND, SC_RESTORE | flag, lParam); + } + } + + void MinMaxCloseControl::Maximize_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) + { + _OnMaximize(HTMAXBUTTON); + } + + void MinMaxCloseControl::DragBar_DoubleTapped(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::Input::DoubleTappedRoutedEventArgs const& e) + { + _OnMaximize(HTCAPTION); + } + + void MinMaxCloseControl::Minimize_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) + { + ::PostMessage(_window, WM_SYSCOMMAND, SC_MINIMIZE | HTMINBUTTON, 0); + } + + void MinMaxCloseControl::Close_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) + { + ::PostQuitMessage(0); + } + +} diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.h b/src/cascadia/TerminalApp/MinMaxCloseControl.h new file mode 100644 index 000000000..e819f5406 --- /dev/null +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.h @@ -0,0 +1,34 @@ +// +// Declaration of the MainUserControl class. +// + +#pragma once + +#include "winrt/Windows.UI.Xaml.h" +#include "winrt/Windows.UI.Xaml.Markup.h" +#include "winrt/Windows.UI.Xaml.Interop.h" +#include "MinMaxCloseControl.g.h" + +namespace winrt::TerminalApp::implementation +{ + struct MinMaxCloseControl : MinMaxCloseControlT + { + MinMaxCloseControl(uint64_t hWnd); + + void Minimize_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); + void Maximize_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); + void Close_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); + void DragBar_DoubleTapped(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::Input::DoubleTappedRoutedEventArgs const& e); + + private: + void _OnMaximize(byte flag); + HWND _window = nullptr; + }; +} + +namespace winrt::TerminalApp::factory_implementation +{ + struct MinMaxCloseControl : MinMaxCloseControlT + { + }; +} diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.idl b/src/cascadia/TerminalApp/MinMaxCloseControl.idl new file mode 100644 index 000000000..5021204c1 --- /dev/null +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.idl @@ -0,0 +1,11 @@ +namespace TerminalApp +{ + [default_interface] + runtimeclass MinMaxCloseControl : Windows.UI.Xaml.Controls.StackPanel + { + MinMaxCloseControl(UInt64 hParentWnd); + + Windows.UI.Xaml.Controls.Grid Content{ get; }; + Windows.UI.Xaml.Controls.Border DragBar{ get; }; + } +} diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.xaml b/src/cascadia/TerminalApp/MinMaxCloseControl.xaml new file mode 100644 index 000000000..a1ee4854b --- /dev/null +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.xaml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/src/cascadia/TerminalApp/TerminalApp.vcxproj b/src/cascadia/TerminalApp/TerminalApp.vcxproj index a986dd41d..c8922991c 100644 --- a/src/cascadia/TerminalApp/TerminalApp.vcxproj +++ b/src/cascadia/TerminalApp/TerminalApp.vcxproj @@ -1,5 +1,6 @@ + @@ -15,7 +16,6 @@ TerminalApp TerminalApp - - + + + MinMaxCloseControl.xaml + @@ -53,9 +56,15 @@ App.xaml - + + MinMaxCloseControl.xaml + + + MinMaxCloseControl.xaml + Code + @@ -76,15 +85,12 @@ App.xaml - NotUsing - - @@ -92,13 +98,11 @@ - - - - {015a0047-772d-4f1a-88c9-45c18f0adfb6} - true - true - - + + + + Designer + true PreserveNewest - + + + true + PreserveNewest +