Diff
Modified: trunk/Source/WebKit/ChangeLog (260816 => 260817)
--- trunk/Source/WebKit/ChangeLog 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/ChangeLog 2020-04-28 11:50:39 UTC (rev 260817)
@@ -1,3 +1,17 @@
+2020-04-26 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [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):
+
2020-04-28 Carlos Garcia Campos <cgar...@igalia.com>
[GTK4][Wayland] Add support for rendering web view contents
Modified: trunk/Source/WebKit/Shared/NativeWebWheelEvent.h (260816 => 260817)
--- trunk/Source/WebKit/Shared/NativeWebWheelEvent.h 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/Shared/NativeWebWheelEvent.h 2020-04-28 11:50:39 UTC (rev 260817)
@@ -60,6 +60,7 @@
NativeWebWheelEvent(const NativeWebWheelEvent&);
NativeWebWheelEvent(GdkEvent*);
NativeWebWheelEvent(GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
+ NativeWebWheelEvent(GdkEvent*, const WebCore::IntPoint&);
#elif USE(LIBWPE)
NativeWebWheelEvent(struct wpe_input_axis_event*, float deviceScaleFactor, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
#elif PLATFORM(WIN)
Modified: trunk/Source/WebKit/Shared/gtk/NativeWebWheelEventGtk.cpp (260816 => 260817)
--- trunk/Source/WebKit/Shared/gtk/NativeWebWheelEventGtk.cpp 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/Shared/gtk/NativeWebWheelEventGtk.cpp 2020-04-28 11:50:39 UTC (rev 260817)
@@ -43,8 +43,14 @@
{
}
+NativeWebWheelEvent::NativeWebWheelEvent(GdkEvent* event, const WebCore::IntPoint& position)
+ : WebWheelEvent(WebEventFactory::createWebWheelEvent(event, position, position, WebWheelEvent::Phase::PhaseChanged, WebWheelEvent::Phase::PhaseNone))
+ , m_nativeEvent(gdk_event_copy(event))
+{
+}
+
NativeWebWheelEvent::NativeWebWheelEvent(const NativeWebWheelEvent& event)
- : WebWheelEvent(WebEventFactory::createWebWheelEvent(event.nativeEvent(), event.phase(), event.momentumPhase()))
+ : WebWheelEvent(WebEventFactory::createWebWheelEvent(event.nativeEvent(), event.position(), event.globalPosition(), event.phase(), event.momentumPhase()))
, m_nativeEvent(gdk_event_copy(event.nativeEvent()))
{
}
Modified: trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp (260816 => 260817)
--- trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp 2020-04-28 11:50:39 UTC (rev 260817)
@@ -36,6 +36,7 @@
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <wtf/ASCIICType.h>
+#include <wtf/MathExtras.h>
namespace WebKit {
@@ -204,12 +205,17 @@
WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, WebWheelEvent::Phase phase, WebWheelEvent::Phase momentumPhase)
{
- FloatSize wheelTicks = FloatSize(0, 0);
double x, y;
gdk_event_get_coords(event, &x, &y);
double xRoot, yRoot;
gdk_event_get_root_coords(event, &xRoot, &yRoot);
+ return createWebWheelEvent(event, { clampToInteger(x), clampToInteger(y) }, { clampToInteger(xRoot), clampToInteger(yRoot) }, phase, momentumPhase);
+}
+
+WebWheelEvent WebEventFactory::createWebWheelEvent(const GdkEvent* event, const IntPoint& position, const IntPoint& globalPosition, WebWheelEvent::Phase phase, WebWheelEvent::Phase momentumPhase)
+{
+ Optional<FloatSize> wheelTicks;
GdkScrollDirection direction;
if (!gdk_event_get_scroll_direction(event, &direction)) {
direction = GDK_SCROLL_SMOOTH;
@@ -218,7 +224,7 @@
wheelTicks = FloatSize(-deltaX, -deltaY);
}
- if (wheelTicks.isZero()) {
+ if (!wheelTicks) {
switch (direction) {
case GDK_SCROLL_UP:
wheelTicks = FloatSize(0, 1);
@@ -233,9 +239,8 @@
wheelTicks = FloatSize(-1, 0);
break;
case GDK_SCROLL_SMOOTH:
+ wheelTicks = FloatSize(0, 0);
break;
- default:
- ASSERT_NOT_REACHED();
}
}
@@ -242,13 +247,13 @@
// FIXME: [GTK] Add a setting to change the pixels per line used for scrolling
// https://bugs.webkit.org/show_bug.cgi?id=54826
float step = static_cast<float>(Scrollbar::pixelsPerLineStep());
- FloatSize delta(wheelTicks.width() * step, wheelTicks.height() * step);
+ FloatSize delta(wheelTicks->width() * step, wheelTicks->height() * step);
return WebWheelEvent(WebEvent::Wheel,
- IntPoint(x, y),
- IntPoint(xRoot, yRoot),
+ position,
+ globalPosition,
delta,
- wheelTicks,
+ wheelTicks.value(),
phase,
momentumPhase,
WebWheelEvent::ScrollByPixelWheelEvent,
Modified: trunk/Source/WebKit/Shared/gtk/WebEventFactory.h (260816 => 260817)
--- trunk/Source/WebKit/Shared/gtk/WebEventFactory.h 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/Shared/gtk/WebEventFactory.h 2020-04-28 11:50:39 UTC (rev 260817)
@@ -41,6 +41,7 @@
static WebMouseEvent createWebMouseEvent(const GdkEvent*, int, Optional<WebCore::IntPoint>);
static WebWheelEvent createWebWheelEvent(const GdkEvent*);
static WebWheelEvent createWebWheelEvent(const GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
+ static WebWheelEvent createWebWheelEvent(const GdkEvent*, const WebCore::IntPoint&, const WebCore::IntPoint&, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
static WebKeyboardEvent createWebKeyboardEvent(const GdkEvent*, const String&, bool handledByInputMethod, Optional<Vector<WebCore::CompositionUnderline>>&&, Optional<EditingRange>&&, Vector<String>&& commands);
#if ENABLE(TOUCH_EVENTS)
static WebTouchEvent createWebTouchEvent(const GdkEvent*, Vector<WebPlatformTouchPoint>&&);
Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (260816 => 260817)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-04-28 11:28:36 UTC (rev 260816)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-04-28 11:50:39 UTC (rev 260817)
@@ -69,6 +69,7 @@
#include <pal/system/SleepDisabler.h>
#include <wtf/Compiler.h>
#include <wtf/HashMap.h>
+#include <wtf/MathExtras.h>
#include <wtf/glib/GRefPtr.h>
#include <wtf/glib/RunLoopSourcePriority.h>
#include <wtf/glib/WTFGType.h>
@@ -597,23 +598,6 @@
G_OBJECT_CLASS(webkit_web_view_base_parent_class)->dispose(gobject);
}
-static void webkitWebViewBaseConstructed(GObject* object)
-{
- G_OBJECT_CLASS(webkit_web_view_base_parent_class)->constructed(object);
-
- GtkWidget* viewWidget = GTK_WIDGET(object);
- gtk_widget_set_can_focus(viewWidget, TRUE);
-#if !USE(GTK4)
- gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
- static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
- gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
-#endif
-
- WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
- priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
- priv->dialog = nullptr;
-}
-
#if USE(GTK4)
void webkitWebViewBaseSnapshot(GtkWidget* widget, GtkSnapshot* snapshot)
{
@@ -1025,7 +1009,22 @@
return GDK_EVENT_STOP;
}
+#endif
+#if USE(GTK4)
+static gboolean webkitWebViewBaseScroll(WebKitWebViewBase* webViewBase, double x, double y, GtkEventController* controller)
+{
+ if (webViewBase->priv->dialog)
+ return GDK_EVENT_PROPAGATE;
+
+ // FIXME: invert axis in case of SHIFT.
+ webViewBase->priv->pageProxy->handleWheelEvent(NativeWebWheelEvent(gtk_event_controller_get_current_event(controller), { clampToInteger(x), clampToInteger(y) }));
+
+ return GDK_EVENT_STOP;
+}
+#endif
+
+#if !USE(GTK4)
static gboolean webkitWebViewBasePopupMenu(GtkWidget* widget)
{
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
@@ -1503,6 +1502,28 @@
GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->destroy(widget);
}
+static void webkitWebViewBaseConstructed(GObject* object)
+{
+ G_OBJECT_CLASS(webkit_web_view_base_parent_class)->constructed(object);
+
+ GtkWidget* viewWidget = GTK_WIDGET(object);
+ gtk_widget_set_can_focus(viewWidget, TRUE);
+#if !USE(GTK4)
+ gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), nullptr, 0,
+ static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
+ gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::singleton().targetList());
+#endif
+
+ WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
+ priv->pageClient = makeUnique<PageClientImpl>(viewWidget);
+
+#if USE(GTK4)
+ auto* controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
+ g_signal_connect_object(controller, "scroll", G_CALLBACK(webkitWebViewBaseScroll), viewWidget, G_CONNECT_SWAPPED);
+ gtk_widget_add_controller(viewWidget, controller);
+#endif
+}
+
static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebViewBaseClass)
{
GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(webkitWebViewBaseClass);