From: Adrian Vovk Date: Tue, 20 Jan 2026 00:26:30 +0000 (-0500) Subject: login1: Emit NCurrentInhibitors changed events X-Git-Tag: v260-rc1~34^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=482aa607a573c9430ee12390a0f3fc8f8290cc9b;p=thirdparty%2Fsystemd.git login1: Emit NCurrentInhibitors changed events Currently, there's no way for a desktop environment to detect when a systemd inhibitor has been added or removed. This means that a desktop environment that wishes to show current inhibitors to the user will be either forced to poll systemd or just use stale data. Now, the desktop can listen for changed events on NCurrentInhibitors and call GetInhibitors() in response to that. --- diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml index bc952538593..dc80e967177 100644 --- a/man/org.freedesktop.login1.xml +++ b/man/org.freedesktop.login1.xml @@ -276,7 +276,6 @@ node /org/freedesktop/login1 { readonly t RuntimeDirectoryInodesMax = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly t InhibitorsMax = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t NCurrentInhibitors = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly t SessionsMax = ...; diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 7f7d9e70d2b..b50e69809fe 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -3960,7 +3960,7 @@ static const sd_bus_vtable manager_vtable[] = { SD_BUS_PROPERTY("RuntimeDirectorySize", "t", NULL, offsetof(Manager, runtime_dir_size), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("RuntimeDirectoryInodesMax", "t", NULL, offsetof(Manager, runtime_dir_inodes), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("InhibitorsMax", "t", NULL, offsetof(Manager, inhibitors_max), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("NCurrentInhibitors", "t", property_get_hashmap_size, offsetof(Manager, inhibitors), 0), + SD_BUS_PROPERTY("NCurrentInhibitors", "t", property_get_hashmap_size, offsetof(Manager, inhibitors), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("SessionsMax", "t", NULL, offsetof(Manager, sessions_max), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("NCurrentSessions", "t", property_get_hashmap_size, offsetof(Manager, sessions), 0), SD_BUS_PROPERTY("UserTasksMax", "t", property_get_compat_user_tasks_max, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN), diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 2ef15588f28..b78d39d02d7 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -148,13 +148,11 @@ static int inhibitor_save(Inhibitor *i) { } static int bus_manager_send_inhibited_change(Inhibitor *i) { - const char *property; - assert(i); - property = IN_SET(i->mode, INHIBIT_BLOCK, INHIBIT_BLOCK_WEAK) ? "BlockInhibited" : "DelayInhibited"; - - return manager_send_changed(i->manager, property); + return manager_send_changed(i->manager, + i->mode == INHIBIT_DELAY ? "DelayInhibited" : "BlockInhibited", + "NCurrentInhibitors"); } int inhibitor_start(Inhibitor *i) {