From 1d193fbad100dd0dbd72c7bd336278544c260c9c Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Sun, 13 Sep 2015 13:43:09 +0200 Subject: plasma-workspace: add ConsoleKit2 support for screenlocker. ConsoleKit2 has implemented the systemd-logind API for Lock, Unlock, PrepareForSleep and Inhibit. --- kde/patch/plasma-workspace.patch | 4 + .../plasma-workspace_consolekit2.patch | 189 +++++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 kde/patch/plasma-workspace.patch create mode 100644 kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch (limited to 'kde/patch') diff --git a/kde/patch/plasma-workspace.patch b/kde/patch/plasma-workspace.patch new file mode 100644 index 0000000..2b1c630 --- /dev/null +++ b/kde/patch/plasma-workspace.patch @@ -0,0 +1,4 @@ +# Add ConsoleKit2 support for screenlocker (ConsoleKit2 has implemented the +# systemd-logind API for Lock, Unlock, PrepareForSleep and Inhibit. +cat $CWD/patch/plasma-workspace/plasma-workspace_consolekit2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; } + diff --git a/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch b/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch new file mode 100644 index 0000000..6131c90 --- /dev/null +++ b/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch @@ -0,0 +1,189 @@ +From: Eric Koegel +Date: Wed, 12 Aug 2015 08:33:39 +0000 +Subject: ConsoleKit2 support for screenlocker +X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=72578284a1fda5f012cafcaccad6069fadbf9a25 +--- +ConsoleKit2 support for screenlocker + +ConsoleKit2 has the same API as systemd-logind for Lock, Unlock, +PrepareForSleep, and Inhibit. This patch adds the functionality +for ConsoleKit2 while attempting to minimize code duplication. + +REVIEW: 124469 +--- + + +--- a/ksmserver/screenlocker/logind.cpp ++++ b/ksmserver/screenlocker/logind.cpp +@@ -25,13 +25,17 @@ + #include + #include + #include +-#include + #include + + const static QString s_login1Service = QStringLiteral("org.freedesktop.login1"); + const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1"); + const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager"); + const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session"); ++ ++const static QString s_consolekitService = QStringLiteral("org.freedesktop.ConsoleKit"); ++const static QString s_consolekitPath = QStringLiteral("/org/freedesktop/ConsoleKit/Manager"); ++const static QString s_consolekitManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager"); ++const static QString s_consolekitSessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session"); + + LogindIntegration::LogindIntegration(const QDBusConnection &connection, QObject *parent) + : QObject(parent) +@@ -42,6 +46,10 @@ + this)) + , m_connected(false) + , m_inhibitFileDescriptor() ++ , m_service(nullptr) ++ , m_path(nullptr) ++ , m_managerInterface(nullptr) ++ , m_sessionInterface(nullptr) + { + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered); + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, +@@ -67,6 +75,11 @@ + } + if (reply.value().contains(s_login1Service)) { + logindServiceRegistered(); ++ // Don't register ck if we have logind ++ return; ++ } ++ if (reply.value().contains(s_consolekitService)) { ++ consolekitServiceRegistered(); + } + } + ); +@@ -89,6 +102,40 @@ + message.setArguments(QVariantList() << (quint32) QCoreApplication::applicationPid()); + QDBusPendingReply session = m_bus.asyncCall(message); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this); ++ ++ m_service = &s_login1Service; ++ m_path = &s_login1Path; ++ m_managerInterface = &s_login1ManagerInterface; ++ m_sessionInterface = &s_login1SessionInterface; ++ ++ commonServiceRegistered(watcher); ++} ++ ++void LogindIntegration::consolekitServiceRegistered() ++{ ++ // Don't try to register with ck if we have logind ++ if (m_connected) { ++ return; ++ } ++ ++ // get the current session ++ QDBusMessage message = QDBusMessage::createMethodCall(s_consolekitService, ++ s_consolekitPath, ++ s_consolekitManagerInterface, ++ QStringLiteral("GetCurrentSession")); ++ QDBusPendingReply session = m_bus.asyncCall(message); ++ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this); ++ ++ m_service = &s_consolekitService; ++ m_path = &s_consolekitPath; ++ m_managerInterface = &s_consolekitManagerInterface; ++ m_sessionInterface = &s_consolekitSessionInterface; ++ ++ commonServiceRegistered(watcher); ++} ++ ++void LogindIntegration::commonServiceRegistered(QDBusPendingCallWatcher *watcher) ++{ + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [this](QDBusPendingCallWatcher *self) { + QDBusPendingReply reply = *self; +@@ -97,7 +144,7 @@ + return; + } + if (!reply.isValid()) { +- qDebug() << "The session is not registered with logind" << reply.error().message(); ++ qDebug() << "The session is not registered: " << reply.error().message(); + return; + } + const QString sessionPath = reply.value().path(); +@@ -105,15 +152,15 @@ + + // connections need to be done this way as the object exposes both method and signal + // with name "Lock"/"Unlock". Qt is not able to automatically handle this. +- m_bus.connect(s_login1Service, ++ m_bus.connect(*m_service, + sessionPath, +- s_login1SessionInterface, ++ *m_sessionInterface, + QStringLiteral("Lock"), + this, + SIGNAL(requestLock())); +- m_bus.connect(s_login1Service, ++ m_bus.connect(*m_service, + sessionPath, +- s_login1SessionInterface, ++ *m_sessionInterface, + QStringLiteral("Unlock"), + this, + SIGNAL(requestUnlock())); +@@ -123,9 +170,9 @@ + ); + + // connect to manager object's signals we need +- m_bus.connect(s_login1Service, +- s_login1Path, +- s_login1ManagerInterface, ++ m_bus.connect(*m_service, ++ *m_path, ++ *m_managerInterface, + QStringLiteral("PrepareForSleep"), + this, + SIGNAL(prepareForSleep(bool))); +@@ -136,9 +183,14 @@ + if (m_inhibitFileDescriptor.isValid()) { + return; + } +- QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, +- s_login1Path, +- s_login1ManagerInterface, ++ ++ if (!m_connected) { ++ return; ++ } ++ ++ QDBusMessage message = QDBusMessage::createMethodCall(*m_service, ++ *m_path, ++ *m_managerInterface, + QStringLiteral("Inhibit")); + message.setArguments(QVariantList({QStringLiteral("sleep"), + i18n("Screen Locker"), + +--- a/ksmserver/screenlocker/logind.h ++++ b/ksmserver/screenlocker/logind.h +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + class QDBusServiceWatcher; + +@@ -59,10 +60,16 @@ + **/ + explicit LogindIntegration(const QDBusConnection &connection, QObject *parent = nullptr); + void logindServiceRegistered(); ++ void consolekitServiceRegistered(); ++ void commonServiceRegistered(QDBusPendingCallWatcher *watcher); + QDBusConnection m_bus; + QDBusServiceWatcher *m_logindServiceWatcher; + bool m_connected; + QDBusUnixFileDescriptor m_inhibitFileDescriptor; ++ const QString *m_service; ++ const QString *m_path; ++ const QString *m_managerInterface; ++ const QString *m_sessionInterface; + }; + + #endif + -- cgit v1.2.3