[kwin/aurorae] Have the QMutex in the Factory and not in each Client

This seems to fix the crash which could happen when closing a window. At
least the kwindowsystem unit tests no longer crash KWin (it was very
reliable before).

BUG: 332091
icc-effect-5.14.5
Martin Gräßlin 2014-03-27 14:17:07 +01:00
parent 086bc69ec5
commit cdd9c5bcf5
2 changed files with 8 additions and 4 deletions

View File

@ -51,6 +51,7 @@ AuroraeFactory::AuroraeFactory(QObject *parent)
, m_engine(new QQmlEngine(this))
, m_component(new QQmlComponent(m_engine, this))
, m_engineType(AuroraeEngine)
, m_mutex(new QMutex(QMutex::Recursive))
{
init();
connect(options(), &KDecorationOptions::buttonsChanged, this, &AuroraeFactory::buttonsChanged);
@ -245,7 +246,6 @@ AuroraeClient::AuroraeClient(KDecorationBridge *bridge, KDecorationFactory *fact
: KDecoration(bridge, factory)
, m_view(nullptr)
, m_item(AuroraeFactory::instance()->createQmlDecoration(this))
, m_mutex(new QMutex(QMutex::Recursive))
{
connect(AuroraeFactory::instance(), SIGNAL(buttonsChanged()), SIGNAL(buttonsChanged()));
connect(AuroraeFactory::instance(), SIGNAL(configChanged()), SIGNAL(configChanged()));
@ -282,7 +282,7 @@ void AuroraeClient::init()
m_view->setRenderTarget(m_fbo.data());
});
connect(m_view, &QQuickWindow::afterRendering, [this]{
QMutexLocker locker(m_mutex.data());
QMutexLocker locker(AuroraeFactory::instance()->mutex());
m_buffer = m_fbo->toImage();
});
connect(m_view, &QQuickWindow::afterRendering, this,
@ -563,7 +563,7 @@ bool AuroraeClient::animationsSupported() const
void AuroraeClient::render(QPaintDevice *device, const QRegion &sourceRegion)
{
QMutexLocker locker(m_mutex.data());
QMutexLocker locker(AuroraeFactory::instance()->mutex());
QPainter painter(device);
painter.setClipRegion(sourceRegion);
painter.drawImage(QPoint(0, 0), m_buffer);

View File

@ -57,6 +57,10 @@ public:
return m_themeName;
}
QMutex *mutex() {
return m_mutex.data();
}
private:
enum EngineType {
AuroraeEngine,
@ -83,6 +87,7 @@ private:
QQmlComponent *m_component;
EngineType m_engineType;
QString m_themeName;
QScopedPointer<QMutex> m_mutex;
};
class AuroraeClient : public KDecoration
@ -162,7 +167,6 @@ private:
QScopedPointer<QQuickItem> m_item;
QScopedPointer<QOpenGLFramebufferObject> m_fbo;
QImage m_buffer;
QScopedPointer<QMutex> m_mutex;
};
}