summaryrefslogtreecommitdiff
blob: 7f6f3f7f81130aaef18113cba086d451f1e06e9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
From 7a8024639ee3ae7e128a9dc3efce90a07b4d316c Mon Sep 17 00:00:00 2001
From: Eric Koegel <eric.koegel@gmail.com>
Date: Mon, 6 Jul 2015 11:16:38 +0300
Subject: [PATCH] ConsoleKit2 support for system actions

This adds support for calling ConsoleKit2's DBUS API for shutdown,
reboot, suspend, and hibernate. It does so by using the exact same
interface as login1, making it a shared seat manager backend.
---
 INSTALL                     |  4 ++--
 src/daemon/PowerManager.cpp | 26 +++++++++++++++++---------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/INSTALL b/INSTALL
index 77b6a8b..5d16710 100644
--- a/INSTALL
+++ b/INSTALL
@@ -30,8 +30,8 @@ its home set to `/var/lib/sddm` by default.
 SDDM depends on PAM for authorization and XCB to communicate with the X server.
 Apart from other things, it also depends on Qt for the user interface and event
 loop management.
-SDDM can optionally make use of logind (the systemd login manager API) or
-upower to enable support for suspend, hibernate etc.
+SDDM can optionally make use of logind (the systemd login manager API), or
+ConsoleKit2, or upower to enable support for suspend, hibernate etc.
 In order to build the man pages, you will need `rst2man` installed. It is
 provided by the python `docutils` package
 
diff --git a/src/daemon/PowerManager.cpp b/src/daemon/PowerManager.cpp
index 3a4d25d..6329032 100644
--- a/src/daemon/PowerManager.cpp
+++ b/src/daemon/PowerManager.cpp
@@ -59,8 +59,8 @@ namespace SDDM {
 
     class UPowerBackend : public PowerManagerBackend {
     public:
-        UPowerBackend() {
-            m_interface = new QDBusInterface(UPOWER_SERVICE, UPOWER_PATH, UPOWER_OBJECT, QDBusConnection::systemBus());
+        UPowerBackend(const QString & service, const QString & path, const QString & interface) {
+            m_interface = new QDBusInterface(service, path, interface, QDBusConnection::systemBus());
         }
 
         ~UPowerBackend() {
@@ -110,20 +110,24 @@ namespace SDDM {
     };
 
     /**********************************************/
-    /* LOGIN1 BACKEND                             */
+    /* LOGIN1 && ConsoleKit2 BACKEND              */
     /**********************************************/
 
 #define LOGIN1_SERVICE  QStringLiteral("org.freedesktop.login1")
 #define LOGIN1_PATH     QStringLiteral("/org/freedesktop/login1")
 #define LOGIN1_OBJECT   QStringLiteral("org.freedesktop.login1.Manager")
 
-    class Login1Backend : public PowerManagerBackend {
+#define CK2_SERVICE  QStringLiteral("org.freedesktop.ConsoleKit")
+#define CK2_PATH     QStringLiteral("/org/freedesktop/ConsoleKit/Manager")
+#define CK2_OBJECT   QStringLiteral("org.freedesktop.ConsoleKit.Manager")
+
+    class SeatManagerBackend : public PowerManagerBackend {
     public:
-        Login1Backend() {
-            m_interface = new QDBusInterface(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_OBJECT, QDBusConnection::systemBus());
+        SeatManagerBackend(const QString & service, const QString & path, const QString & interface) {
+            m_interface = new QDBusInterface(service, path, interface, QDBusConnection::systemBus());
         }
 
-        ~Login1Backend() {
+        ~SeatManagerBackend() {
             delete m_interface;
         }
 
@@ -194,11 +198,15 @@ namespace SDDM {
 
         // check if login1 interface exists
         if (interface->isServiceRegistered(LOGIN1_SERVICE))
-            m_backends << new Login1Backend();
+            m_backends << new SeatManagerBackend(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_OBJECT);
+
+        // check if ConsoleKit2 interface exists
+        if (interface->isServiceRegistered(CK2_SERVICE))
+            m_backends << new SeatManagerBackend(CK2_SERVICE, CK2_PATH, CK2_OBJECT);
 
         // check if upower interface exists
         if (interface->isServiceRegistered(UPOWER_SERVICE))
-            m_backends << new UPowerBackend();
+            m_backends << new UPowerBackend(UPOWER_SERVICE, UPOWER_PATH, UPOWER_OBJECT);
     }
 
     PowerManager::~PowerManager() {