[aurorae] Do not update shadow from ::paint

Paint is in the middle of the compositor rendering loop. Updating
the shadow at that point breaks KWin. Thus we delay the update to
the next event cycle. Obviously it would be even better to only
update the shadow if it changed, but that might be too expensive.
This commit is contained in:
Martin Gräßlin 2014-12-12 22:12:11 +01:00
parent 97de9856ea
commit 060b310082
2 changed files with 11 additions and 2 deletions

View file

@ -511,13 +511,19 @@ void Decoration::paint(QPainter *painter, const QRect &repaintRegion)
m_padding->top(),
m_buffer.width() - m_padding->left() - m_padding->right(),
m_buffer.height() - m_padding->top() - m_padding->bottom()));
setShadow(s);
m_scheduledShadow = s;
} else {
setShadow(QSharedPointer<KDecoration2::DecorationShadow>());
m_scheduledShadow = QSharedPointer<KDecoration2::DecorationShadow>();
}
QMetaObject::invokeMethod(this, "updateShadow", Qt::QueuedConnection);
painter->drawImage(rect(), m_buffer, r);
}
void Decoration::updateShadow()
{
setShadow(m_scheduledShadow);
}
QMouseEvent Decoration::translatedMouseEvent(QMouseEvent *orig)
{
if (!m_padding || client().data()->isMaximized()) {

View file

@ -61,6 +61,8 @@ public Q_SLOTS:
void init() override;
void installTitleItem(QQuickItem *item);
void updateShadow();
Q_SIGNALS:
void configChanged();
@ -92,6 +94,7 @@ private:
QScopedPointer<QTimer> m_updateTimer;
QScopedPointer<QOpenGLContext> m_context;
QScopedPointer<QOffscreenSurface> m_offscreenSurface;
QSharedPointer<KDecoration2::DecorationShadow> m_scheduledShadow;
};
class ThemeFinder : public QObject