File indexing completed on 2024-06-09 05:25:57
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2007 Philip Falkner <philip.falkner@gmail.com> 0006 SPDX-FileCopyrightText: 2009 Martin Gräßlin <mgraesslin@kde.org> 0007 SPDX-FileCopyrightText: 2010 Alexandre Pereira <pereira.alex@gmail.com> 0008 SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0009 0010 SPDX-License-Identifier: GPL-2.0-or-later 0011 */ 0012 0013 #pragma once 0014 0015 // kwineffects 0016 #include "effect/effect.h" 0017 #include "effect/effectwindow.h" 0018 #include "effect/timeline.h" 0019 0020 namespace KWin 0021 { 0022 0023 struct GlideAnimation 0024 { 0025 EffectWindowDeletedRef deletedRef; 0026 TimeLine timeLine; 0027 }; 0028 0029 class GlideEffect : public Effect 0030 { 0031 Q_OBJECT 0032 Q_PROPERTY(int duration READ duration) 0033 Q_PROPERTY(RotationEdge inRotationEdge READ inRotationEdge) 0034 Q_PROPERTY(qreal inRotationAngle READ inRotationAngle) 0035 Q_PROPERTY(qreal inDistance READ inDistance) 0036 Q_PROPERTY(qreal inOpacity READ inOpacity) 0037 Q_PROPERTY(RotationEdge outRotationEdge READ outRotationEdge) 0038 Q_PROPERTY(qreal outRotationAngle READ outRotationAngle) 0039 Q_PROPERTY(qreal outDistance READ outDistance) 0040 Q_PROPERTY(qreal outOpacity READ outOpacity) 0041 0042 public: 0043 GlideEffect(); 0044 ~GlideEffect() override; 0045 0046 void reconfigure(ReconfigureFlags flags) override; 0047 0048 void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override; 0049 void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override; 0050 void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override; 0051 void postPaintScreen() override; 0052 0053 bool isActive() const override; 0054 int requestedEffectChainPosition() const override; 0055 0056 static bool supported(); 0057 0058 enum RotationEdge { 0059 Top = 0, 0060 Right = 1, 0061 Bottom = 2, 0062 Left = 3 0063 }; 0064 Q_ENUM(RotationEdge) 0065 0066 int duration() const; 0067 RotationEdge inRotationEdge() const; 0068 qreal inRotationAngle() const; 0069 qreal inDistance() const; 0070 qreal inOpacity() const; 0071 RotationEdge outRotationEdge() const; 0072 qreal outRotationAngle() const; 0073 qreal outDistance() const; 0074 qreal outOpacity() const; 0075 0076 private Q_SLOTS: 0077 void windowAdded(EffectWindow *w); 0078 void windowClosed(EffectWindow *w); 0079 void windowDataChanged(EffectWindow *w, int role); 0080 0081 private: 0082 bool isGlideWindow(EffectWindow *w) const; 0083 0084 std::chrono::milliseconds m_duration; 0085 QHash<EffectWindow *, GlideAnimation> m_animations; 0086 0087 struct GlideParams 0088 { 0089 RotationEdge edge; 0090 struct 0091 { 0092 qreal from; 0093 qreal to; 0094 } angle, distance, opacity; 0095 }; 0096 0097 GlideParams m_inParams; 0098 GlideParams m_outParams; 0099 }; 0100 0101 inline int GlideEffect::requestedEffectChainPosition() const 0102 { 0103 return 50; 0104 } 0105 0106 inline int GlideEffect::duration() const 0107 { 0108 return m_duration.count(); 0109 } 0110 0111 inline GlideEffect::RotationEdge GlideEffect::inRotationEdge() const 0112 { 0113 return m_inParams.edge; 0114 } 0115 0116 inline qreal GlideEffect::inRotationAngle() const 0117 { 0118 return m_inParams.angle.from; 0119 } 0120 0121 inline qreal GlideEffect::inDistance() const 0122 { 0123 return m_inParams.distance.from; 0124 } 0125 0126 inline qreal GlideEffect::inOpacity() const 0127 { 0128 return m_inParams.opacity.from; 0129 } 0130 0131 inline GlideEffect::RotationEdge GlideEffect::outRotationEdge() const 0132 { 0133 return m_outParams.edge; 0134 } 0135 0136 inline qreal GlideEffect::outRotationAngle() const 0137 { 0138 return m_outParams.angle.to; 0139 } 0140 0141 inline qreal GlideEffect::outDistance() const 0142 { 0143 return m_outParams.distance.to; 0144 } 0145 0146 inline qreal GlideEffect::outOpacity() const 0147 { 0148 return m_outParams.opacity.to; 0149 } 0150 0151 } // namespace KWin