diff --git a/src/cascadia/Remoting/Monarch.cpp b/src/cascadia/Remoting/Monarch.cpp index 778ff2f6160..f828fd05dbd 100644 --- a/src/cascadia/Remoting/Monarch.cpp +++ b/src/cascadia/Remoting/Monarch.cpp @@ -725,6 +725,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation result->WindowName(targetWindowName); result->ShouldCreateWindow(true); + _RequestNewWindowHandlers(*this, *winrt::make_self(*result, args)); + // If this fails, it'll be logged in the following // TraceLoggingWrite statement, with succeeded=false } @@ -760,6 +762,9 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation auto result{ winrt::make_self(true) }; result->Id(windowID); result->WindowName(targetWindowName); + + _RequestNewWindowHandlers(*this, *winrt::make_self(*result, args)); + return *result; } } @@ -774,6 +779,9 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation // In this case, no usable ID was provided. Return { true, nullopt } auto result = winrt::make_self(true); result->WindowName(targetWindowName); + + _RequestNewWindowHandlers(*this, *winrt::make_self(*result, args)); + return *result; } diff --git a/src/cascadia/Remoting/Monarch.h b/src/cascadia/Remoting/Monarch.h index bb8fffbe900..6765d0b15ca 100644 --- a/src/cascadia/Remoting/Monarch.h +++ b/src/cascadia/Remoting/Monarch.h @@ -88,6 +88,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation TYPED_EVENT(WindowClosed, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); TYPED_EVENT(QuitAllRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::QuitAllRequestedArgs); + TYPED_EVENT(RequestNewWindow, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs); + private: uint64_t _ourPID; diff --git a/src/cascadia/Remoting/Monarch.idl b/src/cascadia/Remoting/Monarch.idl index adc29036a9a..1dc3d53f70e 100644 --- a/src/cascadia/Remoting/Monarch.idl +++ b/src/cascadia/Remoting/Monarch.idl @@ -76,6 +76,8 @@ namespace Microsoft.Terminal.Remoting event Windows.Foundation.TypedEventHandler WindowCreated; event Windows.Foundation.TypedEventHandler WindowClosed; event Windows.Foundation.TypedEventHandler QuitAllRequested; + + event Windows.Foundation.TypedEventHandler RequestNewWindow; }; runtimeclass Monarch : [default] IMonarch diff --git a/src/cascadia/Remoting/WindowManager.idl b/src/cascadia/Remoting/WindowManager.idl index 2fdfd7e3432..917347f2e9b 100644 --- a/src/cascadia/Remoting/WindowManager.idl +++ b/src/cascadia/Remoting/WindowManager.idl @@ -31,5 +31,6 @@ namespace Microsoft.Terminal.Remoting event Windows.Foundation.TypedEventHandler GetWindowLayoutRequested; event Windows.Foundation.TypedEventHandler ShowNotificationIconRequested; event Windows.Foundation.TypedEventHandler HideNotificationIconRequested; + }; } diff --git a/src/cascadia/Remoting/WindowManager2.cpp b/src/cascadia/Remoting/WindowManager2.cpp index bd410014a97..ea8794d8218 100644 --- a/src/cascadia/Remoting/WindowManager2.cpp +++ b/src/cascadia/Remoting/WindowManager2.cpp @@ -46,7 +46,28 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation // * If we're running unpackaged: the .winmd must be a sibling of the .exe // * If we're running packaged: the .winmd must be in the package root _monarch = try_create_instance(Monarch_clsid, - CLSCTX_LOCAL_SERVER); + CLSCTX_LOCAL_SERVER); + } + + // Check if we became the king, and if we are, wire up callbacks. + void WindowManager2::_createCallbacks() + { + assert(_monarch); + // Here, we're the king! + // + // This is where you should do any additional setup that might need to be + // done when we become the king. This will be called both for the first + // window, and when the current monarch dies. + + _monarch.WindowCreated({ get_weak(), &WindowManager2::_WindowCreatedHandlers }); + _monarch.WindowClosed({ get_weak(), &WindowManager2::_WindowClosedHandlers }); + _monarch.FindTargetWindowRequested({ this, &WindowManager2::_raiseFindTargetWindowRequested }); + _monarch.ShowNotificationIconRequested([this](auto&&, auto&&) { _ShowNotificationIconRequestedHandlers(*this, nullptr); }); + _monarch.HideNotificationIconRequested([this](auto&&, auto&&) { _HideNotificationIconRequestedHandlers(*this, nullptr); }); + _monarch.QuitAllRequested({ get_weak(), &WindowManager2::_QuitAllRequestedHandlers }); + + _monarch.RequestNewWindow({ get_weak(), &WindowManager2::_raiseRequestNewWindow }); + // _BecameMonarchHandlers(*this, nullptr); } void WindowManager2::_registerAsMonarch() @@ -58,6 +79,17 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation &_registrationHostClass)); } + void WindowManager2::_raiseFindTargetWindowRequested(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Remoting::FindTargetWindowArgs& args) + { + _FindTargetWindowRequestedHandlers(sender, args); + } + void WindowManager2::_raiseRequestNewWindow(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs& args) + { + _RequestNewWindowHandlers(sender, args); + } + Remoting::ProposeCommandlineResult WindowManager2::ProposeCommandline2(const Remoting::CommandlineArgs& args) { bool shouldCreateWindow = false; @@ -105,6 +137,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation // getting any windows. _registerAsMonarch(); _createMonarch(); + _createCallbacks(); if (!_monarch) { // TODO! something catastrophically bad happened here. diff --git a/src/cascadia/Remoting/WindowManager2.h b/src/cascadia/Remoting/WindowManager2.h index 34a9f9b84ac..3de1b41883e 100644 --- a/src/cascadia/Remoting/WindowManager2.h +++ b/src/cascadia/Remoting/WindowManager2.h @@ -36,6 +36,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation TYPED_EVENT(QuitAllRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::QuitAllRequestedArgs); TYPED_EVENT(GetWindowLayoutRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::GetWindowLayoutArgs); + TYPED_EVENT(RequestNewWindow, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs); + private: DWORD _registrationHostClass{ 0 }; winrt::Microsoft::Terminal::Remoting::IMonarch _monarch{ nullptr }; @@ -46,6 +48,12 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation void _proposeToMonarch(const Remoting::CommandlineArgs& args, std::optional& givenID, winrt::hstring& givenName); + + void _createCallbacks(); + void _raiseFindTargetWindowRequested(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Remoting::FindTargetWindowArgs& args); + void _raiseRequestNewWindow(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs& args); }; } diff --git a/src/cascadia/Remoting/WindowManager2.idl b/src/cascadia/Remoting/WindowManager2.idl index c037d8c1b2d..b111b06294d 100644 --- a/src/cascadia/Remoting/WindowManager2.idl +++ b/src/cascadia/Remoting/WindowManager2.idl @@ -38,5 +38,7 @@ namespace Microsoft.Terminal.Remoting event Windows.Foundation.TypedEventHandler HideNotificationIconRequested; + event Windows.Foundation.TypedEventHandler RequestNewWindow; + }; } diff --git a/src/cascadia/WindowsTerminal/WindowEmperor.cpp b/src/cascadia/WindowsTerminal/WindowEmperor.cpp index 6d3203a5d14..2c4eb1e99c8 100644 --- a/src/cascadia/WindowsTerminal/WindowEmperor.cpp +++ b/src/cascadia/WindowsTerminal/WindowEmperor.cpp @@ -67,6 +67,10 @@ bool WindowEmperor::HandleCommandlineArgs() if (result.ShouldCreateWindow()) { CreateNewWindowThread(Remoting::WindowRequestedArgs{ result, eventArgs }); + + _manager.RequestNewWindow([this](auto&&, const Remoting::WindowRequestedArgs& args) { + CreateNewWindowThread(args); + }); } return result.ShouldCreateWindow(); @@ -95,7 +99,15 @@ void WindowEmperor::WaitForWindows() // one.join(); // two.join(); - Sleep(30000); //30s + // Sleep(30000); //30s + + MSG message; + + while (GetMessage(&message, nullptr, 0, 0)) + { + TranslateMessage(&message); + DispatchMessage(&message); + } } void WindowEmperor::CreateNewWindowThread(Remoting::WindowRequestedArgs args) diff --git a/src/cascadia/WindowsTerminal/main.cpp b/src/cascadia/WindowsTerminal/main.cpp index 6055122446a..43934998b9f 100644 --- a/src/cascadia/WindowsTerminal/main.cpp +++ b/src/cascadia/WindowsTerminal/main.cpp @@ -122,5 +122,8 @@ int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) if (emperor.HandleCommandlineArgs()) { emperor.WaitForWindows(); + + + } }