on xenial help sign in
Support org.gnome.SessionManager interface
commit71328b08f6548f001352eb688da11660f7b3f0cb authorMichael Terry <mike@mterry.name> dateWed 15 Mar 2017, 17:31 (10 years ago) parent593d500
6 files changed+186−8
plugins/Unity/Session/dbusunitysessionservice.cpp+46−1 plugins/Unity/Session/dbusunitysessionservice.h+18−4 tests/plugins/Unity/Session/LogindServer.cpp+10 tests/plugins/Unity/Session/LogindServer.h+5 tests/plugins/Unity/Session/interfaces.xml+12 tests/plugins/Unity/Session/sessionbackendtest.cpp+95−3
plugins/Unity/Session/dbusunitysessionservice.cpp+46−1
@@ -468,11 +468,56 @@ void performAsyncUnityCall(const QString &method)
468468
469469
470470DBusGnomeSessionManagerWrapper::DBusGnomeSessionManagerWrapper()
471+ : UnityDBusObject(QStringLiteral("/org/gnome/SessionManager"), QStringLiteral("org.gnome.SessionManager"))
472+{
473+}
474+
475+void DBusGnomeSessionManagerWrapper::Logout(quint32 mode)
476+{
477+ auto call = QStringLiteral("RequestLogout");
478+
479+ // These modes are documented as bitwise flags, not an enum, even though
480+ // they only ever seem to be used as enums.
481+
482+ if (mode & 1) // without dialog
483+ call = QStringLiteral("Logout");
484+ if (mode & 2) // without dialog, ignoring inhibitors (which we don't have)
485+ call = QStringLiteral("Logout");
486+
487+ performAsyncUnityCall(call);
488+}
489+
490+void DBusGnomeSessionManagerWrapper::Reboot()
491+{
492+ // GNOME's Reboot means with dialog (they use Request differently than us).
493+ performAsyncUnityCall(QStringLiteral("RequestReboot"));
494+}
495+
496+void DBusGnomeSessionManagerWrapper::RequestReboot()
497+{
498+ // GNOME's RequestReboot means no dialog (they use Request differently than us).
499+ performAsyncUnityCall(QStringLiteral("Reboot"));
500+}
501+
502+void DBusGnomeSessionManagerWrapper::RequestShutdown()
503+{
504+ // GNOME's RequestShutdown means no dialog (they use Request differently than us).
505+ performAsyncUnityCall(QStringLiteral("Shutdown"));
506+}
507+
508+void DBusGnomeSessionManagerWrapper::Shutdown()
509+{
510+ // GNOME's Shutdown means with dialog (they use Request differently than us).
511+ performAsyncUnityCall(QStringLiteral("RequestShutdown"));
512+}
513+
514+
515+DBusGnomeSessionManagerDialogWrapper::DBusGnomeSessionManagerDialogWrapper()
471516 : UnityDBusObject(QStringLiteral("/org/gnome/SessionManager/EndSessionDialog"), QStringLiteral("com.canonical.Unity"))
472517{
473518}
474519
475−void DBusGnomeSessionManagerWrapper::Open(const unsigned type, const unsigned arg_1, const unsigned max_wait, const QList<QDBusObjectPath> &inhibitors)
520+void DBusGnomeSessionManagerDialogWrapper::Open(const unsigned type, const unsigned arg_1, const unsigned max_wait, const QList<QDBusObjectPath> &inhibitors)
476521{
477522 Q_UNUSED(arg_1);
478523 Q_UNUSED(max_wait);
plugins/Unity/Session/dbusunitysessionservice.h+18−4
@@ -270,17 +270,31 @@ private:
270270class DBusGnomeSessionManagerWrapper : public UnityDBusObject
271271{
272272 Q_OBJECT
273− Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager.EndSessionDialog")
273+ Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager")
274274
275275public:
276276 DBusGnomeSessionManagerWrapper();
277277 ~DBusGnomeSessionManagerWrapper() = default;
278278
279279public Q_SLOTS:
280− Q_SCRIPTABLE void Open(const unsigned int type, const unsigned int arg_1, const unsigned int max_wait, const QList<QDBusObjectPath> &inhibitors);
280+ Q_SCRIPTABLE void Logout(quint32 mode);
281+ Q_SCRIPTABLE void Reboot();
282+ Q_SCRIPTABLE void RequestReboot();
283+ Q_SCRIPTABLE void RequestShutdown();
284+ Q_SCRIPTABLE void Shutdown();
285+};
281286
282−private:
283− void performAsyncCall(const QString &method);
287+class DBusGnomeSessionManagerDialogWrapper : public UnityDBusObject
288+{
289+ Q_OBJECT
290+ Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager.EndSessionDialog")
291+
292+public:
293+ DBusGnomeSessionManagerDialogWrapper();
294+ ~DBusGnomeSessionManagerDialogWrapper() = default;
295+
296+public Q_SLOTS:
297+ Q_SCRIPTABLE void Open(const unsigned int type, const unsigned int arg_1, const unsigned int max_wait, const QList<QDBusObjectPath> &inhibitors);
284298};
285299
286300class DBusGnomeScreensaverWrapper: public UnityDBusObject
tests/plugins/Unity/Session/LogindServer.cpp+10
@@ -27,6 +27,16 @@ QDBusObjectPath LogindServer::GetSessionByPID(quint32)
2727 return QDBusObjectPath("/logindsession");
2828}
2929
30+void LogindServer::Reboot(bool interactive)
31+{
32+ Q_EMIT RebootCalled(interactive);
33+}
34+
35+void LogindServer::PowerOff(bool interactive)
36+{
37+ Q_EMIT PowerOffCalled(interactive);
38+}
39+
3040void LogindServer::MockEmitUnlock()
3141{
3242 Q_EMIT Unlock();
tests/plugins/Unity/Session/LogindServer.h+5
@@ -31,6 +31,8 @@ public:
3131
3232public Q_SLOTS:
3333 QDBusObjectPath GetSessionByPID(quint32 pid);
34+ void Reboot(bool interactive);
35+ void PowerOff(bool interactive);
3436
3537 void MockEmitUnlock(); // only in mock
3638
@@ -38,6 +40,9 @@ Q_SIGNALS:
3840 void Lock();
3941 void Unlock();
4042 void PrepareForSleep();
43+
44+ void RebootCalled(bool interactive); // only in mock
45+ void PowerOffCalled(bool interactive); // only in mock
4146};
4247
4348#endif
tests/plugins/Unity/Session/interfaces.xml+12
@@ -7,6 +7,18 @@
77 <arg name="pid" type="u" direction="in" />
88 <arg name="session" type="o" direction="out" />
99 </method>
10+ <method name="Reboot">
11+ <arg name="interactive" type="b" direction="in" />
12+ </method>
13+ <method name="PowerOff">
14+ <arg name="interactive" type="b" direction="in" />
15+ </method>
16+ <signal name="RebootCalled">
17+ <arg name="interactive" type="b" direction="out" />
18+ </signal>
19+ <signal name="PowerOffCalled">
20+ <arg name="interactive" type="b" direction="out" />
21+ </signal>
1022 <signal name="PrepareForSleep" />
1123 </interface>
1224 <interface name="org.freedesktop.login1.Session">
tests/plugins/Unity/Session/sessionbackendtest.cpp+95−3
@@ -81,7 +81,99 @@ private Q_SLOTS:
8181 QTRY_COMPARE(spy.count(), 1);
8282 }
8383
84− void testGnomeSessionWrapper_data() {
84+ void testGnomeSessionWrapperWithoutConfirmation_data() {
85+ QTest::addColumn<QString>("method");
86+ QTest::addColumn<QString>("signal");
87+
88+ QTest::newRow("Reboot") << "RequestReboot" << SIGNAL(RebootCalled(bool));
89+ QTest::newRow("Shutdown") << "RequestShutdown" << SIGNAL(PowerOffCalled(bool));
90+ }
91+
92+ void testGnomeSessionWrapperWithoutConfirmation() {
93+ QFETCH(QString, method);
94+ QFETCH(QString, signal);
95+
96+ DBusUnitySessionService dbusUnitySessionService;
97+ DBusGnomeSessionManagerWrapper dbusGnomeSessionManagerWrapper;
98+ QCoreApplication::processEvents(); // to let the services register on DBus
99+
100+ QDBusInterface login1Interface("org.freedesktop.login1",
101+ "/logindsession",
102+ "org.freedesktop.login1.Manager");
103+ QSignalSpy spy(&login1Interface, signal.toUtf8().data());
104+
105+ QDBusInterface dbusGnomeSessionWrapper("org.gnome.SessionManager",
106+ "/org/gnome/SessionManager",
107+ "org.gnome.SessionManager",
108+ QDBusConnection::sessionBus());
109+ QVERIFY(dbusGnomeSessionWrapper.isValid());
110+
111+ QDBusReply<void> reply = dbusGnomeSessionWrapper.call(method);
112+ QVERIFY(reply.isValid());
113+ QTRY_COMPARE(spy.count(), 1);
114+ }
115+
116+ void testGnomeSessionWrapperWithConfirmation_data() {
117+ QTest::addColumn<QString>("method");
118+ QTest::addColumn<QString>("signal");
119+
120+ QTest::newRow("Reboot") << "Reboot" << SIGNAL(RebootRequested(bool));
121+ QTest::newRow("Shutdown") << "Shutdown" << SIGNAL(ShutdownRequested(bool));
122+ }
123+
124+ void testGnomeSessionWrapperWithConfirmation() {
125+ QFETCH(QString, method);
126+ QFETCH(QString, signal);
127+
128+ DBusUnitySessionService dbusUnitySessionService;
129+ DBusGnomeSessionManagerWrapper dbusGnomeSessionManagerWrapper;
130+ QCoreApplication::processEvents(); // to let the services register on DBus
131+
132+ QSignalSpy spy(&dbusUnitySessionService, signal.toUtf8().data());
133+
134+ QDBusInterface dbusGnomeSessionWrapper("org.gnome.SessionManager",
135+ "/org/gnome/SessionManager",
136+ "org.gnome.SessionManager",
137+ QDBusConnection::sessionBus());
138+ QVERIFY(dbusGnomeSessionWrapper.isValid());
139+
140+ QDBusReply<void> reply = dbusGnomeSessionWrapper.call(method);
141+ QVERIFY(reply.isValid());
142+ QCOMPARE(spy.count(), 1);
143+ }
144+
145+ void testGnomeSessionWrapperLogout_data() {
146+ QTest::addColumn<int>("mode");
147+ QTest::addColumn<QString>("signal");
148+
149+ QTest::newRow("Logout") << 0 << SIGNAL(LogoutRequested(bool));
150+ QTest::newRow("LogoutNoDialog") << 1 << SIGNAL(LogoutReady());
151+ QTest::newRow("LogoutNoInhibits") << 2 << SIGNAL(LogoutReady());
152+ QTest::newRow("LogoutNoDialogNoInhibits") << 3 << SIGNAL(LogoutReady());
153+ }
154+
155+ void testGnomeSessionWrapperLogout() {
156+ QFETCH(int, mode);
157+ QFETCH(QString, signal);
158+
159+ DBusUnitySessionService dbusUnitySessionService;
160+ DBusGnomeSessionManagerWrapper dbusGnomeSessionManagerWrapper;
161+ QCoreApplication::processEvents(); // to let the services register on DBus
162+
163+ QSignalSpy spy(&dbusUnitySessionService, signal.toUtf8().data());
164+
165+ QDBusInterface dbusGnomeSessionWrapper("org.gnome.SessionManager",
166+ "/org/gnome/SessionManager",
167+ "org.gnome.SessionManager",
168+ QDBusConnection::sessionBus());
169+ QVERIFY(dbusGnomeSessionWrapper.isValid());
170+
171+ QDBusReply<void> reply = dbusGnomeSessionWrapper.call("Logout", (quint32)mode);
172+ QVERIFY(reply.isValid());
173+ QCOMPARE(spy.count(), 1);
174+ }
175+
176+ void testGnomeSessionDialogWrapper_data() {
85177 QTest::addColumn<uint>("method");
86178 QTest::addColumn<QString>("signal");
87179
@@ -90,7 +182,7 @@ private Q_SLOTS:
90182 QTest::newRow("Reboot") << (uint)Action::REBOOT << "RebootRequested(bool)";
91183 }
92184
93− void testGnomeSessionWrapper() {
185+ void testGnomeSessionDialogWrapper() {
94186 QFETCH(uint, method);
95187 QFETCH(QString, signal);
96188
@@ -102,7 +194,7 @@ private Q_SLOTS:
102194 // .. because QSignalSpy checks the signal signature like this: "if (((aSignal[0] - '0') & 0x03) != QSIGNAL_CODE)"
103195 QSignalSpy spy(&dbusUnitySessionService, qPrintable(signal.prepend(QSIGNAL_CODE)));
104196
105− DBusGnomeSessionManagerWrapper dbusGnomeSessionManagerWrapper;
197+ DBusGnomeSessionManagerDialogWrapper dbusGnomeSessionManagerDialogWrapper;
106198 QCoreApplication::processEvents(); // to let the service register on DBus
107199
108200 QDBusInterface dbusGnomeSessionWrapper("com.canonical.Unity",