From 07aa429175ece985a7fd1f3445bb0f50aab54a3d Mon Sep 17 00:00:00 2001 From: Hixie Date: Tue, 8 Dec 2015 11:15:42 -0800 Subject: [PATCH] Fix pointers in mojo. Make the mojo implementation of the pointer packet logic fake move events when it would send ups or downs without corresponding moves. --- sky/shell/platform/mojo/platform_view_mojo.cc | 63 ++++++++++++++----- sky/shell/platform/mojo/platform_view_mojo.h | 4 ++ 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/sky/shell/platform/mojo/platform_view_mojo.cc b/sky/shell/platform/mojo/platform_view_mojo.cc index eb70ce20a..1811baaed 100644 --- a/sky/shell/platform/mojo/platform_view_mojo.cc +++ b/sky/shell/platform/mojo/platform_view_mojo.cc @@ -130,22 +130,33 @@ void PlatformViewMojo::OnEvent(mojo::EventPtr event, mojo::PointerDataPtr data = event->pointer_data.Pass(); if (!data) break; - pointer::PointerPtr pointer = pointer::Pointer::New(); - pointer->time_stamp = event->time_stamp; - pointer->pointer = data->pointer_id; - pointer->type = GetTypeFromAction(event->action); - pointer->kind = GetKindFromKind(data->kind); - pointer->x = data->x; - pointer->y = data->y; - pointer->buttons = static_cast(event->flags); - pointer->pressure = data->pressure; - pointer->radius_major = data->radius_major; - pointer->radius_minor = data->radius_minor; - pointer->orientation = data->orientation; - - pointer::PointerPacketPtr packet = pointer::PointerPacket::New(); - packet->pointers = mojo::Array::New(1); - packet->pointers[0] = pointer.Pass(); + pointer::PointerPacketPtr packet; + int packetIndex = 0; + if (pointer_positions_.count(data->pointer_id) > 0) { + if (event->action == mojo::EventType::POINTER_UP || + event->action == mojo::EventType::POINTER_CANCEL) { + std::pair last_position = pointer_positions_[data->pointer_id]; + if (last_position.first != data->x || last_position.second != data->y) { + packet = pointer::PointerPacket::New(); + packet->pointers = mojo::Array::New(2); + packet->pointers[packetIndex] = CreateEvent(pointer::PointerType::MOVE, event.get(), data.get()); + packetIndex += 1; + } + pointer_positions_.erase(data->pointer_id); + } + } else { + // We don't currently support hover moves. + // If we want to support those, we have to first implement + // added/removed events for pointers. + // See: https://github.com/flutter/flutter/issues/720 + if (event->action != mojo::EventType::POINTER_DOWN) + break; + } + if (packetIndex == 0) { + packet = pointer::PointerPacket::New(); + packet->pointers = mojo::Array::New(1); + } + packet->pointers[packetIndex] = CreateEvent(GetTypeFromAction(event->action), event.get(), data.get()); sky_engine_->OnPointerPacket(packet.Pass()); break; } @@ -162,6 +173,26 @@ void PlatformViewMojo::OnEvent(mojo::EventPtr event, callback.Run(); } +pointer::PointerPtr PlatformViewMojo::CreateEvent(pointer::PointerType type, mojo::Event* event, mojo::PointerData* data) { + DCHECK(data); + pointer::PointerPtr pointer = pointer::Pointer::New(); + pointer->time_stamp = event->time_stamp; + pointer->pointer = data->pointer_id; + pointer->type = type; + pointer->kind = GetKindFromKind(data->kind); + pointer->x = data->x; + pointer->y = data->y; + pointer->buttons = static_cast(event->flags); + pointer->pressure = data->pressure; + pointer->radius_major = data->radius_major; + pointer->radius_minor = data->radius_minor; + pointer->orientation = data->orientation; + if (event->action != mojo::EventType::POINTER_UP || + event->action != mojo::EventType::POINTER_CANCEL) + pointer_positions_[data->pointer_id] = { data->x, data->y }; + return pointer.Pass(); +} + void PlatformViewMojo::Create( mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) { diff --git a/sky/shell/platform/mojo/platform_view_mojo.h b/sky/shell/platform/mojo/platform_view_mojo.h index d3f20473e..a6f6ac747 100644 --- a/sky/shell/platform/mojo/platform_view_mojo.h +++ b/sky/shell/platform/mojo/platform_view_mojo.h @@ -37,6 +37,8 @@ class PlatformViewMojo : public PlatformView, void OnEvent(mojo::EventPtr event, const mojo::Callback& callback) override; + pointer::PointerPtr CreateEvent(pointer::PointerType type, mojo::Event* event, mojo::PointerData* data); + // |mojo::InterfaceFactory| implementation: void Create( mojo::ApplicationConnection* connection, @@ -53,6 +55,8 @@ class PlatformViewMojo : public PlatformView, mojo::NativeViewportEventDispatcherPtr key_event_dispatcher_; + std::map> pointer_positions_; + DISALLOW_COPY_AND_ASSIGN(PlatformViewMojo); }; -- GitLab