未验证 提交 69d7e8eb 编写于 作者: C Chris Bracken 提交者: GitHub

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.
上级 b0c6686d
......@@ -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);
......
......@@ -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;
};
//------------------------------------------------------------------------------
......
......@@ -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<PointerDataPacket>(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<PointerDataPacket>(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<PointerDataPacket>(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<PointerDataPacket>(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<PointerDataPacket>(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<PointerDataPacket>(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<PointerData> result;
// First finger down.
auto packet = std::make_unique<PointerDataPacket>(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<PointerDataPacket>(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<PointerDataPacket>(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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册