From 6be66ae20e033b17b7e94e52e58fb1955c90d1ac Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Thu, 15 Feb 2024 22:19:12 +0000 Subject: [PATCH] make roundtrip async --- src/qwaylandlayersurface.cpp | 33 ++++++++++++++++++++++++++++++++- src/qwaylandlayersurface_p.h | 7 ++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/qwaylandlayersurface.cpp b/src/qwaylandlayersurface.cpp index 44cc382..628a8a7 100644 --- a/src/qwaylandlayersurface.cpp +++ b/src/qwaylandlayersurface.cpp @@ -18,6 +18,17 @@ namespace LayerShellQt { + +const wl_callback_listener QWaylandLayerSurface::syncCallbackListener = { + [](void *data, struct wl_callback *callback, uint32_t time){ + Q_UNUSED(time); + wl_callback_destroy(callback); + QWaylandLayerSurface *display = static_cast(data); + display->mSyncCallback = nullptr; + display->handleWaylandSync(); + } +}; + QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShellIntegration *shell, QtWaylandClient::QWaylandWindow *window) : QtWaylandClient::QWaylandShellSurface(window) , QtWayland::zwlr_layer_surface_v1() @@ -77,6 +88,26 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShellIntegration *shell, } } +void QWaylandLayerSurface::requestWaylandSync() +{ + if (mSyncCallback) + return; + + mSyncCallback = wl_display_sync(m_window->display()->wl_display()); + wl_callback_add_listener(mSyncCallback, &syncCallbackListener, this); +} + +void QWaylandLayerSurface::handleWaylandSync() +{ + if (!window()->isExposed()) + return; +#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0) + window()->handleExpose(QRect(QPoint(), m_pendingSize)); +#else + window()->sendRecursiveExposeEvent(); +#endif +} + QWaylandLayerSurface::~QWaylandLayerSurface() { destroy(); @@ -172,7 +203,7 @@ void QWaylandLayerSurface::setWindowGeometry(const QRect &geometry) size.setHeight(0); } set_size(size.width(), size.height()); - wl_display_roundtrip(m_window->display()->wl_display()); + requestWaylandSync(); } bool QWaylandLayerSurface::requestActivate() diff --git a/src/qwaylandlayersurface_p.h b/src/qwaylandlayersurface_p.h index 65e8385..c879df4 100644 --- a/src/qwaylandlayersurface_p.h +++ b/src/qwaylandlayersurface_p.h @@ -30,7 +30,7 @@ public: bool isExposed() const override { - return m_configured; + return m_configured && !mSyncCallback; } void attachPopup(QtWaylandClient::QWaylandShellSurface *popup) override; @@ -48,6 +48,8 @@ public: void setXdgActivationToken(const QString &token) override; void requestXdgActivationToken(quint32 serial) override; + void requestWaylandSync(); + void handleWaylandSync(); private: void zwlr_layer_surface_v1_configure(uint32_t serial, uint32_t width, uint32_t height) override; void zwlr_layer_surface_v1_closed() override; @@ -57,7 +59,10 @@ private: QtWaylandClient::QWaylandWindow *m_window; QSize m_pendingSize; QString m_activationToken; + + static const wl_callback_listener syncCallbackListener; bool m_configured = false; + struct wl_callback *mSyncCallback = nullptr; }; }