diff --git a/abstract_egl_backend.h b/abstract_egl_backend.h --- a/abstract_egl_backend.h +++ b/abstract_egl_backend.h @@ -29,8 +29,9 @@ namespace KWin { -class KWIN_EXPORT AbstractEglBackend : public OpenGLBackend +class KWIN_EXPORT AbstractEglBackend : public QObject, public OpenGLBackend { + Q_OBJECT public: virtual ~AbstractEglBackend(); bool makeCurrent() override; @@ -49,8 +50,6 @@ return m_config; } - static void unbindWaylandDisplay(); - protected: AbstractEglBackend(); void setEglDisplay(const EGLDisplay &display); @@ -69,6 +68,8 @@ bool createContext(); private: + void unbindWaylandDisplay(); + EGLDisplay m_display = EGL_NO_DISPLAY; EGLSurface m_surface = EGL_NO_SURFACE; EGLContext m_context = EGL_NO_CONTEXT; diff --git a/abstract_egl_backend.cpp b/abstract_egl_backend.cpp --- a/abstract_egl_backend.cpp +++ b/abstract_egl_backend.cpp @@ -18,6 +18,7 @@ along with this program. If not, see . *********************************************************************/ #include "abstract_egl_backend.h" +#include "composite.h" #include "egl_context_attribute_builder.h" #include "options.h" #include "platform.h" @@ -54,17 +55,18 @@ #endif AbstractEglBackend::AbstractEglBackend() - : OpenGLBackend() + : QObject(nullptr) + , OpenGLBackend() { + connect(Compositor::self(), &Compositor::aboutToDestroy, this, &AbstractEglBackend::unbindWaylandDisplay); } AbstractEglBackend::~AbstractEglBackend() = default; void AbstractEglBackend::unbindWaylandDisplay() { - auto display = kwinApp()->platform()->sceneEglDisplay(); - if (eglUnbindWaylandDisplayWL && display != EGL_NO_DISPLAY) { - eglUnbindWaylandDisplayWL(display, *(WaylandServer::self()->display())); + if (eglUnbindWaylandDisplayWL && m_display != EGL_NO_DISPLAY) { + eglUnbindWaylandDisplayWL(m_display, *(WaylandServer::self()->display())); } } diff --git a/composite.cpp b/composite.cpp --- a/composite.cpp +++ b/composite.cpp @@ -19,7 +19,6 @@ *********************************************************************/ #include "composite.h" -#include "abstract_egl_backend.h" #include "dbusinterface.h" #include "utils.h" #include @@ -146,7 +145,6 @@ Compositor::~Compositor() { emit aboutToDestroy(); - AbstractEglBackend::unbindWaylandDisplay(); finish(); deleteUnusedSupportProperties(); delete cm_selection; diff --git a/plugins/platforms/drm/egl_gbm_backend.h b/plugins/platforms/drm/egl_gbm_backend.h --- a/plugins/platforms/drm/egl_gbm_backend.h +++ b/plugins/platforms/drm/egl_gbm_backend.h @@ -33,7 +33,7 @@ /** * @brief OpenGL Backend using Egl on a GBM surface. **/ -class EglGbmBackend : public QObject, public AbstractEglBackend +class EglGbmBackend : public AbstractEglBackend { Q_OBJECT public: diff --git a/plugins/platforms/drm/egl_gbm_backend.cpp b/plugins/platforms/drm/egl_gbm_backend.cpp --- a/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/plugins/platforms/drm/egl_gbm_backend.cpp @@ -36,8 +36,7 @@ { EglGbmBackend::EglGbmBackend(DrmBackend *b) - : QObject(NULL) - , AbstractEglBackend() + : AbstractEglBackend() , m_backend(b) { // Egl is always direct rendering diff --git a/plugins/platforms/virtual/egl_gbm_backend.h b/plugins/platforms/virtual/egl_gbm_backend.h --- a/plugins/platforms/virtual/egl_gbm_backend.h +++ b/plugins/platforms/virtual/egl_gbm_backend.h @@ -31,9 +31,8 @@ /** * @brief OpenGL Backend using Egl on a GBM surface. **/ -class EglGbmBackend : public QObject, public AbstractEglBackend +class EglGbmBackend : public AbstractEglBackend { - Q_OBJECT public: EglGbmBackend(VirtualBackend *b); virtual ~EglGbmBackend(); diff --git a/plugins/platforms/virtual/egl_gbm_backend.cpp b/plugins/platforms/virtual/egl_gbm_backend.cpp --- a/plugins/platforms/virtual/egl_gbm_backend.cpp +++ b/plugins/platforms/virtual/egl_gbm_backend.cpp @@ -42,8 +42,7 @@ { EglGbmBackend::EglGbmBackend(VirtualBackend *b) - : QObject(nullptr) - , AbstractEglBackend() + : AbstractEglBackend() , m_backend(b) { // Egl is always direct rendering diff --git a/plugins/platforms/wayland/egl_wayland_backend.h b/plugins/platforms/wayland/egl_wayland_backend.h --- a/plugins/platforms/wayland/egl_wayland_backend.h +++ b/plugins/platforms/wayland/egl_wayland_backend.h @@ -47,7 +47,7 @@ * repaints, which is obviously not optimal. Best solution is probably to go for buffer_age extension * and make it the only available solution next to fullscreen repaints. **/ -class EglWaylandBackend : public QObject, public AbstractEglBackend +class EglWaylandBackend : public AbstractEglBackend { Q_OBJECT public: diff --git a/plugins/platforms/wayland/egl_wayland_backend.cpp b/plugins/platforms/wayland/egl_wayland_backend.cpp --- a/plugins/platforms/wayland/egl_wayland_backend.cpp +++ b/plugins/platforms/wayland/egl_wayland_backend.cpp @@ -39,8 +39,7 @@ { EglWaylandBackend::EglWaylandBackend(Wayland::WaylandBackend *b) - : QObject(NULL) - , AbstractEglBackend() + : AbstractEglBackend() , m_bufferAge(0) , m_wayland(b) , m_overlay(NULL)