Convert Gfx PlatformView to use modern TouchSource API (flutter/engine#32877)

This commit is contained in:
Jaeheon Yi 2022-04-29 22:09:04 -07:00 committed by GitHub
parent 1601cdeaed
commit bcf1a7774a
7 changed files with 31 additions and 36 deletions

View File

@ -166,8 +166,8 @@ void Engine::Initialize(
} else {
gfx_protocols.set_view_focuser(focuser.NewRequest());
gfx_protocols.set_view_ref_focused(view_ref_focused.NewRequest());
// TODO(fxbug.dev/85125): Enable TouchSource for GFX.
// gfx_protocols.set_touch_source(touch_source.NewRequest());
gfx_protocols.set_touch_source(touch_source.NewRequest());
// GFX used only on products without a mouse.
}
scenic->CreateSessionT(std::move(gfx_protocols), [] {});

View File

@ -32,8 +32,7 @@ FlatlandPlatformView::FlatlandPlatformView(
AwaitVsyncCallback await_vsync_callback,
AwaitVsyncForSecondaryCallbackCallback
await_vsync_for_secondary_callback_callback)
: PlatformView(true /* is_flatland */,
delegate,
: PlatformView(delegate,
std::move(task_runners),
std::move(view_ref),
std::move(external_view_embedder),

View File

@ -33,8 +33,7 @@ GfxPlatformView::GfxPlatformView(
AwaitVsyncCallback await_vsync_callback,
AwaitVsyncForSecondaryCallbackCallback
await_vsync_for_secondary_callback_callback)
: PlatformView(false /* is_flatland */,
delegate,
: PlatformView(delegate,
std::move(task_runners),
std::move(view_ref),
std::move(external_view_embedder),

View File

@ -51,7 +51,6 @@ void SetInterfaceErrorHandler(fidl::Binding<T>& binding, std::string name) {
}
PlatformView::PlatformView(
bool is_flatland,
flutter::PlatformView::Delegate& delegate,
flutter::TaskRunners task_runners,
fuchsia::ui::views::ViewRef view_ref,
@ -122,33 +121,31 @@ PlatformView::PlatformView(
});
// Begin watching for pointer events.
if (is_flatland) { // TODO(fxbug.dev/85125): make unconditional
pointer_delegate_->WatchLoop([weak = weak_factory_.GetWeakPtr()](
std::vector<flutter::PointerData> events) {
if (!weak) {
FML_LOG(WARNING) << "PlatformView use-after-free attempted. Ignoring.";
return;
}
pointer_delegate_->WatchLoop([weak = weak_factory_.GetWeakPtr()](
std::vector<flutter::PointerData> events) {
if (!weak) {
FML_LOG(WARNING) << "PlatformView use-after-free attempted. Ignoring.";
return;
}
if (events.size() == 0) {
return; // No work, bounce out.
}
if (events.size() == 0) {
return; // No work, bounce out.
}
// If pixel ratio hasn't been set, use a default value of 1.
const float pixel_ratio = weak->view_pixel_ratio_.value_or(1.f);
auto packet = std::make_unique<flutter::PointerDataPacket>(events.size());
for (size_t i = 0; i < events.size(); ++i) {
auto& event = events[i];
// Translate logical to physical coordinates, as per
// flutter::PointerData contract. Done here because pixel ratio comes
// from the graphics API.
event.physical_x = event.physical_x * pixel_ratio;
event.physical_y = event.physical_y * pixel_ratio;
packet->SetPointerData(i, event);
}
weak->DispatchPointerDataPacket(std::move(packet));
});
}
// If pixel ratio hasn't been set, use a default value of 1.
const float pixel_ratio = weak->view_pixel_ratio_.value_or(1.f);
auto packet = std::make_unique<flutter::PointerDataPacket>(events.size());
for (size_t i = 0; i < events.size(); ++i) {
auto& event = events[i];
// Translate logical to physical coordinates, as per
// flutter::PointerData contract. Done here because pixel ratio comes
// from the graphics API.
event.physical_x = event.physical_x * pixel_ratio;
event.physical_y = event.physical_y * pixel_ratio;
packet->SetPointerData(i, event);
}
weak->DispatchPointerDataPacket(std::move(packet));
});
// Finally! Register the native platform message handlers.
RegisterPlatformMessageHandlers();

View File

@ -64,7 +64,6 @@ class PlatformView : public flutter::PlatformView,
private fuchsia::ui::input::InputMethodEditorClient {
public:
PlatformView(
bool is_flatland,
flutter::PlatformView::Delegate& delegate,
flutter::TaskRunners task_runners,
fuchsia::ui::views::ViewRef view_ref,

View File

@ -1385,8 +1385,7 @@ TEST_F(PlatformViewTests, OnShaderWarmup) {
EXPECT_EQ(expected_result_string, response->result_string);
}
// TODO(fxbug.dev/85125): Enable when GFX converts to TouchSource.
TEST_F(PlatformViewTests, DISABLED_TouchSourceLogicalToPhysicalConversion) {
TEST_F(PlatformViewTests, TouchSourceLogicalToPhysicalConversion) {
constexpr std::array<std::array<float, 2>, 2> kRect = {{{0, 0}, {20, 20}}};
constexpr std::array<float, 9> kIdentity = {1, 0, 0, 0, 1, 0, 0, 0, 1};
constexpr fuchsia::ui::pointer::TouchInteractionId kIxnOne = {

View File

@ -411,7 +411,9 @@ void PointerDelegate::WatchLoop(
// Start watching both channels.
touch_source_->Watch(std::move(touch_responses_), /*copy*/ touch_responder_);
touch_responses_.clear();
mouse_source_->Watch(/*copy*/ mouse_responder_);
if (mouse_source_) {
mouse_source_->Watch(/*copy*/ mouse_responder_);
}
}
} // namespace flutter_runner