Skip to content

Commit f0af1da

Browse files
committed
[WPEPlatform] Page scrolls at double speed when scrolling with two fingers
https://bugs.webkit.org/show_bug.cgi?id=308643 Reviewed by Carlos Garcia Campos. When scrolling begins with one finger and a second finger is placed on the screen and both fingers move together, the page scrolls at twice the expected speed. `WPEGestureDetector` only tracks the first touch sequence and ignores events from other sequences. However, `handleGesture()` did not check whether the event was actually processed and always proceeded to emit a scroll event based on the current gesture state. As a result, touch move events from the second finger triggered a second scroll event, doubling the scroll speed. Fixed by making `wpe_gesture_controller_handle_event()` return a boolean indicating whether the event was consumed. * Source/WebKit/UIProcess/API/wpe/WPEWebViewPlatform.cpp: (WKWPE::ViewPlatform::handleGesture): * Source/WebKit/WPEPlatform/wpe/WPEGestureController.cpp: (wpe_gesture_controller_handle_event): * Source/WebKit/WPEPlatform/wpe/WPEGestureController.h: * Source/WebKit/WPEPlatform/wpe/WPEGestureControllerImpl.cpp: (wpeHandleEvent): * Source/WebKit/WPEPlatform/wpe/WPEGestureDetector.cpp: (WPE::GestureDetector::handleEvent): * Source/WebKit/WPEPlatform/wpe/WPEGestureDetector.h: Canonical link: https://commits.webkit.org/308271@main
1 parent 09bf7af commit f0af1da

File tree

6 files changed

+22
-12
lines changed

6 files changed

+22
-12
lines changed

‎Source/WebKit/UIProcess/API/wpe/WPEWebViewPlatform.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,8 @@ void ViewPlatform::handleGesture(WPEEvent* event)
430430
if (!gestureController)
431431
return;
432432

433-
wpe_gesture_controller_handle_event(gestureController, event);
433+
if (!wpe_gesture_controller_handle_event(gestureController, event))
434+
return;
434435

435436
if (wpe_event_get_event_type(event) == WPE_EVENT_TOUCH_DOWN)
436437
return;

‎Source/WebKit/WPEPlatform/wpe/WPEGestureController.cpp‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,17 @@ static void wpe_gesture_controller_default_init(WPEGestureControllerInterface*)
4949
* @event: a #WPEEvent
5050
*
5151
* Get the gesture detected by @controller if any was detected during processing of @event.
52+
*
53+
* Returns: %TRUE if @event was handled by @controller and gesture information is updated,
54+
* or %FALSE otherwise.
5255
*/
53-
void wpe_gesture_controller_handle_event(WPEGestureController* controller, WPEEvent* event)
56+
gboolean wpe_gesture_controller_handle_event(WPEGestureController* controller, WPEEvent* event)
5457
{
55-
g_return_if_fail(controller);
56-
g_return_if_fail(event);
58+
g_return_val_if_fail(controller, FALSE);
59+
g_return_val_if_fail(event, FALSE);
5760

5861
auto* controllerInterface = WPE_GESTURE_CONTROLLER_GET_IFACE(controller);
59-
controllerInterface->handle_event(controller, event);
62+
return controllerInterface->handle_event(controller, event);
6063
}
6164

6265
/**

‎Source/WebKit/WPEPlatform/wpe/WPEGestureController.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct _WPEGestureControllerInterface
5757
{
5858
GTypeInterface parent_interface;
5959

60-
void (* handle_event) (WPEGestureController *controller,
60+
gboolean (* handle_event) (WPEGestureController *controller,
6161
WPEEvent *event );
6262
void (* cancel) (WPEGestureController *controller);
6363
WPEGesture (* get_gesture) (WPEGestureController *controller);
@@ -70,7 +70,7 @@ struct _WPEGestureControllerInterface
7070
gboolean (* is_drag_begin) (WPEGestureController *controller);
7171
};
7272

73-
WPE_API void wpe_gesture_controller_handle_event (WPEGestureController *controller,
73+
WPE_API gboolean wpe_gesture_controller_handle_event (WPEGestureController *controller,
7474
WPEEvent *event);
7575
WPE_API void wpe_gesture_controller_cancel (WPEGestureController *controller);
7676
WPE_API WPEGesture wpe_gesture_controller_get_gesture (WPEGestureController *controller);

‎Source/WebKit/WPEPlatform/wpe/WPEGestureControllerImpl.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ WEBKIT_DEFINE_FINAL_TYPE_WITH_CODE(
3939
WPEGestureControllerImpl, wpe_gesture_controller_impl, G_TYPE_OBJECT, GObject,
4040
G_IMPLEMENT_INTERFACE(WPE_TYPE_GESTURE_CONTROLLER, wpe_gesture_controller_interface_init))
4141

42-
static void wpeHandleEvent(WPEGestureController* controller, WPEEvent* event)
42+
static gboolean wpeHandleEvent(WPEGestureController* controller, WPEEvent* event)
4343
{
44-
WPE_GESTURE_CONTROLLER_IMPL(controller)->priv->detector.handleEvent(event);
44+
return WPE_GESTURE_CONTROLLER_IMPL(controller)->priv->detector.handleEvent(event);
4545
}
4646

4747
static void wpeCancel(WPEGestureController* controller)

‎Source/WebKit/WPEPlatform/wpe/WPEGestureDetector.cpp‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232

3333
namespace WPE {
3434

35-
void GestureDetector::handleEvent(WPEEvent* event)
35+
bool GestureDetector::handleEvent(WPEEvent* event)
3636
{
3737
if (m_sequenceId && *m_sequenceId != wpe_event_touch_get_sequence_id(event))
38-
return;
38+
return false;
3939

4040
switch (wpe_event_get_event_type(event)) {
4141
case WPE_EVENT_TOUCH_DOWN:
@@ -50,6 +50,8 @@ void GestureDetector::handleEvent(WPEEvent* event)
5050
reset();
5151
break;
5252
case WPE_EVENT_TOUCH_MOVE:
53+
if (!m_sequenceId)
54+
return false;
5355
if (double x, y; wpe_event_get_position(event, &x, &y) && m_position) {
5456
auto* settings = wpe_display_get_settings(wpe_view_get_display(wpe_event_get_view(event)));
5557
auto dragActivationThresholdPx = wpe_settings_get_uint32(settings, WPE_SETTING_DRAG_THRESHOLD, nullptr);
@@ -67,6 +69,8 @@ void GestureDetector::handleEvent(WPEEvent* event)
6769
reset();
6870
break;
6971
case WPE_EVENT_TOUCH_UP:
72+
if (!m_sequenceId)
73+
return false;
7074
if (double x, y; wpe_event_get_position(event, &x, &y) && m_position) {
7175
if (m_gesture == WPE_GESTURE_DRAG)
7276
m_delta = { x - m_nextDeltaReferencePosition->x, y - m_nextDeltaReferencePosition->y };
@@ -77,6 +81,8 @@ void GestureDetector::handleEvent(WPEEvent* event)
7781
default:
7882
RELEASE_ASSERT_NOT_REACHED();
7983
}
84+
85+
return true;
8086
}
8187

8288
void GestureDetector::reset()

‎Source/WebKit/WPEPlatform/wpe/WPEGestureDetector.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace WPE {
3232

3333
class GestureDetector final {
3434
public:
35-
void handleEvent(WPEEvent*);
35+
bool handleEvent(WPEEvent*);
3636
WPEGesture gesture() const { return m_gesture; }
3737
void reset();
3838

0 commit comments

Comments
 (0)