KWin
Loading...
Searching...
No Matches
scriptedeffect.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
6 SPDX-FileCopyrightText: 2018 David Edmundson <davidedmundson@kde.org>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10
11#pragma once
12
14
15#include <QJSEngine>
16#include <QJSValue>
17
18class KConfigLoader;
19class KPluginMetaData;
20
21class QAction;
22
23namespace KWin
24{
25
26class KWIN_EXPORT ScriptedEffect : public KWin::AnimationEffect
27{
28 Q_OBJECT
29
30 Q_ENUMS(DataRole)
31 Q_ENUMS(Qt::Axis)
32 Q_ENUMS(Anchor)
33 Q_ENUMS(MetaType)
34 Q_ENUMS(EasingCurve)
35 Q_ENUMS(SessionState)
36 Q_ENUMS(ElectricBorder)
37 Q_ENUMS(ShaderTrait)
41 Q_PROPERTY(QString pluginId READ pluginId CONSTANT)
45 Q_PROPERTY(bool isActiveFullScreenEffect READ isActiveFullScreenEffect NOTIFY isActiveFullScreenEffectChanged)
46
47public:
48 // copied from kwineffects.h
49 enum DataRole {
50 // Grab roles are used to force all other animations to ignore the window.
51 // The value of the data is set to the Effect's `this` value.
60 };
62 GaussianCurve = 128
63 };
64 // copied from kwinglutils.h
65 enum class ShaderTrait {
66 MapTexture = (1 << 0),
67 UniformColor = (1 << 1),
68 Modulate = (1 << 2),
69 AdjustSaturation = (1 << 3),
70 };
71
72 const QString &scriptFile() const
73 {
74 return m_scriptFile;
75 }
76 void reconfigure(ReconfigureFlags flags) override;
77 int requestedEffectChainPosition() const override
78 {
79 return m_chainPosition;
80 }
81 QString activeConfig() const;
82 void setActiveConfig(const QString &name);
83 static ScriptedEffect *create(const QString &effectName, const QString &pathToScript, int chainPosition, const QString &exclusiveCategory);
84 static ScriptedEffect *create(const KPluginMetaData &effect);
85 static bool supported();
86 ~ScriptedEffect() override;
93 Q_SCRIPTABLE bool isGrabbed(KWin::EffectWindow *w, DataRole grabRole);
94
106 Q_SCRIPTABLE bool grab(KWin::EffectWindow *w, DataRole grabRole, bool force = false);
107
115 Q_SCRIPTABLE bool ungrab(KWin::EffectWindow *w, DataRole grabRole);
116
123 Q_SCRIPTABLE QJSValue readConfig(const QString &key, const QJSValue &defaultValue = QJSValue());
124
125 Q_SCRIPTABLE int displayWidth() const;
126 Q_SCRIPTABLE int displayHeight() const;
127 Q_SCRIPTABLE int animationTime(int defaultTime) const;
128
129 Q_SCRIPTABLE void registerShortcut(const QString &objectName, const QString &text,
130 const QString &keySequence, const QJSValue &callback);
131 Q_SCRIPTABLE bool registerScreenEdge(int edge, const QJSValue &callback);
132 Q_SCRIPTABLE bool registerRealtimeScreenEdge(int edge, const QJSValue &callback);
133 Q_SCRIPTABLE bool unregisterScreenEdge(int edge);
134 Q_SCRIPTABLE bool registerTouchScreenEdge(int edge, const QJSValue &callback);
135 Q_SCRIPTABLE bool unregisterTouchScreenEdge(int edge);
136
137 Q_SCRIPTABLE quint64 animate(KWin::EffectWindow *window, Attribute attribute, int ms,
138 const QJSValue &to, const QJSValue &from = QJSValue(),
139 uint metaData = 0, int curve = QEasingCurve::Linear, int delay = 0,
140 bool fullScreen = false, bool keepAlive = true, uint shaderId = 0);
141 Q_SCRIPTABLE QJSValue animate(const QJSValue &object);
142
143 Q_SCRIPTABLE quint64 set(KWin::EffectWindow *window, Attribute attribute, int ms,
144 const QJSValue &to, const QJSValue &from = QJSValue(),
145 uint metaData = 0, int curve = QEasingCurve::Linear, int delay = 0,
146 bool fullScreen = false, bool keepAlive = true, uint shaderId = 0);
147 Q_SCRIPTABLE QJSValue set(const QJSValue &object);
148
149 Q_SCRIPTABLE bool retarget(quint64 animationId, const QJSValue &newTarget,
150 int newRemainingTime = -1);
151 Q_SCRIPTABLE bool retarget(const QList<quint64> &animationIds, const QJSValue &newTarget,
152 int newRemainingTime = -1);
153 Q_SCRIPTABLE bool freezeInTime(quint64 animationId, qint64 frozenTime);
154 Q_SCRIPTABLE bool freezeInTime(const QList<quint64> &animationIds, qint64 frozenTime);
155
156 Q_SCRIPTABLE bool redirect(quint64 animationId, Direction direction,
157 TerminationFlags terminationFlags = TerminateAtSource);
158 Q_SCRIPTABLE bool redirect(const QList<quint64> &animationIds, Direction direction,
159 TerminationFlags terminationFlags = TerminateAtSource);
160
161 Q_SCRIPTABLE bool complete(quint64 animationId);
162 Q_SCRIPTABLE bool complete(const QList<quint64> &animationIds);
163
164 Q_SCRIPTABLE bool cancel(quint64 animationId);
165 Q_SCRIPTABLE bool cancel(const QList<quint64> &animationIds);
166
167 Q_SCRIPTABLE QList<int> touchEdgesForAction(const QString &action) const;
168
169 Q_SCRIPTABLE uint addFragmentShader(ShaderTrait traits, const QString &fragmentShaderFile = {});
170
171 Q_SCRIPTABLE void setUniform(uint shaderId, const QString &name, const QJSValue &value);
172
173 QHash<int, QJSValueList> &screenEdgeCallbacks()
174 {
175 return m_screenEdgeCallbacks;
176 }
177
178 QHash<int, QJSValueList> &realtimeScreenEdgeCallbacks()
179 {
180 return m_realtimeScreenEdgeCallbacks;
181 }
182
183 QString pluginId() const;
184 bool isActiveFullScreenEffect() const;
185
186public Q_SLOTS:
187 bool borderActivated(ElectricBorder border) override;
188
189Q_SIGNALS:
194 void animationEnded(KWin::EffectWindow *w, quint64 animationId);
196
197protected:
199 QJSEngine *engine() const;
200 bool init(const QString &effectName, const QString &pathToScript);
201 void animationEnded(KWin::EffectWindow *w, Attribute a, uint meta) override;
202
203private:
204 enum class AnimationType {
205 Animate,
206 Set
207 };
208
209 QJSValue animate_helper(const QJSValue &object, AnimationType animationType);
210
211 GLShader *findShader(uint shaderId) const;
212
213 QJSEngine *m_engine;
214 QString m_effectName;
215 QString m_scriptFile;
216 QString m_exclusiveCategory;
217 QHash<int, QJSValueList> m_screenEdgeCallbacks;
218 QHash<int, QJSValueList> m_realtimeScreenEdgeCallbacks;
219 KConfigLoader *m_config;
220 int m_chainPosition;
221 QHash<int, QAction *> m_touchScreenEdgeCallbacks;
222 Effect *m_activeFullScreenEffect = nullptr;
223 std::map<uint, std::unique_ptr<GLShader>> m_shaders;
224 uint m_nextShaderId{1u};
225};
226}
Base class for all KWin effects.
Definition effect.h:535
Representation of a window used by/for Effect classes.
~ScriptedEffect() override
QHash< int, QJSValueList > & realtimeScreenEdgeCallbacks()
QString activeConfig() const
void animationEnded(KWin::EffectWindow *w, quint64 animationId)
void isActiveFullScreenEffectChanged()
void setActiveConfig(const QString &name)
int requestedEffectChainPosition() const override
@ WindowForceBackgroundContrastRole
For fullscreen effects to enforce the background contrast,.
@ WindowBackgroundContrastRole
For single windows to enable Background contrast.
@ WindowForceBlurRole
For fullscreen effects to enforce blurring of windows,.
@ WindowBlurBehindRole
For single windows to blur behind.
const QString & scriptFile() const
QHash< int, QJSValueList > & screenEdgeCallbacks()
@ WindowAddedGrabRole
SessionState
Definition globals.h:132
ElectricBorder
Definition globals.h:60