From a880f7389e2c89f565f90b69b27d5bf5d643fc66 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 13 Jun 2019 10:12:27 -0700 Subject: [PATCH 1/4] Captured pointer for SwapChainPanel and ScrollBar separately Renamed MouseClickHandler and MouseMovedHandler to more generic names (since they handle touch events too) --- src/cascadia/TerminalControl/TermControl.cpp | 42 +++++++++++++++++--- src/cascadia/TerminalControl/TermControl.h | 6 ++- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index e6fd982d9cd..1dfdd707dff 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -477,6 +477,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation _scrollBar.Value(0); _scrollBar.ViewportSize(bufferHeight); _scrollBar.ValueChanged({ this, &TermControl::_ScrollbarChangeHandler }); + _scrollBar.PointerPressed({ this, &TermControl::_CapturePointer }); + _scrollBar.PointerReleased({ this, &TermControl::_ReleasePointer }); // Apply settings for scrollbar if (_settings.ScrollState() == ScrollbarState::Visible) @@ -499,9 +501,9 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation } _root.PointerWheelChanged({ this, &TermControl::_MouseWheelHandler }); - _root.PointerPressed({ this, &TermControl::_MouseClickHandler }); - _root.PointerMoved({ this, &TermControl::_MouseMovedHandler }); - _root.PointerReleased({ this, &TermControl::_PointerReleasedHandler }); + _swapChainPanel.PointerPressed({ this, &TermControl::_PointerPressedHandler }); + _swapChainPanel.PointerMoved({ this, &TermControl::_PointerMovedHandler }); + _swapChainPanel.PointerReleased({ this, &TermControl::_PointerReleasedHandler }); localPointerToThread->EnablePainting(); @@ -671,9 +673,11 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Arguments: // - sender: not used // - args: event data - void TermControl::_MouseClickHandler(Windows::Foundation::IInspectable const& /*sender*/, + void TermControl::_PointerPressedHandler(Windows::Foundation::IInspectable const& sender, Input::PointerRoutedEventArgs const& args) { + _CapturePointer(sender, args); + const auto ptr = args.Pointer(); const auto point = args.GetCurrentPoint(_root); @@ -740,7 +744,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Arguments: // - sender: not used // - args: event data - void TermControl::_MouseMovedHandler(Windows::Foundation::IInspectable const& /*sender*/, + void TermControl::_PointerMovedHandler(Windows::Foundation::IInspectable const& /*sender*/, Input::PointerRoutedEventArgs const& args) { const auto ptr = args.Pointer(); @@ -801,9 +805,11 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - args: event data // Return Value: // - - void TermControl::_PointerReleasedHandler(Windows::Foundation::IInspectable const& /*sender*/, + void TermControl::_PointerReleasedHandler(Windows::Foundation::IInspectable const& sender, Input::PointerRoutedEventArgs const& args) { + _ReleasePointer(sender, args); + const auto ptr = args.Pointer(); if (ptr.PointerDeviceType() == Windows::Devices::Input::PointerDeviceType::Touch) @@ -949,6 +955,30 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation } } + // Method Description: + // - captures the pointer so that none of the other XAML elements respond to pointer events + // Arguments: + // - sender: XAML element that is interacting with pointer + // - args: pointer data (i.e.: mouse, touch) + void TermControl::_CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) + { + IUIElement uielem; + sender.as(uielem); + uielem.CapturePointer(args.Pointer()); + } + + // Method Description: + // - releases the captured pointer because we're done responding to XAML pointer events + // Arguments: + // - sender: XAML element that is interacting with pointer + // - args: pointer data (i.e.: mouse, touch) + void TermControl::_ReleasePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) + { + IUIElement uielem; + sender.as(uielem); + uielem.ReleasePointerCapture(args.Pointer()); + } + // Method Description: // - Event handler for the GotFocus event. This is used to start // blinking the cursor when the window is focused. diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index ad845b75f66..69bf1d8a041 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -114,11 +114,13 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation 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 _PointerPressedHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); + void _PointerMovedHandler(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 _CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); + void _ReleasePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs 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); From 01717f3d8aaac4018d58fb6bd74909e94865ca98 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 13 Jun 2019 10:41:20 -0700 Subject: [PATCH 2/4] forgot to format (again) :( --- src/cascadia/TerminalControl/TermControl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 1dfdd707dff..6f62fce4957 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -674,7 +674,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - sender: not used // - args: event data void TermControl::_PointerPressedHandler(Windows::Foundation::IInspectable const& sender, - Input::PointerRoutedEventArgs const& args) + Input::PointerRoutedEventArgs const& args) { _CapturePointer(sender, args); @@ -745,7 +745,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - sender: not used // - args: event data void TermControl::_PointerMovedHandler(Windows::Foundation::IInspectable const& /*sender*/, - Input::PointerRoutedEventArgs const& args) + Input::PointerRoutedEventArgs const& args) { const auto ptr = args.Pointer(); const auto point = args.GetCurrentPoint(_root); From 4124a5a4dcddeb82e60131139f7c9aa0454ecc0b Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 13 Jun 2019 16:16:15 -0700 Subject: [PATCH 3/4] PR changes --- src/cascadia/TerminalControl/TermControl.cpp | 34 +++++++++++++------- src/cascadia/TerminalControl/TermControl.h | 5 +-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 6f62fce4957..f4a5c4a7083 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -501,6 +501,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation } _root.PointerWheelChanged({ this, &TermControl::_MouseWheelHandler }); + + // These need to be hooked up to the SwapChainPanel because we don't want the scrollbar to respond to pointer events (GitHub #950) _swapChainPanel.PointerPressed({ this, &TermControl::_PointerPressedHandler }); _swapChainPanel.PointerMoved({ this, &TermControl::_PointerMovedHandler }); _swapChainPanel.PointerReleased({ this, &TermControl::_PointerReleasedHandler }); @@ -671,7 +673,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Method Description: // - handle a mouse click event. Begin selection process. // Arguments: - // - sender: not used + // - sender: the XAML element responding to the pointer input // - args: event data void TermControl::_PointerPressedHandler(Windows::Foundation::IInspectable const& sender, Input::PointerRoutedEventArgs const& args) @@ -801,14 +803,12 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - Event handler for the PointerReleased event. We use this to de-anchor // touch events, to stop scrolling via touch. // Arguments: - // - sender: not used + // - sender: the XAML element responding to the pointer input // - args: event data - // Return Value: - // - void TermControl::_PointerReleasedHandler(Windows::Foundation::IInspectable const& sender, Input::PointerRoutedEventArgs const& args) { - _ReleasePointer(sender, args); + _ReleasePointerCapture(sender, args); const auto ptr = args.Pointer(); @@ -960,11 +960,17 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Arguments: // - sender: XAML element that is interacting with pointer // - args: pointer data (i.e.: mouse, touch) - void TermControl::_CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) + // Return Value: + // - true if we successfully capture the pointer, false otherwise. + bool TermControl::_CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) { IUIElement uielem; - sender.as(uielem); - uielem.CapturePointer(args.Pointer()); + if (sender.try_as(uielem)) + { + uielem.CapturePointer(args.Pointer()); + return true; + } + return false; } // Method Description: @@ -972,11 +978,17 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Arguments: // - sender: XAML element that is interacting with pointer // - args: pointer data (i.e.: mouse, touch) - void TermControl::_ReleasePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) + // Return Value: + // - true if we release capture of the pointer, false otherwise. + bool TermControl::_ReleasePointerCapture(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& args) { IUIElement uielem; - sender.as(uielem); - uielem.ReleasePointerCapture(args.Pointer()); + if (sender.try_as(uielem)) + { + uielem.ReleasePointerCapture(args.Pointer()); + return true; + } + return false; } // Method Description: diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 69bf1d8a041..f473c4753ca 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -119,8 +119,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation 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 _CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); - void _ReleasePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs 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); @@ -136,6 +134,9 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void _MouseZoomHandler(const double delta); void _MouseTransparencyHandler(const double delta); + bool _CapturePointer(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); + bool _ReleasePointerCapture(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); + void _ScrollbarUpdater(Windows::UI::Xaml::Controls::Primitives::ScrollBar scrollbar, const int viewTop, const int viewHeight, const int bufferSize); static Windows::UI::Xaml::Thickness _ParseThicknessFromPadding(const hstring padding); From e530944d04af2f5d0b555fb7cd871f3b00c02e56 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 13 Jun 2019 17:14:04 -0700 Subject: [PATCH 4/4] fixed my derp --- src/cascadia/TerminalControl/TermControl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index f4a5c4a7083..ecd1ef13046 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -478,7 +478,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation _scrollBar.ViewportSize(bufferHeight); _scrollBar.ValueChanged({ this, &TermControl::_ScrollbarChangeHandler }); _scrollBar.PointerPressed({ this, &TermControl::_CapturePointer }); - _scrollBar.PointerReleased({ this, &TermControl::_ReleasePointer }); + _scrollBar.PointerReleased({ this, &TermControl::_ReleasePointerCapture }); // Apply settings for scrollbar if (_settings.ScrollState() == ScrollbarState::Visible)