[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwin/scripting2] /: port to QJSEngine
From: David Edmundson <null () kde ! org>
Date: 2018-07-31 21:37:18
Message-ID: E1fkcKU-0001yG-Cv () code ! kde ! org
[Download RAW message or body]
Git commit 3ed7cbd8efa5b8de2a50f8b9ccb9e639c1b5ea1c by David Edmundson.
Committed on 31/07/2018 at 20:22.
Pushed by davidedmundson into branch 'scripting2'.
port to QJSEngine
M +23 -11 autotests/integration/effects/scripted_effects_test.cpp
M +1 -1 autotests/test_scripted_effectloader.cpp
M +315 -300 scripting/scriptedeffect.cpp
M +10 -11 scripting/scriptedeffect.h
https://commits.kde.org/kwin/3ed7cbd8efa5b8de2a50f8b9ccb9e639c1b5ea1c
diff --git a/autotests/integration/effects/scripted_effects_test.cpp \
b/autotests/integration/effects/scripted_effects_test.cpp index fd00a8711..0276ec965 \
100644
--- a/autotests/integration/effects/scripted_effects_test.cpp
+++ b/autotests/integration/effects/scripted_effects_test.cpp
@@ -34,9 +34,8 @@ along with this program. If not, see <http:// \
www.gnu.org/licenses/>. #include "wayland_server.h"
#include "workspace.h"
-#include <QScriptContext>
-#include <QScriptEngine>
-#include <QScriptValue>
+#include <QJSValue>
+#include <QJSEngine>
#include <KConfigGroup>
#include <KGlobalAccel>
@@ -74,15 +73,15 @@ class ScriptedEffectWithDebugSpy : public KWin::ScriptedEffect
{
Q_OBJECT
public:
- ScriptedEffectWithDebugSpy();
bool load(const QString &name);
using AnimationEffect::state;
signals:
void testOutput(const QString &data);
};
-QScriptValue kwinEffectScriptTestOut(QScriptContext *context, QScriptEngine *engine)
+class SendTestResponseContext : public QObject
{
+<<<<<<< HEAD
auto *script = qobject_cast<ScriptedEffectWithDebugSpy*>(context->callee().data().toQObject());
QString result;
for (int i = 0; i < context->argumentCount(); ++i) {
@@ -92,21 +91,34 @@ QScriptValue kwinEffectScriptTestOut(QScriptContext *context, \
QScriptEngine *eng result.append(context->argument(i).toString());
}
emit script->testOutput(result);
+=======
+ Q_OBJECT
+public:
+ SendTestResponseContext(ScriptedEffectWithDebugSpy *scriptedEffect);
+ Q_INVOKABLE void sendTestResponse(const QString &out);
+private:
+ ScriptedEffectWithDebugSpy *m_scriptedEffect;
+};
- return engine->undefinedValue();
+>>>>>>> 87ad4e45f... port to QJSEngine
+
+SendTestResponseContext::SendTestResponseContext(ScriptedEffectWithDebugSpy \
*scriptedEffect): + QObject(nullptr),
+ m_scriptedEffect(scriptedEffect)
+{
}
-ScriptedEffectWithDebugSpy::ScriptedEffectWithDebugSpy()
- : ScriptedEffect()
+void SendTestResponseContext::sendTestResponse(const QString &out)
{
- QScriptValue testHookFunc = engine()->newFunction(kwinEffectScriptTestOut);
- testHookFunc.setData(engine()->newQObject(this));
- engine()->globalObject().setProperty(QStringLiteral("sendTestResponse"), \
testHookFunc); + emit m_scriptedEffect->testOutput(out);
}
bool ScriptedEffectWithDebugSpy::load(const QString &name)
{
+ auto selfContext = engine()->newQObject(new SendTestResponseContext(this)); //JS \
ownership +
const QString path = QFINDTESTDATA("./scripts/" + name + ".js");
+ engine()->globalObject().setProperty("sendTestResponse", \
selfContext.property("sendTestResponse")); if (!init(name, path)) {
return false;
}
diff --git a/autotests/test_scripted_effectloader.cpp \
b/autotests/test_scripted_effectloader.cpp index b308dc7f2..988e70689 100644
--- a/autotests/test_scripted_effectloader.cpp
+++ b/autotests/test_scripted_effectloader.cpp
@@ -59,7 +59,7 @@ void InputRedirection::registerShortcut(const QKeySequence &, \
QAction *)
namespace MetaScripting
{
-void registration(QScriptEngine *)
+void registration(QJSEngine *)
{
}
}
diff --git a/scripting/scriptedeffect.cpp b/scripting/scriptedeffect.cpp
index 4710bf6c2..e78f6315e 100644
--- a/scripting/scriptedeffect.cpp
+++ b/scripting/scriptedeffect.cpp
@@ -31,10 +31,12 @@ along with this program. If not, see \
<http://www.gnu.org/licenses/>. #include <KPluginMetaData>
// Qt
#include <QFile>
-#include <QtScript/QScriptEngine>
-#include <QtScript/QScriptValueIterator>
+#include <QJSEngine>
+#include <QJSValueIterator>
#include <QStandardPaths>
+#include <QGridLayout>
+
typedef KWin::EffectWindow* KEffectWindowRef;
Q_DECLARE_METATYPE(KSharedConfigPtr)
@@ -42,7 +44,7 @@ Q_DECLARE_METATYPE(KSharedConfigPtr)
namespace KWin
{
-QScriptValue kwinEffectScriptPrint(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinEffectScriptPrint(QScriptContext *context, QJSEngine *engine)
{
ScriptedEffect *script = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject()); QString result;
@@ -54,52 +56,56 @@ QScriptValue kwinEffectScriptPrint(QScriptContext *context, \
QScriptEngine *engin }
qCDebug(KWIN_SCRIPTING) << script->scriptFile() << ":" << result;
- return engine->undefinedValue();
+ return QJSValue();
}
-QScriptValue kwinEffectScriptAnimationTime(QScriptContext *context, QScriptEngine \
*engine) +QJSValue kwinEffectScriptAnimationTime(QScriptContext *context, QJSEngine \
*engine) {
if (context->argumentCount() != 1) {
- return engine->undefinedValue();
+ return QJSValue();
}
if (!context->argument(0).isNumber()) {
- return engine->undefinedValue();
+ return QJSValue();
}
return Effect::animationTime(context->argument(0).toInteger());
}
-QScriptValue kwinEffectDisplayWidth(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinEffectDisplayWidth(QScriptContext *context, QJSEngine *engine)
{
Q_UNUSED(context)
Q_UNUSED(engine)
return screens()->displaySize().width();
}
-QScriptValue kwinEffectDisplayHeight(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinEffectDisplayHeight(QScriptContext *context, QJSEngine *engine)
{
Q_UNUSED(context)
Q_UNUSED(engine)
return screens()->displaySize().height();
}
-QScriptValue kwinScriptGlobalShortcut(QScriptContext *context, QScriptEngine \
*engine) +QJSValue kwinScriptGlobalShortcut(QScriptContext *context, QJSEngine \
*engine) {
- return globalShortcut<KWin::ScriptedEffect*>(context, engine);
+ return QJSValue();
+// return globalShortcut<KWin::ScriptedEffect*>(context, engine);
}
-QScriptValue kwinScriptScreenEdge(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinScriptScreenEdge(QScriptContext *context, QJSEngine *engine)
{
- return registerScreenEdge<KWin::ScriptedEffect*>(context, engine);
+ return QJSValue();
+// return registerScreenEdge<KWin::ScriptedEffect*>(context, engine);
}
-QScriptValue kwinRegisterTouchScreenEdge(QScriptContext *context, QScriptEngine \
*engine) +QJSValue kwinRegisterTouchScreenEdge(QScriptContext *context, QJSEngine \
*engine) {
- return registerTouchScreenEdge<KWin::ScriptedEffect*>(context, engine);
+ return QJSValue();
+// return registerTouchScreenEdge<KWin::ScriptedEffect*>(context, engine);
}
-QScriptValue kwinUnregisterTouchScreenEdge(QScriptContext *context, QScriptEngine \
*engine) +QJSValue kwinUnregisterTouchScreenEdge(QScriptContext *context, QJSEngine \
*engine) {
- return unregisterTouchScreenEdge<KWin::ScriptedEffect*>(context, engine);
+ return QJSValue();
+// return unregisterTouchScreenEdge<KWin::ScriptedEffect*>(context, engine);
}
struct AnimationSettings {
@@ -114,42 +120,42 @@ struct AnimationSettings {
uint metaData;
};
-AnimationSettings animationSettingsFromObject(QScriptValue &object)
+AnimationSettings animationSettingsFromObject(QJSValue &object)
{
AnimationSettings settings;
settings.set = 0;
settings.metaData = 0;
- settings.to = qscriptvalue_cast<FPx2>(object.property(QStringLiteral("to")));
- settings.from = \
qscriptvalue_cast<FPx2>(object.property(QStringLiteral("from"))); + settings.to = \
object.property(QStringLiteral("to")).toVariant().value<FPx2>(); + settings.from = \
object.property(QStringLiteral("from")).toVariant().value<FPx2>();
- QScriptValue duration = object.property(QStringLiteral("duration"));
- if (duration.isValid() && duration.isNumber()) {
- settings.duration = duration.toUInt32();
+ QJSValue duration = object.property(QStringLiteral("duration"));
+ if (duration.isNumber()) {
+ settings.duration = duration.toUInt();
settings.set |= AnimationSettings::Duration;
} else {
settings.duration = 0;
}
- QScriptValue delay = object.property(QStringLiteral("delay"));
- if (delay.isValid() && delay.isNumber()) {
- settings.delay = delay.toInt32();
+ QJSValue delay = object.property(QStringLiteral("delay"));
+ if (delay.isNumber()) {
+ settings.delay = delay.toInt();
settings.set |= AnimationSettings::Delay;
} else {
settings.delay = 0;
}
- QScriptValue curve = object.property(QStringLiteral("curve"));
- if (curve.isValid() && curve.isNumber()) {
- settings.curve = static_cast<QEasingCurve::Type>(curve.toInt32());
+ QJSValue curve = object.property(QStringLiteral("curve"));
+ if (curve.isNumber()) {
+ settings.curve = static_cast<QEasingCurve::Type>(curve.toInt());
settings.set |= AnimationSettings::Curve;
} else {
settings.curve = QEasingCurve::Linear;
}
- QScriptValue type = object.property(QStringLiteral("type"));
- if (type.isValid() && type.isNumber()) {
- settings.type = static_cast<AnimationEffect::Attribute>(type.toInt32());
+ QJSValue type = object.property(QStringLiteral("type"));
+ if (type.isNumber()) {
+ settings.type = static_cast<AnimationEffect::Attribute>(type.toInt());
settings.set |= AnimationSettings::Type;
} else {
settings.type = static_cast<AnimationEffect::Attribute>(-1);
@@ -158,167 +164,171 @@ AnimationSettings animationSettingsFromObject(QScriptValue \
&object) return settings;
}
-QList<AnimationSettings> animationSettings(QScriptContext *context, ScriptedEffect \
*effect, EffectWindow **window)
-{
- QList<AnimationSettings> settings;
- if (!effect) {
- context->throwError(QScriptContext::ReferenceError, QStringLiteral("Internal \
Scripted KWin Effect error"));
- return settings;
- }
- if (context->argumentCount() != 1) {
- context->throwError(QScriptContext::SyntaxError, QStringLiteral("Exactly one \
argument expected"));
- return settings;
- }
- if (!context->argument(0).isObject()) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Argument \
needs to be an object"));
- return settings;
- }
- QScriptValue object = context->argument(0);
- QScriptValue windowProperty = object.property(QStringLiteral("window"));
- if (!windowProperty.isValid() || !windowProperty.isObject()) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property missing in animation options"));
- return settings;
- }
- *window = qobject_cast<EffectWindow*>(windowProperty.toQObject());
-
- settings << animationSettingsFromObject(object); // global
-
- QScriptValue animations = object.property(QStringLiteral("animations")); // \
array
- if (animations.isValid()) {
- if (!animations.isArray()) {
- context->throwError(QScriptContext::TypeError, \
QStringLiteral("Animations provided but not an array"));
- settings.clear();
- return settings;
- }
- const int length = \
static_cast<int>(animations.property(QStringLiteral("length")).toInteger());
- for (int i=0; i<length; ++i) {
- QScriptValue value = animations.property(QString::number(i));
- if (!value.isValid()) {
- continue;
- }
- if (value.isObject()) {
- AnimationSettings s = animationSettingsFromObject(value);
- const uint set = s.set | settings.at(0).set;
- // Catch show stoppers (incompletable animation)
- if (!(set & AnimationSettings::Type)) {
- context->throwError(QScriptContext::TypeError, \
QStringLiteral("Type property missing in animation options"));
- continue;
- }
- if (!(set & AnimationSettings::Duration)) {
- context->throwError(QScriptContext::TypeError, \
QStringLiteral("Duration property missing in animation options"));
- continue;
- }
- // Complete local animations from global settings
- if (!(s.set & AnimationSettings::Duration)) {
- s.duration = settings.at(0).duration;
- }
- if (!(s.set & AnimationSettings::Curve)) {
- s.curve = settings.at(0).curve;
- }
- if (!(s.set & AnimationSettings::Delay)) {
- s.delay = settings.at(0).delay;
- }
-
- s.metaData = 0;
- typedef QMap<AnimationEffect::MetaType, QString> MetaTypeMap;
- static MetaTypeMap metaTypes({
- {AnimationEffect::SourceAnchor, QStringLiteral("sourceAnchor")},
- {AnimationEffect::TargetAnchor, QStringLiteral("targetAnchor")},
- {AnimationEffect::RelativeSourceX, \
QStringLiteral("relativeSourceX")},
- {AnimationEffect::RelativeSourceY, \
QStringLiteral("relativeSourceY")},
- {AnimationEffect::RelativeTargetX, \
QStringLiteral("relativeTargetX")},
- {AnimationEffect::RelativeTargetY, \
QStringLiteral("relativeTargetY")},
- {AnimationEffect::Axis, QStringLiteral("axis")}
- });
-
- for (MetaTypeMap::const_iterator it = metaTypes.constBegin(),
- end = metaTypes.constEnd(); it != \
end; ++it) {
- QScriptValue metaVal = value.property(*it);
- if (metaVal.isValid() && metaVal.isNumber()) {
- AnimationEffect::setMetaData(it.key(), metaVal.toInt32(), \
s.metaData);
- }
- }
-
- settings << s;
- }
- }
- }
-
- if (settings.count() == 1) {
- const uint set = settings.at(0).set;
- if (!(set & AnimationSettings::Type)) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Type \
property missing in animation options"));
- settings.clear();
- }
- if (!(set & AnimationSettings::Duration)) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Duration \
property missing in animation options"));
- settings.clear();
- }
- } else if (!(settings.at(0).set & AnimationSettings::Type)) { // invalid global
- settings.removeAt(0); // -> get rid of it, only used to complete the others
- }
-
- return settings;
-}
-
-QScriptValue kwinEffectAnimate(QScriptContext *context, QScriptEngine *engine)
-{
- ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject());
- EffectWindow *window;
- QList<AnimationSettings> settings = animationSettings(context, effect, &window);
- if (settings.empty()) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("No animations \
provided"));
- return engine->undefinedValue();
- }
- if (!window) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property does not contain an EffectWindow"));
- return engine->undefinedValue();
- }
-
- QScriptValue array = engine->newArray(settings.length());
- int i = 0;
- foreach (const AnimationSettings &setting, settings) {
- array.setProperty(i, (uint)effect->animate(window,
- setting.type,
- setting.duration,
- setting.to,
- setting.from,
- setting.metaData,
- setting.curve,
- setting.delay));
- ++i;
- }
- return array;
-}
-
-QScriptValue kwinEffectSet(QScriptContext *context, QScriptEngine *engine)
-{
- ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject());
-
- EffectWindow *window;
- QList<AnimationSettings> settings = animationSettings(context, effect, &window);
- if (settings.empty()) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("No animations \
provided"));
- return engine->undefinedValue();
- }
- if (!window) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property does not contain an EffectWindow"));
- return engine->undefinedValue();
- }
-
- QList<QVariant> animIds;
- foreach (const AnimationSettings &setting, settings) {
- animIds << QVariant(effect->set(window,
- setting.type,
- setting.duration,
- setting.to,
- setting.from,
- setting.metaData,
- setting.curve,
- setting.delay));
- }
-
- return engine->newVariant(animIds);
+//QList<AnimationSettings> animationSettings(QScriptContext *context, ScriptedEffect \
*effect, EffectWindow **window) +//{
+// QList<AnimationSettings> settings;
+// if (!effect) {
+// context->throwError(QScriptContext::ReferenceError, \
QStringLiteral("Internal Scripted KWin Effect error")); +// return settings;
+// }
+// if (context->argumentCount() != 1) {
+// context->throwError(QScriptContext::SyntaxError, QStringLiteral("Exactly \
one argument expected")); +// return settings;
+// }
+// if (!context->argument(0).isObject()) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Argument \
needs to be an object")); +// return settings;
+// }
+// QJSValue object = context->argument(0);
+// QJSValue windowProperty = object.property(QStringLiteral("window"));
+// if (!windowProperty.isValid() || !windowProperty.isObject()) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property missing in animation options")); +// return settings;
+// }
+// *window = qobject_cast<EffectWindow*>(windowProperty.toQObject());
+
+// settings << animationSettingsFromObject(object); // global
+
+// QJSValue animations = object.property(QStringLiteral("animations")); // array
+// if (!animations.isNull()) {
+// if (!animations.isArray()) {
+// context->throwError(QScriptContext::TypeError, \
QStringLiteral("Animations provided but not an array")); +// \
settings.clear(); +// return settings;
+// }
+// const int length = \
static_cast<int>(animations.property(QStringLiteral("length")).toInteger()); +// \
for (int i=0; i<length; ++i) { +// QJSValue value = \
animations.property(QString::number(i)); +// if (!value.isValid()) {
+// continue;
+// }
+// if (value.isObject()) {
+// AnimationSettings s = animationSettingsFromObject(value);
+// const uint set = s.set | settings.at(0).set;
+// // Catch show stoppers (incompletable animation)
+// if (!(set & AnimationSettings::Type)) {
+// context->throwError(QScriptContext::TypeError, \
QStringLiteral("Type property missing in animation options")); +// \
continue; +// }
+// if (!(set & AnimationSettings::Duration)) {
+// context->throwError(QScriptContext::TypeError, \
QStringLiteral("Duration property missing in animation options")); +// \
continue; +// }
+// // Complete local animations from global settings
+// if (!(s.set & AnimationSettings::Duration)) {
+// s.duration = settings.at(0).duration;
+// }
+// if (!(s.set & AnimationSettings::Curve)) {
+// s.curve = settings.at(0).curve;
+// }
+// if (!(s.set & AnimationSettings::Delay)) {
+// s.delay = settings.at(0).delay;
+// }
+
+// s.metaData = 0;
+// typedef QMap<AnimationEffect::MetaType, QString> MetaTypeMap;
+// static MetaTypeMap metaTypes({
+// {AnimationEffect::SourceAnchor, \
QStringLiteral("sourceAnchor")}, +// \
{AnimationEffect::TargetAnchor, QStringLiteral("targetAnchor")}, +// \
{AnimationEffect::RelativeSourceX, QStringLiteral("relativeSourceX")}, +// \
{AnimationEffect::RelativeSourceY, QStringLiteral("relativeSourceY")}, +// \
{AnimationEffect::RelativeTargetX, QStringLiteral("relativeTargetX")}, +// \
{AnimationEffect::RelativeTargetY, QStringLiteral("relativeTargetY")}, +// \
{AnimationEffect::Axis, QStringLiteral("axis")} +// });
+
+// for (MetaTypeMap::const_iterator it = metaTypes.constBegin(),
+// end = metaTypes.constEnd(); it != \
end; ++it) { +// QJSValue metaVal = value.property(*it);
+// if (metaVal.isNumber()) {
+// AnimationEffect::setMetaData(it.key(), metaVal.toInt(), \
s.metaData); +// }
+// }
+
+// settings << s;
+// }
+// }
+// }
+
+// if (settings.count() == 1) {
+// const uint set = settings.at(0).set;
+// if (!(set & AnimationSettings::Type)) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Type \
property missing in animation options")); +// settings.clear();
+// }
+// if (!(set & AnimationSettings::Duration)) {
+// context->throwError(QScriptContext::TypeError, \
QStringLiteral("Duration property missing in animation options")); +// \
settings.clear(); +// }
+// } else if (!(settings.at(0).set & AnimationSettings::Type)) { // invalid \
global +// settings.removeAt(0); // -> get rid of it, only used to complete \
the others +// }
+
+// return settings;
+//}
+
+QJSValue kwinEffectAnimate(QScriptContext *context, QJSEngine *engine)
+{
+// ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject()); +// \
EffectWindow *window; +// QList<AnimationSettings> settings = \
animationSettings(context, effect, &window); +// if (settings.empty()) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("No \
animations provided")); +// return QJSValue();
+// }
+// if (!window) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property does not contain an EffectWindow")); +// return QJSValue();
+// }
+
+// QJSValue array = engine->newArray(settings.length());
+// int i = 0;
+// foreach (const AnimationSettings &setting, settings) {
+// array.setProperty(i, (uint)effect->animate(window,
+// setting.type,
+// setting.duration,
+// setting.to,
+// setting.from,
+// setting.metaData,
+// setting.curve,
+// setting.delay));
+// ++i;
+// }
+// return array;
+ return QJSValue();
+}
+
+QJSValue kwinEffectSet(QScriptContext *context, QJSEngine *engine)
+{
+ return QJSValue();
+
+
+// ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject()); +
+// EffectWindow *window;
+// QList<AnimationSettings> settings = animationSettings(context, effect, \
&window); +// if (settings.empty()) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("No \
animations provided")); +// return QJSValue();
+// }
+// if (!window) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Window \
property does not contain an EffectWindow")); +// return QJSValue();
+// }
+
+// QList<QVariant> animIds;
+// foreach (const AnimationSettings &setting, settings) {
+// animIds << QVariant(effect->set(window,
+// setting.type,
+// setting.duration,
+// setting.to,
+// setting.from,
+// setting.metaData,
+// setting.curve,
+// setting.delay));
+// }
+
+// return engine->newVariant(animIds);
}
QList<quint64> animations(const QVariant &v, bool *ok)
@@ -344,15 +354,15 @@ QList<quint64> animations(const QVariant &v, bool *ok)
return animIds;
}
-QScriptValue fpx2ToScriptValue(QScriptEngine *eng, const KWin::FPx2 &fpx2)
+QJSValue fpx2ToScriptValue(QJSEngine *eng, const KWin::FPx2 &fpx2)
{
- QScriptValue val = eng->newObject();
+ QJSValue val = eng->newObject();
val.setProperty(QStringLiteral("value1"), fpx2[0]);
val.setProperty(QStringLiteral("value2"), fpx2[1]);
return val;
}
-void fpx2FromScriptValue(const QScriptValue &value, KWin::FPx2 &fpx2)
+void fpx2FromScriptValue(const QJSValue &value, KWin::FPx2 &fpx2)
{
if (value.isNull()) {
fpx2 = FPx2();
@@ -363,9 +373,9 @@ void fpx2FromScriptValue(const QScriptValue &value, KWin::FPx2 \
&fpx2) return;
}
if (value.isObject()) {
- QScriptValue value1 = value.property(QStringLiteral("value1"));
- QScriptValue value2 = value.property(QStringLiteral("value2"));
- if (!value1.isValid() || !value2.isValid() || !value1.isNumber() || \
!value2.isNumber()) { + QJSValue value1 = \
value.property(QStringLiteral("value1")); + QJSValue value2 = \
value.property(QStringLiteral("value2")); + if (!value1.isNumber() || \
!value2.isNumber()) {
qCDebug(KWIN_SCRIPTING) << "Cannot cast scripted FPx2 to C++";
fpx2 = FPx2();
return;
@@ -374,63 +384,66 @@ void fpx2FromScriptValue(const QScriptValue &value, KWin::FPx2 \
&fpx2) }
}
-QScriptValue kwinEffectRetarget(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinEffectRetarget(QScriptContext *context, QJSEngine *engine)
{
- ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject());
- if (context->argumentCount() < 2 || context->argumentCount() > 3) {
- context->throwError(QScriptContext::SyntaxError, QStringLiteral("2 or 3 \
arguments expected"));
- return engine->undefinedValue();
- }
- QVariant v = context->argument(0).toVariant();
- bool ok = false;
- QList<quint64> animIds = animations(v, &ok);
- if (!ok) {
- context->throwError(QScriptContext::TypeError, QStringLiteral("Argument \
needs to be one or several quint64"));
- return engine->undefinedValue();
- }
- FPx2 target;
- fpx2FromScriptValue(context->argument(1), target);
+// ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject()); +// if \
(context->argumentCount() < 2 || context->argumentCount() > 3) { +// \
context->throwError(QScriptContext::SyntaxError, QStringLiteral("2 or 3 arguments \
expected")); +// return QJSValue();
+// }
+// QVariant v = context->argument(0).toVariant();
+// bool ok = false;
+// QList<quint64> animIds = animations(v, &ok);
+// if (!ok) {
+// context->throwError(QScriptContext::TypeError, QStringLiteral("Argument \
needs to be one or several quint64")); +// return QJSValue();
+// }
+// FPx2 target;
+// fpx2FromScriptValue(context->argument(1), target);
- ok = false;
- const int remainingTime = context->argumentCount() == 3 ? \
context->argument(2).toVariant().toInt() : -1;
- foreach (const quint64 &animId, animIds) {
- ok = effect->retarget(animId, target, remainingTime);
- if (!ok) {
- break;
- }
- }
+// ok = false;
+// const int remainingTime = context->argumentCount() == 3 ? \
context->argument(2).toVariant().toInt() : -1; +// foreach (const quint64 &animId, \
animIds) { +// ok = effect->retarget(animId, target, remainingTime);
+// if (!ok) {
+// break;
+// }
+// }
- return QScriptValue(ok);
+ return QJSValue();
}
-QScriptValue kwinEffectCancel(QScriptContext *context, QScriptEngine *engine)
+QJSValue kwinEffectCancel(QScriptContext *context, QJSEngine *engine)
{
ScriptedEffect *effect = \
qobject_cast<ScriptedEffect*>(context->callee().data().toQObject()); if \
(context->argumentCount() != 1) {
context->throwError(QScriptContext::SyntaxError, QStringLiteral("Exactly one \
argument expected"));
- return engine->undefinedValue();
+ return QJSValue();
}
QVariant v = context->argument(0).toVariant();
bool ok = false;
QList<quint64> animIds = animations(v, &ok);
if (!ok) {
context->throwError(QScriptContext::TypeError, QStringLiteral("Argument \
needs to be one or several quint64"));
- return engine->undefinedValue();
+ return QJSValue();
}
foreach (const quint64 &animId, animIds) {
- ok |= engine->newVariant(effect->cancel(animId)).toBool();
+ ok |= effect->cancel(animId);
}
- return engine->newVariant(ok);
+ return QJSValue(ok);
}
-QScriptValue effectWindowToScriptValue(QScriptEngine *eng, const KEffectWindowRef \
&window) +QJSValue effectWindowToScriptValue(QJSEngine *eng, const KEffectWindowRef \
&window) {
- return eng->newQObject(window, QScriptEngine::QtOwnership,
- QScriptEngine::ExcludeChildObjects | \
QScriptEngine::ExcludeDeleteLater | QScriptEngine::PreferExistingWrapperObject); +
+ //TODO
+ return eng->newQObject(window);
+// return eng->newQObject(window, QJSEngine::QtOwnership,
+// QJSEngine::ExcludeChildObjects | \
QJSEngine::ExcludeDeleteLater | QJSEngine::PreferExistingWrapperObject); }
-void effectWindowFromScriptValue(const QScriptValue &value, EffectWindow* &window)
+void effectWindowFromScriptValue(const QJSValue &value, EffectWindow* &window)
{
window = qobject_cast<EffectWindow*>(value.toQObject());
}
@@ -470,12 +483,12 @@ bool ScriptedEffect::supported()
ScriptedEffect::ScriptedEffect()
: AnimationEffect()
- , m_engine(new QScriptEngine(this))
+ , m_engine(new QJSEngine(this))
, m_scriptFile(QString())
, m_config(nullptr)
, m_chainPosition(0)
{
- connect(m_engine, SIGNAL(signalHandlerException(QScriptValue)), \
SLOT(signalHandlerException(QScriptValue))); +// connect(m_engine, \
SIGNAL(signalHandlerException(QJSValue)), SLOT(signalHandlerException(QJSValue))); }
ScriptedEffect::~ScriptedEffect()
@@ -501,60 +514,61 @@ bool ScriptedEffect::init(const QString &effectName, const \
QString &pathToScript m_config->load();
}
- QScriptValue effectsObject = m_engine->newQObject(effects, \
QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater);
- m_engine->globalObject().setProperty(QStringLiteral("effects"), effectsObject, \
QScriptValue::Undeletable); +// QJSValue effectsObject = \
m_engine->newQObject(effects); +// \
m_engine->globalObject().setProperty(QStringLiteral("effects"), \
effectsObject);
m_engine->globalObject().setProperty(QStringLiteral("Effect"), \
m_engine->newQMetaObject(&ScriptedEffect::staticMetaObject)); #ifndef KWIN_UNIT_TEST
m_engine->globalObject().setProperty(QStringLiteral("KWin"), \
m_engine->newQMetaObject(&QtScriptWorkspaceWrapper::staticMetaObject)); #endif
m_engine->globalObject().setProperty(QStringLiteral("QEasingCurve"), \
m_engine->newQMetaObject(&QEasingCurve::staticMetaObject));
- m_engine->globalObject().setProperty(QStringLiteral("effect"), \
m_engine->newQObject(this, QScriptEngine::QtOwnership, \
QScriptEngine::ExcludeDeleteLater), QScriptValue::Undeletable);
- MetaScripting::registration(m_engine);
- qScriptRegisterMetaType<KEffectWindowRef>(m_engine, effectWindowToScriptValue, \
effectWindowFromScriptValue);
- qScriptRegisterMetaType<KWin::FPx2>(m_engine, fpx2ToScriptValue, \
fpx2FromScriptValue);
- qScriptRegisterSequenceMetaType<QList< KWin::EffectWindow* > >(m_engine);
- // add our print
- QScriptValue printFunc = m_engine->newFunction(kwinEffectScriptPrint);
- printFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("print"), printFunc);
- // add our animationTime
- QScriptValue animationTimeFunc = \
m_engine->newFunction(kwinEffectScriptAnimationTime);
- animationTimeFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("animationTime"), \
animationTimeFunc);
- // add displayWidth and displayHeight
- QScriptValue displayWidthFunc = m_engine->newFunction(kwinEffectDisplayWidth);
- m_engine->globalObject().setProperty(QStringLiteral("displayWidth"), \
displayWidthFunc);
- QScriptValue displayHeightFunc = m_engine->newFunction(kwinEffectDisplayHeight);
- m_engine->globalObject().setProperty(QStringLiteral("displayHeight"), \
displayHeightFunc);
- // add global Shortcut
- registerGlobalShortcutFunction(this, m_engine, kwinScriptGlobalShortcut);
- registerScreenEdgeFunction(this, m_engine, kwinScriptScreenEdge);
- registerTouchScreenEdgeFunction(this, m_engine, kwinRegisterTouchScreenEdge);
- unregisterTouchScreenEdgeFunction(this, m_engine, \
kwinUnregisterTouchScreenEdge);
- // add the animate method
- QScriptValue animateFunc = m_engine->newFunction(kwinEffectAnimate);
- animateFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("animate"), animateFunc);
-
- // and the set variant
- QScriptValue setFunc = m_engine->newFunction(kwinEffectSet);
- setFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("set"), setFunc);
-
- // retarget
- QScriptValue retargetFunc = m_engine->newFunction(kwinEffectRetarget);
- retargetFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("retarget"), retargetFunc);
-
- // cancel...
- QScriptValue cancelFunc = m_engine->newFunction(kwinEffectCancel);
- cancelFunc.setData(m_engine->newQObject(this));
- m_engine->globalObject().setProperty(QStringLiteral("cancel"), cancelFunc);
-
- QScriptValue ret = m_engine->evaluate(QString::fromUtf8(scriptFile.readAll()));
-
+// m_engine->globalObject().setProperty(QStringLiteral("effect"), \
m_engine->newQObject(this, QJSEngine::QtOwnership, QJSEngine::ExcludeDeleteLater), \
QJSValue::Undeletable); +// MetaScripting::registration(m_engine);
+// qScriptRegisterMetaType<KEffectWindowRef>(m_engine, effectWindowToScriptValue, \
effectWindowFromScriptValue); +// qScriptRegisterMetaType<KWin::FPx2>(m_engine, \
fpx2ToScriptValue, fpx2FromScriptValue); +// \
qScriptRegisterSequenceMetaType<QList< KWin::EffectWindow* > >(m_engine); +// // \
add our print +// QJSValue printFunc = \
m_engine->newFunction(kwinEffectScriptPrint); +// \
printFunc.setData(m_engine->newQObject(this)); +// \
m_engine->globalObject().setProperty(QStringLiteral("print"), printFunc); +// // \
add our animationTime +// QJSValue animationTimeFunc = \
m_engine->newFunction(kwinEffectScriptAnimationTime); +// \
animationTimeFunc.setData(m_engine->newQObject(this)); +// \
m_engine->globalObject().setProperty(QStringLiteral("animationTime"), \
animationTimeFunc); +// // add displayWidth and displayHeight
+// QJSValue displayWidthFunc = m_engine->newFunction(kwinEffectDisplayWidth);
+// m_engine->globalObject().setProperty(QStringLiteral("displayWidth"), \
displayWidthFunc); +// QJSValue displayHeightFunc = \
m_engine->newFunction(kwinEffectDisplayHeight); +// \
m_engine->globalObject().setProperty(QStringLiteral("displayHeight"), \
displayHeightFunc); +// // add global Shortcut
+// registerGlobalShortcutFunction(this, m_engine, kwinScriptGlobalShortcut);
+// registerScreenEdgeFunction(this, m_engine, kwinScriptScreenEdge);
+// registerTouchScreenEdgeFunction(this, m_engine, kwinRegisterTouchScreenEdge);
+// unregisterTouchScreenEdgeFunction(this, m_engine, \
kwinUnregisterTouchScreenEdge); +// // add the animate method
+// QJSValue animateFunc = m_engine->newFunction(kwinEffectAnimate);
+// animateFunc.setData(m_engine->newQObject(this));
+// m_engine->globalObject().setProperty(QStringLiteral("animate"), animateFunc);
+
+// // and the set variant
+// QJSValue setFunc = m_engine->newFunction(kwinEffectSet);
+// setFunc.setData(m_engine->newQObject(this));
+// m_engine->globalObject().setProperty(QStringLiteral("set"), setFunc);
+
+// // retarget
+// QJSValue retargetFunc = m_engine->newFunction(kwinEffectRetarget);
+// retargetFunc.setData(m_engine->newQObject(this));
+// m_engine->globalObject().setProperty(QStringLiteral("retarget"), \
retargetFunc); +
+// // cancel...
+// QJSValue cancelFunc = m_engine->newFunction(kwinEffectCancel);
+// cancelFunc.setData(m_engine->newQObject(this));
+// m_engine->globalObject().setProperty(QStringLiteral("cancel"), cancelFunc);
+
+ QJSValue ret = m_engine->evaluate(QString::fromUtf8(scriptFile.readAll()));
+
+// qDebug() <<" HERE! " << ret.toString();
if (ret.isError()) {
- signalHandlerException(ret);
+// signalHandlerException(ret);
return false;
}
scriptFile.close();
@@ -567,19 +581,20 @@ void ScriptedEffect::animationEnded(KWin::EffectWindow *w, \
Attribute a, uint met emit animationEnded(w, 0);
}
-void ScriptedEffect::signalHandlerException(const QScriptValue &value)
-{
- if (value.isError()) {
- qCDebug(KWIN_SCRIPTING) << "KWin Effect script encountered an error at [Line \
" << m_engine->uncaughtExceptionLineNumber() << "]";
- qCDebug(KWIN_SCRIPTING) << "Message: " << value.toString();
+//TODO port to QQmlEngine::warnings
+//void ScriptedEffect::signalHandlerException(const QJSValue &value)
+//{
+// if (value.isError()) {
+// qCDebug(KWIN_SCRIPTING) << "KWin Effect script encountered an error at \
[Line " << m_engine->uncaughtExceptionLineNumber() << "]"; +// \
qCDebug(KWIN_SCRIPTING) << "Message: " << value.toString();
- QScriptValueIterator iter(value);
- while (iter.hasNext()) {
- iter.next();
- qCDebug(KWIN_SCRIPTING) << " " << iter.name() << ": " << \
iter.value().toString();
- }
- }
-}
+// QJSValueIterator iter(value);
+// while (iter.hasNext()) {
+// iter.next();
+// qCDebug(KWIN_SCRIPTING) << " " << iter.name() << ": " << \
iter.value().toString(); +// }
+// }
+//}
quint64 ScriptedEffect::animate(KWin::EffectWindow* w, \
KWin::AnimationEffect::Attribute a, int ms, KWin::FPx2 to, KWin::FPx2 from, uint \
metaData, QEasingCurve::Type curve, int delay) {
@@ -625,7 +640,7 @@ void ScriptedEffect::reconfigure(ReconfigureFlags flags)
emit configChanged();
}
-void ScriptedEffect::registerShortcut(QAction *a, QScriptValue callback)
+void ScriptedEffect::registerShortcut(QAction *a, QJSValue callback)
{
m_shortcutCallbacks.insert(a, callback);
connect(a, SIGNAL(triggered(bool)), SLOT(globalShortcutTriggered()));
@@ -633,12 +648,12 @@ void ScriptedEffect::registerShortcut(QAction *a, QScriptValue \
callback)
void ScriptedEffect::globalShortcutTriggered()
{
- callGlobalShortcutCallback<KWin::ScriptedEffect*>(this, sender());
+// callGlobalShortcutCallback<KWin::ScriptedEffect*>(this, sender());
}
bool ScriptedEffect::borderActivated(ElectricBorder edge)
{
- screenEdgeActivated(this, edge);
+// screenEdgeActivated(this, edge);
return true;
}
@@ -650,7 +665,7 @@ QVariant ScriptedEffect::readConfig(const QString &key, const \
QVariant defaultVa return m_config->property(key);
}
-bool ScriptedEffect::registerTouchScreenCallback(int edge, QScriptValue callback)
+bool ScriptedEffect::registerTouchScreenCallback(int edge, QJSValue callback)
{
if (m_touchScreenEdgeCallbacks.constFind(edge) != \
m_touchScreenEdgeCallbacks.constEnd()) { return false;
@@ -658,7 +673,7 @@ bool ScriptedEffect::registerTouchScreenCallback(int edge, \
QScriptValue callback QAction *action = new QAction(this);
connect(action, &QAction::triggered, this,
[callback] {
- QScriptValue invoke(callback);
+ QJSValue invoke(callback);
invoke.call();
}
);
@@ -678,7 +693,7 @@ bool ScriptedEffect::unregisterTouchScreenCallback(int edge)
return true;
}
-QScriptEngine *ScriptedEffect::engine() const
+QJSEngine *ScriptedEffect::engine() const
{
return m_engine;
}
diff --git a/scripting/scriptedeffect.h b/scripting/scriptedeffect.h
index 0d6dea2e3..3fbdec51e 100644
--- a/scripting/scriptedeffect.h
+++ b/scripting/scriptedeffect.h
@@ -25,8 +25,8 @@ along with this program. If not, see \
<http://www.gnu.org/licenses/>.
class KConfigLoader;
class KPluginMetaData;
-class QScriptEngine;
-class QScriptValue;
+class QJSEngine;
+class QJSValue;
namespace KWin
{
@@ -83,15 +83,15 @@ public:
* @returns The config value if present
**/
Q_SCRIPTABLE QVariant readConfig(const QString &key, const QVariant defaultValue \
= QVariant());
- void registerShortcut(QAction *a, QScriptValue callback);
- const QHash<QAction*, QScriptValue> &shortcutCallbacks() const {
+ void registerShortcut(QAction *a, QJSValue callback);
+ const QHash<QAction*, QJSValue> &shortcutCallbacks() const {
return m_shortcutCallbacks;
}
- QHash<int, QList<QScriptValue > > &screenEdgeCallbacks() {
+ QHash<int, QList<QJSValue > > &screenEdgeCallbacks() {
return m_screenEdgeCallbacks;
}
- bool registerTouchScreenCallback(int edge, QScriptValue callback);
+ bool registerTouchScreenCallback(int edge, QJSValue callback);
bool unregisterTouchScreenCallback(int edge);
public Q_SLOTS:
@@ -110,19 +110,18 @@ Q_SIGNALS:
protected:
ScriptedEffect();
- QScriptEngine *engine() const;
+ QJSEngine *engine() const;
bool init(const QString &effectName, const QString &pathToScript);
void animationEnded(KWin::EffectWindow *w, Attribute a, uint meta);
private Q_SLOTS:
- void signalHandlerException(const QScriptValue &value);
void globalShortcutTriggered();
private:
- QScriptEngine *m_engine;
+ QJSEngine *m_engine;
QString m_effectName;
QString m_scriptFile;
- QHash<QAction*, QScriptValue> m_shortcutCallbacks;
- QHash<int, QList<QScriptValue> > m_screenEdgeCallbacks;
+ QHash<QAction*, QJSValue> m_shortcutCallbacks;
+ QHash<int, QList<QJSValue> > m_screenEdgeCallbacks;
KConfigLoader *m_config;
int m_chainPosition;
QHash<int, QAction*> m_touchScreenEdgeCallbacks;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic