From 482aa607a573c9430ee12390a0f3fc8f8290cc9b Mon Sep 17 00:00:00 2001 From: Adrian Vovk Date: Mon, 19 Jan 2026 19:26:30 -0500 Subject: [PATCH] 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. --- man/org.freedesktop.login1.xml | 1 - src/login/logind-dbus.c | 2 +- src/login/logind-inhibit.c | 8 +++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/man/org.freedesktop.login1.xml b/man/org.freedesktop.login1.xml index bc95253859..dc80e96717 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 7f7d9e70d2..b50e69809f 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 2ef15588f2..b78d39d02d 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) {