diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp index a06f77d7fe..9f87e07af8 100644 --- a/scripting/scripting.cpp +++ b/scripting/scripting.cpp @@ -157,6 +157,7 @@ KWin::Script::Script(int id, QString scriptName, QString pluginName, QObject* pa : AbstractScript(id, scriptName, pluginName, parent) , m_engine(new QScriptEngine(this)) , m_starting(false) + , m_agent(new ScriptUnloaderAgent(this)) { QDBusConnection::sessionBus().registerObject('/' + QString::number(scriptId()), this, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportScriptableInvokables); } @@ -235,6 +236,19 @@ void KWin::Script::sigException(const QScriptValue& exception) } } emit printError(exception.toString()); + stop(); +} + +KWin::ScriptUnloaderAgent::ScriptUnloaderAgent(KWin::Script *script) + : QScriptEngineAgent(script->engine()) + , m_script(script) +{ + script->engine()->setAgent(this); +} + +void KWin::ScriptUnloaderAgent::scriptUnload(qint64 id) +{ + m_script->stop(); } KWin::DeclarativeScript::DeclarativeScript(int id, QString scriptName, QString pluginName, QObject* parent) diff --git a/scripting/scripting.h b/scripting/scripting.h index 9c871eb0e7..b2b08ac7b3 100644 --- a/scripting/scripting.h +++ b/scripting/scripting.h @@ -25,6 +25,7 @@ along with this program. If not, see . #include #include #include +#include class QAction; class QDeclarativeView; @@ -38,6 +39,7 @@ typedef QList< QPair > > LoadScriptList; namespace KWin { +class ScriptUnloaderAgent; class WorkspaceWrapper; class AbstractScript : public QObject @@ -108,6 +110,9 @@ public: Script(int id, QString scriptName, QString pluginName, QObject *parent = NULL); virtual ~Script(); + QScriptEngine *engine() { + return m_engine; + } public Q_SLOTS: Q_SCRIPTABLE void run(); @@ -134,6 +139,17 @@ private: QByteArray loadScriptFromFile(); QScriptEngine *m_engine; bool m_starting; + QScopedPointer m_agent; +}; + +class ScriptUnloaderAgent : public QScriptEngineAgent +{ +public: + ScriptUnloaderAgent(Script *script); + virtual void scriptUnload(qint64 id); + +private: + Script *m_script; }; class DeclarativeScript : public AbstractScript