diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -365,6 +365,7 @@ Qt5::Test Qt5::Widgets # QAction include Qt5::Quick + Qt5::DBus KF5::ConfigCore ) diff --git a/autotests/tabbox/CMakeLists.txt b/autotests/tabbox/CMakeLists.txt --- a/autotests/tabbox/CMakeLists.txt +++ b/autotests/tabbox/CMakeLists.txt @@ -22,6 +22,7 @@ Qt5::Script Qt5::Quick Qt5::Test + Qt5::DBus Qt5::X11Extras KF5::ConfigCore KF5::I18n @@ -54,6 +55,7 @@ Qt5::Script Qt5::Quick Qt5::Test + Qt5::DBus Qt5::X11Extras KF5::ConfigCore KF5::I18n diff --git a/scripting/scripting.h b/scripting/scripting.h --- a/scripting/scripting.h +++ b/scripting/scripting.h @@ -30,6 +30,9 @@ #include #include +#include +#include + class QQmlComponent; class QQmlContext; class QQmlEngine; @@ -214,7 +217,7 @@ QList m_userActionsMenuCallbacks; }; -class Script : public AbstractScript +class Script : public AbstractScript, QDBusContext { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.Scripting") @@ -254,6 +257,7 @@ **/ QByteArray loadScriptFromFile(const QString &fileName); QScriptEngine *m_engine; + QDBusMessage m_invocationContext; bool m_starting; QScopedPointer m_agent; QHash m_touchScreenEdgeCallbacks; diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp --- a/scripting/scripting.cpp +++ b/scripting/scripting.cpp @@ -465,6 +465,12 @@ if (running() || m_starting) { return; } + + if (calledFromDBus()) { + m_invocationContext = message(); + setDelayedReply(true); + } + m_starting = true; QFutureWatcher *watcher = new QFutureWatcher(this); connect(watcher, SIGNAL(finished()), SLOT(slotScriptLoadedFromFile())); @@ -492,8 +498,16 @@ // do not load empty script deleteLater(); watcher->deleteLater(); + + if (m_invocationContext.type() == QDBusMessage::MethodCallMessage) { + auto reply = m_invocationContext.createErrorReply("org.kde.kwin.Scripting.FileError", QString("Could not open %1").arg(fileName())); + QDBusConnection::sessionBus().send(reply); + m_invocationContext = QDBusMessage(); + } + return; } + QScriptValue optionsValue = m_engine->newQObject(options, QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassContents | QScriptEngine::ExcludeDeleteLater); m_engine->globalObject().setProperty(QStringLiteral("options"), optionsValue, QScriptValue::Undeletable); @@ -509,6 +523,12 @@ deleteLater(); } + if (m_invocationContext.type() == QDBusMessage::MethodCallMessage) { + auto reply = m_invocationContext.createReply(); + QDBusConnection::sessionBus().send(reply); + m_invocationContext = QDBusMessage(); + } + watcher->deleteLater(); setRunning(true); m_starting = false;