diff options
-rw-r--r-- | src/launcher-lib/waylandqtamclientextension.cpp | 53 | ||||
-rw-r--r-- | src/launcher-lib/waylandqtamclientextension_p.h | 2 |
2 files changed, 30 insertions, 25 deletions
diff --git a/src/launcher-lib/waylandqtamclientextension.cpp b/src/launcher-lib/waylandqtamclientextension.cpp index 69cd7dac..b58fe676 100644 --- a/src/launcher-lib/waylandqtamclientextension.cpp +++ b/src/launcher-lib/waylandqtamclientextension.cpp @@ -44,7 +44,7 @@ #include <QWindow> #include <QGuiApplication> -#include <QPlatformSurfaceEvent> +#include <QEvent> #include <qpa/qplatformnativeinterface.h> #include <QtAppManCommon/logging.h> @@ -64,29 +64,31 @@ WaylandQtAMClientExtension::~WaylandQtAMClientExtension() bool WaylandQtAMClientExtension::eventFilter(QObject *o, QEvent *e) { - if (e->type() == QEvent::PlatformSurface) { - QWindow *window = qobject_cast<QWindow *>(o); - if (!window) - return false; + if (e->type() == QEvent::Expose) { if (!isActive()) { - qCWarning(LogGraphics) << "Tried to (un)register a Wayland qtam_extended_surface, but the extension itself is not active"; + qCWarning(LogGraphics) << "WaylandQtAMClientExtension is not active"; return false; } - switch (static_cast<QPlatformSurfaceEvent *>(e)->surfaceEventType()) { - case QPlatformSurfaceEvent::SurfaceCreated: { - auto surface = static_cast<struct ::wl_surface *>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window)); - m_windows.insert(surface, window); - const QVariantMap wp = windowProperties(window); - for (auto it = wp.cbegin(); it != wp.cend(); ++it) - sendPropertyToServer(surface, it.key(), it.value()); - break; - } - case QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed: - // NOOP - break; - } + if (static_cast<QExposeEvent *>(e)->region().isNull()) + return false; + + QWindow *window = qobject_cast<QWindow *>(o); + Q_ASSERT(window); + + if (m_windowToSurface.contains(window)) + return false; + + auto surface = static_cast<struct ::wl_surface *> + (QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window)); + m_windowToSurface.insert(window, surface); + const QVariantMap wp = windowProperties(window); + for (auto it = wp.cbegin(); it != wp.cend(); ++it) + sendPropertyToServer(surface, it.key(), it.value()); + } else if (e->type() == QEvent::Hide) { + m_windowToSurface.remove(qobject_cast<QWindow *>(o)); } + return false; } @@ -95,7 +97,8 @@ QVariantMap WaylandQtAMClientExtension::windowProperties(QWindow *window) const return m_windowProperties.value(window); } -void WaylandQtAMClientExtension::sendPropertyToServer(struct ::wl_surface *surface, const QString &name, const QVariant &value) +void WaylandQtAMClientExtension::sendPropertyToServer(struct ::wl_surface *surface, const QString &name, + const QVariant &value) { QByteArray byteValue; QDataStream ds(&byteValue, QIODevice::WriteOnly); @@ -106,8 +109,9 @@ void WaylandQtAMClientExtension::sendPropertyToServer(struct ::wl_surface *surfa void WaylandQtAMClientExtension::setWindowProperty(QWindow *window, const QString &name, const QVariant &value) { - if (setWindowPropertyHelper(window, name, value)) { - auto surface = static_cast<struct ::wl_surface *>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window)); + if (setWindowPropertyHelper(window, name, value) && m_windowToSurface.contains(window)) { + auto surface = static_cast<struct ::wl_surface *> + (QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window)); if (surface) sendPropertyToServer(surface, name, value); } @@ -133,14 +137,15 @@ void WaylandQtAMClientExtension::clearWindowPropertyCache(QWindow *window) m_windowProperties.remove(window); } -void WaylandQtAMClientExtension::qtam_extension_window_property_changed(wl_surface *surface, const QString &name, wl_array *value) +void WaylandQtAMClientExtension::qtam_extension_window_property_changed(wl_surface *surface, const QString &name, + wl_array *value) { const QByteArray data = QByteArray::fromRawData(static_cast<char *>(value->data), int(value->size)); QDataStream ds(data); QVariant variantValue; ds >> variantValue; - QWindow *window = m_windows.value(surface); + QWindow *window = m_windowToSurface.key(surface); qCDebug(LogWaylandDebug) << "CLIENT <<prop<<" << window << name << variantValue; if (!window) return; diff --git a/src/launcher-lib/waylandqtamclientextension_p.h b/src/launcher-lib/waylandqtamclientextension_p.h index c2814855..086cb44c 100644 --- a/src/launcher-lib/waylandqtamclientextension_p.h +++ b/src/launcher-lib/waylandqtamclientextension_p.h @@ -88,7 +88,7 @@ private: void qtam_extension_window_property_changed(wl_surface *surface, const QString &name, wl_array *value) override; QMap<QWindow *, QVariantMap> m_windowProperties; - QMap<::wl_surface *, QWindow *> m_windows; + QMap<QWindow *, ::wl_surface *> m_windowToSurface; }; QT_END_NAMESPACE_AM |