16#include "sheetconfig.h"
28static QMatrix4x4 createPerspectiveMatrix(
const QRectF &rect,
const qreal scale)
32 const float fovY = std::tan(qDegreesToRadians(60.0f) / 2);
33 const float aspect = 1.0f;
34 const float zNear = 0.1f;
35 const float zFar = 100.0f;
37 const float yMax = zNear * fovY;
38 const float yMin = -yMax;
39 const float xMin = yMin * aspect;
40 const float xMax = yMax * aspect;
42 ret.frustum(xMin, xMax, yMin, yMax, zNear, zFar);
44 const auto deviceRect =
scaledRect(rect, scale);
46 const float scaleFactor = 1.1 * fovY / yMax;
47 ret.translate(xMin * scaleFactor, yMax * scaleFactor, -1.1);
48 ret.scale((xMax - xMin) * scaleFactor / deviceRect.width(),
49 -(yMax - yMin) * scaleFactor / deviceRect.height(),
51 ret.translate(-deviceRect.x(), -deviceRect.y());
67 SheetConfig::self()->read();
71 ? SheetConfig::animationTime()
73 m_duration = std::chrono::milliseconds(
static_cast<int>(d));
85 auto animationIt = m_animations.find(w);
86 if (animationIt != m_animations.end()) {
87 (*animationIt).timeLine.advance(presentTime);
96 auto animationIt = m_animations.constFind(w);
97 if (animationIt == m_animations.constEnd()) {
109 const QMatrix4x4 oldProjMatrix = createPerspectiveMatrix(viewport.
renderRect(), viewport.
scale());
111 const QVector3D invOffset = oldProjMatrix.map(QVector3D(windowGeo.center()));
112 QMatrix4x4 invOffsetMatrix;
113 invOffsetMatrix.translate(invOffset.x(), invOffset.y());
118 const QPointF offset = screenGeo.center() - windowGeo.center();
121 const qreal t = (*animationIt).timeLine.value();
124 data *= QVector3D(1.0, t, t);
134 auto animationIt = m_animations.begin();
135 while (animationIt != m_animations.end()) {
138 if ((*animationIt).timeLine.done()) {
139 animationIt = m_animations.erase(animationIt);
145 if (m_animations.isEmpty()) {
154 return !m_animations.isEmpty();
169 if (!isSheetWindow(w)) {
173 Animation &animation = m_animations[w];
174 animation.parentY = 0;
175 animation.timeLine.reset();
176 animation.timeLine.setDuration(m_duration);
178 animation.timeLine.setEasingCurve(QEasingCurve::Linear);
181 auto parentIt = std::find_if(windows.constBegin(), windows.constEnd(),
182 [w](EffectWindow *p) {
183 return p->findModal() == w;
185 if (parentIt != windows.constEnd()) {
186 animation.parentY = (*parentIt)->y();
194void SheetEffect::slotWindowClosed(EffectWindow *w)
200 if (!isSheetWindow(w) || w->skipsCloseAnimation()) {
204 Animation &animation = m_animations[w];
205 animation.deletedRef = EffectWindowDeletedRef(w);
206 animation.timeLine.reset();
207 animation.parentY = 0;
208 animation.timeLine.setDuration(m_duration);
210 animation.timeLine.setEasingCurve(QEasingCurve::Linear);
213 auto parentIt = std::find_if(windows.constBegin(), windows.constEnd(),
214 [w](EffectWindow *p) {
215 return p->findModal() == w;
217 if (parentIt != windows.constEnd()) {
218 animation.parentY = (*parentIt)->y();
226bool SheetEffect::isSheetWindow(EffectWindow *w)
const
233#include "moc_sheet.cpp"
Representation of a window used by/for Effect classes.
Q_SCRIPTABLE void addRepaintFull()
Q_SCRIPTABLE void setData(int role, const QVariant &data)
QRectF frameGeometry() const
bool animationsSupported() const
void windowClosed(KWin::EffectWindow *w)
QList< EffectWindow * > stackingOrder
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
QRect virtualScreenGeometry
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 postPaintWindow(EffectWindow *w)
QRectF renderRect() const
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void reconfigure(ReconfigureFlags flags) 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
void postPaintWindow(EffectWindow *w) override
bool isActive() const override
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)
static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)
void translate(qreal x, qreal y=0.0, qreal z=0.0)
@ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)