diff --git a/logind.h b/logind.h --- a/logind.h +++ b/logind.h @@ -78,6 +78,11 @@ explicit LogindIntegration(const QDBusConnection &connection, QObject *parent = nullptr); void logindServiceRegistered(); void connectSessionPropertiesChanged(); + enum SessionController { + SessionControllerLogind, + SessionControllerConsoleKit, + }; + void setupSessionController(SessionController controller); void getSeat(); QDBusConnection m_bus; QDBusServiceWatcher *m_logindServiceWatcher; @@ -87,6 +92,13 @@ bool m_sessionActive; int m_vt = -1; QString m_seatPath; + QString m_sessionControllerName; + QString m_sessionControllerService; + QString m_sessionControllerPath; + QString m_sessionControllerManagerInterface; + QString m_sessionControllerSeatInterface; + QString m_sessionControllerSessionInterface; + QString m_sessionControllerActivateProperty; KWIN_SINGLETON(LogindIntegration) }; diff --git a/logind.cpp b/logind.cpp --- a/logind.cpp +++ b/logind.cpp @@ -58,12 +58,26 @@ namespace KWin { +const static QString s_login1Name = QStringLiteral("logind"); 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_login1SeatInterface = QStringLiteral("org.freedesktop.login1.Seat"); const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session"); +const static QString s_login1ActivateProperty = QStringLiteral("Activate"); + +const static QString s_ck2Name = QStringLiteral("ConsoleKit"); +const static QString s_ck2Service = QStringLiteral("org.freedesktop.ConsoleKit"); +const static QString s_ck2Path = QStringLiteral("/org/freedesktop/ConsoleKit/Manager"); +const static QString s_ck2ManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager"); +const static QString s_ck2SeatInterface = QStringLiteral("org.freedesktop.ConsoleKit.Seat"); +const static QString s_ck2SessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session"); +const static QString s_ck2ActivateProperty = QStringLiteral("activate"); + const static QString s_dbusPropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); + + LogindIntegration *LogindIntegration::s_self = nullptr; LogindIntegration *LogindIntegration::create(QObject *parent) @@ -76,22 +90,10 @@ LogindIntegration::LogindIntegration(const QDBusConnection &connection, QObject *parent) : QObject(parent) , m_bus(connection) - , m_logindServiceWatcher(new QDBusServiceWatcher(s_login1Service, - m_bus, - QDBusServiceWatcher::WatchForUnregistration | QDBusServiceWatcher::WatchForRegistration, - this)) , m_connected(false) , m_sessionControl(false) , m_sessionActive(false) { - connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered); - connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, - [this]() { - m_connected = false; - emit connectedChanged(); - } - ); - // check whether the logind service is registered QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DBus"), QStringLiteral("/"), @@ -107,8 +109,11 @@ return; } if (reply.value().contains(s_login1Service)) { - logindServiceRegistered(); + setupSessionController(SessionControllerLogind); + } else if (reply.value().contains(s_ck2Service)) { + setupSessionController(SessionControllerConsoleKit); } + } ); } @@ -123,6 +128,53 @@ s_self = nullptr; } +void LogindIntegration::setupSessionController(SessionController controller) +{ + if (controller == SessionControllerLogind) { + // We have the logind serivce, set it up and use it + m_sessionControllerName = s_login1Name; + m_sessionControllerService = s_login1Service; + m_sessionControllerPath = s_login1Path; + m_sessionControllerManagerInterface = s_login1ManagerInterface; + m_sessionControllerSeatInterface = s_login1SeatInterface; + m_sessionControllerSessionInterface = s_login1SessionInterface; + m_sessionControllerActivateProperty = s_login1ActivateProperty; + m_logindServiceWatcher = new QDBusServiceWatcher(m_sessionControllerService, + m_bus, + QDBusServiceWatcher::WatchForUnregistration | QDBusServiceWatcher::WatchForRegistration, + this); + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered); + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, + [this]() { + m_connected = false; + emit connectedChanged(); + } + ); + logindServiceRegistered(); + } else if (controller == SessionControllerConsoleKit) { + // We have the ConsoleKit serivce, set it up and use it + m_sessionControllerName = s_ck2Name; + m_sessionControllerService = s_ck2Service; + m_sessionControllerPath = s_ck2Path; + m_sessionControllerManagerInterface = s_ck2ManagerInterface; + m_sessionControllerSeatInterface = s_ck2SeatInterface; + m_sessionControllerSessionInterface = s_ck2SessionInterface; + m_sessionControllerActivateProperty = s_ck2ActivateProperty; + m_logindServiceWatcher = new QDBusServiceWatcher(m_sessionControllerService, + m_bus, + QDBusServiceWatcher::WatchForUnregistration | QDBusServiceWatcher::WatchForRegistration, + this); + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered); + connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, + [this]() { + m_connected = false; + emit connectedChanged(); + } + ); + logindServiceRegistered(); + } +} + void LogindIntegration::logindServiceRegistered() { const QByteArray sessionId = qgetenv("XDG_SESSION_ID"); @@ -136,9 +188,9 @@ args << QString::fromLocal8Bit(sessionId); } // get the current session - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, - s_login1Path, - s_login1ManagerInterface, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, + m_sessionControllerPath, + m_sessionControllerManagerInterface, methodName); message.setArguments(args); QDBusPendingReply session = m_bus.asyncCall(message); @@ -151,17 +203,17 @@ return; } if (!reply.isValid()) { - qCDebug(KWIN_CORE) << "The session is not registered with logind" << reply.error().message(); + qCDebug(KWIN_CORE) << "The session is not registered with " << m_sessionControllerName << " " << reply.error().message(); return; } m_sessionPath = reply.value().path(); qCDebug(KWIN_CORE) << "Session path:" << m_sessionPath; m_connected = true; connectSessionPropertiesChanged(); // activate the session, in case we are not on it - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, - s_login1SessionInterface, + m_sessionControllerSessionInterface, QStringLiteral("Activate")); // blocking on purpose m_bus.call(message); @@ -176,13 +228,13 @@ void LogindIntegration::connectSessionPropertiesChanged() { - m_bus.connect(s_login1Service, + m_bus.connect(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("PropertiesChanged"), this, SLOT(getSessionActive())); - m_bus.connect(s_login1Service, + m_bus.connect(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("PropertiesChanged"), @@ -195,19 +247,19 @@ if (!m_connected || m_sessionPath.isEmpty()) { return; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("Get")); - message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("Active")})); + message.setArguments(QVariantList({m_sessionControllerSessionInterface, m_sessionControllerActivateProperty})); QDBusPendingReply reply = m_bus.asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { QDBusPendingReply reply = *self; self->deleteLater(); if (!reply.isValid()) { - qCDebug(KWIN_CORE) << "Failed to get Active Property of logind session:" << reply.error().message(); + qCDebug(KWIN_CORE) << "Failed to get Active Property of " << m_sessionControllerName << " session:" << reply.error().message(); return; } const bool active = reply.value().toBool(); @@ -224,19 +276,19 @@ if (!m_connected || m_sessionPath.isEmpty()) { return; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("Get")); - message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("VTNr")})); + message.setArguments(QVariantList({m_sessionControllerSessionInterface, QStringLiteral("VTNr")})); QDBusPendingReply reply = m_bus.asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { QDBusPendingReply reply = *self; self->deleteLater(); if (!reply.isValid()) { - qCDebug(KWIN_CORE) << "Failed to get VTNr Property of logind session:" << reply.error().message(); + qCDebug(KWIN_CORE) << "Failed to get VTNr Property of " << m_sessionControllerName << " session:" << reply.error().message(); return; } const int vt = reply.value().toUInt(); @@ -259,9 +311,9 @@ } s_recursionCheck = true; - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, - s_login1SessionInterface, + m_sessionControllerSessionInterface, QStringLiteral("TakeControl")); message.setArguments(QVariantList({QVariant(false)})); QDBusPendingReply session = m_bus.asyncCall(message); @@ -279,8 +331,8 @@ qCDebug(KWIN_CORE) << "Gained session control"; m_sessionControl = true; emit hasSessionControlChanged(true); - m_bus.connect(s_login1Service, m_sessionPath, - s_login1SessionInterface, QStringLiteral("PauseDevice"), + m_bus.connect(m_sessionControllerService, m_sessionPath, + m_sessionControllerSessionInterface, QStringLiteral("PauseDevice"), this, SLOT(pauseDevice(uint,uint,QString))); } ); @@ -292,9 +344,9 @@ return; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, - s_login1SessionInterface, + m_sessionControllerSessionInterface, QStringLiteral("ReleaseControl")); m_bus.asyncCall(message); m_sessionControl = false; @@ -308,9 +360,9 @@ qCDebug(KWIN_CORE) << "Could not stat the path"; return -1; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, - s_login1SessionInterface, + m_sessionControllerSessionInterface, QStringLiteral("TakeDevice")); message.setArguments(QVariantList({QVariant(major(st.st_rdev)), QVariant(minor(st.st_rdev))})); // intended to be a blocking call @@ -329,9 +381,9 @@ qCDebug(KWIN_CORE) << "Could not stat the file descriptor"; return; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, - s_login1SessionInterface, + m_sessionControllerSessionInterface, QStringLiteral("ReleaseDevice")); message.setArguments(QVariantList({QVariant(major(st.st_rdev)), QVariant(minor(st.st_rdev))})); m_bus.asyncCall(message); @@ -341,7 +393,7 @@ { if (QString::compare(type, QStringLiteral("pause"), Qt::CaseInsensitive) == 0) { // unconditionally call complete - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, m_sessionPath, s_login1SessionInterface, QStringLiteral("PauseDeviceComplete")); + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, m_sessionControllerSessionInterface, QStringLiteral("PauseDeviceComplete")); message.setArguments(QVariantList({QVariant(devMajor), QVariant(devMinor)})); m_bus.asyncCall(message); } @@ -353,24 +405,26 @@ return; } qDBusRegisterMetaType(); - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("Get")); - message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("Seat")})); + message.setArguments(QVariantList({m_sessionControllerSessionInterface, QStringLiteral("Seat")})); + message.setArguments(QVariantList({m_sessionControllerSessionInterface, QStringLiteral("Seat")})); QDBusPendingReply reply = m_bus.asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { QDBusPendingReply reply = *self; self->deleteLater(); if (!reply.isValid()) { - qCDebug(KWIN_CORE) << "Failed to get Seat Property of logind session:" << reply.error().message(); + qCDebug(KWIN_CORE) << "Failed to get Seat Property of " << m_sessionControllerName << " session:" << reply.error().message(); return; } DBusLogindSeat seat = qdbus_cast(reply.value().value()); const QString seatPath = seat.path.path(); - qCDebug(KWIN_CORE) << "Logind seat:" << seat.name << "/" << seatPath; + qCDebug(KWIN_CORE) << m_sessionControllerName << " seat:" << seat.name << "/" << seatPath; + qCDebug(KWIN_CORE) << m_sessionControllerName << " seat:" << seat.name << "/" << seatPath; if (m_seatPath != seatPath) { m_seatPath = seatPath; } @@ -383,9 +437,9 @@ if (!m_connected || m_seatPath.isEmpty()) { return; } - QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service, + QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_seatPath, - QStringLiteral("org.freedesktop.login1.Seat"), + m_sessionControllerSeatInterface, QStringLiteral("SwitchTo")); message.setArguments(QVariantList{vtNr}); m_bus.asyncCall(message);