Changeset 252126 in webkit


Ignore:
Timestamp:
Nov 6, 2019 12:06:32 AM (4 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Implement support for Pointer Lock API
https://bugs.webkit.org/show_bug.cgi?id=202956

Reviewed by Carlos Alberto Lopez Perez.

.:

Enable Pointer Lock for GTK port.

  • Source/cmake/OptionsGTK.cmake:

Source/WebKit:

Add platform specific implementation of Pointer Lock for the GTK port.

  • PlatformGTK.cmake: Generate code for pointer-constraints and relative-pointer Wayland protocols.
  • Shared/NativeWebMouseEvent.h: Add optional mouse movement delta.
  • Shared/gtk/NativeWebMouseEventGtk.cpp:

(WebKit::NativeWebMouseEvent::NativeWebMouseEvent): Pass movement delta to WebEventFactory::createWebMouseEvent().

  • Shared/gtk/WebEventFactory.cpp:

(WebKit::WebEventFactory::createWebMouseEvent): Initialize deltaX and deltaY for motion events using the received delta.

  • Shared/gtk/WebEventFactory.h: Add optional mouse movement delta.
  • SourcesGTK.txt: Add new files to compilation.
  • UIProcess/API/glib/WebKitUIClient.cpp: Add implementation for requestPointerLock and didLosePointerLock.
  • UIProcess/API/glib/WebKitWebView.cpp:

(webkitWebViewRequestPointerLock): Call webkitWebViewBaseRequestPointerLock().
(webkitWebViewDidLosePointerLock): Call webkitWebViewBaseDidLosePointerLock().

  • UIProcess/API/glib/WebKitWebViewPrivate.h:
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseDispose): Unlock the pointer and release the PointerLockManager.
(webkitWebViewBaseHandleMouseEvent): Initialize the mouse movement delta for motion events and save the current event.
(webkitWebViewBaseMotionNotifyEvent): Let PointerLockManager handle motion events while pointer is locked.
(webkitWebViewBaseRequestPointerLock): Create a PointerLockManager and request it to lock the pointer.
(webkitWebViewBaseDidLosePointerLock): Request PointerLockManager to unlock the pointer.

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
  • UIProcess/gtk/PointerLockManager.cpp: Added.

(WebKit::PointerLockManager::create):
(WebKit::PointerLockManager::PointerLockManager):
(WebKit::PointerLockManager::~PointerLockManager):
(WebKit::PointerLockManager::lock):
(WebKit::PointerLockManager::unlock):
(WebKit::PointerLockManager::handleMotion):

  • UIProcess/gtk/PointerLockManager.h: Added.

(WebKit::PointerLockManager::didReceiveMotionEvent):

  • UIProcess/gtk/PointerLockManagerWayland.cpp: Added.

(WebKit::PointerLockManagerWayland::PointerLockManagerWayland):
(WebKit::PointerLockManagerWayland::~PointerLockManagerWayland):
(WebKit::PointerLockManagerWayland::lock):
(WebKit::PointerLockManagerWayland::unlock):

  • UIProcess/gtk/PointerLockManagerWayland.h: Added.
  • UIProcess/gtk/PointerLockManagerX11.cpp: Added.

(WebKit::PointerLockManagerX11::PointerLockManagerX11):
(WebKit::PointerLockManagerX11::didReceiveMotionEvent):

  • UIProcess/gtk/PointerLockManagerX11.h: Added.

Tools:

  • WebKitTestRunner/gtk/EventSenderProxyGtk.cpp:

(WTR::getGDKKeySymForKeyRef): Handle escape key.

LayoutTests:

Unskip Pointer Lock tests and update expectations for tests still failing.

  • platform/gtk/TestExpectations:
  • platform/gtk/pointer-lock/mouse-event-delivery-expected.txt: Added.
