diff options
Diffstat (limited to 'src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp')
-rw-r--r-- | src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp index bf37572da..0b014cd5c 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp @@ -4,6 +4,7 @@ #include "qwaylandeglwindow_p.h" #include <QtWaylandClient/private/qwaylandscreen_p.h> +#include <QtWaylandClient/private/qwaylandsurface_p.h> #include "qwaylandglcontext_p.h" #include <QtGui/private/qeglconvenience_p.h> @@ -23,6 +24,10 @@ QWaylandEglWindow::QWaylandEglWindow(QWindow *window, QWaylandDisplay *display) , m_clientBufferIntegration(static_cast<QWaylandEglClientBufferIntegration *>(mDisplay->clientBufferIntegration())) , m_format(window->requestedFormat()) { + connect(display, &QWaylandDisplay::connected, this, [this] { + m_clientBufferIntegration = static_cast<QWaylandEglClientBufferIntegration *>( + mDisplay->clientBufferIntegration()); + }); } QWaylandEglWindow::~QWaylandEglWindow() @@ -60,7 +65,7 @@ void QWaylandEglWindow::setGeometry(const QRect &rect) void QWaylandEglWindow::updateSurface(bool create) { - QMargins margins = mWindowDecoration ? frameMargins() : QMargins{}; + QMargins margins = clientSideMargins(); QRect rect = geometry(); QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale(); @@ -79,6 +84,7 @@ void QWaylandEglWindow::updateSurface(bool create) } mOffset = QPoint(); } else { + QReadLocker locker(&mSurfaceLock); if (m_waylandEglWindow) { int current_width, current_height; static bool disableResizeCheck = qgetenv("QT_WAYLAND_DISABLE_RESIZECHECK").toInt(); @@ -93,8 +99,8 @@ void QWaylandEglWindow::updateSurface(bool create) m_resize = true; } - } else if (create && wlSurface()) { - m_waylandEglWindow = wl_egl_window_create(wlSurface(), sizeWithMargins.width(), sizeWithMargins.height()); + } else if (create && mSurface) { + m_waylandEglWindow = wl_egl_window_create(mSurface->object(), sizeWithMargins.width(), sizeWithMargins.height()); m_requestedSize = sizeWithMargins; } @@ -104,7 +110,7 @@ void QWaylandEglWindow::updateSurface(bool create) if (mDisplay->supportsWindowDecoration()) fmt.setAlphaBufferSize(8); EGLConfig eglConfig = q_configFromGLFormat(m_clientBufferIntegration->eglDisplay(), fmt); - m_format = q_glFormatFromConfig(m_clientBufferIntegration->eglDisplay(), eglConfig); + m_format = q_glFormatFromConfig(m_clientBufferIntegration->eglDisplay(), eglConfig, fmt); m_eglSurface = eglCreateWindowSurface(m_clientBufferIntegration->eglDisplay(), eglConfig, eglw, 0); if (Q_UNLIKELY(m_eglSurface == EGL_NO_SURFACE)) qCWarning(lcQpaWayland, "Could not create EGL surface (EGL error 0x%x)\n", eglGetError()); @@ -115,7 +121,7 @@ void QWaylandEglWindow::updateSurface(bool create) QRect QWaylandEglWindow::contentsRect() const { QRect r = geometry(); - QMargins m = frameMargins(); + QMargins m = clientSideMargins(); return QRect(m.left(), m.bottom(), r.width(), r.height()); } @@ -134,6 +140,8 @@ void QWaylandEglWindow::invalidateSurface() wl_egl_window_destroy(m_waylandEglWindow); m_waylandEglWindow = nullptr; } + delete m_contentFBO; + m_contentFBO = nullptr; } EGLSurface QWaylandEglWindow::eglSurface() const |