482dcec60a
Some followups to #10368: - Accidentally reverted a defapp change where the Monarch should not by default register itself as a handoff server. - Destroy the tray icon if we're a monarch otherwise if we're a quake window we request the monarch to hide the icon.
84 lines
3.3 KiB
C++
84 lines
3.3 KiB
C++
/*++
|
|
Copyright (c) Microsoft Corporation
|
|
Licensed under the MIT license.
|
|
|
|
Class Name:
|
|
- WindowManager.h
|
|
|
|
Abstract:
|
|
- The Window Manager takes care of coordinating the monarch and peasant for this
|
|
process.
|
|
- It's responsible for registering as a potential future monarch. It's also
|
|
responsible for creating the Peasant for this process when it's determined
|
|
this process should become a window process.
|
|
- If we aren't the monarch, it's responsible for watching the current monarch
|
|
process, and finding the new one if the current monarch dies.
|
|
- When the monarch needs to ask the TerminalApp about how to parse a
|
|
commandline, it'll ask by raising an event that we'll bubble up to the
|
|
AppHost.
|
|
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#include "WindowManager.g.h"
|
|
#include "Peasant.h"
|
|
#include "Monarch.h"
|
|
#include "../cascadia/inc/cppwinrt_utils.h"
|
|
|
|
namespace winrt::Microsoft::Terminal::Remoting::implementation
|
|
{
|
|
struct WindowManager : public WindowManagerT<WindowManager>
|
|
{
|
|
WindowManager();
|
|
~WindowManager();
|
|
|
|
void ProposeCommandline(const winrt::Microsoft::Terminal::Remoting::CommandlineArgs& args);
|
|
bool ShouldCreateWindow();
|
|
|
|
winrt::Microsoft::Terminal::Remoting::Peasant CurrentWindow();
|
|
bool IsMonarch();
|
|
void SummonWindow(const Remoting::SummonWindowSelectionArgs& args);
|
|
|
|
void SummonAllWindows();
|
|
Windows::Foundation::Collections::IMapView<uint64_t, winrt::hstring> GetPeasantNames();
|
|
|
|
winrt::fire_and_forget RequestShowTrayIcon();
|
|
winrt::fire_and_forget RequestHideTrayIcon();
|
|
bool DoesQuakeWindowExist();
|
|
|
|
TYPED_EVENT(FindTargetWindowRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::FindTargetWindowArgs);
|
|
TYPED_EVENT(BecameMonarch, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
|
TYPED_EVENT(ShowTrayIconRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
|
TYPED_EVENT(HideTrayIconRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
|
|
|
private:
|
|
bool _shouldCreateWindow{ false };
|
|
bool _isKing{ false };
|
|
DWORD _registrationHostClass{ 0 };
|
|
winrt::Microsoft::Terminal::Remoting::Monarch _monarch{ nullptr };
|
|
winrt::Microsoft::Terminal::Remoting::Peasant _peasant{ nullptr };
|
|
|
|
wil::unique_event _monarchWaitInterrupt;
|
|
std::thread _electionThread;
|
|
|
|
void _registerAsMonarch();
|
|
void _createMonarch();
|
|
void _createMonarchAndCallbacks();
|
|
bool _areWeTheKing();
|
|
winrt::Microsoft::Terminal::Remoting::IPeasant _createOurPeasant(std::optional<uint64_t> givenID,
|
|
const winrt::hstring& givenName);
|
|
|
|
bool _performElection();
|
|
void _createPeasantThread();
|
|
void _waitOnMonarchThread();
|
|
void _raiseFindTargetWindowRequested(const winrt::Windows::Foundation::IInspectable& sender,
|
|
const winrt::Microsoft::Terminal::Remoting::FindTargetWindowArgs& args);
|
|
};
|
|
}
|
|
|
|
namespace winrt::Microsoft::Terminal::Remoting::factory_implementation
|
|
{
|
|
BASIC_FACTORY(WindowManager);
|
|
}
|