From: Lennart Poettering Date: Tue, 22 Oct 2024 16:08:19 +0000 (+0200) Subject: logind: add CanIdle + CanLock dbus properties to session object X-Git-Tag: v257-rc1~163^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd91f23acfecc92ede6965d752540a758b3e6c79;p=thirdparty%2Fsystemd.git logind: add CanIdle + CanLock dbus properties to session object Clients should be able to know if the idle logic is available on a session without secondary knowledge about the session class. Let's hence expose a property for that. Similar for the screen lock concept. Fixes: #34844 --- diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml index c5263efc827..630ecc64f94 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 ff4e60017d5..0812cfc2c25 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 78e0c1e326b..ac3836b8161 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