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
+