1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 14:07:46 +00:00

WebContent: Coalesce multiple sequential MouseWheel events

Same as a58d84407f but for MouseWheel :)
This commit is contained in:
Aliaksandr Kalenik 2023-08-04 20:52:43 +02:00 committed by Andreas Kling
parent 6631314874
commit b549f2d1d9

View file

@ -210,6 +210,9 @@ void ConnectionFromClient::process_next_input_event()
event.button, event.buttons, event.modifiers)); event.button, event.buttons, event.modifiers));
break; break;
case QueuedMouseEvent::Type::MouseWheel: case QueuedMouseEvent::Type::MouseWheel:
for (size_t i = 0; i < event.coalesced_event_count; ++i) {
report_finished_handling_input_event(false);
}
report_finished_handling_input_event(page().handle_mousewheel( report_finished_handling_input_event(page().handle_mousewheel(
event.position.to_type<Web::DevicePixels>(), event.position.to_type<Web::DevicePixels>(),
event.button, event.buttons, event.modifiers, event.wheel_delta_x, event.wheel_delta_y)); event.button, event.buttons, event.modifiers, event.wheel_delta_x, event.wheel_delta_y));
@ -279,16 +282,29 @@ void ConnectionFromClient::mouse_up(Gfx::IntPoint position, unsigned int button,
void ConnectionFromClient::mouse_wheel(Gfx::IntPoint position, unsigned int button, unsigned int buttons, unsigned int modifiers, i32 wheel_delta_x, i32 wheel_delta_y) void ConnectionFromClient::mouse_wheel(Gfx::IntPoint position, unsigned int button, unsigned int buttons, unsigned int modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
enqueue_input_event( auto event = QueuedMouseEvent {
QueuedMouseEvent { .type = QueuedMouseEvent::Type::MouseWheel,
.type = QueuedMouseEvent::Type::MouseWheel, .position = position,
.position = position, .button = button,
.button = button, .buttons = buttons,
.buttons = buttons, .modifiers = modifiers,
.modifiers = modifiers, .wheel_delta_x = wheel_delta_x,
.wheel_delta_x = wheel_delta_x, .wheel_delta_y = wheel_delta_y,
.wheel_delta_y = wheel_delta_y, };
});
// OPTIMIZATION: Coalesce with previous unprocessed event if the previous event is also a MouseWheel event.
if (!m_input_event_queue.is_empty()
&& m_input_event_queue.tail().has<QueuedMouseEvent>()
&& m_input_event_queue.tail().get<QueuedMouseEvent>().type == QueuedMouseEvent::Type::MouseWheel) {
auto const& last_event = m_input_event_queue.tail().get<QueuedMouseEvent>();
event.coalesced_event_count = last_event.coalesced_event_count + 1;
event.wheel_delta_x += last_event.wheel_delta_x;
event.wheel_delta_y += last_event.wheel_delta_y;
m_input_event_queue.tail() = event;
return;
}
enqueue_input_event(move(event));
} }
void ConnectionFromClient::doubleclick(Gfx::IntPoint position, unsigned int button, unsigned int buttons, unsigned int modifiers) void ConnectionFromClient::doubleclick(Gfx::IntPoint position, unsigned int button, unsigned int buttons, unsigned int modifiers)