client: Implement QNativeInterface::Private::QWaylandWindow

Task-number: QTBUG-94729
Change-Id: Ib79f3199a4518700aa032c5ca4760a2b53c401e5
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Edmundson <davidedmundson@kde.org>
This commit is contained in:
David Redondo 2022-10-12 09:01:07 +02:00
parent d62c5761e8
commit 9e23cbc94c
10 changed files with 46 additions and 7 deletions

View File

@ -18,6 +18,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandFullScreenShellV1Surface : public QWaylandS
{ {
public: public:
QWaylandFullScreenShellV1Surface(QtWayland::zwp_fullscreen_shell_v1 *shell, QWaylandWindow *window); QWaylandFullScreenShellV1Surface(QtWayland::zwp_fullscreen_shell_v1 *shell, QWaylandWindow *window);
std::any surfaceRole() const override { return m_shell->object(); }
private: private:
QtWayland::zwp_fullscreen_shell_v1 *m_shell = nullptr; QtWayland::zwp_fullscreen_shell_v1 *m_shell = nullptr;

View File

@ -57,6 +57,8 @@ public:
void applyConfigure() override; void applyConfigure() override;
bool wantsDecorations() const override; bool wantsDecorations() const override;
std::any surfaceRole() const override { return object(); };
protected: protected:
void requestWindowStates(Qt::WindowStates states) override; void requestWindowStates(Qt::WindowStates states) override;

View File

@ -417,6 +417,15 @@ void *QWaylandXdgSurface::nativeResource(const QByteArray &resource)
return nullptr; return nullptr;
} }
std::any QWaylandXdgSurface::surfaceRole() const
{
if (m_toplevel)
return m_toplevel->object();
if (m_popup)
return m_popup->object();
return {};
}
void QWaylandXdgSurface::requestWindowStates(Qt::WindowStates states) void QWaylandXdgSurface::requestWindowStates(Qt::WindowStates states)
{ {
if (m_toplevel) if (m_toplevel)

View File

@ -72,6 +72,8 @@ public:
void *nativeResource(const QByteArray &resource); void *nativeResource(const QByteArray &resource);
std::any surfaceRole() const override;
protected: protected:
void requestWindowStates(Qt::WindowStates states) override; void requestWindowStates(Qt::WindowStates states) override;
void xdg_surface_configure(uint32_t serial) override; void xdg_surface_configure(uint32_t serial) override;

View File

@ -143,7 +143,7 @@ void *QWaylandNativeInterface::nativeResourceForWindow(const QByteArray &resourc
if (lowerCaseResource == "vksurface") { if (lowerCaseResource == "vksurface") {
if (window->surfaceType() == QSurface::VulkanSurface && window->handle()) { if (window->surfaceType() == QSurface::VulkanSurface && window->handle()) {
// return a pointer to the VkSurfaceKHR value, not the value itself // return a pointer to the VkSurfaceKHR value, not the value itself
return static_cast<QWaylandVulkanWindow *>(window->handle())->surface(); return static_cast<QWaylandVulkanWindow *>(window->handle())->vkSurface();
} }
} }
#endif #endif

View File

@ -21,6 +21,8 @@
#include <QtWaylandClient/qtwaylandclientglobal.h> #include <QtWaylandClient/qtwaylandclientglobal.h>
#include <QtCore/private/qglobal_p.h> #include <QtCore/private/qglobal_p.h>
#include <any>
struct wl_surface; struct wl_surface;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -80,6 +82,8 @@ public:
QPlatformWindow *platformWindow(); QPlatformWindow *platformWindow();
struct wl_surface *wlSurface(); struct wl_surface *wlSurface();
virtual std::any surfaceRole() const { return std::any(); };
protected: protected:
void resizeFromApplyConfigure(const QSize &sizeWithMargins, const QPoint &offset = {0, 0}); void resizeFromApplyConfigure(const QSize &sizeWithMargins, const QPoint &offset = {0, 0});
void repositionFromApplyConfigure(const QPoint &position); void repositionFromApplyConfigure(const QPoint &position);

View File

@ -26,7 +26,7 @@ QWaylandWindow::WindowType QWaylandVulkanWindow::windowType() const
return QWaylandWindow::Vulkan; return QWaylandWindow::Vulkan;
} }
VkSurfaceKHR *QWaylandVulkanWindow::surface() VkSurfaceKHR *QWaylandVulkanWindow::vkSurface()
{ {
if (m_surface) if (m_surface)
return &m_surface; return &m_surface;

View File

@ -30,7 +30,7 @@ public:
WindowType windowType() const override; WindowType windowType() const override;
VkSurfaceKHR *surface(); VkSurfaceKHR *vkSurface();
private: private:
VkSurfaceKHR m_surface = VK_NULL_HANDLE; VkSurfaceKHR m_surface = VK_NULL_HANDLE;

View File

@ -59,6 +59,11 @@ QWaylandWindow::QWaylandWindow(QWindow *window, QWaylandDisplay *display)
static WId id = 1; static WId id = 1;
mWindowId = id++; mWindowId = id++;
initializeWlSurface(); initializeWlSurface();
connect(this, &QWaylandWindow::wlSurfaceCreated, this,
&QNativeInterface::Private::QWaylandWindow::surfaceCreated);
connect(this, &QWaylandWindow::wlSurfaceDestroyed, this,
&QNativeInterface::Private::QWaylandWindow::surfaceDestroyed);
} }
QWaylandWindow::~QWaylandWindow() QWaylandWindow::~QWaylandWindow()
@ -847,6 +852,15 @@ QWaylandShellSurface *QWaylandWindow::shellSurface() const
return mShellSurface; return mShellSurface;
} }
std::any QWaylandWindow::_surfaceRole() const
{
if (mSubSurfaceWindow)
return mSubSurfaceWindow->object();
if (mShellSurface)
return mShellSurface->surfaceRole();
return {};
}
QWaylandSubSurface *QWaylandWindow::subSurfaceWindow() const QWaylandSubSurface *QWaylandWindow::subSurfaceWindow() const
{ {
return mSubSurfaceWindow; return mSubSurfaceWindow;

View File

@ -28,10 +28,12 @@
#include <QtCore/QMap> // for QVariantMap #include <QtCore/QMap> // for QVariantMap
#include <qpa/qplatformwindow.h> #include <qpa/qplatformwindow.h>
#include <qpa/qplatformwindow_p.h>
#include <QtWaylandClient/private/qwayland-wayland.h> #include <QtWaylandClient/private/qwayland-wayland.h>
#include <QtWaylandClient/private/qwaylanddisplay_p.h> #include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <QtWaylandClient/qtwaylandclientglobal.h> #include <QtWaylandClient/qtwaylandclientglobal.h>
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
struct wl_egl_window; struct wl_egl_window;
@ -56,7 +58,8 @@ class QWaylandSurface;
class QWaylandFractionalScale; class QWaylandFractionalScale;
class QWaylandViewport; class QWaylandViewport;
class Q_WAYLANDCLIENT_EXPORT QWaylandWindow : public QObject, public QPlatformWindow class Q_WAYLANDCLIENT_EXPORT QWaylandWindow : public QNativeInterface::Private::QWaylandWindow,
public QPlatformWindow
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -115,17 +118,22 @@ public:
QMargins frameMargins() const override; QMargins frameMargins() const override;
QMargins customMargins() const; QMargins customMargins() const;
void setCustomMargins(const QMargins &margins); void setCustomMargins(const QMargins &margins) override;
QSize surfaceSize() const; QSize surfaceSize() const;
QRect windowContentGeometry() const; QRect windowContentGeometry() const;
QPointF mapFromWlSurface(const QPointF &surfacePosition) const; QPointF mapFromWlSurface(const QPointF &surfacePosition) const;
QWaylandSurface *waylandSurface() const { return mSurface.data(); } QWaylandSurface *waylandSurface() const { return mSurface.data(); }
::wl_surface *wlSurface(); ::wl_surface *wlSurface();
::wl_surface *surface() const override
{
return const_cast<QWaylandWindow *>(this)->wlSurface();
}
static QWaylandWindow *fromWlSurface(::wl_surface *surface); static QWaylandWindow *fromWlSurface(::wl_surface *surface);
QWaylandDisplay *display() const { return mDisplay; } QWaylandDisplay *display() const { return mDisplay; }
QWaylandShellSurface *shellSurface() const; QWaylandShellSurface *shellSurface() const;
std::any _surfaceRole() const override;
QWaylandSubSurface *subSurfaceWindow() const; QWaylandSubSurface *subSurfaceWindow() const;
QWaylandScreen *waylandScreen() const; QWaylandScreen *waylandScreen() const;
@ -207,7 +215,7 @@ public:
void deliverUpdateRequest() override; void deliverUpdateRequest() override;
void setXdgActivationToken(const QString &token); void setXdgActivationToken(const QString &token);
void requestXdgActivationToken(uint serial); void requestXdgActivationToken(uint serial) override;
void beginFrame(); void beginFrame();
void endFrame(); void endFrame();
@ -222,7 +230,6 @@ public slots:
signals: signals:
void wlSurfaceCreated(); void wlSurfaceCreated();
void wlSurfaceDestroyed(); void wlSurfaceDestroyed();
void xdgActivationTokenCreated(const QString &token);
protected: protected:
virtual void doHandleFrameCallback(); virtual void doHandleFrameCallback();