[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