on xenial help sign in
implement GetSessionIdleTime()
a0f1491Lukáš Tinkl
plugins/Unity/Session/dbusunitysessionservice.cpp+54−14
@@ -31,6 +31,7 @@
31#include <QDBusPendingCall>
31#include <QDBusPendingCall>
32#include <QDBusReply>
32#include <QDBusReply>
33#include <QElapsedTimer>
33#include <QElapsedTimer>
34+#include <QDateTime>
34
35
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")
39
40
40#define ACTIVE_KEY QStringLiteral("Active")
41#define ACTIVE_KEY QStringLiteral("Active")
42+#define IDLE_SINCE_KEY QStringLiteral("IdleSinceHint")
41
43
42class DBusUnitySessionServicePrivate: public QObject
44class DBusUnitySessionServicePrivate: public QObject
43{
45{
@@ -114,7 +116,7 @@ public:
114 }
116 }
115 }
117 }
116
118
117− quint32 activeTime() const
119+ quint32 screensaverActiveTime() const
118 {
120 {
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;
124 }
126 }
125
127
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+
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)
128 {
149 {
129 Q_UNUSED(iface)
150 Q_UNUSED(iface)
130
151
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();
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+ }
135 }
168 }
169+ }
136
170
137− Q_EMIT screensaverActiveChanged(!isSessionActive);
171+ void setIdleHint(bool idle)
138−
172+ {
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");
143− }
177+ msg << idle;
178+ QDBusConnection::systemBus().asyncCall(msg);
144 }
179 }
145
180
146Q_SIGNALS:
181Q_SIGNALS:
@@ -385,7 +420,7 @@ void DBusGnomeScreensaverWrapper::Lock()
385
420
386quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
421quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
387{
422{
388− return d->activeTime();
423+ return d->screensaverActiveTime();
389}
424}
390
425
391
426
@@ -416,7 +451,12 @@ void DBusScreensaverWrapper::Lock()
416
451
417quint32 DBusScreensaverWrapper::GetActiveTime() const
452quint32 DBusScreensaverWrapper::GetActiveTime() const
418{
453{
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());
420}
460}
421
461
422#include "dbusunitysessionservice.moc"
462#include "dbusunitysessionservice.moc"
plugins/Unity/Session/dbusunitysessionservice.h+5
@@ -330,6 +330,11 @@ public Q_SLOTS:
330 */
330 */
331 Q_SCRIPTABLE quint32 GetActiveTime() const;
331 Q_SCRIPTABLE quint32 GetActiveTime() const;
332
332
333+ /**
334+ * @return the number of seconds that this session has been idle
335+ */
336+ Q_SCRIPTABLE quint32 GetSessionIdleTime() const;
337+
333Q_SIGNALS:
338Q_SIGNALS:
334 void ActiveChanged(bool active);
339 void ActiveChanged(bool active);
335};
340};
tests/plugins/Unity/Session/sessionbackendtest.cpp+1
@@ -173,6 +173,7 @@ private Q_SLOTS:
173
173
174// sleep(5);
174// sleep(5);
175// qDebug() << "Screensaver has been active for" << saverIface.GetActiveTime() << "seconds";
175// qDebug() << "Screensaver has been active for" << saverIface.GetActiveTime() << "seconds";
176+// qDebug() << "Session has been idle for" << saverIface.GetSessionIdleTime() << "seconds";
176// }
177// }
177
178
178private:
179private: