Paste P648

Masterwork From Distant Lands
ActivePublic

Authored by davidedmundson on Nov 30 2020, 4:46 PM.
From 199fa5d6d0fa33a55a073c1d49b2af5f8d6455fc Mon Sep 17 00:00:00 2001
From: David Edmundson <kde@davidedmundson.co.uk>
Date: Mon, 30 Nov 2020 15:58:52 +0000
Subject: [PATCH] Forward global removal events to QWaylandClientExtension
If a global is removed, the client will want to be notified so that they
can take appropriate action.
It is still up to the client to remove any resources they have bound to
that global.
addRegistryListener wasn't scalable to two callbacks and having the
removeRegisterListener work reliably if parameters didn't match, so the
registry is changed from callbacks to objects with virtuals.
---
src/client/global/qwaylandclientextension.cpp | 25 +++++++++----
src/client/global/qwaylandclientextension_p.h | 9 +++--
src/client/qwaylanddisplay.cpp | 22 ++++++------
src/client/qwaylanddisplay_p.h | 36 +++++++++----------
.../qwaylandwindowmanagerintegration.cpp | 6 ++--
.../qwaylandwindowmanagerintegration_p.h | 7 ++--
.../shmserverbufferintegration.cpp | 7 ++--
.../shmserverbufferintegration.h | 5 +--
.../vulkanserverbufferintegration.cpp | 7 ++--
.../vulkanserverbufferintegration.h | 4 +--
...ndxcompositeeglclientbufferintegration.cpp | 9 +++--
...landxcompositeeglclientbufferintegration.h | 8 +++--
.../qwaylandxcompositeglxintegration.cpp | 9 +++--
.../qwaylandxcompositeglxintegration.h | 5 +--
.../xdg-shell/qwaylandxdgshell.cpp | 11 +++---
.../xdg-shell/qwaylandxdgshell_p.h | 7 ++--
16 files changed, 96 insertions(+), 81 deletions(-)
diff --git a/src/client/global/qwaylandclientextension.cpp b/src/client/global/qwaylandclientextension.cpp
index 125b1e19..30023a3f 100644
--- a/src/client/global/qwaylandclientextension.cpp
+++ b/src/client/global/qwaylandclientextension.cpp
@@ -60,21 +60,32 @@ QWaylandClientExtensionPrivate::QWaylandClientExtensionPrivate()
qWarning() << "This application requires a Wayland platform plugin";
}
-void QWaylandClientExtensionPrivate::handleRegistryGlobal(void *data, ::wl_registry *registry, uint32_t id,
+void QWaylandClientExtensionPrivate::globalAdded(::wl_registry *registry, uint32_t _id,
const QString &interface, uint32_t version)
{
- QWaylandClientExtension *extension = static_cast<QWaylandClientExtension *>(data);
- if (interface == QLatin1String(extension->extensionInterface()->name) && !extension->d_func()->active) {
- extension->bind(registry, id, version);
- extension->d_func()->active = true;
- emit extension->activeChanged();
+ Q_Q(QWaylandClientExtension);
+ if (interface == QLatin1String(q->extensionInterface()->name) && !q->d_func()->active) {
+ q->bind(registry, id, version);
+ active = true;
+ this->id = _id;
+ emit q->activeChanged();
+ }
+}
+
+void QWaylandClientExtensionPrivate::globalRemoved(::wl_registry *registry, uint32_t _id)
+{
+ Q_Q(QWaylandClientExtension);
+ Q_UNUSED(registry);
+ if (id == _id) {
+ active = false;
+ emit q->activeChanged();
}
}
void QWaylandClientExtension::addRegistryListener()
{
Q_D(QWaylandClientExtension);
- d->waylandIntegration->display()->addRegistryListener(&QWaylandClientExtensionPrivate::handleRegistryGlobal, this);
+ d->waylandIntegration->display()->addRegistryObserver(d);
}
QWaylandClientExtension::QWaylandClientExtension(const int ver)
diff --git a/src/client/global/qwaylandclientextension_p.h b/src/client/global/qwaylandclientextension_p.h
index 69cc46a0..64837d15 100644
--- a/src/client/global/qwaylandclientextension_p.h
+++ b/src/client/global/qwaylandclientextension_p.h
@@ -54,19 +54,22 @@
#include <QtCore/private/qobject_p.h>
#include <QtWaylandClient/QWaylandClientExtension>
#include <QtWaylandClient/private/qwaylandintegration_p.h>
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
QT_BEGIN_NAMESPACE
-class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtensionPrivate : public QObjectPrivate
+class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtensionPrivate : public QObjectPrivate, public QtWaylandClient::QWaylandRegistryObserver
{
Q_DECLARE_PUBLIC(QWaylandClientExtension)
public:
QWaylandClientExtensionPrivate();
- static void handleRegistryGlobal(void *data, ::wl_registry *registry, uint32_t id,
- const QString &interface, uint32_t version);
+ void globalAdded(::wl_registry *registry, uint32_t id,
+ const QString &interface, uint32_t version) override;
+ void globalRemoved(wl_registry *register_t, uint32_t id) override;
QtWaylandClient::QWaylandIntegration *waylandIntegration = nullptr;
int version = -1;
+ uint32_t id = -1;
bool active = false;
};
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 1420c73a..b962bb61 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -516,9 +516,9 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
mGlobals.append(RegistryGlobal(id, interface, version, registry));
- const auto copy = mRegistryListeners; // be prepared for listeners unregistering on notification
- for (Listener l : copy)
- (*l.listener)(l.data, registry, id, interface, version);
+ const auto copy = mRegistryObservers; // be prepared for listeners unregistering on notification
+ for (QWaylandRegistryObserver *o : copy)
+ o->globalAdded(registry, id, interface, version);
}
void QWaylandDisplay::registry_global_remove(uint32_t id)
@@ -561,6 +561,9 @@ void QWaylandDisplay::registry_global_remove(uint32_t id)
break;
}
}
+ const auto copy = mRegistryObservers; // be prepared for listeners unregistering on notification
+ for (QWaylandRegistryObserver *o : copy)
+ o->globalRemoved(object(), id);
}
bool QWaylandDisplay::hasRegistryGlobal(QStringView interfaceName) const
@@ -572,19 +575,16 @@ bool QWaylandDisplay::hasRegistryGlobal(QStringView interfaceName) const
return false;
}
-void QWaylandDisplay::addRegistryListener(RegistryListener listener, void *data)
+void QWaylandDisplay::addRegistryObserver(QWaylandRegistryObserver *listener)
{
- Listener l = { listener, data };
- mRegistryListeners.append(l);
+ mRegistryObservers.append(listener);
for (int i = 0, ie = mGlobals.count(); i != ie; ++i)
- (*l.listener)(l.data, mGlobals[i].registry, mGlobals[i].id, mGlobals[i].interface, mGlobals[i].version);
+ listener->globalAdded(mGlobals[i].registry, mGlobals[i].id, mGlobals[i].interface, mGlobals[i].version);
}
-void QWaylandDisplay::removeListener(RegistryListener listener, void *data)
+void QWaylandDisplay::removeRegistryObserver(QWaylandRegistryObserver *listener)
{
- std::remove_if(mRegistryListeners.begin(), mRegistryListeners.end(), [=](Listener l){
- return (l.listener == listener && l.data == data);
- });
+ mRegistryObservers.removeOne(listener);
}
uint32_t QWaylandDisplay::currentTimeMillisec()
diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
index 3aa53429..d80938b1 100644
--- a/src/client/qwaylanddisplay_p.h
+++ b/src/client/qwaylanddisplay_p.h
@@ -111,11 +111,21 @@ class QWaylandShellIntegration;
class QWaylandCursor;
class QWaylandCursorTheme;
-typedef void (*RegistryListener)(void *data,
- struct wl_registry *registry,
- uint32_t id,
- const QString &interface,
- uint32_t version);
+class Q_WAYLAND_CLIENT_EXPORT QWaylandRegistryObserver
+{
+public:
+ virtual void globalAdded(struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version);
+ {
+ Q_UNUSED(registry);
+ Q_UNUSED(id)
+ Q_UNUSED(interface)
+ Q_UNUSED(version)
+ }
+ virtual void globalRemoved(struct wl_registry *registry, uint32_t id) {
+ Q_UNUSED(registry);
+ Q_UNUSED(id)
+ }
+};
class Q_WAYLAND_CLIENT_EXPORT QWaylandDisplay : public QObject, public QtWayland::wl_registry {
Q_OBJECT
@@ -192,8 +202,8 @@ public:
/* wl_registry_add_listener does not add but rather sets a listener, so this function is used
* to enable many listeners at once. */
- void addRegistryListener(RegistryListener listener, void *data);
- void removeListener(RegistryListener listener, void *data);
+ void addRegistryObserver(QWaylandRegistryObserver *listener);
+ void removeRegistryObserver(QWaylandRegistryObserver *listener);
QWaylandShm *shm() const { return mShm.data(); }
@@ -235,16 +245,6 @@ private:
void handleWaylandSync();
void requestWaylandSync();
- struct Listener {
- Listener() = default;
- Listener(RegistryListener incomingListener,
- void* incomingData)
- : listener(incomingListener), data(incomingData)
- {}
- RegistryListener listener = nullptr;
- void *data = nullptr;
- };
-
struct wl_display *mDisplay = nullptr;
QtWayland::wl_compositor mCompositor;
QScopedPointer<QWaylandShm> mShm;
@@ -252,7 +252,7 @@ private:
QList<QWaylandScreen *> mScreens;
QPlatformPlaceholderScreen *mPlaceholderScreen = nullptr;
QList<QWaylandInputDevice *> mInputDevices;
- QList<Listener> mRegistryListeners;
+ QList<QWaylandRegistryObserver*> mRegistryObservers;
QWaylandIntegration *mWaylandIntegration = nullptr;
#if QT_CONFIG(cursor)
struct WaylandCursorTheme {
diff --git a/src/client/qwaylandwindowmanagerintegration.cpp b/src/client/qwaylandwindowmanagerintegration.cpp
index dd1acaf7..83e51c0b 100644
--- a/src/client/qwaylandwindowmanagerintegration.cpp
+++ b/src/client/qwaylandwindowmanagerintegration.cpp
@@ -75,7 +75,7 @@ QWaylandWindowManagerIntegrationPrivate::QWaylandWindowManagerIntegrationPrivate
QWaylandWindowManagerIntegration::QWaylandWindowManagerIntegration(QWaylandDisplay *waylandDisplay)
: d_ptr(new QWaylandWindowManagerIntegrationPrivate(waylandDisplay))
{
- waylandDisplay->addRegistryListener(&wlHandleListenerGlobal, this);
+ waylandDisplay->addRegistryObserver(this);
}
QWaylandWindowManagerIntegration::~QWaylandWindowManagerIntegration()
@@ -89,11 +89,11 @@ bool QWaylandWindowManagerIntegration::showIsFullScreen() const
return d->m_showIsFullScreen;
}
-void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(void *data, wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
+void QWaylandWindowManagerIntegration::globalAdded(wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
if (interface == QStringLiteral("qt_windowmanager"))
- static_cast<QWaylandWindowManagerIntegration *>(data)->init(registry, id, 1);
+ init(registry, id, 1);
}
void QWaylandWindowManagerIntegration::windowmanager_hints(int32_t showIsFullScreen)
diff --git a/src/client/qwaylandwindowmanagerintegration_p.h b/src/client/qwaylandwindowmanagerintegration_p.h
index 1c36f67b..e6e1aad7 100644
--- a/src/client/qwaylandwindowmanagerintegration_p.h
+++ b/src/client/qwaylandwindowmanagerintegration_p.h
@@ -57,6 +57,7 @@
#include <QtGui/private/qgenericunixservices_p.h>
#include <QtWaylandClient/private/qwayland-qt-windowmanager.h>
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <QtWaylandClient/qtwaylandclientglobal.h>
QT_BEGIN_NAMESPACE
@@ -68,7 +69,7 @@ class QWaylandDisplay;
class QWaylandWindowManagerIntegrationPrivate;
-class Q_WAYLAND_CLIENT_EXPORT QWaylandWindowManagerIntegration : public QObject, public QGenericUnixServices, public QtWayland::qt_windowmanager
+class Q_WAYLAND_CLIENT_EXPORT QWaylandWindowManagerIntegration : public QObject, public QGenericUnixServices, public QtWayland::qt_windowmanager, public QWaylandRegistryObserver
{
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandWindowManagerIntegration)
@@ -82,8 +83,8 @@ public:
bool showIsFullScreen() const;
private:
- static void wlHandleListenerGlobal(void *data, wl_registry *registry, uint32_t id,
- const QString &interface, uint32_t version);
+ void globalAdded(wl_registry *registry, uint32_t id,
+ const QString &interface, uint32_t version) override;
QScopedPointer<QWaylandWindowManagerIntegrationPrivate> d_ptr;
diff --git a/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.cpp b/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.cpp
index ad7bc5b7..521b3505 100644
--- a/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.cpp
+++ b/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.cpp
@@ -112,7 +112,7 @@ QOpenGLTexture *ShmServerBuffer::toOpenGlTexture()
void ShmServerBufferIntegration::initialize(QWaylandDisplay *display)
{
m_display = display;
- display->addRegistryListener(&wlDisplayHandleGlobal, this);
+ display->addRegistryObserver(this);
}
QWaylandServerBuffer *ShmServerBufferIntegration::serverBuffer(struct qt_server_buffer *buffer)
@@ -120,12 +120,11 @@ QWaylandServerBuffer *ShmServerBufferIntegration::serverBuffer(struct qt_server_
return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
}
-void ShmServerBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
+void ShmServerBufferIntegration::globalAdded(::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
if (interface == "qt_shm_emulation_server_buffer") {
- auto *integration = static_cast<ShmServerBufferIntegration *>(data);
- integration->QtWayland::qt_shm_emulation_server_buffer::init(registry, id, 1);
+ QtWayland::qt_shm_emulation_server_buffer::init(registry, id, 1);
}
}
diff --git a/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.h b/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.h
index b162d692..b799cd4e 100644
--- a/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.h
+++ b/src/hardwareintegration/client/shm-emulation-server/shmserverbufferintegration.h
@@ -69,6 +69,7 @@ private:
class ShmServerBufferIntegration
: public QWaylandServerBufferIntegration
, public QtWayland::qt_shm_emulation_server_buffer
+ , public QWaylandRegistryObserver
{
public:
void initialize(QWaylandDisplay *display) override;
@@ -79,8 +80,8 @@ protected:
void shm_emulation_server_buffer_server_buffer_created(qt_server_buffer *id, const QString &key, int32_t width, int32_t height, int32_t bytes_per_line, int32_t format) override;
private:
- static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id,
- const QString &interface, uint32_t version);
+ void globalAdded(struct ::wl_registry *registry, uint32_t id,
+ const QString &interface, uint32_t version) override;
QWaylandDisplay *m_display = nullptr;
};
diff --git a/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.cpp b/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.cpp
index 90e9a321..47017e20 100644
--- a/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.cpp
+++ b/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.cpp
@@ -174,7 +174,7 @@ QOpenGLTexture *VulkanServerBuffer::toOpenGlTexture()
void VulkanServerBufferIntegration::initialize(QWaylandDisplay *display)
{
m_display = display;
- display->addRegistryListener(&wlDisplayHandleGlobal, this);
+ display->addRegistryObserver(this);
}
QWaylandServerBuffer *VulkanServerBufferIntegration::serverBuffer(struct qt_server_buffer *buffer)
@@ -182,12 +182,11 @@ QWaylandServerBuffer *VulkanServerBufferIntegration::serverBuffer(struct qt_serv
return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
}
-void VulkanServerBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
+void VulkanServerBufferIntegration::globalAdded(struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
if (interface == "zqt_vulkan_server_buffer_v1") {
- auto *integration = static_cast<VulkanServerBufferIntegration *>(data);
- integration->QtWayland::zqt_vulkan_server_buffer_v1::init(registry, id, 1);
+ QtWayland::zqt_vulkan_server_buffer_v1::init(registry, id, 1);
}
}
diff --git a/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.h b/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.h
index 44fd6997..88a7bf88 100644
--- a/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.h
+++ b/src/hardwareintegration/client/vulkan-server/vulkanserverbufferintegration.h
@@ -76,6 +76,7 @@ private:
class VulkanServerBufferIntegration
: public QWaylandServerBufferIntegration
, public QtWayland::zqt_vulkan_server_buffer_v1
+ , public QWaylandRegistryObserver
{
public:
void initialize(QWaylandDisplay *display) override;
@@ -89,8 +90,7 @@ protected:
void zqt_vulkan_server_buffer_v1_server_buffer_created(qt_server_buffer *id, int32_t fd, uint32_t width, uint32_t height, uint32_t memory_size, uint32_t format) override;
private:
- static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id,
- const QString &interface, uint32_t version);
+ void globalAdded(struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version) override;
QWaylandDisplay *m_display = nullptr;
QList<QOpenGLTexture *> orphanedTextures;
};
diff --git a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.cpp b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.cpp
index 1809aa21..c3bc8480 100644
--- a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.cpp
@@ -66,7 +66,7 @@ QWaylandXCompositeEGLClientBufferIntegration::~QWaylandXCompositeEGLClientBuffer
void QWaylandXCompositeEGLClientBufferIntegration::initialize(QWaylandDisplay *display)
{
mWaylandDisplay = display;
- mWaylandDisplay->addRegistryListener(&wlDisplayHandleGlobal, this);
+ mWaylandDisplay->addRegistryObserver(this);
while (!mDisplay) {
display->flushRequests();
display->blockingReadEvents();
@@ -118,13 +118,12 @@ const struct qt_xcomposite_listener QWaylandXCompositeEGLClientBufferIntegration
QWaylandXCompositeEGLClientBufferIntegration::rootInformation
};
-void QWaylandXCompositeEGLClientBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
+void QWaylandXCompositeEGLClientBufferIntegration::globalAdded(::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
if (interface == "qt_xcomposite") {
- QWaylandXCompositeEGLClientBufferIntegration *integration = static_cast<QWaylandXCompositeEGLClientBufferIntegration *>(data);
- integration->mWaylandComposite = static_cast<struct qt_xcomposite *>(wl_registry_bind(registry,id,&qt_xcomposite_interface,1));
- qt_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+ mWaylandComposite = static_cast<struct qt_xcomposite *>(wl_registry_bind(registry,id,&qt_xcomposite_interface,1));
+ qt_xcomposite_add_listener(mWaylandComposite,&xcomposite_listener,this);
}
}
diff --git a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.h b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.h
index 5fe21d7b..b540b109 100644
--- a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.h
+++ b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglclientbufferintegration.h
@@ -41,6 +41,8 @@
#define QWAYLANDXCOMPOSITEEGLCLIENTBUFFERINTEGRATION_H
#include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>
+
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <wayland-client-core.h>
#include <QtCore/QTextStream>
@@ -70,7 +72,7 @@ QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
-class QWaylandXCompositeEGLClientBufferIntegration : public QWaylandClientBufferIntegration
+class QWaylandXCompositeEGLClientBufferIntegration : public QWaylandClientBufferIntegration, QWaylandRegistryObserver
{
public:
QWaylandXCompositeEGLClientBufferIntegration();
@@ -101,8 +103,8 @@ private:
int mScreen = 0;
Window mRootWindow = -1;
- static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id,
- const QString &interface, uint32_t version);
+ void globalAdded(struct ::wl_registry *registry, uint32_t id,
+ const QString &interface, uint32_t version) override;
static const struct ::qt_xcomposite_listener xcomposite_listener;
static void rootInformation(void *data,
diff --git a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.cpp b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.cpp
index 8be47fa2..281e1256 100644
--- a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.cpp
+++ b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.cpp
@@ -64,7 +64,7 @@ QWaylandXCompositeGLXIntegration::~QWaylandXCompositeGLXIntegration()
void QWaylandXCompositeGLXIntegration::initialize(QWaylandDisplay *display)
{
mWaylandDisplay = display;
- mWaylandDisplay->addRegistryListener(QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal, this);
+ mWaylandDisplay->addRegistryObserver(this);
while (!mDisplay) {
display->flushRequests();
display->blockingReadEvents();
@@ -109,14 +109,13 @@ const struct qt_xcomposite_listener QWaylandXCompositeGLXIntegration::xcomposite
QWaylandXCompositeGLXIntegration::rootInformation
};
-void QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
+void QWaylandXCompositeGLXIntegration::globalAdded(::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
if (interface == "qt_xcomposite") {
qDebug("XComposite-GLX: got qt_xcomposite global");
- QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
- integration->mWaylandComposite = static_cast<struct qt_xcomposite *>(wl_registry_bind(registry, id, &qt_xcomposite_interface, 1));
- qt_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+ mWaylandComposite = static_cast<struct qt_xcomposite *>(wl_registry_bind(registry, id, &qt_xcomposite_interface, 1));
+ qt_xcomposite_add_listener(mWaylandComposite, &xcomposite_listener, this);
}
}
diff --git a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.h b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.h
index 80969081..624b872b 100644
--- a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.h
+++ b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxintegration.h
@@ -41,6 +41,7 @@
#define QWAYLANDXCOMPOSITEGLXINTEGRATION_H
#include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <wayland-client-core.h>
#include <QtCore/QTextStream>
@@ -65,7 +66,7 @@ QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
-class QWaylandXCompositeGLXIntegration : public QWaylandClientBufferIntegration
+class QWaylandXCompositeGLXIntegration : public QWaylandClientBufferIntegration, QWaylandRegistryObserver
{
public:
QWaylandXCompositeGLXIntegration();
@@ -94,7 +95,7 @@ private:
int mScreen = 0;
Window mRootWindow = 0;
- static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id,
+ void globalAdded(struct ::wl_registry *registry, uint32_t id,
const QString &interface, uint32_t version);
static const struct qt_xcomposite_listener xcomposite_listener;
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
index 0ee8cae3..1a9d160d 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
@@ -470,12 +470,12 @@ QWaylandXdgShell::QWaylandXdgShell(QWaylandDisplay *display, uint32_t id, uint32
: QtWayland::xdg_wm_base(display->wl_registry(), id, qMin(availableVersion, 1u))
, m_display(display)
{
- display->addRegistryListener(&QWaylandXdgShell::handleRegistryGlobal, this);
+ display->addRegistryObserver(this);
}
QWaylandXdgShell::~QWaylandXdgShell()
{
- m_display->removeListener(&QWaylandXdgShell::handleRegistryGlobal, this);
+ m_display->removeRegistryObserver(this);
destroy();
}
@@ -489,12 +489,11 @@ void QWaylandXdgShell::xdg_wm_base_ping(uint32_t serial)
pong(serial);
}
-void QWaylandXdgShell::handleRegistryGlobal(void *data, wl_registry *registry, uint id,
+void QWaylandXdgShell::globalAdded(wl_registry *registry, uint id,
const QString &interface, uint version)
{
-// QWaylandXdgShell *xdgShell = static_cast<QWaylandXdgShell *>(data);
-// if (interface == QLatin1String(QWaylandXdgDecorationManagerV1::interface()->name))
-// xdgShell->m_xdgDecorationManager.reset(new QWaylandXdgDecorationManagerV1(registry, id, version));
+ if (interface == QLatin1String(QWaylandXdgDecorationManagerV1::interface()->name))
+ m_xdgDecorationManager.reset(new QWaylandXdgDecorationManagerV1(registry, id, version));
}
}
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
index 5aeec2eb..5b4891d9 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
@@ -58,6 +58,7 @@
#include <QtWaylandClient/qtwaylandclientglobal.h>
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <QtCore/QSize>
#include <QtGui/QRegion>
@@ -159,7 +160,7 @@ private:
friend class QWaylandXdgShell;
};
-class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_wm_base
+class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_wm_base, public QWaylandRegistryObserver
{
public:
QWaylandXdgShell(QWaylandDisplay *display, uint32_t id, uint32_t availableVersion);
@@ -172,8 +173,8 @@ protected:
void xdg_wm_base_ping(uint32_t serial) override;
private:
- static void handleRegistryGlobal(void *data, ::wl_registry *registry, uint id,
- const QString &interface, uint version);
+ void globalAdded(::wl_registry *registry, uint id,
+ const QString &interface, uint version) override;
QWaylandDisplay *m_display = nullptr;
QScopedPointer<QWaylandXdgDecorationManagerV1> m_xdgDecorationManager;
--
2.29.2
davidedmundson edited the content of this paste. (Show Details)Nov 30 2020, 4:46 PM
davidedmundson changed the title of this paste from untitled to Masterwork From Distant Lands.