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