You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
7.4 KiB
190 lines
7.4 KiB
From: Eric Koegel <eric.koegel@gmail.com>
|
|
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 <QDebug>
|
|
#include <QDBusConnection>
|
|
#include <QDBusConnectionInterface>
|
|
-#include <QDBusPendingCallWatcher>
|
|
#include <QDBusServiceWatcher>
|
|
|
|
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<QDBusObjectPath> 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<QDBusObjectPath> 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<QDBusObjectPath> 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 <QDBusConnection>
|
|
#include <QDBusUnixFileDescriptor>
|
|
#include <QObject>
|
|
+#include <QDBusPendingCallWatcher>
|
|
|
|
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
|
|
|