daemon: add a ClientCount dbus property

Introduce a new "ClientCount" dbus property that can be queried and
also watched to see if gamemode is currently active (or not).
This commit is contained in:
Christian Kellner 2019-04-10 23:57:27 +02:00
parent 6d921617f9
commit 05909d1cfa
3 changed files with 47 additions and 12 deletions

View File

@ -182,12 +182,37 @@ 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),
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),
@ -197,7 +222,8 @@ static const sd_bus_vtable gamemode_vtable[] =
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("QueryStatusByPID", "ii", "i", method_query_status_by_pid,
SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_VTABLE_END };
SD_BUS_VTABLE_END
};
/**
* Main process loop for the daemon. Run until quitting has been requested.

View File

@ -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);

View File

@ -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;
}