// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "Tab.h" #include "CascadiaSettings.h" #include "TerminalPage.h" #include "App.g.h" #include "App.base.h" #include "../../cascadia/inc/cppwinrt_utils.h" #include #include #include #include #include #include namespace winrt::TerminalApp::implementation { struct App : AppT2 { public: App(); ~App() = default; void Create(); void LoadSettings(); Windows::Foundation::Point GetLaunchDimensions(uint32_t dpi); bool GetShowTabsInTitlebar(); Windows::UI::Xaml::UIElement GetRoot() noexcept; hstring Title(); void TitlebarClicked(); // -------------------------------- WinRT Events --------------------------------- DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(TitleChanged, _titleChangeHandlers, winrt::Windows::Foundation::IInspectable, winrt::hstring); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(LastTabClosed, _lastTabClosedHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(SetTitleBarContent, _setTitleBarContentHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::UIElement); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(RequestedThemeChanged, _requestedThemeChangedHandlers, TerminalApp::App, winrt::Windows::UI::Xaml::ElementTheme); private: // 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. // ALSO: If you add any UIElements as roots here, make sure they're // updated in _ApplyTheme. The root currently is _root. winrt::com_ptr _root{ nullptr }; std::shared_ptr<::TerminalApp::CascadiaSettings> _settings{ nullptr }; std::shared_ptr _resourceLoader{ nullptr }; HRESULT _settingsLoadedResult; winrt::hstring _settingsLoadExceptionText{}; bool _loadedInitialSettings; wil::unique_folder_change_reader_nothrow _reader; std::shared_mutex _dialogLock; std::atomic _settingsReloadQueued{ false }; fire_and_forget _ShowDialog(const winrt::Windows::Foundation::IInspectable& sender, winrt::Windows::UI::Xaml::Controls::ContentDialog dialog); void _ShowLoadErrorsDialog(const winrt::hstring& titleKey, const winrt::hstring& contentKey, HRESULT settingsLoadedResult); void _ShowLoadWarningsDialog(); void _OnLoaded(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); [[nodiscard]] HRESULT _TryLoadSettings() noexcept; void _LoadSettings(); void _RegisterSettingsChange(); fire_and_forget _DispatchReloadSettings(); void _ReloadSettings(); void _ApplyTheme(const Windows::UI::Xaml::ElementTheme& newTheme); static Windows::UI::Xaml::Controls::IconElement _GetIconFromProfile(const ::TerminalApp::Profile& profile); winrt::Microsoft::Terminal::TerminalControl::TermControl _GetFocusedControl(); void _CopyToClipboardHandler(const IInspectable& sender, const winrt::Microsoft::Terminal::TerminalControl::CopyToClipboardEventArgs& copiedData); void _PasteFromClipboardHandler(const IInspectable& sender, const Microsoft::Terminal::TerminalControl::PasteFromClipboardEventArgs& eventArgs); static void _SetAcceleratorForMenuItem(Windows::UI::Xaml::Controls::MenuFlyoutItem& menuItem, const winrt::Microsoft::Terminal::Settings::KeyChord& keyChord); }; } namespace winrt::TerminalApp::factory_implementation { struct App : AppT { }; }