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