Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions src/cascadia/TerminalControl/TermControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2017,12 +2017,23 @@ namespace winrt::Microsoft::Terminal::Control::implementation
args.Handled(true);
}

void TermControl::_setPointerCursor(const bool showIBeam)
{
if (showIBeam == _ownsPointerCursor)
{
return;
}

CoreWindow::GetForCurrentThread().PointerCursor(CoreCursor{ showIBeam ? CoreCursorType::IBeam : CoreCursorType::Arrow, 0 });
_ownsPointerCursor = showIBeam;
}

// Method Description:
// - handle a mouse moved event. Specifically handling mouse drag to update selection process.
// Arguments:
// - sender: not used
// - sender: the element the handler is attached to, i.e. the text area
// - args: event data
void TermControl::_PointerMovedHandler(const Windows::Foundation::IInspectable& /*sender*/,
void TermControl::_PointerMovedHandler(const Windows::Foundation::IInspectable& sender,
const Input::PointerRoutedEventArgs& args)
{
if (_IsClosing())
Expand All @@ -2046,6 +2057,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
if (type == Windows::Devices::Input::PointerDeviceType::Mouse ||
type == Windows::Devices::Input::PointerDeviceType::Pen)
{
const auto overTextArea = args.OriginalSource() == sender || args.OriginalSource() == SwapChainPanel();
const auto selectable = ControlKeyStates{ args.KeyModifiers() }.IsShiftPressed() ||
!winrt::get_self<ControlCore>(_core)->IsVtMouseModeEnabled();
_setPointerCursor(overTextArea && selectable);

auto suppressFurtherHandling = _interactivity.PointerMoved(point.PointerId(),
TermControl::GetPressedMouseButtons(point),
TermControl::GetPointerUpdateKind(point),
Expand Down Expand Up @@ -3477,6 +3493,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
const Windows::UI::Xaml::Input::PointerRoutedEventArgs& /*e*/)
{
_core.ClearHoveredCell();
_setPointerCursor(false);
}

void TermControl::_hoveredHyperlinkChanged(const IInspectable& /*sender*/, const IInspectable& /*args*/)
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalControl/TermControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
SafeDispatcherTimer _autoScrollTimer;
std::optional<std::chrono::high_resolution_clock::time_point> _lastAutoScrollUpdateTime;
bool _pointerPressedInBounds{ false };
bool _ownsPointerCursor{ false };

winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellLightAnimation{ nullptr };
winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellDarkAnimation{ nullptr };
Expand Down Expand Up @@ -367,6 +368,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void _KeyUpHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
void _CharacterHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::CharacterReceivedRoutedEventArgs& e);
void _PointerPressedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
void _setPointerCursor(const bool showIBeam);
void _PointerMovedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
void _PointerReleasedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
void _PointerExitedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
Expand Down