on xenial help sign in
implement GetSessionIdleTime()
commita0f149100143752aeb921d175af862af556c3b4f authorLukáš Tinkl <lukas.tinkl@canonical.com> dateThu 18 Jun 2015, 19:42 (11 years ago) parent34f3f35
3 files changed+60−14
plugins/Unity/Session/dbusunitysessionservice.cpp+54−14 plugins/Unity/Session/dbusunitysessionservice.h+5 tests/plugins/Unity/Session/sessionbackendtest.cpp+1
plugins/Unity/Session/dbusunitysessionservice.cpp+54−14
@@ -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"
plugins/Unity/Session/dbusunitysessionservice.h+5
@@ -330,6 +330,11 @@ public Q_SLOTS:
330330 */
331331 Q_SCRIPTABLE quint32 GetActiveTime() const;
332332
333+ /**
334+ * @return the number of seconds that this session has been idle
335+ */
336+ Q_SCRIPTABLE quint32 GetSessionIdleTime() const;
337+
333338Q_SIGNALS:
334339 void ActiveChanged(bool active);
335340};
tests/plugins/Unity/Session/sessionbackendtest.cpp+1
@@ -173,6 +173,7 @@ private Q_SLOTS:
173173
174174// sleep(5);
175175// qDebug() << "Screensaver has been active for" << saverIface.GetActiveTime() << "seconds";
176+// qDebug() << "Session has been idle for" << saverIface.GetSessionIdleTime() << "seconds";
176177// }
177178
178179private: