diff options
-rw-r--r-- | support/hololens/ServoApp/ServoControl/Servo.h | 6 | ||||
-rw-r--r-- | support/hololens/ServoApp/ServoControl/ServoControl.cpp | 85 | ||||
-rw-r--r-- | support/hololens/ServoApp/ServoControl/ServoControl.h | 10 |
3 files changed, 83 insertions, 18 deletions
diff --git a/support/hololens/ServoApp/ServoControl/Servo.h b/support/hololens/ServoApp/ServoControl/Servo.h index a27313d3792..5cf4e113e33 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.h +++ b/support/hololens/ServoApp/ServoControl/Servo.h @@ -62,6 +62,12 @@ public: void MouseUp(float x, float y, capi::CMouseButton b) { capi::mouse_up(x, y, b); } + void TouchDown(float x, float y, int32_t id) { capi::touch_down(x, y, id); } + void TouchUp(float x, float y, int32_t id) { capi::touch_up(x, y, id); } + void TouchMove(float x, float y, int32_t id) { capi::touch_move(x, y, id); } + void TouchCancel(float x, float y, int32_t id) { + capi::touch_cancel(x, y, id); + } void MouseMove(float x, float y) { capi::mouse_move(x, y); } void Reload() { capi::reload(); } diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.cpp b/support/hololens/ServoApp/ServoControl/ServoControl.cpp index 5aefe85b813..38cc4f284f4 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.cpp +++ b/support/hololens/ServoApp/ServoControl/ServoControl.cpp @@ -9,6 +9,7 @@ using namespace winrt::Windows::UI::Xaml; using namespace winrt::Windows::UI::Core; using namespace winrt::Windows::Foundation; using namespace winrt::Windows::System; +using namespace winrt::Windows::Devices::Input; using namespace concurrency; using namespace winrt::servo; @@ -38,13 +39,15 @@ void ServoControl::OnLoaded(IInspectable const &, RoutedEventArgs const &) { auto panel = Panel(); panel.Tapped(std::bind(&ServoControl::OnSurfaceTapped, this, _1, _2)); panel.PointerPressed( - std::bind(&ServoControl::OnSurfacePointerPressed, this, _1, _2)); + std::bind(&ServoControl::OnSurfacePointerPressed, this, _1, _2, true)); panel.PointerReleased( - std::bind(&ServoControl::OnSurfacePointerPressed, this, _1, _2)); + std::bind(&ServoControl::OnSurfacePointerPressed, this, _1, _2, false)); panel.PointerCanceled( std::bind(&ServoControl::OnSurfacePointerCanceled, this, _1, _2)); + panel.PointerExited( + std::bind(&ServoControl::OnSurfacePointerExited, this, _1, _2)); panel.PointerCaptureLost( - std::bind(&ServoControl::OnSurfacePointerCanceled, this, _1, _2)); + std::bind(&ServoControl::OnSurfacePointerLost, this, _1, _2)); panel.PointerMoved( std::bind(&ServoControl::OnSurfacePointerMoved, this, _1, _2)); panel.PointerWheelChanged( @@ -105,17 +108,19 @@ void ServoControl::OnSurfaceManipulationDelta( void ServoControl::OnSurfaceTapped(IInspectable const &, Input::TappedRoutedEventArgs const &e) { - auto coords = e.GetPosition(Panel()); - auto x = coords.X * mDPI; - auto y = coords.Y * mDPI; - RunOnGLThread([=] { mServo->Click(x, y); }); + if (e.PointerDeviceType() == PointerDeviceType::Mouse) { + auto coords = e.GetPosition(Panel()); + auto x = coords.X * mDPI; + auto y = coords.Y * mDPI; + RunOnGLThread([=] { mServo->Click(x, y); }); + } e.Handled(true); } void ServoControl::OnSurfacePointerPressed( - IInspectable const &, Input::PointerRoutedEventArgs const &e) { - if (e.Pointer().PointerDeviceType() == - Windows::Devices::Input::PointerDeviceType::Mouse) { + IInspectable const &, Input::PointerRoutedEventArgs const &e, bool down) { + auto ty = e.Pointer().PointerDeviceType(); + if (ty == PointerDeviceType::Mouse) { auto point = e.GetCurrentPoint(Panel()); auto x = point.Position().X * mDPI; @@ -144,30 +149,76 @@ void ServoControl::OnSurfacePointerPressed( } mPressedMouseButton = button; + } else if (ty == PointerDeviceType::Touch) { + auto point = e.GetCurrentPoint(Panel()); + + auto x = point.Position().X * mDPI; + auto y = point.Position().Y * mDPI; + + if (down) { + RunOnGLThread([=] { mServo->TouchDown(x, y, point.PointerId()); }); + } else { + RunOnGLThread([=] { mServo->TouchUp(x, y, point.PointerId()); }); + } + e.Handled(true); } } void ServoControl::OnSurfacePointerCanceled( IInspectable const &, Input::PointerRoutedEventArgs const &e) { - mPressedMouseButton = {}; + e.Handled(true); + auto ty = e.Pointer().PointerDeviceType(); + if (ty == PointerDeviceType::Mouse) { + mPressedMouseButton = {}; + } else if (ty == PointerDeviceType::Touch) { + auto point = e.GetCurrentPoint(Panel()); + auto x = point.Position().X * mDPI; + auto y = point.Position().Y * mDPI; + RunOnGLThread([=] { mServo->TouchCancel(x, y, point.PointerId()); }); + } } -void ServoControl::OnSurfacePointerMoved( +void ServoControl::OnSurfacePointerExited( IInspectable const &, Input::PointerRoutedEventArgs const &e) { - if (e.Pointer().PointerDeviceType() == - Windows::Devices::Input::PointerDeviceType::Mouse) { + e.Handled(true); + auto ty = e.Pointer().PointerDeviceType(); + if (ty == PointerDeviceType::Touch) { auto point = e.GetCurrentPoint(Panel()); auto x = point.Position().X * mDPI; auto y = point.Position().Y * mDPI; - e.Handled(true); + RunOnGLThread([=] { mServo->TouchCancel(x, y, point.PointerId()); }); + ; + } +} + +void ServoControl::OnSurfacePointerLost( + IInspectable const &, Input::PointerRoutedEventArgs const &e) { + // According to the documentation: + // https://docs.microsoft.com/en-us/windows/uwp/design/input/handle-pointer-input#handle-pointer-events + // we should cancel the event on PointLost. But we keep getting + // PointerMoved events after PointerLost. Servo doesn't like getting events + // from a pointer id that has been canceled. So we do nothing. + e.Handled(true); + return; +} + +void ServoControl::OnSurfacePointerMoved( + IInspectable const &, Input::PointerRoutedEventArgs const &e) { + auto ty = e.Pointer().PointerDeviceType(); + auto point = e.GetCurrentPoint(Panel()); + auto x = point.Position().X * mDPI; + auto y = point.Position().Y * mDPI; + if (ty == PointerDeviceType::Touch && point.IsInContact()) { + RunOnGLThread([=] { mServo->TouchMove(x, y, point.PointerId()); }); + } else { RunOnGLThread([=] { mServo->MouseMove(x, y); }); } + e.Handled(true); } void ServoControl::OnSurfaceWheelChanged( IInspectable const &, Input::PointerRoutedEventArgs const &e) { - if (e.Pointer().PointerDeviceType() == - Windows::Devices::Input::PointerDeviceType::Mouse) { + if (e.Pointer().PointerDeviceType() == PointerDeviceType::Mouse) { auto point = e.GetCurrentPoint(Panel()); auto x = point.Position().X * mDPI; auto y = point.Position().Y * mDPI; diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.h b/support/hololens/ServoApp/ServoControl/ServoControl.h index 921cf767021..fea53fdb5bb 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.h +++ b/support/hololens/ServoApp/ServoControl/ServoControl.h @@ -115,12 +115,20 @@ private: void OnSurfacePointerPressed( IInspectable const &, - Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); + Windows::UI::Xaml::Input::PointerRoutedEventArgs const &, bool); void OnSurfacePointerCanceled( IInspectable const &, Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); + void OnSurfacePointerExited( + IInspectable const &, + Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); + + void OnSurfacePointerLost( + IInspectable const &, + Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); + void OnSurfacePointerMoved( IInspectable const &, Windows::UI::Xaml::Input::PointerRoutedEventArgs const &); |