Skip to content

Commit

Permalink
Captured pointer for SwapChainPanel and ScrollBar separately (#1248)
Browse files Browse the repository at this point in the history
* Captured pointer for SwapChainPanel and ScrollBar separately
Renamed MouseClickHandler and MouseMovedHandler to more generic names (since they handle touch events too)

Fixes #950.
  • Loading branch information
carlos-zamora authored and DHowett committed Jun 18, 2019
1 parent 2266313 commit f30d148
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 14 deletions.
66 changes: 54 additions & 12 deletions src/cascadia/TerminalControl/TermControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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::_ReleasePointerCapture });

// Apply settings for scrollbar
if (_settings.ScrollState() == ScrollbarState::Visible)
Expand All @@ -499,9 +501,11 @@ 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 });

// 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 });

localPointerToThread->EnablePainting();

Expand Down Expand Up @@ -669,11 +673,13 @@ 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::_MouseClickHandler(Windows::Foundation::IInspectable const& /*sender*/,
Input::PointerRoutedEventArgs const& args)
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);

Expand Down Expand Up @@ -740,8 +746,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation
// Arguments:
// - sender: not used
// - args: event data
void TermControl::_MouseMovedHandler(Windows::Foundation::IInspectable const& /*sender*/,
Input::PointerRoutedEventArgs const& args)
void TermControl::_PointerMovedHandler(Windows::Foundation::IInspectable const& /*sender*/,
Input::PointerRoutedEventArgs const& args)
{
const auto ptr = args.Pointer();
const auto point = args.GetCurrentPoint(_root);
Expand Down Expand Up @@ -797,13 +803,13 @@ 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:
// - <none>
void TermControl::_PointerReleasedHandler(Windows::Foundation::IInspectable const& /*sender*/,
void TermControl::_PointerReleasedHandler(Windows::Foundation::IInspectable const& sender,
Input::PointerRoutedEventArgs const& args)
{
_ReleasePointerCapture(sender, args);

const auto ptr = args.Pointer();

if (ptr.PointerDeviceType() == Windows::Devices::Input::PointerDeviceType::Touch)
Expand Down Expand Up @@ -949,6 +955,42 @@ 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)
// 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;
if (sender.try_as(uielem))
{
uielem.CapturePointer(args.Pointer());
return true;
}
return false;
}

// 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)
// 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;
if (sender.try_as(uielem))
{
uielem.ReleasePointerCapture(args.Pointer());
return true;
}
return false;
}

// Method Description:
// - Event handler for the GotFocus event. This is used to start
// blinking the cursor when the window is focused.
Expand Down
7 changes: 5 additions & 2 deletions src/cascadia/TerminalControl/TermControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ 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);
Expand All @@ -134,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);

Expand Down

0 comments on commit f30d148

Please sign in to comment.