@@ -31,6 +31,7 @@
3131#include <QDBusPendingCall>
3232#include <QDBusReply>
3333#include <QElapsedTimer>
34+#include <QDateTime>
3435
3536#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
3637#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
@@ -38,6 +39,7 @@
3839#define LOGIN1_SESSION_IFACE QStringLiteral("org.freedesktop.login1.Session")
3940
4041#define ACTIVE_KEY QStringLiteral("Active")
42+#define IDLE_SINCE_KEY QStringLiteral("IdleSinceHint")
4143
4244class DBusUnitySessionServicePrivate: public QObject
4345{
@@ -114,7 +116,7 @@ public:
114116 }
115117 }
116118
117− quint32 activeTime() const
119+ quint32 screensaverActiveTime() const
118120 {
119121 if (!isSessionActive && screensaverActiveTimer.isValid()) {
120122 return screensaverActiveTimer.elapsed() / 1000;
@@ -123,24 +125,57 @@ public:
123125 return 0;
124126 }
125127
128+ quint64 idleSinceUSecTimestamp() const
129+ {
130+ QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE,
131+ logindSessionPath,
132+ "org.freedesktop.DBus.Properties",
133+ "Get");
134+ msg << LOGIN1_SESSION_IFACE;
135+ msg << IDLE_SINCE_KEY;
136+
137+ QDBusReply<QVariant> reply = QDBusConnection::systemBus().asyncCall(msg);
138+ if (reply.isValid()) {
139+ return reply.value().value<quint64>();
140+ } else {
141+ qWarning() << "Failed to get IdleSinceHint property" << reply.error().message();
142+ }
143+
144+ return 0;
145+ }
146+
126147private Q_SLOTS:
127148 void onPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
128149 {
129150 Q_UNUSED(iface)
130151
131− if (changedProps.contains(ACTIVE_KEY)) {
132− isSessionActive = changedProps.value(ACTIVE_KEY).toBool();
133− } else if (invalidatedProps.contains(ACTIVE_KEY)) {
134− checkActive();
152+ if (changedProps.contains(ACTIVE_KEY) || invalidatedProps.contains(ACTIVE_KEY)) {
153+ if (changedProps.value(ACTIVE_KEY).isValid()) {
154+ isSessionActive = changedProps.value(ACTIVE_KEY).toBool();
155+ } else {
156+ checkActive();
157+ }
158+
159+ Q_EMIT screensaverActiveChanged(!isSessionActive);
160+
161+ if (isSessionActive) {
162+ screensaverActiveTimer.invalidate();
163+ setIdleHint(false);
164+ } else {
165+ screensaverActiveTimer.start();
166+ setIdleHint(true);
167+ }
135168 }
169+ }
136170
137− Q_EMIT screensaverActiveChanged(!isSessionActive);
138−
139− if (isSessionActive) {
140− screensaverActiveTimer.invalidate();
141− } else {
142− screensaverActiveTimer.start();
143− }
171+ void setIdleHint(bool idle)
172+ {
173+ QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE,
174+ logindSessionPath,
175+ LOGIN1_SESSION_IFACE,
176+ "SetIdleHint");
177+ msg << idle;
178+ QDBusConnection::systemBus().asyncCall(msg);
144179 }
145180
146181Q_SIGNALS:
@@ -385,7 +420,7 @@ void DBusGnomeScreensaverWrapper::Lock()
385420
386421quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
387422{
388− return d->activeTime();
423+ return d->screensaverActiveTime();
389424}
390425
391426
@@ -416,7 +451,12 @@ void DBusScreensaverWrapper::Lock()
416451
417452quint32 DBusScreensaverWrapper::GetActiveTime() const
418453{
419− return d->activeTime();
454+ return d->screensaverActiveTime();
455+}
456+
457+quint32 DBusScreensaverWrapper::GetSessionIdleTime() const
458+{
459+ return QDateTime::fromMSecsSinceEpoch(d->idleSinceUSecTimestamp()/1000).secsTo(QDateTime::currentDateTime());
420460}
421461
422462#include "dbusunitysessionservice.moc"