5e104fbc12
Summary: Consider current implementation of the Squash effect: if a window was minimized, an animation will be started; if the window is unminimized and the animation is still active (that can happen when user clicks on app's icon really fast), the animation will be stopped and a new one will be created. Such behavior can lead to rapid jumps in the observed "animation". A better approach would be first try to **reverse** the already active animation, and if that attempt wasn't successful, start a new animation. This patch introduces a new function to the scripted effects API that lets JavaScript effects to control direction of animations. The prototype of the function looks as follows: redirect(<animation id(s)>, <direction>, [<termination policy>]) the first argument is an animation id or a list of animation ids, the second argument specifies the new direction of the animation or animations if a list of ids was passed as the first argument. The third argument specifies whether the animation(s) should be terminated when it(they) reaches the source position, currently it's relevant only for animations that are created with set() function. The termination policy argument is optional, by default it's Effect.TerminateAtSource. We can use this function to fix issues with rapid jumps in the Squash effect. Also, redirect() lets us to write effects for simple animations in slightly different style: first, we have to start the main animation (e.g. for the Dialog Parent effect, it would be dimming of main windows) and then change direction of the animation depending on external events, e.g. when the Desktop Cube effect is activated. Reviewers: #kwin, davidedmundson Reviewed By: #kwin, davidedmundson Subscribers: davidedmundson, abetts, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D16449
108 lines
3 KiB
C++
108 lines
3 KiB
C++
/********************************************************************
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
Copyright (C) 2011 Thomas Lübking <thomas.luebking@web.de>
|
|
Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*********************************************************************/
|
|
|
|
#ifndef ANIDATA_H
|
|
#define ANIDATA_H
|
|
|
|
#include "kwinanimationeffect.h"
|
|
|
|
#include <QEasingCurve>
|
|
|
|
namespace KWin {
|
|
|
|
/**
|
|
* Wraps effects->setActiveFullScreenEffect for the duration of it's lifespan
|
|
*/
|
|
class FullScreenEffectLock
|
|
{
|
|
public:
|
|
FullScreenEffectLock(Effect *effect);
|
|
~FullScreenEffectLock();
|
|
private:
|
|
Q_DISABLE_COPY(FullScreenEffectLock)
|
|
};
|
|
typedef QSharedPointer<FullScreenEffectLock> FullScreenEffectLockPtr;
|
|
|
|
/**
|
|
* Keeps windows alive during animation after they got closed
|
|
**/
|
|
class KeepAliveLock
|
|
{
|
|
public:
|
|
KeepAliveLock(EffectWindow *w);
|
|
~KeepAliveLock();
|
|
|
|
private:
|
|
EffectWindow *m_window;
|
|
Q_DISABLE_COPY(KeepAliveLock)
|
|
};
|
|
typedef QSharedPointer<KeepAliveLock> KeepAliveLockPtr;
|
|
|
|
/**
|
|
* References the previous window pixmap to prevent discarding.
|
|
**/
|
|
class PreviousWindowPixmapLock
|
|
{
|
|
public:
|
|
PreviousWindowPixmapLock(EffectWindow *w);
|
|
~PreviousWindowPixmapLock();
|
|
|
|
private:
|
|
EffectWindow *m_window;
|
|
Q_DISABLE_COPY(PreviousWindowPixmapLock)
|
|
};
|
|
typedef QSharedPointer<PreviousWindowPixmapLock> PreviousWindowPixmapLockPtr;
|
|
|
|
class KWINEFFECTS_EXPORT AniData {
|
|
public:
|
|
AniData();
|
|
AniData(AnimationEffect::Attribute a, int meta, const FPx2 &to,
|
|
int delay, const FPx2 &from, bool waitAtSource,
|
|
FullScreenEffectLockPtr=FullScreenEffectLockPtr(),
|
|
bool keepAlive = true, PreviousWindowPixmapLockPtr previousWindowPixmapLock = {});
|
|
|
|
bool isActive() const;
|
|
|
|
inline bool isOneDimensional() const {
|
|
return from[0] == from[1] && to[0] == to[1];
|
|
}
|
|
|
|
quint64 id{0};
|
|
QString debugInfo() const;
|
|
AnimationEffect::Attribute attribute;
|
|
int customCurve;
|
|
FPx2 from, to;
|
|
TimeLine timeLine;
|
|
uint meta;
|
|
qint64 startTime;
|
|
QSharedPointer<FullScreenEffectLock> fullScreenEffectLock;
|
|
bool waitAtSource;
|
|
bool keepAlive;
|
|
KeepAliveLockPtr keepAliveLock;
|
|
PreviousWindowPixmapLockPtr previousWindowPixmapLock;
|
|
AnimationEffect::TerminationFlags terminationFlags;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
QDebug operator<<(QDebug dbg, const KWin::AniData &a);
|
|
|
|
#endif // ANIDATA_H
|