@@ -31,6 +31,7 @@
31#include <QDBusPendingCall>
31#include <QDBusPendingCall>
32#include <QDBusReply>
32#include <QDBusReply>
33#include <QElapsedTimer>
33#include <QElapsedTimer>
35#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
36#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
36#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
37#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
@@ -38,6 +39,7 @@
38#define LOGIN1_SESSION_IFACE QStringLiteral("org.freedesktop.login1.Session")
39#define LOGIN1_SESSION_IFACE QStringLiteral("org.freedesktop.login1.Session")
40#define ACTIVE_KEY QStringLiteral("Active")
41#define ACTIVE_KEY QStringLiteral("Active")
42+#define IDLE_SINCE_KEY QStringLiteral("IdleSinceHint")
42class DBusUnitySessionServicePrivate: public QObject
44class DBusUnitySessionServicePrivate: public QObject
@@ -114,7 +116,7 @@ public:
117− quint32 activeTime() const
119+ quint32 screensaverActiveTime() const
119 if (!isSessionActive && screensaverActiveTimer.isValid()) {
121 if (!isSessionActive && screensaverActiveTimer.isValid()) {
120 return screensaverActiveTimer.elapsed() / 1000;
122 return screensaverActiveTimer.elapsed() / 1000;
@@ -123,24 +125,57 @@ public:
123 return 0;
125 return 0;
128+ quint64 idleSinceUSecTimestamp() const
130+ QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE,
132+ "org.freedesktop.DBus.Properties",
134+ msg << LOGIN1_SESSION_IFACE;
135+ msg << IDLE_SINCE_KEY;
137+ QDBusReply<QVariant> reply = QDBusConnection::systemBus().asyncCall(msg);
138+ if (reply.isValid()) {
139+ return reply.value().value<quint64>();
141+ qWarning() << "Failed to get IdleSinceHint property" << reply.error().message();
126private Q_SLOTS:
147private Q_SLOTS:
127 void onPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
148 void onPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
129 Q_UNUSED(iface)
150 Q_UNUSED(iface)
131− if (changedProps.contains(ACTIVE_KEY)) {
152+ if (changedProps.contains(ACTIVE_KEY) || invalidatedProps.contains(ACTIVE_KEY)) {
153+ if (changedProps.value(ACTIVE_KEY).isValid()) {
132− isSessionActive = changedProps.value(ACTIVE_KEY).toBool();
154+ isSessionActive = changedProps.value(ACTIVE_KEY).toBool();
133− } else if (invalidatedProps.contains(ACTIVE_KEY)) {
155+ } else {
134− checkActive();
156+ checkActive();
159+ Q_EMIT screensaverActiveChanged(!isSessionActive);
161+ if (isSessionActive) {
162+ screensaverActiveTimer.invalidate();
165+ screensaverActiveTimer.start();
137− Q_EMIT screensaverActiveChanged(!isSessionActive);
171+ void setIdleHint(bool idle)
139− if (isSessionActive) {
173+ QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE,
140− screensaverActiveTimer.invalidate();
174+ logindSessionPath,
141− } else {
175+ LOGIN1_SESSION_IFACE,
142− screensaverActiveTimer.start();
176+ "SetIdleHint");
178+ QDBusConnection::systemBus().asyncCall(msg);
146Q_SIGNALS:
181Q_SIGNALS:
@@ -385,7 +420,7 @@ void DBusGnomeScreensaverWrapper::Lock()
386quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
421quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
388− return d->activeTime();
423+ return d->screensaverActiveTime();
@@ -416,7 +451,12 @@ void DBusScreensaverWrapper::Lock()
417quint32 DBusScreensaverWrapper::GetActiveTime() const
452quint32 DBusScreensaverWrapper::GetActiveTime() const
419− return d->activeTime();
454+ return d->screensaverActiveTime();
457+quint32 DBusScreensaverWrapper::GetSessionIdleTime() const
459+ return QDateTime::fromMSecsSinceEpoch(d->idleSinceUSecTimestamp()/1000).secsTo(QDateTime::currentDateTime());
422#include "dbusunitysessionservice.moc"
462#include "dbusunitysessionservice.moc"