// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "TerminalPage.g.h" #include "Tab.h" #include "CascadiaSettings.h" #include "Profile.h" #include #include "AppCommandlineArgs.h" // fwdecl unittest classes namespace TerminalAppLocalTests { class TabTests; }; namespace winrt::TerminalApp::implementation { enum StartupState : int { NotInitialized = 0, InStartup = 1, Initialized = 2 }; struct TerminalPage : TerminalPageT { public: TerminalPage(); winrt::fire_and_forget SetSettings(std::shared_ptr<::TerminalApp::CascadiaSettings> settings, bool needRefreshUI); void Create(); hstring Title(); void TitlebarClicked(); float CalcSnappedDimension(const bool widthOrHeight, const float dimension) const; winrt::hstring ApplicationDisplayName(); winrt::hstring ApplicationVersion(); winrt::hstring ThirdPartyNoticesLink(); void CloseWindow(); void ToggleFocusMode(); void ToggleFullscreen(); void ToggleAlwaysOnTop(); bool FocusMode() const; bool Fullscreen() const; bool AlwaysOnTop() const; void SetStartupActions(std::vector& actions); static std::vector ConvertExecuteCommandlineToActions(const TerminalApp::ExecuteCommandlineArgs& args); winrt::TerminalApp::IDialogPresenter DialogPresenter() const; void DialogPresenter(winrt::TerminalApp::IDialogPresenter dialogPresenter); // -------------------------------- 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(FocusModeChanged, _focusModeChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(FullscreenChanged, _fullscreenChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(AlwaysOnTopChanged, _alwaysOnTopChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); TYPED_EVENT(Initialized, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::RoutedEventArgs); private: friend struct TerminalPageT; // for Xaml to bind events // 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 App::_ApplyTheme. The roots currently is _tabRow // (which is a root when the tabs are in the titlebar.) Microsoft::UI::Xaml::Controls::TabView _tabView{ nullptr }; TerminalApp::TabRowControl _tabRow{ nullptr }; Windows::UI::Xaml::Controls::Grid _tabContent{ nullptr }; Microsoft::UI::Xaml::Controls::SplitButton _newTabButton{ nullptr }; std::shared_ptr<::TerminalApp::CascadiaSettings> _settings{ nullptr }; Windows::Foundation::Collections::IObservableVector _tabs; winrt::com_ptr _GetStrongTabImpl(const uint32_t index) const; winrt::com_ptr _GetStrongTabImpl(const ::winrt::TerminalApp::Tab& tab) const; bool _isInFocusMode{ false }; bool _isFullscreen{ false }; bool _isAlwaysOnTop{ false }; bool _rearranging; std::optional _rearrangeFrom; std::optional _rearrangeTo; // use a weak reference to prevent circular dependency with AppLogic winrt::weak_ref _dialogPresenter; winrt::com_ptr _actionDispatch{ winrt::make_self() }; winrt::Windows::UI::Xaml::Controls::Grid::LayoutUpdated_revoker _layoutUpdatedRevoker; StartupState _startupState{ StartupState::NotInitialized }; Windows::Foundation::Collections::IVector _startupActions; winrt::fire_and_forget _ProcessStartupActions(Windows::Foundation::Collections::IVector actions, const bool initial); void _ShowAboutDialog(); void _ShowCloseWarningDialog(); winrt::Windows::Foundation::IAsyncOperation _ShowMultiLinePasteWarningDialog(); winrt::Windows::Foundation::IAsyncOperation _ShowLargePasteWarningDialog(); void _CreateNewTabFlyout(); void _OpenNewTabDropdown(); void _OpenNewTab(const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs); void _CreateNewTabFromSettings(GUID profileGuid, TerminalApp::TerminalSettings settings); winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection _CreateConnectionFromSettings(GUID profileGuid, TerminalApp::TerminalSettings settings); void _SettingsButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _FeedbackButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _AboutButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _CloseWarningPrimaryButtonOnClick(Windows::UI::Xaml::Controls::ContentDialog sender, Windows::UI::Xaml::Controls::ContentDialogButtonClickEventArgs eventArgs); void _ThirdPartyNoticesOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _HookupKeyBindings(TerminalApp::AppKeyBindings bindings) noexcept; void _RegisterActionCallbacks(); void _UpdateTitle(const Tab& tab); void _UpdateTabIcon(Tab& tab); void _UpdateTabView(); void _UpdateTabWidthMode(); void _DuplicateTabViewItem(); void _RemoveTabViewItem(const Microsoft::UI::Xaml::Controls::TabViewItem& tabViewItem); void _RemoveTabViewItemByIndex(uint32_t tabIndex); void _RegisterTerminalEvents(Microsoft::Terminal::TerminalControl::TermControl term, Tab& hostingTab); void _SelectNextTab(const bool bMoveRight); bool _SelectTab(const uint32_t tabIndex); void _MoveFocus(const Direction& direction); winrt::Microsoft::Terminal::TerminalControl::TermControl _GetActiveControl(); std::optional _GetFocusedTabIndex() const noexcept; winrt::com_ptr _GetFocusedTab(); winrt::fire_and_forget _SetFocusedTabIndex(const uint32_t tabIndex); void _CloseFocusedTab(); void _CloseFocusedPane(); void _CloseAllTabs(); winrt::fire_and_forget _RemoveOnCloseRoutine(Microsoft::UI::Xaml::Controls::TabViewItem tabViewItem, winrt::com_ptr page); // Todo: add more event implementations here // MSFT:20641986: Add keybindings for New Window void _Scroll(int delta); void _SplitPane(const winrt::TerminalApp::SplitState splitType, const winrt::TerminalApp::SplitType splitMode = winrt::TerminalApp::SplitType::Manual, const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs = nullptr); void _ResizePane(const Direction& direction); void _ScrollPage(int delta); void _SetAcceleratorForMenuItem(Windows::UI::Xaml::Controls::MenuFlyoutItem& menuItem, const winrt::Microsoft::Terminal::TerminalControl::KeyChord& keyChord); winrt::fire_and_forget _CopyToClipboardHandler(const IInspectable sender, const winrt::Microsoft::Terminal::TerminalControl::CopyToClipboardEventArgs copiedData); winrt::fire_and_forget _PasteFromClipboardHandler(const IInspectable sender, const Microsoft::Terminal::TerminalControl::PasteFromClipboardEventArgs eventArgs); bool _CopyText(const bool trimTrailingWhitespace); void _PasteText(); fire_and_forget _LaunchSettings(const winrt::TerminalApp::SettingsTarget target); void _OnTabClick(const IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& eventArgs); void _OnTabSelectionChanged(const IInspectable& sender, const Windows::UI::Xaml::Controls::SelectionChangedEventArgs& eventArgs); void _OnTabItemsChanged(const IInspectable& sender, const Windows::Foundation::Collections::IVectorChangedEventArgs& eventArgs); void _OnContentSizeChanged(const IInspectable& /*sender*/, Windows::UI::Xaml::SizeChangedEventArgs const& e); void _OnTabCloseRequested(const IInspectable& sender, const Microsoft::UI::Xaml::Controls::TabViewTabCloseRequestedEventArgs& eventArgs); void _OnFirstLayout(const IInspectable& sender, const IInspectable& eventArgs); void _UpdatedSelectedTab(const int32_t index); void _Find(); winrt::fire_and_forget _RefreshUIForSettingsReload(); void _SetNonClientAreaColors(const Windows::UI::Color& selectedTabColor); void _ClearNonClientAreaColors(); void _SetNewTabButtonColor(const Windows::UI::Color& color, const Windows::UI::Color& accentColor); void _ClearNewTabButtonColor(); void _CompleteInitialization(); void _CommandPaletteClosed(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _UnZoomIfNeeded(); #pragma region ActionHandlers // These are all defined in AppActionHandlers.cpp void _HandleOpenNewTabDropdown(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleDuplicateTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleCloseTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleClosePane(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleScrollUp(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleScrollDown(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleNextTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandlePrevTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSendInput(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSplitPane(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleTogglePaneZoom(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleScrollUpPage(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleScrollDownPage(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleOpenSettings(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandlePasteText(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleNewTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSwitchToTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleResizePane(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleMoveFocus(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleCopyText(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleCloseWindow(const IInspectable&, const TerminalApp::ActionEventArgs& args); void _HandleAdjustFontSize(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleFind(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleResetFontSize(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleRetroEffect(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFocusMode(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFullscreen(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleAlwaysOnTop(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSetColorScheme(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSetTabColor(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleOpenTabColorPicker(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleRenameTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleExecuteCommandline(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleCommandPalette(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleCloseOtherTabs(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleCloseTabsAfter(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleTabSwitcher(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); // Make sure to hook new actions up in _RegisterActionCallbacks! #pragma endregion friend class TerminalAppLocalTests::TabTests; }; } namespace winrt::TerminalApp::factory_implementation { struct TerminalPage : TerminalPageT { }; }