17#include "glideconfig.h"
33static const QSet<QString> s_blacklist{
34 QStringLiteral(
"ksmserver ksmserver"),
35 QStringLiteral(
"ksmserver-logout-greeter ksmserver-logout-greeter"),
36 QStringLiteral(
"ksplashqml ksplashqml"),
38 QStringLiteral(
"spectacle spectacle"),
39 QStringLiteral(
"spectacle org.kde.spectacle"),
42static QMatrix4x4 createPerspectiveMatrix(
const QRectF &rect,
const qreal scale,
const QMatrix4x4 &renderTargetTransformation)
44 QMatrix4x4 ret = renderTargetTransformation;
46 const float fovY = std::tan(qDegreesToRadians(60.0f) / 2);
47 const float aspect = 1.0f;
48 const float zNear = 0.1f;
49 const float zFar = 100.0f;
51 const float yMax = zNear * fovY;
52 const float yMin = -yMax;
53 const float xMin = yMin * aspect;
54 const float xMax = yMax * aspect;
56 ret.frustum(xMin, xMax, yMin, yMax, zNear, zFar);
58 const auto deviceRect =
scaledRect(rect, scale);
60 const float scaleFactor = 1.1 * fovY / yMax;
61 ret.translate(xMin * scaleFactor, yMax * scaleFactor, -1.1);
62 ret.scale((xMax - xMin) * scaleFactor / deviceRect.width(),
63 -(yMax - yMin) * scaleFactor / deviceRect.height(),
65 ret.translate(-deviceRect.x(), -deviceRect.y());
84 GlideConfig::self()->read();
85 m_duration = std::chrono::milliseconds(animationTime<GlideConfig>(160));
87 m_inParams.edge =
static_cast<RotationEdge>(GlideConfig::inRotationEdge());
88 m_inParams.angle.from = GlideConfig::inRotationAngle();
89 m_inParams.angle.to = 0.0;
90 m_inParams.distance.from = GlideConfig::inDistance();
91 m_inParams.distance.to = 0.0;
92 m_inParams.opacity.from = GlideConfig::inOpacity();
93 m_inParams.opacity.to = 1.0;
95 m_outParams.edge =
static_cast<RotationEdge>(GlideConfig::outRotationEdge());
96 m_outParams.angle.from = 0.0;
97 m_outParams.angle.to = GlideConfig::outRotationAngle();
98 m_outParams.distance.from = 0.0;
99 m_outParams.distance.to = GlideConfig::outDistance();
100 m_outParams.opacity.from = 1.0;
101 m_outParams.opacity.to = GlideConfig::outOpacity();
113 auto animationIt = m_animations.find(w);
114 if (animationIt != m_animations.end()) {
115 (*animationIt).timeLine.advance(presentTime);
124 auto animationIt = m_animations.constFind(w);
125 if (animationIt == m_animations.constEnd()) {
143 const QVector3D invOffset = oldProjMatrix.map(QVector3D(windowGeo.center()));
144 QMatrix4x4 invOffsetMatrix;
145 invOffsetMatrix.translate(invOffset.x(), invOffset.y());
153 const GlideParams params = w->
isDeleted() ? m_outParams : m_inParams;
154 const qreal t = (*animationIt).timeLine.value();
156 switch (params.edge) {
197 auto animationIt = m_animations.begin();
198 while (animationIt != m_animations.end()) {
199 if ((*animationIt).timeLine.done()) {
200 animationIt = m_animations.erase(animationIt);
212 return !m_animations.isEmpty();
227 if (!isGlideWindow(w)) {
236 if (addGrab && addGrab !=
this) {
242 GlideAnimation &animation = m_animations[w];
243 animation.timeLine.reset();
245 animation.timeLine.setDuration(m_duration);
246 animation.timeLine.setEasingCurve(QEasingCurve::InCurve);
251void GlideEffect::windowClosed(EffectWindow *w)
257 if (!isGlideWindow(w)) {
261 if (!w->isVisible() || w->skipsCloseAnimation()) {
266 if (closeGrab && closeGrab !=
this) {
272 GlideAnimation &animation = m_animations[w];
273 animation.deletedRef = EffectWindowDeletedRef(w);
274 animation.timeLine.reset();
276 animation.timeLine.setDuration(m_duration);
277 animation.timeLine.setEasingCurve(QEasingCurve::OutCurve);
282void GlideEffect::windowDataChanged(EffectWindow *w,
int role)
288 if (w->data(role).value<
void *>() ==
this) {
292 auto animationIt = m_animations.find(w);
293 if (animationIt != m_animations.end()) {
294 m_animations.erase(animationIt);
298bool GlideEffect::isGlideWindow(EffectWindow *w)
const
306 if (w->windowClass() == QLatin1String(
"plasmashell plasmashell")
307 || w->windowClass() == QLatin1String(
"plasmashell org.kde.plasmashell")) {
308 return w->hasDecoration();
311 if (s_blacklist.contains(w->windowClass())) {
315 if (w->hasDecoration()) {
320 if (w->isPopupWindow()) {
325 if (w->isLockScreen() || w->isOutline()) {
331 if (w->isX11Client() && !w->isManaged()) {
335 return w->isNormalWindow()
341#include "moc_glide.cpp"
Representation of a window used by/for Effect classes.
Q_SCRIPTABLE void setData(int role, const QVariant &data)
Q_SCRIPTABLE QVariant data(int role) const
QRectF frameGeometry() const
bool animationsSupported() const
void windowClosed(KWin::EffectWindow *w)
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
KSharedConfigPtr config() const
void windowAdded(KWin::EffectWindow *w)
Q_SCRIPTABLE void addRepaintFull()
Effect * activeFullScreenEffect() const
void windowDataChanged(KWin::EffectWindow *w, int role)
void postPaintScreen() override
void reconfigure(ReconfigureFlags flags) override
bool isActive() const override
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override
OutputTransform transform() const
QRectF renderRect() const
void setRotationAngle(qreal angle)
void setProjectionMatrix(const QMatrix4x4 &matrix)
qreal multiplyOpacity(qreal factor)
void setRotationAxis(const QVector3D &axis)
static double interpolate(double x, double y, double a)
void setRotationOrigin(const QVector3D &origin)
void translate(qreal x, qreal y=0.0, qreal z=0.0)
void setZTranslation(qreal translate)
@ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)