diff options
Diffstat (limited to 'sway/commands/seat/idle.c')
-rw-r--r-- | sway/commands/seat/idle.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sway/commands/seat/idle.c b/sway/commands/seat/idle.c new file mode 100644 index 00000000..82428f2c --- /dev/null +++ b/sway/commands/seat/idle.c @@ -0,0 +1,73 @@ +#define _POSIX_C_SOURCE 200809L +#include <limits.h> +#include <string.h> +#include <strings.h> +#include <stdint.h> +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/input/seat.h" + +static const struct { + const char *name; + uint32_t value; +} idle_source_strings[] = { + { "keyboard", IDLE_SOURCE_KEYBOARD }, + { "pointer", IDLE_SOURCE_POINTER }, + { "touch", IDLE_SOURCE_TOUCH }, + { "tablet_pad", IDLE_SOURCE_TABLET_PAD }, + { "tablet_tool", IDLE_SOURCE_TABLET_TOOL }, + { "switch", IDLE_SOURCE_SWITCH }, +}; + +static uint32_t parse_sources(int argc, char **argv) { + uint32_t sources = 0; + for (int i = 0; i < argc; ++i) { + uint32_t value = 0; + for (size_t j = 0; j < sizeof(idle_source_strings) + / sizeof(idle_source_strings[0]); ++j) { + if (strcasecmp(idle_source_strings[j].name, argv[i]) == 0) { + value = idle_source_strings[j].value; + break; + } + } + if (value == 0) { + return UINT32_MAX; + } + sources |= value; + } + return sources; +} + +struct cmd_results *seat_cmd_idle_inhibit(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "idle_inhibit", EXPECTED_AT_LEAST, 1))) { + return error; + } + if (!config->handler_context.seat_config) { + return cmd_results_new(CMD_FAILURE, "No seat defined"); + } + + uint32_t sources = parse_sources(argc, argv); + if (sources == UINT32_MAX) { + return cmd_results_new(CMD_FAILURE, "Invalid idle source"); + } + config->handler_context.seat_config->idle_inhibit_sources = sources; + return cmd_results_new(CMD_SUCCESS, NULL); +} + +struct cmd_results *seat_cmd_idle_wake(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "idle_wake", EXPECTED_AT_LEAST, 1))) { + return error; + } + if (!config->handler_context.seat_config) { + return cmd_results_new(CMD_FAILURE, "No seat defined"); + } + + uint32_t sources = parse_sources(argc, argv); + if (sources == UINT32_MAX) { + return cmd_results_new(CMD_FAILURE, "Invalid idle source"); + } + config->handler_context.seat_config->idle_wake_sources = sources; + return cmd_results_new(CMD_SUCCESS, NULL); +} |