Location:
trunk
Files:
8 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r252086 r252126  
     12019-11-06  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Implement support for Pointer Lock API
     4        https://bugs.webkit.org/show_bug.cgi?id=202956
     5
     6        Reviewed by Carlos Alberto Lopez Perez.
     7
     8        Enable Pointer Lock for GTK port.
     9
     10        * Source/cmake/OptionsGTK.cmake:
     11
    1122019-11-05  Fujii Hironori  <Hironori.Fujii@sony.com>
    213
  • trunk/LayoutTests/ChangeLog

    r252123 r252126  
     12019-11-06  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Implement support for Pointer Lock API
     4        https://bugs.webkit.org/show_bug.cgi?id=202956
     5
     6        Reviewed by Carlos Alberto Lopez Perez.
     7
     8        Unskip Pointer Lock tests and update expectations for tests still failing.
     9
     10        * platform/gtk/TestExpectations:
     11        * platform/gtk/pointer-lock/mouse-event-delivery-expected.txt: Added.
     12
    1132019-11-05  Kate Cheney  <katherine_cheney@apple.com>
    214
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r252121 r252126  
    531531Bug(GTK) legacy-animation-engine/compositing/visible-rect [ Skip ]
    532532
    533 # Pointer Lock is not implemented.
    534 webkit.org/b/99036 pointer-lock [ Skip ]
    535 # As well as testing fullscreen functionality, these tests also utilize the pointer lock feature.
    536 webkit.org/b/99036 http/tests/fullscreen [ Skip ]
    537 webkit.org/b/99036 http/tests/pointer-lock [ Skip ]
    538 webkit.org/b/99036 fast/shadow-dom/pointerlockelement-in-shadow-tree.html [ Skip ]
    539 webkit.org/b/99036 fast/shadow-dom/pointerlockelement-in-slot.html [ Skip ]
    540 
    541533# IETC flexbox failures
    542534webkit.org/b/85211 ietestcenter/css3/flexbox/flexbox-align-stretch-001.htm [ ImageOnlyFailure ]
     
    25322524webkit.org/b/202245 http/tests/workers/service/client-removed-from-clients-while-in-page-cache.html [ Timeout ]
    25332525webkit.org/b/202245 http/tests/workers/service/registration-clear-redundant-worker.html [ Timeout ]
     2526
     2527webkit.org/b/99036 pointer-lock/pointerlockchange-event-on-lock-lost.html [ Timeout ]
     2528webkit.org/b/99036 pointer-lock/pointerlockelement-null-when-pending.html [ Timeout ]
    25342529
    25352530#////////////////////////////////////////////////////////////////////////////////////////
     
    38783873webkit.org/b/203677 svg/W3C-SVG-1.1/painting-fill-05-b.svg [ Failure ]
    38793874
     3875webkit.org/b/99036 pointer-lock/locked-element-iframe-removed-from-dom.html [ Failure ]
     3876webkit.org/b/99036 pointer-lock/pointerlockchange-pointerlockerror-events.html [ Failure ]
     3877
    38803878#////////////////////////////////////////////////////////////////////////////////////////
    38813879# End of non-crashing, non-flaky tests failing
  • trunk/Source/WebKit/ChangeLog

    r252125 r252126  
     12019-11-06  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Implement support for Pointer Lock API
     4        https://bugs.webkit.org/show_bug.cgi?id=202956
     5
     6        Reviewed by Carlos Alberto Lopez Perez.
     7
     8        Add platform specific implementation of Pointer Lock for the GTK port.
     9
     10        * PlatformGTK.cmake: Generate code for pointer-constraints and relative-pointer Wayland protocols.
     11        * Shared/NativeWebMouseEvent.h: Add optional mouse movement delta.
     12        * Shared/gtk/NativeWebMouseEventGtk.cpp:
     13        (WebKit::NativeWebMouseEvent::NativeWebMouseEvent): Pass movement delta to WebEventFactory::createWebMouseEvent().
     14        * Shared/gtk/WebEventFactory.cpp:
     15        (WebKit::WebEventFactory::createWebMouseEvent): Initialize deltaX and deltaY for motion events using the received delta.
     16        * Shared/gtk/WebEventFactory.h: Add optional mouse movement delta.
     17        * SourcesGTK.txt: Add new files to compilation.
     18        * UIProcess/API/glib/WebKitUIClient.cpp: Add implementation for requestPointerLock and didLosePointerLock.
     19        * UIProcess/API/glib/WebKitWebView.cpp:
     20        (webkitWebViewRequestPointerLock): Call webkitWebViewBaseRequestPointerLock().
     21        (webkitWebViewDidLosePointerLock): Call webkitWebViewBaseDidLosePointerLock().
     22        * UIProcess/API/glib/WebKitWebViewPrivate.h:
     23        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     24        (webkitWebViewBaseDispose): Unlock the pointer and release the PointerLockManager.
     25        (webkitWebViewBaseHandleMouseEvent): Initialize the mouse movement delta for motion events and save the current event.
     26        (webkitWebViewBaseMotionNotifyEvent): Let PointerLockManager handle motion events while pointer is locked.
     27        (webkitWebViewBaseRequestPointerLock): Create a PointerLockManager and request it to lock the pointer.
     28        (webkitWebViewBaseDidLosePointerLock): Request PointerLockManager to unlock the pointer.
     29        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     30        * UIProcess/gtk/PointerLockManager.cpp: Added.
     31        (WebKit::PointerLockManager::create):
     32        (WebKit::PointerLockManager::PointerLockManager):
     33        (WebKit::PointerLockManager::~PointerLockManager):
     34        (WebKit::PointerLockManager::lock):
     35        (WebKit::PointerLockManager::unlock):
     36        (WebKit::PointerLockManager::handleMotion):
     37        * UIProcess/gtk/PointerLockManager.h: Added.
     38        (WebKit::PointerLockManager::didReceiveMotionEvent):
     39        * UIProcess/gtk/PointerLockManagerWayland.cpp: Added.
     40        (WebKit::PointerLockManagerWayland::PointerLockManagerWayland):
     41        (WebKit::PointerLockManagerWayland::~PointerLockManagerWayland):
     42        (WebKit::PointerLockManagerWayland::lock):
     43        (WebKit::PointerLockManagerWayland::unlock):
     44        * UIProcess/gtk/PointerLockManagerWayland.h: Added.
     45        * UIProcess/gtk/PointerLockManagerX11.cpp: Added.
     46        (WebKit::PointerLockManagerX11::PointerLockManagerX11):
     47        (WebKit::PointerLockManagerX11::didReceiveMotionEvent):
     48        * UIProcess/gtk/PointerLockManagerX11.h: Added.
     49
    1502019-11-05  Chris Dumez  <cdumez@apple.com>
    251
  • trunk/Source/WebKit/PlatformGTK.cmake

    r251181 r252126  
    5050    list(APPEND WebKit_DERIVED_SOURCES
    5151        ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c
     52        ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c
     53        ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c
    5254    )
    5355endif ()
     
    548550        OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c
    549551        DEPENDS ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml
    550         COMMAND wayland-scanner server-header < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandServerProtocol.h
    551         COMMAND wayland-scanner client-header < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.h
    552         COMMAND wayland-scanner code < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c
     552        COMMAND ${WAYLAND_SCANNER} server-header ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandServerProtocol.h
     553        COMMAND ${WAYLAND_SCANNER} client-header ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.h
     554        COMMAND ${WAYLAND_SCANNER} code ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c
     555        VERBATIM
     556    )
     557
     558    add_custom_command(
     559        OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c
     560        DEPENDS ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
     561        COMMAND ${WAYLAND_SCANNER} code ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c
     562        COMMAND ${WAYLAND_SCANNER} client-header ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-client-protocol.h
     563        VERBATIM
     564    )
     565
     566    add_custom_command(
     567        OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c
     568        DEPENDS ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml
     569        COMMAND ${WAYLAND_SCANNER} code ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c
     570        COMMAND ${WAYLAND_SCANNER} client-header ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-client-protocol.h
     571        VERBATIM
    553572    )
    554573endif ()
  • trunk/Source/WebKit/Shared/NativeWebMouseEvent.h

    r251320 r252126  
    6161#elif PLATFORM(GTK)
    6262    NativeWebMouseEvent(const NativeWebMouseEvent&);
    63     NativeWebMouseEvent(GdkEvent*, int);
     63    NativeWebMouseEvent(GdkEvent*, int, Optional<WebCore::IntPoint>);
    6464#elif PLATFORM(IOS_FAMILY)
    6565    NativeWebMouseEvent(::WebEvent *);
  • trunk/Source/WebKit/Shared/gtk/NativeWebMouseEventGtk.cpp

    r95901 r252126  
    3232namespace WebKit {
    3333
    34 NativeWebMouseEvent::NativeWebMouseEvent(GdkEvent* event, int eventClickCount)
    35     : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, eventClickCount))
     34NativeWebMouseEvent::NativeWebMouseEvent(GdkEvent* event, int eventClickCount, Optional<WebCore::IntPoint> delta)
     35    : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, eventClickCount, delta))
    3636    , m_nativeEvent(gdk_event_copy(event))
    3737{
     
    3939
    4040NativeWebMouseEvent::NativeWebMouseEvent(const NativeWebMouseEvent& event)
    41     : WebMouseEvent(WebEventFactory::createWebMouseEvent(event.nativeEvent(), event.clickCount()))
     41    : WebMouseEvent(WebEventFactory::createWebMouseEvent(event.nativeEvent(), event.clickCount(), WebCore::IntPoint(event.deltaX(), event.deltaY())))
    4242    , m_nativeEvent(gdk_event_copy(event.nativeEvent()))
    4343{
  • trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp

    r251650 r252126  
    136136}
    137137
    138 WebMouseEvent WebEventFactory::createWebMouseEvent(const GdkEvent* event, int currentClickCount)
     138WebMouseEvent WebEventFactory::createWebMouseEvent(const GdkEvent* event, int currentClickCount, Optional<IntPoint> delta)
    139139{
    140140    double x, y, xRoot, yRoot;
     
    149149
    150150    WebEvent::Type type = static_cast<WebEvent::Type>(0);
     151    IntPoint movementDelta;
    151152
    152153    GdkEventType eventType = gdk_event_get_event_type(event);
     
    156157    case GDK_LEAVE_NOTIFY:
    157158        type = WebEvent::MouseMove;
     159        if (delta)
     160            movementDelta = delta.value();
    158161        break;
    159162    case GDK_BUTTON_PRESS:
     
    180183        IntPoint(x, y),
    181184        IntPoint(xRoot, yRoot),
    182         0 /* deltaX */,
    183         0 /* deltaY */,
     185        movementDelta.x(),
     186        movementDelta.y(),
    184187        0 /* deltaZ */,
    185188        currentClickCount,
  • trunk/Source/WebKit/Shared/gtk/WebEventFactory.h

    r251650 r252126  
    3535class WebEventFactory {
    3636public:
    37     static WebMouseEvent createWebMouseEvent(const GdkEvent*, int);
     37    static WebMouseEvent createWebMouseEvent(const GdkEvent*, int, Optional<WebCore::IntPoint>);
    3838    static WebWheelEvent createWebWheelEvent(const GdkEvent*);
    3939    static WebWheelEvent createWebWheelEvent(const GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase);
  • trunk/Source/WebKit/SourcesGTK.txt

    r251181 r252126  
    241241UIProcess/gtk/InputMethodFilter.cpp
    242242UIProcess/gtk/KeyBindingTranslator.cpp
     243UIProcess/gtk/PointerLockManager.cpp @no-unify
     244UIProcess/gtk/PointerLockManagerWayland.cpp @no-unify
     245UIProcess/gtk/PointerLockManagerX11.cpp @no-unify
    243246UIProcess/gtk/RemoteWebInspectorProxyGtk.cpp
    244247UIProcess/gtk/TextCheckerGtk.cpp @no-unify
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp

    r250707 r252126  
    251251    }
    252252
     253#if ENABLE(POINTER_LOCK)
     254    void requestPointerLock(WebPageProxy* page) final
     255    {
     256        webkitWebViewRequestPointerLock(m_webView);
     257    }
     258
     259    void didLosePointerLock(WebPageProxy*) final
     260    {
     261        webkitWebViewDidLosePointerLock(m_webView);
     262    }
     263#endif
     264
     265
    253266    WebKitWebView* m_webView;
    254267};
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp

    r251181 r252126  
    26282628}
    26292629
     2630#if ENABLE(POINTER_LOCK)
     2631void webkitWebViewRequestPointerLock(WebKitWebView* webView)
     2632{
     2633#if PLATFORM(GTK)
     2634    webkitWebViewBaseRequestPointerLock(WEBKIT_WEB_VIEW_BASE(webView));
     2635#endif
     2636}
     2637
     2638void webkitWebViewDidLosePointerLock(WebKitWebView* webView)
     2639{
     2640#if PLATFORM(GTK)
     2641    webkitWebViewBaseDidLosePointerLock(WEBKIT_WEB_VIEW_BASE(webView));
     2642#endif
     2643}
     2644#endif
     2645
    26302646#if PLATFORM(WPE)
    26312647/**
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h

    r251181 r252126  
    104104void webkitWebViewDidChangePageID(WebKitWebView*);
    105105void webkitWebViewDidReceiveUserMessage(WebKitWebView*, WebKit::UserMessage&&, CompletionHandler<void(WebKit::UserMessage&&)>&&);
     106
     107#if ENABLE(POINTER_LOCK)
     108void webkitWebViewRequestPointerLock(WebKitWebView*);
     109void webkitWebViewDidLosePointerLock(WebKitWebView*);
     110#endif
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r251650 r252126  
    3939#include "NativeWebWheelEvent.h"
    4040#include "PageClientImpl.h"
     41#include "PointerLockManager.h"
    4142#include "ViewGestureController.h"
    4243#include "WebEventFactory.h"
     
    196197    TouchEventsMap touchEvents;
    197198    IntSize contentsSize;
     199    GUniquePtr<GdkEvent> lastMotionEvent;
    198200
    199201    GtkWindow* toplevelOnScreenWindow { nullptr };
     
    230232    RunLoop::Timer<WebKitWebViewBasePrivate> releaseEmojiChooserTimer;
    231233#endif
     234
     235    std::unique_ptr<PointerLockManager> pointerLockManager;
    232236};
    233237
     
    556560    webkitWebViewBaseCompleteEmojiChooserRequest(webView, emptyString());
    557561#endif
     562    if (webView->priv->pointerLockManager) {
     563        webView->priv->pointerLockManager->unlock();
     564        webView->priv->pointerLockManager = nullptr;
     565    }
    558566    webView->priv->pageProxy->close();
    559567    webView->priv->acceleratedBackingStore = nullptr;
     
    822830
    823831    int clickCount = 0;
     832    Optional<IntPoint> movementDelta;
    824833    GdkEventType eventType = gdk_event_get_event_type(event);
    825834    switch (eventType) {
     
    851860        break;
    852861    case GDK_MOTION_NOTIFY:
     862        // Pointer Lock. 7.1 Attributes: movementX/Y must be updated regardless of pointer lock state.
     863        if (priv->lastMotionEvent) {
     864            double currentX, currentY;
     865            gdk_event_get_root_coords(event, &currentX, &currentY);
     866            double previousX, previousY;
     867            gdk_event_get_root_coords(priv->lastMotionEvent.get(), &previousX, &previousY);
     868            movementDelta = IntPoint(currentX - previousX, currentY - previousY);
     869        }
     870        priv->lastMotionEvent.reset(gdk_event_copy(event));
     871        break;
    853872    case GDK_ENTER_NOTIFY:
    854873    case GDK_LEAVE_NOTIFY:
     
    858877    }
    859878
    860     priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(event, clickCount));
     879    priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(event, clickCount, movementDelta));
    861880}
    862881
     
    960979        auto* widgetClass = GTK_WIDGET_CLASS(webkit_web_view_base_parent_class);
    961980        return widgetClass->motion_notify_event ? widgetClass->motion_notify_event(widget, event) : GDK_EVENT_PROPAGATE;
     981    }
     982
     983    if (priv->pointerLockManager) {
     984        priv->pointerLockManager->didReceiveMotionEvent(reinterpret_cast<GdkEvent*>(event));
     985        return GDK_EVENT_STOP;
    962986    }
    963987
     
    18381862}
    18391863#endif
     1864
     1865void webkitWebViewBaseRequestPointerLock(WebKitWebViewBase* webViewBase)
     1866{
     1867    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     1868    RELEASE_ASSERT(!priv->pointerLockManager);
     1869    if (!priv->lastMotionEvent) {
     1870        GtkWidget* viewWidget = GTK_WIDGET(webViewBase);
     1871        auto* device = gdk_seat_get_pointer(gdk_display_get_default_seat(gtk_widget_get_display(viewWidget)));
     1872        int x, y;
     1873        GdkModifierType state;
     1874        gdk_window_get_device_position(gtk_widget_get_window(viewWidget), device, &x, &y, &state);
     1875        priv->lastMotionEvent.reset(gdk_event_new(GDK_MOTION_NOTIFY));
     1876        priv->lastMotionEvent->motion.x = x;
     1877        priv->lastMotionEvent->motion.y = y;
     1878        int rootX, rootY;
     1879        gdk_window_get_root_coords(gtk_widget_get_window(viewWidget), x, y, &rootX, &rootY);
     1880        priv->lastMotionEvent->motion.x_root = rootX;
     1881        priv->lastMotionEvent->motion.y_root = rootY;
     1882        priv->lastMotionEvent->motion.state = state;
     1883    }
     1884    priv->pointerLockManager = PointerLockManager::create(*priv->pageProxy, priv->lastMotionEvent.get());
     1885    if (priv->pointerLockManager->lock()) {
     1886        priv->pageProxy->didAllowPointerLock();
     1887        return;
     1888    }
     1889
     1890    priv->pointerLockManager = nullptr;
     1891    priv->pageProxy->didDenyPointerLock();
     1892}
     1893
     1894void webkitWebViewBaseDidLosePointerLock(WebKitWebViewBase* webViewBase)
     1895{
     1896    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     1897    if (!priv->pointerLockManager)
     1898        return;
     1899
     1900    priv->pointerLockManager->unlock();
     1901    priv->pointerLockManager = nullptr;
     1902}
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r251650 r252126  
    102102int webkitWebViewBaseRenderHostFileDescriptor(WebKitWebViewBase*);
    103103#endif
     104
     105void webkitWebViewBaseRequestPointerLock(WebKitWebViewBase*);
     106void webkitWebViewBaseDidLosePointerLock(WebKitWebViewBase*);
  • trunk/Source/cmake/OptionsGTK.cmake

    r251656 r252126  
    161161WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION PRIVATE ON)
    162162WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_OFFSCREEN_CANVAS PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES})
     163WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_POINTER_LOCK PRIVATE ON)
    163164WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SERVICE_WORKER PRIVATE ON)
    164165WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SHAREABLE_RESOURCE PUBLIC ON)
     
    344345
    345346    find_package(Wayland REQUIRED)
     347    find_package(WaylandProtocols 1.12 REQUIRED)
    346348endif ()
    347349
  • trunk/Tools/ChangeLog

    r252125 r252126  
     12019-11-06  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Implement support for Pointer Lock API
     4        https://bugs.webkit.org/show_bug.cgi?id=202956
     5
     6        Reviewed by Carlos Alberto Lopez Perez.
     7
     8        * WebKitTestRunner/gtk/EventSenderProxyGtk.cpp:
     9        (WTR::getGDKKeySymForKeyRef): Handle escape key.
     10
    1112019-11-05  Chris Dumez  <cdumez@apple.com>
    212
  • trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp

    r248846 r252126  
    271271    if (WKStringIsEqualToUTF8CString(keyRef, "F12"))
    272272        return GDK_KEY_F12;
     273    if (WKStringIsEqualToUTF8CString(keyRef, "escape"))
     274        return GDK_KEY_Escape;
    273275
    274276    size_t bufferSize = WKStringGetMaximumUTF8CStringSize(keyRef);
Note: See TracChangeset for help on using the changeset viewer.