mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
112 lines
3.7 KiB
C++
112 lines
3.7 KiB
C++
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "sky/shell/platform/mojo/pointer_converter_mojo.h"
|
|
|
|
#include "base/logging.h"
|
|
|
|
namespace sky {
|
|
namespace shell {
|
|
namespace {
|
|
|
|
pointer::PointerType GetTypeFromAction(mojo::EventType type) {
|
|
switch (type) {
|
|
case mojo::EventType::POINTER_CANCEL:
|
|
return pointer::PointerType::CANCEL;
|
|
case mojo::EventType::POINTER_DOWN:
|
|
return pointer::PointerType::DOWN;
|
|
case mojo::EventType::POINTER_MOVE:
|
|
return pointer::PointerType::MOVE;
|
|
case mojo::EventType::POINTER_UP:
|
|
return pointer::PointerType::UP;
|
|
default:
|
|
DCHECK(false);
|
|
return pointer::PointerType::CANCEL;
|
|
}
|
|
}
|
|
|
|
pointer::PointerKind GetKindFromKind(mojo::PointerKind kind) {
|
|
switch (kind) {
|
|
case mojo::PointerKind::TOUCH:
|
|
return pointer::PointerKind::TOUCH;
|
|
case mojo::PointerKind::MOUSE:
|
|
return pointer::PointerKind::MOUSE;
|
|
}
|
|
DCHECK(false);
|
|
return pointer::PointerKind::TOUCH;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
PointerConverterMojo::PointerConverterMojo() {
|
|
}
|
|
|
|
PointerConverterMojo::~PointerConverterMojo() {
|
|
}
|
|
|
|
pointer::PointerPacketPtr PointerConverterMojo::ConvertEvent(
|
|
mojo::EventPtr event) {
|
|
DCHECK(event->action == mojo::EventType::POINTER_CANCEL
|
|
|| event->action == mojo::EventType::POINTER_DOWN
|
|
|| event->action == mojo::EventType::POINTER_MOVE
|
|
|| event->action == mojo::EventType::POINTER_UP);
|
|
mojo::PointerDataPtr data = event->pointer_data.Pass();
|
|
if (!data)
|
|
return nullptr;
|
|
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) {
|
|
auto 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<pointer::PointerPtr>::New(2);
|
|
packet->pointers[packetIndex] = CreatePointer(
|
|
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)
|
|
return nullptr;
|
|
}
|
|
if (packetIndex == 0) {
|
|
packet = pointer::PointerPacket::New();
|
|
packet->pointers = mojo::Array<pointer::PointerPtr>::New(1);
|
|
}
|
|
packet->pointers[packetIndex] = CreatePointer(
|
|
GetTypeFromAction(event->action), event.get(), data.get());
|
|
return packet.Pass();
|
|
}
|
|
|
|
pointer::PointerPtr PointerConverterMojo::CreatePointer(
|
|
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<int32_t>(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();
|
|
}
|
|
|
|
} // namespace shell
|
|
} // namespace sky
|