Changeset 260817 in webkit


Ignore:
Timestamp:
Apr 28, 2020 4:50:39 AM (4 years ago)
Author:
Carlos Garcia Campos
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):

Location:
trunk/Source/WebKit
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r260816 r260817  
     12020-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
    1152020-04-28  Carlos Garcia Campos  <cgarcia@igalia.com>
    216
  • trunk/Source/WebKit/Shared/NativeWebWheelEvent.h

    r260752 r260817  
    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);
  • trunk/Source/WebKit/Shared/gtk/NativeWebWheelEventGtk.cpp

    r260752 r260817  
    4444}
    4545
     46NativeWebWheelEvent::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
    4652NativeWebWheelEvent::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{
  • trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp

    r260752 r260817  
    3737#include <gdk/gdkkeysyms.h>
    3838#include <wtf/ASCIICType.h>
     39#include <wtf/MathExtras.h>
    3940
    4041namespace WebKit {
     
    205206WebWheelEvent 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);
     
    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
     216WebWheelEvent 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)) {
     
    219225    }
    220226
    221     if (wheelTicks.isZero()) {
     227    if (!wheelTicks) {
    222228        switch (direction) {
    223229        case GDK_SCROLL_UP:
     
    234240            break;
    235241        case GDK_SCROLL_SMOOTH:
    236             break;
    237         default:
    238             ASSERT_NOT_REACHED();
     242            wheelTicks = FloatSize(0, 0);
     243            break;
    239244        }
    240245    }
     
    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,
  • trunk/Source/WebKit/Shared/gtk/WebEventFactory.h

    r260752 r260817  
    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)
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r260816 r260817  
    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>
     
    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)
    618602void webkitWebViewBaseSnapshot(GtkWidget* widget, GtkSnapshot* snapshot)
     
    10261010    return GDK_EVENT_STOP;
    10271011}
    1028 
     1012#endif
     1013
     1014#if USE(GTK4)
     1015static 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
     1026
     1027#if !USE(GTK4)
    10291028static gboolean webkitWebViewBasePopupMenu(GtkWidget* widget)
    10301029{
     
    15041503}
    15051504
     1505static 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
    15061527static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebViewBaseClass)
    15071528{
Note: See TracChangeset for help on using the changeset viewer.