2011-10-19 23:04:52 +00:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2011 Thomas Lübking <thomas.luebking@web.de>
|
[effects/dialogparent] Fix flickering of parent windows
Summary:
If a modal window is closed and some alternative effect that animates
the disappearing of windows is enabled(e.g. the Glide effect, or the
Scale effect), the Dialog Parent effect can cause flickering of the
parent window because its animation duration doesn't match duration of
those alternative effects.
Also, if the Fade effect, the Glide effect, and the Scale effect are
disabled, the Dialog Parent will keep the parent window alive for no
good reason.
This change addresses that problem by adding keepAlive property to
`animate` function so scripted effects have more control over lifetime
of animated windows.
If both a modal window and its parent window are closed at the same time
(and there is no effect that animates the disappearing of windows), the
Dialog Parent will stop immediately(because windowDeleted will be
emitted right after windowClosed signal).
If both a modal window and its parent window are closed at the same time
(and there is effect that animates the disappearing of windows), the
Dialog Parent won't reference the latter window. Thus, it won't cause
flickering. I.e. it will "passively" animate parent windows.
BUG: 355036
FIXED-IN: 5.15.0
Reviewers: #kwin, davidedmundson
Reviewed By: #kwin, davidedmundson
Subscribers: davidedmundson, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D14919
2018-10-10 07:36:45 +00:00
|
|
|
Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com>
|
2011-10-19 23:04:52 +00:00
|
|
|
|
|
|
|
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"
|
2018-10-23 15:21:51 +00:00
|
|
|
|
2011-10-19 23:04:52 +00:00
|
|
|
#include <QEasingCurve>
|
|
|
|
|
|
|
|
namespace KWin {
|
|
|
|
|
2018-10-09 15:44:07 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
[effects/dialogparent] Fix flickering of parent windows
Summary:
If a modal window is closed and some alternative effect that animates
the disappearing of windows is enabled(e.g. the Glide effect, or the
Scale effect), the Dialog Parent effect can cause flickering of the
parent window because its animation duration doesn't match duration of
those alternative effects.
Also, if the Fade effect, the Glide effect, and the Scale effect are
disabled, the Dialog Parent will keep the parent window alive for no
good reason.
This change addresses that problem by adding keepAlive property to
`animate` function so scripted effects have more control over lifetime
of animated windows.
If both a modal window and its parent window are closed at the same time
(and there is no effect that animates the disappearing of windows), the
Dialog Parent will stop immediately(because windowDeleted will be
emitted right after windowClosed signal).
If both a modal window and its parent window are closed at the same time
(and there is effect that animates the disappearing of windows), the
Dialog Parent won't reference the latter window. Thus, it won't cause
flickering. I.e. it will "passively" animate parent windows.
BUG: 355036
FIXED-IN: 5.15.0
Reviewers: #kwin, davidedmundson
Reviewed By: #kwin, davidedmundson
Subscribers: davidedmundson, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D14919
2018-10-10 07:36:45 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
2018-10-23 17:21:27 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
2018-07-23 21:52:58 +00:00
|
|
|
class KWINEFFECTS_EXPORT AniData {
|
2011-10-19 23:04:52 +00:00
|
|
|
public:
|
|
|
|
AniData();
|
|
|
|
AniData(AnimationEffect::Attribute a, int meta, int ms, const FPx2 &to,
|
[effects/dialogparent] Fix flickering of parent windows
Summary:
If a modal window is closed and some alternative effect that animates
the disappearing of windows is enabled(e.g. the Glide effect, or the
Scale effect), the Dialog Parent effect can cause flickering of the
parent window because its animation duration doesn't match duration of
those alternative effects.
Also, if the Fade effect, the Glide effect, and the Scale effect are
disabled, the Dialog Parent will keep the parent window alive for no
good reason.
This change addresses that problem by adding keepAlive property to
`animate` function so scripted effects have more control over lifetime
of animated windows.
If both a modal window and its parent window are closed at the same time
(and there is no effect that animates the disappearing of windows), the
Dialog Parent will stop immediately(because windowDeleted will be
emitted right after windowClosed signal).
If both a modal window and its parent window are closed at the same time
(and there is effect that animates the disappearing of windows), the
Dialog Parent won't reference the latter window. Thus, it won't cause
flickering. I.e. it will "passively" animate parent windows.
BUG: 355036
FIXED-IN: 5.15.0
Reviewers: #kwin, davidedmundson
Reviewed By: #kwin, davidedmundson
Subscribers: davidedmundson, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D14919
2018-10-10 07:36:45 +00:00
|
|
|
QEasingCurve curve, int delay, const FPx2 &from, bool waitAtSource,
|
|
|
|
bool keepAtTarget = false, FullScreenEffectLockPtr=FullScreenEffectLockPtr(),
|
2018-10-23 17:21:27 +00:00
|
|
|
bool keepAlive = true, PreviousWindowPixmapLockPtr previousWindowPixmapLock = {});
|
2011-10-19 23:04:52 +00:00
|
|
|
inline void addTime(int t) { time += t; }
|
|
|
|
inline bool isOneDimensional() const {
|
|
|
|
return from[0] == from[1] && to[0] == to[1];
|
|
|
|
}
|
2016-03-04 17:17:42 +00:00
|
|
|
|
|
|
|
quint64 id{0};
|
2012-10-27 21:35:19 +00:00
|
|
|
QString debugInfo() const;
|
2011-10-19 23:04:52 +00:00
|
|
|
AnimationEffect::Attribute attribute;
|
|
|
|
QEasingCurve curve;
|
|
|
|
int customCurve;
|
|
|
|
FPx2 from, to;
|
|
|
|
int time, duration;
|
|
|
|
uint meta;
|
2012-11-03 20:33:34 +00:00
|
|
|
qint64 startTime;
|
2018-10-03 00:11:59 +00:00
|
|
|
QSharedPointer<FullScreenEffectLock> fullScreenEffectLock;
|
2013-02-28 18:51:00 +00:00
|
|
|
bool waitAtSource, keepAtTarget;
|
[effects/dialogparent] Fix flickering of parent windows
Summary:
If a modal window is closed and some alternative effect that animates
the disappearing of windows is enabled(e.g. the Glide effect, or the
Scale effect), the Dialog Parent effect can cause flickering of the
parent window because its animation duration doesn't match duration of
those alternative effects.
Also, if the Fade effect, the Glide effect, and the Scale effect are
disabled, the Dialog Parent will keep the parent window alive for no
good reason.
This change addresses that problem by adding keepAlive property to
`animate` function so scripted effects have more control over lifetime
of animated windows.
If both a modal window and its parent window are closed at the same time
(and there is no effect that animates the disappearing of windows), the
Dialog Parent will stop immediately(because windowDeleted will be
emitted right after windowClosed signal).
If both a modal window and its parent window are closed at the same time
(and there is effect that animates the disappearing of windows), the
Dialog Parent won't reference the latter window. Thus, it won't cause
flickering. I.e. it will "passively" animate parent windows.
BUG: 355036
FIXED-IN: 5.15.0
Reviewers: #kwin, davidedmundson
Reviewed By: #kwin, davidedmundson
Subscribers: davidedmundson, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D14919
2018-10-10 07:36:45 +00:00
|
|
|
bool keepAlive;
|
|
|
|
KeepAliveLockPtr keepAliveLock;
|
2018-10-23 17:21:27 +00:00
|
|
|
PreviousWindowPixmapLockPtr previousWindowPixmapLock;
|
2011-10-19 23:04:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2012-10-27 21:35:19 +00:00
|
|
|
QDebug operator<<(QDebug dbg, const KWin::AniData &a);
|
|
|
|
|
2011-10-19 23:04:52 +00:00
|
|
|
#endif // ANIDATA_H
|