[wayland] Set depth in ShellClient depending on whether the Buffer has alpha
We need to set the depth in order to properly determine whether the Surface has an alpha channel and whether blending needs to be enabled for rendering. For this a new method is introduced in Toplevel to set the depth. If the depth changed in a way that the Toplevel gained or lost the alpha channel a signal is emitted which implies that the hasAlpha property of Toplevel is no longer constant.
This commit is contained in:
parent
99237c9b3f
commit
5a98d8bbbd
3 changed files with 20 additions and 1 deletions
|
@ -165,6 +165,7 @@ void ShellClient::addDamage(const QRegion &damage)
|
||||||
}
|
}
|
||||||
setGeometry(QRect(position, m_clientSize));
|
setGeometry(QRect(position, m_clientSize));
|
||||||
}
|
}
|
||||||
|
setDepth(m_shellSurface->surface()->buffer()->hasAlphaChannel() ? 32 : 24);
|
||||||
setReadyForPainting();
|
setReadyForPainting();
|
||||||
Toplevel::addDamage(damage);
|
Toplevel::addDamage(damage);
|
||||||
}
|
}
|
||||||
|
|
13
toplevel.cpp
13
toplevel.cpp
|
@ -42,6 +42,7 @@ namespace KWin
|
||||||
|
|
||||||
Toplevel::Toplevel()
|
Toplevel::Toplevel()
|
||||||
: m_visual(XCB_NONE)
|
: m_visual(XCB_NONE)
|
||||||
|
, bit_depth(24)
|
||||||
, info(NULL)
|
, info(NULL)
|
||||||
, ready_for_painting(true)
|
, ready_for_painting(true)
|
||||||
, m_isDamaged(false)
|
, m_isDamaged(false)
|
||||||
|
@ -475,6 +476,18 @@ QByteArray Toplevel::windowRole() const
|
||||||
return QByteArray(info->windowRole());
|
return QByteArray(info->windowRole());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Toplevel::setDepth(int depth)
|
||||||
|
{
|
||||||
|
if (bit_depth == depth) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const bool oldAlpha = hasAlpha();
|
||||||
|
bit_depth = depth;
|
||||||
|
if (oldAlpha != hasAlpha()) {
|
||||||
|
emit hasAlphaChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#include "toplevel.moc"
|
#include "toplevel.moc"
|
||||||
|
|
|
@ -71,7 +71,7 @@ class Toplevel
|
||||||
: public QObject
|
: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool alpha READ hasAlpha CONSTANT)
|
Q_PROPERTY(bool alpha READ hasAlpha NOTIFY hasAlphaChanged)
|
||||||
Q_PROPERTY(qulonglong frameId READ frameId)
|
Q_PROPERTY(qulonglong frameId READ frameId)
|
||||||
Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)
|
Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)
|
||||||
Q_PROPERTY(QRect visibleRect READ visibleRect)
|
Q_PROPERTY(QRect visibleRect READ visibleRect)
|
||||||
|
@ -414,6 +414,10 @@ Q_SIGNALS:
|
||||||
* @since 5.3
|
* @since 5.3
|
||||||
**/
|
**/
|
||||||
void surfaceIdChanged(quint32);
|
void surfaceIdChanged(quint32);
|
||||||
|
/**
|
||||||
|
* @since 5.4
|
||||||
|
**/
|
||||||
|
void hasAlphaChanged();
|
||||||
|
|
||||||
protected Q_SLOTS:
|
protected Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
|
@ -460,6 +464,7 @@ protected:
|
||||||
friend QDebug& operator<<(QDebug& stream, const Toplevel*);
|
friend QDebug& operator<<(QDebug& stream, const Toplevel*);
|
||||||
void deleteEffectWindow();
|
void deleteEffectWindow();
|
||||||
virtual bool shouldUnredirect() const = 0;
|
virtual bool shouldUnredirect() const = 0;
|
||||||
|
void setDepth(int depth);
|
||||||
QRect geom;
|
QRect geom;
|
||||||
xcb_visualid_t m_visual;
|
xcb_visualid_t m_visual;
|
||||||
int bit_depth;
|
int bit_depth;
|
||||||
|
|
Loading…
Reference in a new issue