From 7fc72ca82012bc295dc47513762bce9e5d148053 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 21 May 2021 12:18:25 -0500 Subject: [PATCH] An enum does in fact work across the process boundary --- src/cascadia/TerminalControl/ControlCore.idl | 15 ++++++++------- .../TerminalControl/ControlInteractivity.cpp | 14 ++++++++------ src/cascadia/TerminalControl/TermControl.cpp | 19 +++++++++++++------ 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index 34e97a4be6c..fa4746ca404 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -11,14 +11,15 @@ namespace Microsoft.Terminal.Control // This is a mirror of // ::Microsoft::Console::VirtualTerminal::TerminalInput::MouseButtonState, // but projectable. - struct MouseButtonState + // !! LOAD BEARING !! If you make this a struct with Booleans (like they + // make the most sense as), then the app will crash trying to toss one of + // these across the process boundary. I haven't the damndest idea why. + [flags] + enum MouseButtonState { - // !! LOAD BEARING !! If you make these Booleans (like they should be), - // then the app will crash trying to toss one of these across the - // process boundary. I haven't the damndest idea why. - Int32 IsLeftButtonDown; - Int32 IsMiddleButtonDown; - Int32 IsRightButtonDown; + IsLeftButtonDown = 0x1, + IsMiddleButtonDown = 0x2, + IsRightButtonDown = 0x4 }; [default_interface] runtimeclass ControlCore : ICoreState diff --git a/src/cascadia/TerminalControl/ControlInteractivity.cpp b/src/cascadia/TerminalControl/ControlInteractivity.cpp index 342ddef2d1a..e49759bbdab 100644 --- a/src/cascadia/TerminalControl/ControlInteractivity.cpp +++ b/src/cascadia/TerminalControl/ControlInteractivity.cpp @@ -32,7 +32,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation static constexpr TerminalInput::MouseButtonState toInternalMouseState(const Control::MouseButtonState& state) { return TerminalInput::MouseButtonState{ - state.IsLeftButtonDown != 0, state.IsMiddleButtonDown != 0, state.IsRightButtonDown != 0 + WI_IsFlagSet(state, MouseButtonState::IsLeftButtonDown), + WI_IsFlagSet(state, MouseButtonState::IsMiddleButtonDown), + WI_IsFlagSet(state, MouseButtonState::IsRightButtonDown) }; } @@ -202,7 +204,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation // GH#9396: we prioritize hyper-link over VT mouse events auto hyperlink = _core->GetHyperlink(terminalPosition); - if (buttonState.IsLeftButtonDown && + if (WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown) && ctrlEnabled && !hyperlink.empty()) { const auto clickCount = _numberOfClicks(pixelPosition, timestamp); @@ -216,7 +218,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation { _core->SendMouseEvent(terminalPosition, pointerUpdateKind, modifiers, 0, toInternalMouseState(buttonState)); } - else if (buttonState.IsLeftButtonDown) + else if (WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown)) { const auto clickCount = _numberOfClicks(pixelPosition, timestamp); // This formula enables the number of clicks to cycle properly @@ -251,7 +253,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation _singleClickTouchdownPos = std::nullopt; } } - else if (buttonState.IsRightButtonDown) + else if (WI_IsFlagSet(buttonState, MouseButtonState::IsRightButtonDown)) { // CopyOnSelect right click always pastes if (_core->CopyOnSelect() || !_core->HasSelection()) @@ -283,7 +285,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation { _core->SendMouseEvent(terminalPosition, pointerUpdateKind, modifiers, 0, toInternalMouseState(buttonState)); } - else if (focused && buttonState.IsLeftButtonDown) + else if (focused && WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown)) { if (_singleClickTouchdownPos) { @@ -430,7 +432,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation } else { - _mouseScrollHandler(delta, pixelPosition, buttonState.IsLeftButtonDown); + _mouseScrollHandler(delta, pixelPosition, WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown)); } return false; } diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 96cdf7f031e..15ff568b901 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -43,6 +43,8 @@ constexpr const auto TerminalWarningBellInterval = std::chrono::milliseconds(100 DEFINE_ENUM_FLAG_OPERATORS(winrt::Microsoft::Terminal::Control::CopyFormat); +DEFINE_ENUM_FLAG_OPERATORS(winrt::Microsoft::Terminal::Control::MouseButtonState); + namespace winrt::Microsoft::Terminal::Control::implementation { TermControl::TermControl(IControlSettings settings, @@ -1250,9 +1252,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation const bool rightButtonDown) { const auto modifiers = _GetPressedModifierKeys(); - Control::MouseButtonState state{ leftButtonDown, - midButtonDown, - rightButtonDown }; + + Control::MouseButtonState state{}; + WI_SetFlagIf(state, Control::MouseButtonState::IsLeftButtonDown, leftButtonDown); + WI_SetFlagIf(state, Control::MouseButtonState::IsMiddleButtonDown, midButtonDown); + WI_SetFlagIf(state, Control::MouseButtonState::IsRightButtonDown, rightButtonDown); + return _interactivity.MouseWheel(modifiers, delta, _toTerminalOrigin(location), state); } @@ -2487,9 +2492,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation Control::MouseButtonState TermControl::GetPressedMouseButtons(const winrt::Windows::UI::Input::PointerPoint point) { - return Control::MouseButtonState{ point.Properties().IsLeftButtonPressed(), - point.Properties().IsMiddleButtonPressed(), - point.Properties().IsRightButtonPressed() }; + Control::MouseButtonState state{}; + WI_SetFlagIf(state, Control::MouseButtonState::IsLeftButtonDown, point.Properties().IsLeftButtonPressed()); + WI_SetFlagIf(state, Control::MouseButtonState::IsMiddleButtonDown, point.Properties().IsMiddleButtonPressed()); + WI_SetFlagIf(state, Control::MouseButtonState::IsRightButtonDown, point.Properties().IsRightButtonPressed()); + return state; } unsigned int TermControl::GetPointerUpdateKind(const winrt::Windows::UI::Input::PointerPoint point)