diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -274,7 +274,6 @@
install(FILES ${kscreensaver_dbusXML}
DESTINATION ${KDE_INSTALL_DBUSINTERFACEDIR})
-
install(FILES updaters/kscreenlocker.upd DESTINATION ${KDE_INSTALL_DATADIR}/kconf_update)
install(PROGRAMS updaters/ksreenlocker_5_3_separate_autologin.pl
DESTINATION ${KDE_INSTALL_DATADIR}/kconf_update)
diff --git a/dbus/org.kde.screensaver.Greeter.xml b/dbus/org.kde.screensaver.Greeter.xml
new file mode 100644
--- /dev/null
+++ b/dbus/org.kde.screensaver.Greeter.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/greeter/CMakeLists.txt b/greeter/CMakeLists.txt
--- a/greeter/CMakeLists.txt
+++ b/greeter/CMakeLists.txt
@@ -1,6 +1,8 @@
remove_definitions(-DTRANSLATION_DOMAIN=\"kscreenlocker\")
add_definitions(-DTRANSLATION_DOMAIN=\"kscreenlocker_greet\")
+set(greeter_dbusXML ../dbus/org.kde.screensaver.Greeter.xml)
+
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
../kcheckpass
@@ -17,6 +19,8 @@
kwinglplatform.cpp
)
+qt5_add_dbus_adaptor(kscreenlocker_greet_SRCS ${greeter_dbusXML} greeterapp.h ScreenLocker::UnlockApp greeteradapter GreeterAdapter)
+
if(HAVE_SECCOMP)
set(kscreenlocker_greet_SRCS ${kscreenlocker_greet_SRCS} seccomp_filter.cpp)
endif()
@@ -52,6 +56,9 @@
install(TARGETS kscreenlocker_greet DESTINATION ${KDE_INSTALL_LIBEXECDIR})
+install(FILES ${greeter_dbusXML}
+ DESTINATION ${KDE_INSTALL_DBUSINTERFACEDIR})
+
install(DIRECTORY themes/org.kde.passworddialog DESTINATION ${KDE_INSTALL_DATADIR}/ksmserver/screenlocker)
add_subdirectory(autotests)
diff --git a/greeter/greeterapp.h b/greeter/greeterapp.h
--- a/greeter/greeterapp.h
+++ b/greeter/greeterapp.h
@@ -48,6 +48,7 @@
class UnlockApp : public QGuiApplication
{
Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.kde.screensaver.GreeterApp")
public:
explicit UnlockApp(int &argc, char **argv);
~UnlockApp() override;
@@ -73,6 +74,12 @@
public Q_SLOTS:
void desktopResized();
+ // dbus
+ void Notify(uint id, const QString &app_name, uint replaces_id, const QString &app_icon,
+ const QString &summary, const QString &body, const QStringList &actions,
+ const QVariantMap &hints, int timeout);
+ void CloseNotification(uint id);
+
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
diff --git a/greeter/greeterapp.cpp b/greeter/greeterapp.cpp
--- a/greeter/greeterapp.cpp
+++ b/greeter/greeterapp.cpp
@@ -19,6 +19,7 @@
along with this program. If not, see .
*********************************************************************/
#include "greeterapp.h"
+#include "greeteradapter.h"
#include "kscreensaversettingsbase.h"
#include "authenticator.h"
#include "noaccessnetworkaccessmanagerfactory.h"
@@ -133,6 +134,10 @@
if (QX11Info::isPlatformX11()) {
installNativeEventFilter(new FocusOutEventFilter);
}
+
+ (void) new GreeterAdapter(this);
+ QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.screensaver.Greeter"));
+ QDBusConnection::sessionBus().registerObject(QStringLiteral("/Greeter"), this);
}
UnlockApp::~UnlockApp()
@@ -479,6 +484,41 @@
}
}
+void UnlockApp::Notify(uint id, const QString &app_name, uint replaces_id, const QString &app_icon,
+ const QString &summary, const QString &body, const QStringList &actions,
+ const QVariantMap &hints, int timeout)
+{
+ for (auto v : qAsConst(m_views)) {
+ auto rootObject = v->rootObject();
+ if (!rootObject) {
+ continue;
+ }
+ // we invoke the notify method of the greeter root object
+ QMetaObject::invokeMethod(rootObject, "Notify", Qt::QueuedConnection,
+ Q_ARG(uint, id),
+ Q_ARG(QString, app_name),
+ Q_ARG(uint, replaces_id),
+ Q_ARG(QString, app_icon),
+ Q_ARG(QString, summary),
+ Q_ARG(QString, body),
+ Q_ARG(QStringList, actions),
+ Q_ARG(QVariantMap, hints),
+ Q_ARG(int, timeout));
+ }
+}
+
+void UnlockApp::CloseNotification(uint id)
+{
+ for (auto v : qAsConst(m_views)) {
+ auto rootObject = v->rootObject();
+ if (!rootObject) {
+ continue;
+ }
+ QMetaObject::invokeMethod(rootObject, "CloseNotification",
+ Qt::QueuedConnection, Q_ARG(uint, id));
+ }
+}
+
void UnlockApp::resetRequestIgnore()
{
m_ignoreRequests = false;