diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml
index c5263efc82..630ecc64f9 100644
--- a/man/org.freedesktop.login1.xml
+++ b/man/org.freedesktop.login1.xml
@@ -1245,6 +1245,10 @@ node /org/freedesktop/login1/session/1 {
readonly b IdleHint = ...;
readonly t IdleSinceHint = ...;
readonly t IdleSinceHintMonotonic = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b CanIdle = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b CanLock = ...;
readonly b LockedHint = ...;
};
interface org.freedesktop.DBus.Peer { ... };
@@ -1349,6 +1353,10 @@ node /org/freedesktop/login1/session/1 {
+
+
+
+
@@ -1538,6 +1546,10 @@ node /org/freedesktop/login1/session/1 {
LockedHint shows the locked hint state of this session, as set by the
SetLockedHint() method described above.
+
+ CanIdle indicates whether the session supports the idle hint
+ concept. Similarly, CanLock indicates whether the session supports the screen lock
+ concept.
@@ -1619,10 +1631,9 @@ node /org/freedesktop/login1/session/1 {
CanSleep(),
SleepOperation, and
ListSessionsEx() were added in version 256.
- HandleSecureAttentionKey,
- SecureAttentionKey(),
- PreparingForShutdownWithMetadata, and
- DesignatedMaintenanceTime were added in version 257.
+ HandleSecureAttentionKey, SecureAttentionKey(),
+ PreparingForShutdownWithMetadata, DesignatedMaintenanceTime,
+ CanIdle and CanLock were added in version 257.
Session Objects
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
index ff4e60017d..0812cfc2c2 100644
--- a/src/login/logind-session-dbus.c
+++ b/src/login/logind-session-dbus.c
@@ -109,6 +109,40 @@ static int property_get_idle_hint(
return sd_bus_message_append(reply, "b", session_get_idle_hint(s, NULL) > 0);
}
+static int property_get_can_idle(
+ sd_bus *bus,
+ const char *path,
+ const char *interface,
+ const char *property,
+ sd_bus_message *reply,
+ void *userdata,
+ sd_bus_error *error) {
+
+ Session *s = ASSERT_PTR(userdata);
+
+ assert(bus);
+ assert(reply);
+
+ return sd_bus_message_append(reply, "b", SESSION_CLASS_CAN_IDLE(s->class));
+}
+
+static int property_get_can_lock(
+ sd_bus *bus,
+ const char *path,
+ const char *interface,
+ const char *property,
+ sd_bus_message *reply,
+ void *userdata,
+ sd_bus_error *error) {
+
+ Session *s = ASSERT_PTR(userdata);
+
+ assert(bus);
+ assert(reply);
+
+ return sd_bus_message_append(reply, "b", SESSION_CLASS_CAN_LOCK(s->class));
+}
+
static int property_get_idle_since_hint(
sd_bus *bus,
const char *path,
@@ -983,6 +1017,8 @@ static const sd_bus_vtable session_vtable[] = {
SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("IdleSinceHint", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("IdleSinceHintMonotonic", "t", property_get_idle_since_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+ SD_BUS_PROPERTY("CanIdle", "b", property_get_can_idle, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("CanLock", "b", property_get_can_lock, 0, SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("LockedHint", "b", property_get_locked_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_METHOD("Terminate",
diff --git a/test/units/TEST-35-LOGIN.sh b/test/units/TEST-35-LOGIN.sh
index 78e0c1e326..ac3836b816 100755
--- a/test/units/TEST-35-LOGIN.sh
+++ b/test/units/TEST-35-LOGIN.sh
@@ -575,6 +575,8 @@ testcase_list_users_sessions_seats() {
session=$(loginctl list-sessions --no-legend | grep -v manager | awk '$3 == "logind-test-user" { print $1 }')
: check that we got a valid session id
busctl get-property org.freedesktop.login1 "/org/freedesktop/login1/session/_3${session?}" org.freedesktop.login1.Session Id
+ busctl get-property org.freedesktop.login1 "/org/freedesktop/login1/session/_3${session?}" org.freedesktop.login1.Session CanIdle
+ busctl get-property org.freedesktop.login1 "/org/freedesktop/login1/session/_3${session?}" org.freedesktop.login1.Session CanLock
assert_eq "$(loginctl list-sessions --no-legend | grep -v manager | awk '$3 == "logind-test-user" { print $2 }')" "$(id -ru logind-test-user)"
seat=$(loginctl list-sessions --no-legend | grep -v manager | awk '$3 == "logind-test-user" { print $4 }')
assert_eq "$(loginctl list-sessions --no-legend | grep -v manager | awk '$3 == "logind-test-user" { print $6 }')" user