// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "TermControl.g.h" #include "PasteFromClipboardEventArgs.g.h" #include #include #include "../../renderer/base/Renderer.hpp" #include "../../renderer/dx/DxRenderer.hpp" #include "../../cascadia/TerminalCore/Terminal.hpp" #include "../../cascadia/inc/cppwinrt_utils.h" namespace winrt::Microsoft::Terminal::TerminalControl::implementation { struct PasteFromClipboardEventArgs : public PasteFromClipboardEventArgsT { public: PasteFromClipboardEventArgs(std::function clipboardDataHandler) : m_clipboardDataHandler(clipboardDataHandler) {} void HandleClipboardData(hstring value) { m_clipboardDataHandler(static_cast(value)); }; private: std::function m_clipboardDataHandler; }; struct TermControl : TermControlT { TermControl(); TermControl(Settings::IControlSettings settings); Windows::UI::Xaml::UIElement GetRoot(); Windows::UI::Xaml::Controls::UserControl GetControl(); void UpdateSettings(Settings::IControlSettings newSettings); hstring Title(); void CopySelectionToClipboard(bool trimTrailingWhitespace); void Close(); bool ShouldCloseOnExit() const noexcept; void ScrollViewport(int viewTop); void KeyboardScrollViewport(int viewTop); int GetScrollOffset(); int GetViewHeight() const; void SwapChainChanged(); ~TermControl(); static Windows::Foundation::Point GetProposedDimensions(Microsoft::Terminal::Settings::IControlSettings const& settings, const uint32_t dpi); // clang-format off // -------------------------------- WinRT Events --------------------------------- DECLARE_EVENT(TitleChanged, _titleChangedHandlers, TerminalControl::TitleChangedEventArgs); DECLARE_EVENT(ConnectionClosed, _connectionClosedHandlers, TerminalControl::ConnectionClosedEventArgs); DECLARE_EVENT(ScrollPositionChanged, _scrollPositionChangedHandlers, TerminalControl::ScrollPositionChangedEventArgs); DECLARE_EVENT(CopyToClipboard, _clipboardCopyHandlers, TerminalControl::CopyToClipboardEventArgs); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(PasteFromClipboard, _clipboardPasteHandlers, TerminalControl::TermControl, TerminalControl::PasteFromClipboardEventArgs); // clang-format on private: TerminalConnection::ITerminalConnection _connection; bool _initializedTerminal; Windows::UI::Xaml::Controls::UserControl _controlRoot; Windows::UI::Xaml::Controls::Grid _root; Windows::UI::Xaml::Controls::SwapChainPanel _swapChainPanel; Windows::UI::Xaml::Controls::Primitives::ScrollBar _scrollBar; event_token _connectionOutputEventToken; std::unique_ptr<::Microsoft::Terminal::Core::Terminal> _terminal; std::unique_ptr<::Microsoft::Console::Render::Renderer> _renderer; std::unique_ptr<::Microsoft::Console::Render::DxEngine> _renderEngine; Settings::IControlSettings _settings; bool _focused; std::atomic _closing; FontInfoDesired _desiredFont; FontInfo _actualFont; std::optional _lastScrollOffset; // storage location for the leading surrogate of a utf-16 surrogate pair std::optional _leadingSurrogate; std::optional _cursorTimer; // If this is set, then we assume we are in the middle of panning the // viewport via touch input. std::optional _touchAnchor; // Event revokers -- we need to deregister ourselves before we die, // lest we get callbacks afterwards. winrt::Windows::UI::Xaml::Controls::Control::SizeChanged_revoker _sizeChangedRevoker; winrt::Windows::UI::Xaml::Controls::SwapChainPanel::CompositionScaleChanged_revoker _compositionScaleChangedRevoker; winrt::Windows::UI::Xaml::Controls::SwapChainPanel::Loaded_revoker _loadedRevoker; winrt::Windows::UI::Xaml::UIElement::LostFocus_revoker _lostFocusRevoker; winrt::Windows::UI::Xaml::UIElement::GotFocus_revoker _gotFocusRevoker; void _Create(); void _ApplyUISettings(); void _InitializeBackgroundBrush(); void _BackgroundColorChanged(const uint32_t color); void _ApplyConnectionSettings(); void _InitializeTerminal(); void _UpdateFont(); void _KeyDownHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); void _CharacterHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::CharacterReceivedRoutedEventArgs const& e); void _MouseClickHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _MouseMovedHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _PointerReleasedHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _MouseWheelHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _ScrollbarChangeHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Controls::Primitives::RangeBaseValueChangedEventArgs const& e); void _GotFocusHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& e); void _LostFocusHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& e); void _BlinkCursor(Windows::Foundation::IInspectable const& sender, Windows::Foundation::IInspectable const& e); void _SendInputToConnection(const std::wstring& wstr); void _SwapChainSizeChanged(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::SizeChangedEventArgs const& e); void _SwapChainScaleChanged(Windows::UI::Xaml::Controls::SwapChainPanel const& sender, Windows::Foundation::IInspectable const& args); void _DoResize(const double newWidth, const double newHeight); void _TerminalTitleChanged(const std::wstring_view& wstr); void _TerminalScrollPositionChanged(const int viewTop, const int viewHeight, const int bufferSize); void _MouseScrollHandler(const double delta); void _MouseZoomHandler(const double delta); void _MouseTransparencyHandler(const double delta); void _ScrollbarUpdater(Windows::UI::Xaml::Controls::Primitives::ScrollBar scrollbar, const int viewTop, const int viewHeight, const int bufferSize); Windows::UI::Xaml::Thickness _ParseThicknessFromPadding(const hstring padding); Settings::KeyModifiers _GetPressedModifierKeys() const; const COORD _GetTerminalPosition(winrt::Windows::Foundation::Point cursorPosition); }; } namespace winrt::Microsoft::Terminal::TerminalControl::factory_implementation { struct TermControl : TermControlT { }; }