Title: [280774] trunk
Revision
280774
Author
ifernan...@igalia.com
Date
2021-08-09 05:49:24 -0700 (Mon, 09 Aug 2021)

Log Message

Implement fullscreen in WPEView
https://bugs.webkit.org/show_bug.cgi?id=227951

Reviewed by Adrian Perez de Castro.

Notify DOM fullscreen enter request to libwpe and handle exit fullscreen from libwpe.

* UIProcess/API/wpe/WPEView.cpp:
(WKWPE::m_backend):
(WKWPE::View::setFullScreen):
* UIProcess/API/wpe/WPEView.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (280773 => 280774)


--- trunk/Source/WebKit/ChangeLog	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Source/WebKit/ChangeLog	2021-08-09 12:49:24 UTC (rev 280774)
@@ -1,5 +1,19 @@
 2021-08-09  Imanol Fernandez  <ifernan...@igalia.com>
 
+        Implement fullscreen in WPEView
+        https://bugs.webkit.org/show_bug.cgi?id=227951
+
+        Reviewed by Adrian Perez de Castro.
+
+        Notify DOM fullscreen enter request to libwpe and handle exit fullscreen from libwpe.
+
+        * UIProcess/API/wpe/WPEView.cpp:
+        (WKWPE::m_backend):
+        (WKWPE::View::setFullScreen):
+        * UIProcess/API/wpe/WPEView.h:
+
+2021-08-09  Imanol Fernandez  <ifernan...@igalia.com>
+
         Allow custom IPC::Attachment messaging in ConnectionUnix.cpp
         https://bugs.webkit.org/show_bug.cgi?id=227740
 

Modified: trunk/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp (280773 => 280774)


--- trunk/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp	2021-08-09 12:49:24 UTC (rev 280774)
@@ -384,8 +384,8 @@
     WebFullScreenManagerProxy* fullScreenManagerProxy = m_view.page().fullScreenManager();
     if (fullScreenManagerProxy) {
         fullScreenManagerProxy->willEnterFullScreen();
-        m_view.setFullScreen(true);
-        fullScreenManagerProxy->didEnterFullScreen();
+        if (!m_view.setFullScreen(true))
+            fullScreenManagerProxy->didExitFullScreen();
     }
 }
 
@@ -397,8 +397,9 @@
     WebFullScreenManagerProxy* fullScreenManagerProxy = m_view.page().fullScreenManager();
     if (fullScreenManagerProxy) {
         fullScreenManagerProxy->willExitFullScreen();
-        m_view.setFullScreen(false);
-        fullScreenManagerProxy->didExitFullScreen();
+        if (!m_view.setFullScreen(false))
+            fullScreenManagerProxy->didEnterFullScreen();
+
     }
 }
 

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp (280773 => 280774)


--- trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp	2021-08-09 12:49:24 UTC (rev 280774)
@@ -257,6 +257,40 @@
     };
     wpe_view_backend_set_input_client(m_backend, &s_inputClient, this);
 
+#if ENABLE(FULLSCREEN_API) && WPE_CHECK_VERSION(1, 11, 1)
+    static struct wpe_view_backend_fullscreen_client s_fullscreenClient = {
+        // did_enter_fullscreen
+        [](void* data)
+        {
+            auto& view = *reinterpret_cast<View*>(data);
+            view.page().fullScreenManager()->didEnterFullScreen();
+        },
+        // did_exit_fullscreen
+        [](void* data)
+        {
+            auto& view = *reinterpret_cast<View*>(data);
+            view.page().fullScreenManager()->didExitFullScreen();
+        },
+        // request_enter_fullscreen
+        [](void* data)
+        {
+            auto& view = *reinterpret_cast<View*>(data);
+            view.page().fullScreenManager()->requestEnterFullScreen();
+        },
+        // request_exit_fullscreen
+        [](void* data)
+        {
+            auto& view = *reinterpret_cast<View*>(data);
+            view.page().fullScreenManager()->requestExitFullScreen();
+        },
+        nullptr,
+        nullptr,
+        nullptr,
+        nullptr
+    };
+    wpe_view_backend_set_fullscreen_client(m_backend, &s_fullscreenClient, this);
+#endif
+
     wpe_view_backend_initialize(m_backend);
 
     m_pageProxy->initializeWebPage();
@@ -375,6 +409,18 @@
     m_pageProxy->close();
 }
 
