summaryrefslogtreecommitdiffstats
path: root/src/hardwareintegration
diff options
context:
space:
mode:
authorGiulio Camuffo <giulio.camuffo@kdab.com>2016-07-02 10:46:58 +0200
committerPaul Olav Tvete <paul.tvete@qt.io>2016-11-17 15:28:24 +0000
commit5b807802866c8df00cb3340d4f9bcc343be5973a (patch)
tree0fe08bebff92ebc5cf708ce97ede8a4e422399af /src/hardwareintegration
parent12f2e1e23fc1de16a42d3024561c0f839f9e96cd (diff)
Create and destroy the shell surface when showing and hiding
This changes the shell surface handling for windows, and instead of creating the shell surface at initialization time, and then attaching a null buffer to hide it, it creates the shell surface on setVisible(true), and destroys it on setVisible(false). This fixes hiding when using xdg_shell, as that interface defines that attaching a null buffer to an xdg_surface is an error. Also this should help with bugged EGL drivers which attach a buffer after eglSwapBuffers() returns, which used to cause a newly hidden window to get a new valid buffer after we attached a null one, showing it again. Task-number: QTBUG-47902 Change-Id: I8e0a0442319a98cc1361803ea7be1d079b36fc8c Reviewed-by: Johan Helsing <johan.helsing@qt.io> Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src/hardwareintegration')
-rw-r--r--src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp10
-rw-r--r--src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h4
-rw-r--r--src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglcontext.cpp4
-rw-r--r--src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxcontext.cpp4
4 files changed, 16 insertions, 6 deletions
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
index 236218e7f..6b5c53263 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
@@ -159,6 +159,12 @@ void QWaylandEglWindow::setVisible(bool visible)
{
QWaylandWindow::setVisible(visible);
if (!visible)
+ QMetaObject::invokeMethod(this, "doInvalidateSurface", Qt::QueuedConnection);
+}
+
+void QWaylandEglWindow::doInvalidateSurface()
+{
+ if (!window()->isVisible())
invalidateSurface();
}
@@ -168,6 +174,10 @@ void QWaylandEglWindow::invalidateSurface()
eglDestroySurface(m_clientBufferIntegration->eglDisplay(), m_eglSurface);
m_eglSurface = 0;
}
+ if (m_waylandEglWindow) {
+ wl_egl_window_destroy(m_waylandEglWindow);
+ m_waylandEglWindow = nullptr;
+ }
}
EGLSurface QWaylandEglWindow::eglSurface() const
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
index 556ed6879..bf656689a 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
@@ -54,6 +54,7 @@ class QWaylandGLContext;
class QWaylandEglWindow : public QWaylandWindow
{
+ Q_OBJECT
public:
QWaylandEglWindow(QWindow *window);
~QWaylandEglWindow();
@@ -75,6 +76,9 @@ public:
void invalidateSurface() Q_DECL_OVERRIDE;
void setVisible(bool visible) Q_DECL_OVERRIDE;
+private Q_SLOTS:
+ void doInvalidateSurface();
+
private:
QWaylandEglClientBufferIntegration *m_clientBufferIntegration;
struct wl_egl_window *m_waylandEglWindow;
diff --git a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglcontext.cpp b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglcontext.cpp
index e2e2f5519..c07ad5342 100644
--- a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglcontext.cpp
+++ b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglcontext.cpp
@@ -64,9 +64,7 @@ void QWaylandXCompositeEGLContext::swapBuffers(QPlatformSurface *surface)
QSize size = w->geometry().size();
- w->attach(w->buffer(), 0, 0);
- w->damage(QRect(QPoint(), size));
- w->commit();
+ w->commit(w->buffer(), QRegion(0, 0, size.width(), size.height()));
w->waitForFrameSync();
}
diff --git a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxcontext.cpp b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxcontext.cpp
index bc6e94fed..439acc00c 100644
--- a/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxcontext.cpp
+++ b/src/hardwareintegration/client/xcomposite-glx/qwaylandxcompositeglxcontext.cpp
@@ -90,9 +90,7 @@ void QWaylandXCompositeGLXContext::swapBuffers(QPlatformSurface *surface)
glXSwapBuffers(m_display, w->xWindow());
- w->attach(w->buffer(), 0, 0);
- w->damage(QRect(QPoint(), size));
- w->commit();
+ w->commit(w->buffer(), QRegion(0, 0, size.width(), size.height()));
w->waitForFrameSync();
}