Skip to content

Commit cb39ab1

Browse files
committed
[GTK4] Add support for scroll events
https://bugs.webkit.org/show_bug.cgi?id=211045 Reviewed by Adrian Perez de Castro. Use an event controller to connect to scroll signal and get the GdkEvent. * UIProcess/API/gtk/WebKitWebViewBase.cpp: (webkitWebViewBaseHandleWheelEvent): (webkitWebViewBaseScroll): (webkitWebViewBaseConstructed): Canonical link: https://commits.webkit.org/224012@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@260817 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 9a98e12 commit cb39ab1

6 files changed

Lines changed: 74 additions & 26 deletions

File tree

Source/WebKit/ChangeLog

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
2020-04-26 Carlos Garcia Campos <cgarcia@igalia.com>
2+
3+
[GTK4] Add support for scroll events
4+
https://bugs.webkit.org/show_bug.cgi?id=211045
5+
6+
Reviewed by Adrian Perez de Castro.
7+
8+
Use an event controller to connect to scroll signal and get the GdkEvent.
9+
10+
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
11+
(webkitWebViewBaseHandleWheelEvent):
12+
(webkitWebViewBaseScroll):
13+
(webkitWebViewBaseConstructed):
14+
115
2020-04-28 Carlos Garcia Campos <cgarcia@igalia.com>
216

317
[GTK4][Wayland] Add support for rendering web view contents

