diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp
index d1b76d1e86..bc41770fa4 100644
--- a/scripting/scripting.cpp
+++ b/scripting/scripting.cpp
@@ -25,6 +25,7 @@ along with this program. If not, see .
#include "workspace_wrapper.h"
#include "../thumbnailitem.h"
#include "../options.h"
+#include "../workspace.h"
// KDE
#include
#include
@@ -229,6 +230,7 @@ KWin::Scripting::Scripting(QObject *parent)
{
QDBusConnection::sessionBus().registerObject("/Scripting", this, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportScriptableInvokables);
QDBusConnection::sessionBus().registerService("org.kde.kwin.Scripting");
+ connect(Workspace::self(), SIGNAL(configChanged()), SLOT(start()));
}
void KWin::Scripting::start()
@@ -248,6 +250,10 @@ void KWin::Scripting::start()
}
if (!plugininfo.isPluginEnabled()) {
+ if (isScriptLoaded(plugininfo.pluginName())) {
+ // unload the script
+ unloadScript(plugininfo.pluginName());
+ }
continue;
}
const QString pluginName = service->property("X-KDE-PluginInfo-Name").toString();
@@ -267,6 +273,27 @@ void KWin::Scripting::start()
runScripts();
}
+bool KWin::Scripting::isScriptLoaded(const QString &pluginName) const
+{
+ foreach (AbstractScript *script, scripts) {
+ if (script->pluginName() == pluginName) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool KWin::Scripting::unloadScript(const QString &pluginName)
+{
+ foreach (AbstractScript *script, scripts) {
+ if (script->pluginName() == pluginName) {
+ script->deleteLater();
+ return true;
+ }
+ }
+ return false;
+}
+
void KWin::Scripting::runScripts()
{
for (int i = 0; i < scripts.size(); i++) {
@@ -281,6 +308,9 @@ void KWin::Scripting::scriptDestroyed(QObject *object)
int KWin::Scripting::loadScript(const QString &filePath, const QString& pluginName)
{
+ if (isScriptLoaded(pluginName)) {
+ return -1;
+ }
const int id = scripts.size();
KWin::Script *script = new KWin::Script(id, filePath, pluginName, this);
connect(script, SIGNAL(destroyed(QObject*)), SLOT(scriptDestroyed(QObject*)));
@@ -290,6 +320,9 @@ int KWin::Scripting::loadScript(const QString &filePath, const QString& pluginNa
int KWin::Scripting::loadDeclarativeScript(const QString& filePath, const QString& pluginName)
{
+ if (isScriptLoaded(pluginName)) {
+ return -1;
+ }
const int id = scripts.size();
KWin::DeclarativeScript *script = new KWin::DeclarativeScript(id, filePath, pluginName, this);
connect(script, SIGNAL(destroyed(QObject*)), SLOT(scriptDestroyed(QObject*)));
diff --git a/scripting/scripting.h b/scripting/scripting.h
index d9d0bdb641..67184b4c60 100644
--- a/scripting/scripting.h
+++ b/scripting/scripting.h
@@ -43,6 +43,9 @@ public:
QString fileName() const {
return m_scriptFile.fileName();
}
+ const QString &pluginName() {
+ return m_pluginName;
+ }
void printMessage(const QString &message);
@@ -59,9 +62,6 @@ protected:
QFile &scriptFile() {
return m_scriptFile;
}
- const QString &pluginName() {
- return m_pluginName;
- }
bool running() const {
return m_running;
}
@@ -143,17 +143,15 @@ private:
public:
Scripting(QObject *parent = NULL);
- /**
- * Start running scripts. This was essential to have KWin::Scripting
- * be initialized on stack and also have the option to disable scripting.
- */
- void start();
~Scripting();
Q_SCRIPTABLE Q_INVOKABLE int loadScript(const QString &filePath, const QString &pluginName = QString());
Q_SCRIPTABLE Q_INVOKABLE int loadDeclarativeScript(const QString &filePath, const QString &pluginName = QString());
+ Q_SCRIPTABLE Q_INVOKABLE bool isScriptLoaded(const QString &pluginName) const;
+ Q_SCRIPTABLE Q_INVOKABLE bool unloadScript(const QString &pluginName);
public Q_SLOTS:
void scriptDestroyed(QObject *object);
+ void start();
};
}