Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions lib/ui/window/pointer_data_packet_converter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,15 @@ 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 {
state = iter->second;
}

FML_DCHECK(!state.isDown);
state.buttons = pointer_data.buttons;
if (LocationNeedsUpdate(pointer_data, state)) {
UpdateDeltaAndState(pointer_data, state);
converted_pointers.push_back(pointer_data);
Expand All @@ -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 {
Expand All @@ -152,13 +155,15 @@ 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);
}

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;
Expand All @@ -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;
}
Expand All @@ -188,13 +194,15 @@ 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);
converted_pointers.push_back(synthesized_move_event);
}

state.isDown = false;
state.buttons = pointer_data.buttons;
states_[pointer_data.device] = state;
converted_pointers.push_back(pointer_data);
break;
Expand All @@ -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);
Expand All @@ -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);
Expand Down
14 changes: 11 additions & 3 deletions lib/ui/window/pointer_data_packet_converter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

//------------------------------------------------------------------------------
Expand Down
Loading