Source/WebKit/Shared/NativeWebWheelEvent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class NativeWebWheelEvent : public WebWheelEvent {
6060
NativeWebWheelEvent(const NativeWebWheelEvent&);
6161
NativeWebWheelEvent(GdkEvent*);
6262
NativeWebWheelEvent(GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
63+
NativeWebWheelEvent(GdkEvent*, const WebCore::IntPoint&);
6364
#elif USE(LIBWPE)
6465
NativeWebWheelEvent(struct wpe_input_axis_event*, float deviceScaleFactor, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
6566
#elif PLATFORM(WIN)

Source/WebKit/Shared/gtk/NativeWebWheelEventGtk.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,14 @@ NativeWebWheelEvent::NativeWebWheelEvent(GdkEvent* event, WebWheelEvent::Phase p
4343
{
4444
}
4545

46+
NativeWebWheelEvent::NativeWebWheelEvent(GdkEvent* event, const WebCore::IntPoint& position)
47+
: WebWheelEvent(WebEventFactory::createWebWheelEvent(event, position, position, WebWheelEvent::Phase::PhaseChanged, WebWheelEvent::Phase::PhaseNone))
48+
, m_nativeEvent(gdk_event_copy(event))
49+
{
50+
}
51+
4652
NativeWebWheelEvent::NativeWebWheelEvent(const NativeWebWheelEvent& event)
47-
: WebWheelEvent(WebEventFactory::createWebWheelEvent(event.nativeEvent(), event.phase(), event.momentumPhase()))
53+
: WebWheelEvent(WebEventFactory::createWebWheelEvent(event.nativeEvent(), event.position(), event.globalPosition(), event.phase(), event.momentumPhase()))
4854
, m_nativeEvent(gdk_event_copy(event.nativeEvent()))
4955
{
5056
}

Source/WebKit/Shared/gtk/WebEventFactory.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <gdk/gdk.h>
3737
#include <gdk/gdkkeysyms.h>
3838
#include <wtf/ASCIICType.h>
39+
#include <wtf/MathExtras.h>
3940

4041
namespace WebKit {
4142

@@ -204,12 +205,17 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event)
204205

205206
WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, WebWheelEvent::Phase phase, WebWheelEvent::Phase momentumPhase)
206207
{
207-
FloatSize wheelTicks = FloatSize(0, 0);
208208
double x, y;
209209
gdk_event_get_coords(event, &x, &y);
210210
double xRoot, yRoot;
211211
gdk_event_get_root_coords(event, &xRoot, &yRoot);
212212

213+
return createWebWheelEvent(event, { clampToInteger(x), clampToInteger(y) }, { clampToInteger(xRoot), clampToInteger(yRoot) }, phase, momentumPhase);
214+
}
215+
216+
WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, const IntPoint& position, const IntPoint& globalPosition, WebWheelEvent::Phase phase, WebWheelEvent::Phase momentumPhase)
217+
{
218+
Optional<FloatSize> wheelTicks;
213219
GdkScrollDirection direction;
214220
if (!gdk_event_get_scroll_direction(event, &direction)) {
215221
direction = GDK_SCROLL_SMOOTH;
@@ -218,7 +224,7 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, WebWhe
218224
wheelTicks = FloatSize(-deltaX, -deltaY);
219225
}
220226

221-
if (wheelTicks.isZero()) {
227+
if (!wheelTicks) {
222228
switch (direction) {
223229
case GDK_SCROLL_UP:
224230
wheelTicks = FloatSize(0, 1);
@@ -233,22 +239,21 @@ WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, WebWhe
233239
wheelTicks = FloatSize(-1, 0);
234240
break;
235241
case GDK_SCROLL_SMOOTH:
242+
wheelTicks = FloatSize(0, 0);
236243
break;
237-
default:
238-
ASSERT_NOT_REACHED();
239244
}
240245
}
241246

242247
// FIXME: [GTK] Add a setting to change the pixels per line used for scrolling
243248
// https://bugs.webkit.org/show_bug.cgi?id=54826
244249
float step = static_cast<float>(Scrollbar::pixelsPerLineStep());
245-
FloatSize delta(wheelTicks.width() * step, wheelTicks.height() * step);
250+
FloatSize delta(wheelTicks->width() * step, wheelTicks->height() * step);
246251

247252
return WebWheelEvent(WebEvent::Wheel,
248-
IntPoint(x, y),
249-
IntPoint(xRoot, yRoot),
253+
position,
254+
globalPosition,
250255
delta,
251-
wheelTicks,
256+
wheelTicks.value(),
252257
phase,
253258
momentumPhase,
254259
WebWheelEvent::ScrollByPixelWheelEvent,

Source/WebKit/Shared/gtk/WebEventFactory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class WebEventFactory {
4141
static WebMouseEvent createWebMouseEvent(const GdkEvent*, int, Optional<WebCore::IntPoint>);
4242
static WebWheelEvent createWebWheelEvent(const GdkEvent*);
4343
static WebWheelEvent createWebWheelEvent(const GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
44+
static WebWheelEvent createWebWheelEvent(const GdkEvent*, const WebCore::IntPoint&, const WebCore::IntPoint&, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
4445
static WebKeyboardEvent createWebKeyboardEvent(const GdkEvent*, const String&, bool handledByInputMethod, Optional<Vector<WebCore::CompositionUnderline>>&&, Optional<EditingRange>&&, Vector<String>&& commands);
4546
#if ENABLE(TOUCH_EVENTS)
4647
static WebTouchEvent createWebTouchEvent(const GdkEvent*, Vector<WebPlatformTouchPoint>&&);

Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
#include <pal/system/SleepDisabler.h>
7070
#include <wtf/Compiler.h>
7171
#include <wtf/HashMap.h>
72+
#include <wtf/MathExtras.h>
7273
#include <wtf/glib/GRefPtr.h>
7374
#include <wtf/glib/RunLoopSourcePriority.h>
7475
#include <wtf/glib/WTFGType.h>
@@ -597,23 +598,6 @@ static void webkitWebViewBaseDispose(GObject* gobject)
597598
G_OBJECT_CLASS(webkit_web_view_base_parent_class)->dispose(gobject);
598599
}
599600

600-
static void webkitWebViewBaseConstructed(GObject* object)
601-
{
602-
G_OBJECT_CLASS(webkit_web_view_base_parent_class)->constructed(object);
603-
604-
GtkWidget* viewWidget = GTK_WIDGET(object);
605-
gtk_widget_set_can_focus(viewWidget, TRUE);
606-
#if !USE(GTK4)
607-
gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
608-
static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
609-
gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
610-
#endif
611-
612-
WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
613-
priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
614-
priv->dialog = nullptr;
615-
}
616-
617601
#if USE(GTK4)
618602
void webkitWebViewBaseSnapshot(GtkWidget* widget, GtkSnapshot* snapshot)
619603
{
@@ -1025,7 +1009,22 @@ static gboolean webkitWebViewBaseScrollEvent(GtkWidget* widget, GdkEventScroll*
10251009

10261010
return GDK_EVENT_STOP;
10271011
}
1012+
#endif
1013+
1014+
#if USE(GTK4)
1015+
static gboolean webkitWebViewBaseScroll(WebKitWebViewBase* webViewBase, double x, double y, GtkEventController* controller)
1016+
{
1017+
if (webViewBase->priv->dialog)
1018+
return GDK_EVENT_PROPAGATE;
1019+
1020+
// FIXME: invert axis in case of SHIFT.
1021+
webViewBase->priv->pageProxy->handleWheelEvent(NativeWebWheelEvent(gtk_event_controller_get_current_event(controller), { clampToInteger(x), clampToInteger(y) }));
1022+
1023+
return GDK_EVENT_STOP;
1024+
}
1025+
#endif
10281026

1027+
#if !USE(GTK4)
10291028
static gboolean webkitWebViewBasePopupMenu(GtkWidget* widget)
10301029
{
10311030
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
@@ -1503,6 +1502,28 @@ static void webkitWebViewBaseDestroy(GtkWidget* widget)
15031502
GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->destroy(widget);
15041503
}
15051504

1505+
static void webkitWebViewBaseConstructed(GObject* object)
1506+
{
1507+
G_OBJECT_CLASS(webkit_web_view_base_parent_class)->constructed(object);
1508+
1509+
GtkWidget* viewWidget = GTK_WIDGET(object);
1510+
gtk_widget_set_can_focus(viewWidget, TRUE);
1511+
#if !USE(GTK4)
1512+
gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
1513+
static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
1514+
gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
1515+
#endif
1516+
1517+
WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
1518+
priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
1519+
1520+
#if USE(GTK4)
1521+
auto* controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
1522+
g_signal_connect_object(controller, "scroll", G_CALLBACK(webkitWebViewBaseScroll), viewWidget, G_CONNECT_SWAPPED);
1523+
gtk_widget_add_controller(viewWidget, controller);
1524+
#endif
1525+
}
1526+
15061527
static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebViewBaseClass)
15071528
{
15081529
GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(webkitWebViewBaseClass);

0 commit comments

Comments
 (0)