effects/wobblywindows: Port to DeformEffect

This commit is contained in:
Vlad Zahorodnii 2021-05-26 18:32:44 +03:00
parent 5255ebf8d0
commit ab706e53dc
2 changed files with 17 additions and 15 deletions

View file

@ -188,7 +188,7 @@ void WobblyWindowsEffect::reconfigure(ReconfigureFlags)
bool WobblyWindowsEffect::supported()
{
return effects->isOpenGLCompositing() && effects->animationsSupported();
return DeformEffect::supported() && effects->animationsSupported();
}
void WobblyWindowsEffect::setParameterSet(const ParameterSet& pset)
@ -247,7 +247,6 @@ void WobblyWindowsEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& da
auto infoIt = windows.find(w);
if (infoIt != windows.end()) {
data.setTransformed();
data.quads = data.quads.makeRegularGrid(m_xTesselation, m_yTesselation);
// We have to reset the clip region in order to render clients below
// opaque wobbly windows.
@ -266,9 +265,11 @@ void WobblyWindowsEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& da
effects->prePaintWindow(w, data, presentTime);
}
void WobblyWindowsEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data)
void WobblyWindowsEffect::deform(EffectWindow *w, int mask, WindowPaintData &data, WindowQuadList &quads)
{
if (!(mask & PAINT_SCREEN_TRANSFORMED) && windows.contains(w)) {
quads = quads.makeRegularGrid(m_xTesselation, m_yTesselation);
WindowWobblyInfos& wwi = windows[w];
int tx = w->frameGeometry().x();
int ty = w->frameGeometry().y();
@ -278,17 +279,17 @@ void WobblyWindowsEffect::paintWindow(EffectWindow* w, int mask, QRegion region,
double top = 0.0;
double right = w->width();
double bottom = w->height();
for (int i = 0; i < data.quads.count(); ++i) {
for (int i = 0; i < quads.count(); ++i) {
for (int j = 0; j < 4; ++j) {
WindowVertex& v = data.quads[i][j];
WindowVertex& v = quads[i][j];
Pair uv = {v.x() / width, v.y() / height};
Pair newPos = computeBezierPoint(wwi, uv);
v.move(newPos.x - tx, newPos.y - ty);
}
left = qMin(left, data.quads[i].left());
top = qMin(top, data.quads[i].top());
right = qMax(right, data.quads[i].right());
bottom = qMax(bottom, data.quads[i].bottom());
left = qMin(left, quads[i].left());
top = qMin(top, quads[i].top());
right = qMax(right, quads[i].right());
bottom = qMax(bottom, quads[i].bottom());
}
QRectF dirtyRect(
left * data.xScale() + w->x() + data.xTranslation(),
@ -299,9 +300,6 @@ void WobblyWindowsEffect::paintWindow(EffectWindow* w, int mask, QRegion region,
dirtyRect.adjust(-1.0, -1.0, 1.0, 1.0);
m_updateRegion = m_updateRegion.united(dirtyRect.toRect());
}
// Call the next effect.
effects->paintWindow(w, mask, region, data);
}
void WobblyWindowsEffect::postPaintScreen()
@ -379,6 +377,7 @@ void WobblyWindowsEffect::startMovedResized(EffectWindow* w)
WindowWobblyInfos new_wwi;
initWobblyInfo(new_wwi, w->frameGeometry());
windows[w] = new_wwi;
redirect(w);
}
WindowWobblyInfos& wwi = windows[w];
@ -933,6 +932,7 @@ bool WobblyWindowsEffect::updateWindowWobblyDatas(EffectWindow* w, qreal time)
if (wwi.status != Moving && acc_sum < m_stopAcceleration && vel_sum < m_stopVelocity) {
freeWobblyInfo(wwi);
windows.remove(w);
unredirect(w);
if (windows.isEmpty())
effects->addRepaintFull();
return false;

View file

@ -11,7 +11,7 @@
#define KWIN_WOBBLYWINDOWS_H
// Include with base class for effects.
#include <kwineffects.h>
#include <kwindeformeffect.h>
namespace KWin
{
@ -21,7 +21,7 @@ struct ParameterSet;
/**
* Effect which wobble windows
*/
class WobblyWindowsEffect : public Effect
class WobblyWindowsEffect : public DeformEffect
{
Q_OBJECT
Q_PROPERTY(qreal stiffness READ stiffness)
@ -45,7 +45,6 @@ public:
void reconfigure(ReconfigureFlags) override;
void prePaintScreen(ScreenPrePaintData& data, std::chrono::milliseconds presentTime) override;
void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, std::chrono::milliseconds presentTime) override;
void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) override;
void postPaintScreen() override;
bool isActive() const override;
@ -115,6 +114,9 @@ public:
return m_resizeWobble;
}
protected:
void deform(EffectWindow *w, int mask, WindowPaintData &data, WindowQuadList &quads) override;
public Q_SLOTS:
void slotWindowStartUserMovedResized(KWin::EffectWindow *w);
void slotWindowStepUserMovedResized(KWin::EffectWindow *w, const QRect &geometry);