From 69d7e8eb918a18d2406f8340454bc94de99357a3 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Wed, 16 Dec 2020 11:57:42 -0800 Subject: [PATCH] Correct button state on synthetic pointer events (#23111) This corrects the button state emitted on synthetic pointer move and hover events generated by the engine. When an embedder notifies the engine of a pointer up or down event, and the pointer's position has changed since the last move or hover event, `PointerDataPacketConverter` generates a synthetic move or hover to notify the framework of the change in position. In these cases, the current event from the embedder contains the new button state *after* the pointer up/down event, but the move/hover needs to be synthesized such that it occurs *before* the pointer up/down, with the previous button state. This patch stores the button state after each pointer down, up, move, or hover event such that it can be used by the next event if a synthetic event must be issued. The bug in the previous logic was revealed by the release of macOS 11 (Big Sur), which appears to issue move events between mouse down and mouse up, which did not use to be the case. This fixes https://github.com/flutter/flutter/issues/64961, which is the desktop-specific tracking bug for the more general Big Sur mouse click umbrella issue https://github.com/flutter/flutter/issues/71190. --- .../window/pointer_data_packet_converter.cc | 10 ++ lib/ui/window/pointer_data_packet_converter.h | 14 +- ...pointer_data_packet_converter_unittests.cc | 128 +++++++++++------- 3 files changed, 98 insertions(+), 54 deletions(-) diff --git a/lib/ui/window/pointer_data_packet_converter.cc b/lib/ui/window/pointer_data_packet_converter.cc index c9cf2b9ec..d523f302b 100644 --- a/lib/ui/window/pointer_data_packet_converter.cc +++ b/lib/ui/window/pointer_data_packet_converter.cc @@ -119,6 +119,7 @@ void PointerDataPacketConverter::ConvertPointerData( PointerData synthesized_add_event = pointer_data; synthesized_add_event.change = PointerData::Change::kAdd; synthesized_add_event.synthesized = 1; + synthesized_add_event.buttons = 0; state = EnsurePointerState(synthesized_add_event); converted_pointers.push_back(synthesized_add_event); } else { @@ -126,6 +127,7 @@ void PointerDataPacketConverter::ConvertPointerData( } FML_DCHECK(!state.isDown); + state.buttons = pointer_data.buttons; if (LocationNeedsUpdate(pointer_data, state)) { UpdateDeltaAndState(pointer_data, state); converted_pointers.push_back(pointer_data); @@ -140,6 +142,7 @@ void PointerDataPacketConverter::ConvertPointerData( PointerData synthesized_add_event = pointer_data; synthesized_add_event.change = PointerData::Change::kAdd; synthesized_add_event.synthesized = 1; + synthesized_add_event.buttons = 0; state = EnsurePointerState(synthesized_add_event); converted_pointers.push_back(synthesized_add_event); } else { @@ -152,6 +155,7 @@ void PointerDataPacketConverter::ConvertPointerData( PointerData synthesized_hover_event = pointer_data; synthesized_hover_event.change = PointerData::Change::kHover; synthesized_hover_event.synthesized = 1; + synthesized_hover_event.buttons = 0; UpdateDeltaAndState(synthesized_hover_event, state); converted_pointers.push_back(synthesized_hover_event); @@ -159,6 +163,7 @@ void PointerDataPacketConverter::ConvertPointerData( UpdatePointerIdentifier(pointer_data, state, true); state.isDown = true; + state.buttons = pointer_data.buttons; states_[pointer_data.device] = state; converted_pointers.push_back(pointer_data); break; @@ -172,6 +177,7 @@ void PointerDataPacketConverter::ConvertPointerData( UpdatePointerIdentifier(pointer_data, state, false); UpdateDeltaAndState(pointer_data, state); + state.buttons = pointer_data.buttons; converted_pointers.push_back(pointer_data); break; } @@ -188,6 +194,7 @@ void PointerDataPacketConverter::ConvertPointerData( // Synthesizes a move event if the location does not match. PointerData synthesized_move_event = pointer_data; synthesized_move_event.change = PointerData::Change::kMove; + synthesized_move_event.buttons = state.buttons; synthesized_move_event.synthesized = 1; UpdateDeltaAndState(synthesized_move_event, state); @@ -195,6 +202,7 @@ void PointerDataPacketConverter::ConvertPointerData( } state.isDown = false; + state.buttons = pointer_data.buttons; states_[pointer_data.device] = state; converted_pointers.push_back(pointer_data); break; @@ -218,6 +226,7 @@ void PointerDataPacketConverter::ConvertPointerData( PointerData synthesized_move_event = pointer_data; synthesized_move_event.signal_kind = PointerData::SignalKind::kNone; synthesized_move_event.change = PointerData::Change::kMove; + synthesized_move_event.buttons = state.buttons; synthesized_move_event.synthesized = 1; UpdateDeltaAndState(synthesized_move_event, state); @@ -228,6 +237,7 @@ void PointerDataPacketConverter::ConvertPointerData( synthesized_hover_event.signal_kind = PointerData::SignalKind::kNone; synthesized_hover_event.change = PointerData::Change::kHover; + synthesized_hover_event.buttons = 0; synthesized_hover_event.synthesized = 1; UpdateDeltaAndState(synthesized_hover_event, state); diff --git a/lib/ui/window/pointer_data_packet_converter.h b/lib/ui/window/pointer_data_packet_converter.h index 67b19d164..4f4f20a71 100644 --- a/lib/ui/window/pointer_data_packet_converter.h +++ b/lib/ui/window/pointer_data_packet_converter.h @@ -16,15 +16,23 @@ namespace flutter { //------------------------------------------------------------------------------ -/// The current information about a pointer. This struct is used by -/// PointerDataPacketConverter to fill in necesarry information for raw pointer -/// packet sent from embedding. +/// The current information about a pointer. +/// +/// This struct is used by PointerDataPacketConverter to fill in necessary +/// information for the raw pointer packet sent from embedding. This struct also +/// stores the button state of the last pointer down, up, move, or hover event. +/// When an embedder issues a pointer up or down event where the pointer's +/// position has changed since the last move or hover event, +/// PointerDataPacketConverter generates a synthetic move or hover to notify the +/// framework. In these cases, these events must be issued with the button state +/// prior to the pointer up or down. /// struct PointerState { int64_t pointer_identifier; bool isDown; double physical_x; double physical_y; + int64_t buttons; }; //------------------------------------------------------------------------------ diff --git a/lib/ui/window/pointer_data_packet_converter_unittests.cc b/lib/ui/window/pointer_data_packet_converter_unittests.cc index 806dc4679..deee09267 100644 --- a/lib/ui/window/pointer_data_packet_converter_unittests.cc +++ b/lib/ui/window/pointer_data_packet_converter_unittests.cc @@ -15,7 +15,8 @@ void CreateSimulatedPointerData(PointerData& data, // NOLINT PointerData::Change change, int64_t device, double dx, - double dy) { + double dy, + int64_t buttons) { data.time_stamp = 0; data.change = change; data.kind = PointerData::DeviceKind::kTouch; @@ -26,7 +27,7 @@ void CreateSimulatedPointerData(PointerData& data, // NOLINT data.physical_y = dy; data.physical_delta_x = 0.0; data.physical_delta_y = 0.0; - data.buttons = 0; + data.buttons = buttons; data.obscured = 0; data.synthesized = 0; data.pressure = 0.0; @@ -53,7 +54,8 @@ void CreateSimulatedMousePointerData(PointerData& data, // NOLINT double dx, double dy, double scroll_delta_x, - double scroll_delta_y) { + double scroll_delta_y, + int64_t buttons) { data.time_stamp = 0; data.change = change; data.kind = PointerData::DeviceKind::kMouse; @@ -64,7 +66,7 @@ void CreateSimulatedMousePointerData(PointerData& data, // NOLINT data.physical_y = dy; data.physical_delta_x = 0.0; data.physical_delta_y = 0.0; - data.buttons = 0; + data.buttons = buttons; data.obscured = 0; data.synthesized = 0; data.pressure = 0.0; @@ -103,17 +105,18 @@ TEST(PointerDataPacketConverterTest, CanConvetPointerDataPacket) { PointerDataPacketConverter converter; auto packet = std::make_unique(6); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0, 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kHover, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kHover, 0, 3.0, 0.0, 0); packet->SetPointerData(1, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0, 1); packet->SetPointerData(2, data); - CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 4.0, 1); packet->SetPointerData(3, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0, 0); packet->SetPointerData(4, data); - CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0, + 0); packet->SetPointerData(5, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -151,13 +154,14 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) { PointerDataPacketConverter converter; auto packet = std::make_unique(4); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0, 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0, 1); packet->SetPointerData(1, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0, 0); packet->SetPointerData(2, data); - CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0, + 0); packet->SetPointerData(3, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -173,10 +177,12 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) { ASSERT_EQ(result[1].synthesized, 1); ASSERT_EQ(result[1].physical_delta_x, 3.0); ASSERT_EQ(result[1].physical_delta_y, 0.0); + ASSERT_EQ(result[1].buttons, 0); ASSERT_EQ(result[2].change, PointerData::Change::kDown); ASSERT_EQ(result[2].pointer_identifier, 1); ASSERT_EQ(result[2].synthesized, 0); + ASSERT_EQ(result[2].buttons, 1); // A move should be synthesized. ASSERT_EQ(result[3].change, PointerData::Change::kMove); @@ -184,10 +190,12 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) { ASSERT_EQ(result[3].synthesized, 1); ASSERT_EQ(result[3].physical_delta_x, 0.0); ASSERT_EQ(result[3].physical_delta_y, 4.0); + ASSERT_EQ(result[3].buttons, 1); ASSERT_EQ(result[4].change, PointerData::Change::kUp); ASSERT_EQ(result[4].pointer_identifier, 1); ASSERT_EQ(result[4].synthesized, 0); + ASSERT_EQ(result[4].buttons, 0); ASSERT_EQ(result[5].change, PointerData::Change::kRemove); ASSERT_EQ(result[5].synthesized, 0); @@ -197,19 +205,20 @@ TEST(PointerDataPacketConverterTest, CanUpdatePointerIdentifier) { PointerDataPacketConverter converter; auto packet = std::make_unique(7); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0, 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(1, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0, 0); packet->SetPointerData(2, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(3, data); - CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0, 1); packet->SetPointerData(4, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0, 0); packet->SetPointerData(5, data); - CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0, + 0); packet->SetPointerData(6, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -251,14 +260,14 @@ TEST(PointerDataPacketConverterTest, AlwaysForwardMoveEvent) { PointerDataPacketConverter converter; auto packet = std::make_unique(4); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0, 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(1, data); // Creates a move event without a location change. - CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 0.0, 0.0, 1); packet->SetPointerData(2, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0, 0); packet->SetPointerData(3, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -288,29 +297,31 @@ TEST(PointerDataPacketConverterTest, CanWorkWithDifferentDevices) { PointerDataPacketConverter converter; auto packet = std::make_unique(12); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0, 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(1, data); - CreateSimulatedPointerData(data, PointerData::Change::kAdd, 1, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kAdd, 1, 0.0, 0.0, 0); packet->SetPointerData(2, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 0.0, 0.0, 1); packet->SetPointerData(3, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0, 0); packet->SetPointerData(4, data); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(5, data); - CreateSimulatedPointerData(data, PointerData::Change::kMove, 1, 0.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kMove, 1, 0.0, 4.0, 1); packet->SetPointerData(6, data); - CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0, 1); packet->SetPointerData(7, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 1, 0.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 1, 0.0, 4.0, 0); packet->SetPointerData(8, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0, 0); packet->SetPointerData(9, data); - CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0, + 0); packet->SetPointerData(10, data); - CreateSimulatedPointerData(data, PointerData::Change::kRemove, 1, 0.0, 4.0); + CreateSimulatedPointerData(data, PointerData::Change::kRemove, 1, 0.0, 4.0, + 0); packet->SetPointerData(11, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -383,9 +394,10 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) { PointerDataPacketConverter converter; auto packet = std::make_unique(2); PointerData data; - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 330.0, 450.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 330.0, 450.0, + 1); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0, 0); packet->SetPointerData(1, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -398,11 +410,13 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) { ASSERT_EQ(result[0].physical_x, 330.0); ASSERT_EQ(result[0].physical_y, 450.0); ASSERT_EQ(result[0].synthesized, 1); + ASSERT_EQ(result[0].buttons, 0); ASSERT_EQ(result[1].change, PointerData::Change::kDown); ASSERT_EQ(result[1].physical_x, 330.0); ASSERT_EQ(result[1].physical_y, 450.0); ASSERT_EQ(result[1].synthesized, 0); + ASSERT_EQ(result[1].buttons, 1); // A move should be synthesized. ASSERT_EQ(result[2].change, PointerData::Change::kMove); @@ -411,11 +425,13 @@ TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) { ASSERT_EQ(result[2].physical_x, 0.0); ASSERT_EQ(result[2].physical_y, 0.0); ASSERT_EQ(result[2].synthesized, 1); + ASSERT_EQ(result[2].buttons, 1); ASSERT_EQ(result[3].change, PointerData::Change::kUp); ASSERT_EQ(result[3].physical_x, 0.0); ASSERT_EQ(result[3].physical_y, 0.0); ASSERT_EQ(result[3].synthesized, 0); + ASSERT_EQ(result[3].buttons, 0); } TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) { @@ -425,23 +441,27 @@ TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) { std::vector result; // First finger down. auto packet = std::make_unique(1); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0, 1); packet->SetPointerData(0, data); auto converted_packet = converter.Convert(std::move(packet)); UnpackPointerPacket(result, std::move(converted_packet)); // Second finger down. packet = std::make_unique(1); - CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 33.0, 44.0); + CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 33.0, 44.0, + 1); packet->SetPointerData(0, data); converted_packet = converter.Convert(std::move(packet)); UnpackPointerPacket(result, std::move(converted_packet)); // Triggers three cancels. packet = std::make_unique(3); - CreateSimulatedPointerData(data, PointerData::Change::kCancel, 1, 33.0, 44.0); + CreateSimulatedPointerData(data, PointerData::Change::kCancel, 1, 33.0, 44.0, + 0); packet->SetPointerData(0, data); - CreateSimulatedPointerData(data, PointerData::Change::kCancel, 0, 0.0, 0.0); + CreateSimulatedPointerData(data, PointerData::Change::kCancel, 0, 0.0, 0.0, + 0); packet->SetPointerData(1, data); - CreateSimulatedPointerData(data, PointerData::Change::kCancel, 2, 40.0, 50.0); + CreateSimulatedPointerData(data, PointerData::Change::kCancel, 2, 40.0, 50.0, + 0); packet->SetPointerData(2, data); converted_packet = converter.Convert(std::move(packet)); UnpackPointerPacket(result, std::move(converted_packet)); @@ -452,24 +472,28 @@ TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) { ASSERT_EQ(result[0].physical_x, 0.0); ASSERT_EQ(result[0].physical_y, 0.0); ASSERT_EQ(result[0].synthesized, 1); + ASSERT_EQ(result[0].buttons, 0); ASSERT_EQ(result[1].change, PointerData::Change::kDown); ASSERT_EQ(result[1].device, 0); ASSERT_EQ(result[1].physical_x, 0.0); ASSERT_EQ(result[1].physical_y, 0.0); ASSERT_EQ(result[1].synthesized, 0); + ASSERT_EQ(result[1].buttons, 1); ASSERT_EQ(result[2].change, PointerData::Change::kAdd); ASSERT_EQ(result[2].device, 1); ASSERT_EQ(result[2].physical_x, 33.0); ASSERT_EQ(result[2].physical_y, 44.0); ASSERT_EQ(result[2].synthesized, 1); + ASSERT_EQ(result[2].buttons, 0); ASSERT_EQ(result[3].change, PointerData::Change::kDown); ASSERT_EQ(result[3].device, 1); ASSERT_EQ(result[3].physical_x, 33.0); ASSERT_EQ(result[3].physical_y, 44.0); ASSERT_EQ(result[3].synthesized, 0); + ASSERT_EQ(result[3].buttons, 1); ASSERT_EQ(result[4].change, PointerData::Change::kCancel); ASSERT_EQ(result[4].device, 1); @@ -491,23 +515,23 @@ TEST(PointerDataPacketConverterTest, CanConvetScroll) { PointerData data; CreateSimulatedMousePointerData(data, PointerData::Change::kAdd, PointerData::SignalKind::kNone, 0, 0.0, 0.0, - 0.0, 0.0); + 0.0, 0.0, 0); packet->SetPointerData(0, data); CreateSimulatedMousePointerData(data, PointerData::Change::kAdd, PointerData::SignalKind::kNone, 1, 0.0, 0.0, - 0.0, 0.0); + 0.0, 0.0, 0); packet->SetPointerData(1, data); CreateSimulatedMousePointerData(data, PointerData::Change::kDown, PointerData::SignalKind::kNone, 1, 0.0, 0.0, - 0.0, 0.0); + 0.0, 0.0, 1); packet->SetPointerData(2, data); CreateSimulatedMousePointerData(data, PointerData::Change::kHover, PointerData::SignalKind::kScroll, 0, 34.0, - 34.0, 30.0, 0.0); + 34.0, 30.0, 0.0, 0); packet->SetPointerData(3, data); CreateSimulatedMousePointerData(data, PointerData::Change::kHover, PointerData::SignalKind::kScroll, 1, 49.0, - 49.0, 50.0, 0.0); + 49.0, 50.0, 0.0, 0); packet->SetPointerData(4, data); auto converted_packet = converter.Convert(std::move(packet)); @@ -536,7 +560,7 @@ TEST(PointerDataPacketConverterTest, CanConvetScroll) { ASSERT_EQ(result[2].physical_y, 0.0); ASSERT_EQ(result[2].synthesized, 0); - // Converter will synthesize a hover to position. + // Converter will synthesize a hover to position for device 0. ASSERT_EQ(result[3].change, PointerData::Change::kHover); ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone); ASSERT_EQ(result[3].device, 0); @@ -544,6 +568,7 @@ TEST(PointerDataPacketConverterTest, CanConvetScroll) { ASSERT_EQ(result[3].physical_y, 34.0); ASSERT_EQ(result[3].physical_delta_x, 34.0); ASSERT_EQ(result[3].physical_delta_y, 34.0); + ASSERT_EQ(result[3].buttons, 0); ASSERT_EQ(result[3].synthesized, 1); ASSERT_EQ(result[4].change, PointerData::Change::kHover); @@ -554,7 +579,7 @@ TEST(PointerDataPacketConverterTest, CanConvetScroll) { ASSERT_EQ(result[4].scroll_delta_x, 30.0); ASSERT_EQ(result[4].scroll_delta_y, 0.0); - // Converter will synthesize a move to position. + // Converter will synthesize a move to position for device 1. ASSERT_EQ(result[5].change, PointerData::Change::kMove); ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone); ASSERT_EQ(result[5].device, 1); @@ -562,6 +587,7 @@ TEST(PointerDataPacketConverterTest, CanConvetScroll) { ASSERT_EQ(result[5].physical_y, 49.0); ASSERT_EQ(result[5].physical_delta_x, 49.0); ASSERT_EQ(result[5].physical_delta_y, 49.0); + ASSERT_EQ(result[5].buttons, 1); ASSERT_EQ(result[5].synthesized, 1); ASSERT_EQ(result[6].change, PointerData::Change::kHover); -- GitLab