+#if ENABLE(FULLSCREEN_API)
+bool View::setFullScreen(bool fullScreenState)
+{
+#if WPE_CHECK_VERSION(1, 11, 1)
+    if (!wpe_view_backend_platform_set_fullscreen(m_backend, fullScreenState))
+        return false;
+#endif
+    m_fullScreenModeActive = fullScreenState;
+    return true;
+};
+#endif
+
 #if ENABLE(ACCESSIBILITY)
 WebKitWebViewAccessible* View::accessible() const
 {

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WPEView.h (280773 => 280774)


--- trunk/Source/WebKit/UIProcess/API/wpe/WPEView.h	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WPEView.h	2021-08-09 12:49:24 UTC (rev 280774)
@@ -100,7 +100,7 @@
 
 #if ENABLE(FULLSCREEN_API)
     bool isFullScreen() { return m_fullScreenModeActive; };
-    void setFullScreen(bool fullScreenState) { m_fullScreenModeActive = fullScreenState; };
+    bool setFullScreen(bool);
 #endif
 
 #if ENABLE(ACCESSIBILITY)

Modified: trunk/Tools/wpe/backends/WindowViewBackend.cpp (280773 => 280774)


--- trunk/Tools/wpe/backends/WindowViewBackend.cpp	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Tools/wpe/backends/WindowViewBackend.cpp	2021-08-09 12:49:24 UTC (rev 280774)
@@ -527,6 +527,7 @@
         window.resize(std::max(0, width), std::max(0, height));
 
         bool isFocused = false;
+        bool isFullscreen = false;
         // FIXME: It would be nice if the following loop could use
         // wl_array_for_each, but at the time of writing it relies on
         // GCC specific extension to work properly:
@@ -542,6 +543,8 @@
                 isFocused = true;
                 break;
             case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
+                isFullscreen = true;
+                break;
             case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
             case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
             default:
@@ -553,6 +556,9 @@
             window.addActivityState(wpe_view_activity_state_focused);
         else
             window.removeActivityState(wpe_view_activity_state_focused);
+
+        if (window.m_is_fullscreen != isFullscreen)
+            window.onFullscreenChanged(isFullscreen);
     },
     // close
     [](void* data, struct zxdg_toplevel_v6*)
@@ -562,6 +568,58 @@
     },
 };
 
+#if WPE_CHECK_VERSION(1, 11, 1)
+
+bool WindowViewBackend::onDOMFullscreenRequest(void* data, bool fullscreen)
+{
+    auto& window = *static_cast<WindowViewBackend*>(data);
+    if (window.m_waiting_fullscreen_notify)
+        return false;
+
+    if (fullscreen == window.m_is_fullscreen) {
+        // Handle situations where DOM fullscreen requests are mixed with system fullscreen commands (e.g F11)
+        window.dispatchFullscreenEvent();
+        return true;
+    }
+
+    window.m_waiting_fullscreen_notify = true;
+    if (fullscreen)
+        zxdg_toplevel_v6_set_fullscreen(window.m_xdgToplevel, nullptr);
+    else
+        zxdg_toplevel_v6_unset_fullscreen(window.m_xdgToplevel);
+
+    return true;
+}
+
+void WindowViewBackend::dispatchFullscreenEvent()
+{
+    if (m_is_fullscreen)
+        wpe_view_backend_dispatch_did_enter_fullscreen(backend());
+    else
+        wpe_view_backend_dispatch_did_exit_fullscreen(backend());
+}
+
+void WindowViewBackend::onFullscreenChanged(bool fullscreen)
+{
+    bool wasRequestedFromDOM = m_waiting_fullscreen_notify;
+    m_waiting_fullscreen_notify= false;
+    m_is_fullscreen = fullscreen;
+
+    if (!fullscreen && !wasRequestedFromDOM)
+        wpe_view_backend_dispatch_request_exit_fullscreen(backend());
+    else if (wasRequestedFromDOM)
+        dispatchFullscreenEvent();
+}
+
+#else
+
+void WindowViewBackend::onFullscreenChanged(bool fullscreen)
+{
+    m_is_fullscreen = fullscreen;
+}
+
+#endif // WPE_CHECK_VERSION(1, 11, 1)
+
 WindowViewBackend::WindowViewBackend(uint32_t width, uint32_t height)
     : ViewBackend(width, height)
 {
@@ -824,6 +882,10 @@
     };
     m_exportable = wpe_view_backend_exportable_fdo_egl_create(&exportableClient, this, m_width, m_height);
 
+#if WPE_CHECK_VERSION(1, 11, 1)
+    wpe_view_backend_set_fullscreen_handler(backend(), onDOMFullscreenRequest, this);
+#endif
+
     initializeAccessibility();
 
     return true;

Modified: trunk/Tools/wpe/backends/WindowViewBackend.h (280773 => 280774)


--- trunk/Tools/wpe/backends/WindowViewBackend.h	2021-08-09 12:35:07 UTC (rev 280773)
+++ trunk/Tools/wpe/backends/WindowViewBackend.h	2021-08-09 12:49:24 UTC (rev 280774)
@@ -64,6 +64,12 @@
     static const struct zxdg_surface_v6_listener s_xdgSurfaceListener;
     static const struct zxdg_toplevel_v6_listener s_xdgToplevelListener;
 
+#if WPE_CHECK_VERSION(1, 11, 1)
+    static bool onDOMFullscreenRequest(void* data, bool fullscreen);
+    void dispatchFullscreenEvent();
+#endif
+    void onFullscreenChanged(bool fullscreen);
+
     void handleKeyEvent(uint32_t key, uint32_t state, uint32_t time);
     uint32_t modifiers() const;
 
@@ -131,6 +137,10 @@
     unsigned m_textureUniform { 0 };
     unsigned m_viewTexture { 0 };
     struct wpe_fdo_egl_exported_image* m_committedImage { nullptr };
+    bool m_is_fullscreen { false };
+#if WPE_CHECK_VERSION(1, 11, 1)
+    bool m_waiting_fullscreen_notify { false };
+#endif
 };
 
 } // WPEToolingBackends
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to