Title: [260817] trunk/Source/WebKit
Revision
260817
Author
carlo...@webkit.org
Date
2020-04-28 04:50:39 -0700 (Tue, 28 Apr 2020)

Log Message

[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):

Modified Paths

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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to