blob: 658651301589dd408f49dda931bd04da99efb59b [file] [log] [blame]
// 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 "flutter/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