diff --git a/daemon/dbus_messaging.c b/daemon/dbus_messaging.c index ac72c9c..0a9fe20 100644 --- a/daemon/dbus_messaging.c +++ b/daemon/dbus_messaging.c @@ -182,22 +182,48 @@ static int method_query_status_by_pid(sd_bus_message *m, void *userdata, return sd_bus_reply_method_return(m, "i", status); } +/** + * Handles the Active D-BUS Method + */ +static int property_get_client_count(sd_bus *local_bus, const char *path, const char *interface, + const char *property, sd_bus_message *reply, void *userdata, + __attribute__((unused)) sd_bus_error *ret_error) +{ + GameModeContext *context = userdata; + int count; + + count = game_mode_context_num_clients(context); + + return sd_bus_message_append_basic(reply, 'i', &count); +} + +void game_mode_client_count_changed(void) +{ + (void)sd_bus_emit_properties_changed(bus, + "/com/feralinteractive/GameMode", + "com.feralinteractive.GameMode", + "ClientCount", + NULL); +} /** * D-BUS vtable to dispatch virtual methods */ -static const sd_bus_vtable gamemode_vtable[] = - { SD_BUS_VTABLE_START(0), - SD_BUS_METHOD("RegisterGame", "i", "i", method_register_game, SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("UnregisterGame", "i", "i", method_unregister_game, SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("QueryStatus", "i", "i", method_query_status, SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("RegisterGameByPID", "ii", "i", method_register_game_by_pid, - SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("UnregisterGameByPID", "ii", "i", method_unregister_game_by_pid, - SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("QueryStatusByPID", "ii", "i", method_query_status_by_pid, - SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_VTABLE_END }; +static const sd_bus_vtable gamemode_vtable[] = { + SD_BUS_VTABLE_START(0), + SD_BUS_PROPERTY("ClientCount", "i", property_get_client_count, 0, + SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), + SD_BUS_METHOD("RegisterGame", "i", "i", method_register_game, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("UnregisterGame", "i", "i", method_unregister_game, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("QueryStatus", "i", "i", method_query_status, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("RegisterGameByPID", "ii", "i", method_register_game_by_pid, + SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("UnregisterGameByPID", "ii", "i", method_unregister_game_by_pid, + SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("QueryStatusByPID", "ii", "i", method_query_status_by_pid, + SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_VTABLE_END +}; /** * Main process loop for the daemon. Run until quitting has been requested. diff --git a/daemon/dbus_messaging.h b/daemon/dbus_messaging.h index d02fb1c..6edbc0d 100644 --- a/daemon/dbus_messaging.h +++ b/daemon/dbus_messaging.h @@ -44,3 +44,8 @@ void game_mode_context_loop(GameModeContext *context) __attribute__((noreturn)); * Inhibit the screensaver */ int game_mode_inhibit_screensaver(bool inhibit); + +/** + * Signal the ClientCount property has changed + */ +void game_mode_client_count_changed(void); diff --git a/daemon/gamemode.c b/daemon/gamemode.c index 3bb8be4..9855fe6 100644 --- a/daemon/gamemode.c +++ b/daemon/gamemode.c @@ -415,6 +415,8 @@ int game_mode_context_register(GameModeContext *self, pid_t client, pid_t reques /* Apply io priorities */ game_mode_apply_ioprio(self, client); + game_mode_client_count_changed(); + return 0; error_cleanup: @@ -498,6 +500,8 @@ int game_mode_context_unregister(GameModeContext *self, pid_t client, pid_t requ game_mode_context_leave(self); } + game_mode_client_count_changed(); + return 0; }