diff options
Diffstat (limited to 'sway')
| -rw-r--r-- | sway/commands/input.c | 21 | ||||
| -rw-r--r-- | sway/commands/input/xkb_capslock.c | 33 | ||||
| -rw-r--r-- | sway/commands/input/xkb_numlock.c | 33 | ||||
| -rw-r--r-- | sway/config/input.c | 8 | ||||
| -rw-r--r-- | sway/input/keyboard.c | 26 | ||||
| -rw-r--r-- | sway/meson.build | 2 | ||||
| -rw-r--r-- | sway/sway-input.5.scd | 8 | 
7 files changed, 130 insertions, 1 deletions
diff --git a/sway/commands/input.c b/sway/commands/input.c index 5b203ea0..84888fbb 100644 --- a/sway/commands/input.c +++ b/sway/commands/input.c @@ -31,6 +31,12 @@ static struct cmd_handler input_handlers[] = {  	{ "xkb_variant", input_cmd_xkb_variant },  }; +// must be in order for the bsearch +static struct cmd_handler input_config_handlers[] = { +	{ "xkb_capslock", input_cmd_xkb_capslock }, +	{ "xkb_numlock", input_cmd_xkb_numlock }, +}; +  struct cmd_results *cmd_input(int argc, char **argv) {  	struct cmd_results *error = NULL;  	if ((error = checkarg(argc, "input", EXPECTED_AT_LEAST, 2))) { @@ -44,8 +50,21 @@ struct cmd_results *cmd_input(int argc, char **argv) {  		return cmd_results_new(CMD_FAILURE, NULL, "Couldn't allocate config");  	} -	struct cmd_results *res = config_subcommand(argv + 1, argc - 1, +	struct cmd_results *res; + +	if (find_handler(argv[1], input_config_handlers, +			sizeof(input_config_handlers))) { +		if (config->reading) { +			res = config_subcommand(argv + 1, argc - 1, +				input_config_handlers, sizeof(input_config_handlers)); +		} else { +			res = cmd_results_new(CMD_FAILURE, "input", +				"Can only be used in config file."); +		} +	} else { +		res = config_subcommand(argv + 1, argc - 1,  			input_handlers, sizeof(input_handlers)); +	}  	free_input_config(config->handler_context.input_config);  	config->handler_context.input_config = NULL; diff --git a/sway/commands/input/xkb_capslock.c b/sway/commands/input/xkb_capslock.c new file mode 100644 index 00000000..5442c463 --- /dev/null +++ b/sway/commands/input/xkb_capslock.c @@ -0,0 +1,33 @@ +#include <string.h> +#include <strings.h> +#include "sway/config.h" +#include "sway/commands.h" +#include "sway/input/input-manager.h" + +struct cmd_results *input_cmd_xkb_capslock(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "xkb_capslock", EXPECTED_AT_LEAST, 1))) { +		return error; +	} +	struct input_config *current_input_config = +		config->handler_context.input_config; +	if (!current_input_config) { +		return cmd_results_new(CMD_FAILURE, "xkb_capslock",  +			"No input device defined."); +	} +	struct input_config *new_config = +		new_input_config(current_input_config->identifier); + +	if (strcasecmp(argv[0], "enabled") == 0) { +		new_config->xkb_capslock = 1; +	} else if (strcasecmp(argv[0], "disabled") == 0) { +		new_config->xkb_capslock = 0;  +	} else { +		free_input_config(new_config); +		return cmd_results_new(CMD_INVALID, "xkb_capslock", +			"Expected 'xkb_capslock <enabled|disabled>'"); +	} + +	apply_input_config(new_config); +	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/input/xkb_numlock.c b/sway/commands/input/xkb_numlock.c new file mode 100644 index 00000000..39675366 --- /dev/null +++ b/sway/commands/input/xkb_numlock.c @@ -0,0 +1,33 @@ +#include <string.h> +#include <strings.h> +#include "sway/config.h" +#include "sway/commands.h" +#include "sway/input/input-manager.h" + +struct cmd_results *input_cmd_xkb_numlock(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "xkb_numlock", EXPECTED_AT_LEAST, 1))) { +		return error; +	} +	struct input_config *current_input_config = +		config->handler_context.input_config; +	if (!current_input_config) { +		return cmd_results_new(CMD_FAILURE, "xkb_numlock",  +			"No input device defined."); +	} +	struct input_config *new_config = +		new_input_config(current_input_config->identifier); + +	if (strcasecmp(argv[0], "enabled") == 0) { +		new_config->xkb_numlock = 1; +	} else if (strcasecmp(argv[0], "disabled") == 0) { +		new_config->xkb_numlock = 0;  +	} else { +		free_input_config(new_config); +		return cmd_results_new(CMD_INVALID, "xkb_numlock", +			"Expected 'xkb_numlock <enabled|disabled>'"); +	} + +	apply_input_config(new_config); +	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/config/input.c b/sway/config/input.c index 8d687a6d..9885e85c 100644 --- a/sway/config/input.c +++ b/sway/config/input.c @@ -33,6 +33,8 @@ struct input_config *new_input_config(const char* identifier) {  	input->left_handed = INT_MIN;  	input->repeat_delay = INT_MIN;  	input->repeat_rate = INT_MIN; +	input->xkb_numlock = INT_MIN; +	input->xkb_capslock = INT_MIN;  	return input;  } @@ -104,6 +106,12 @@ void merge_input_config(struct input_config *dst, struct input_config *src) {  		free(dst->xkb_variant);  		dst->xkb_variant = strdup(src->xkb_variant);  	} +	if (src->xkb_numlock != INT_MIN) { +		dst->xkb_numlock = src->xkb_numlock; +	} +	if (src->xkb_capslock != INT_MIN) { +		dst->xkb_capslock = src->xkb_capslock; +	}  	if (src->mapped_from_region) {  		free(dst->mapped_from_region);  		dst->mapped_from_region = diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 49241db8..643ff510 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -3,6 +3,7 @@  #include <wlr/backend/multi.h>  #include <wlr/backend/session.h>  #include <wlr/types/wlr_idle.h> +#include <wlr/interfaces/wlr_keyboard.h>  #include "sway/commands.h"  #include "sway/desktop/transaction.h"  #include "sway/input/input-manager.h" @@ -385,6 +386,31 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {  	keyboard->keymap = keymap;  	wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); +	xkb_mod_mask_t locked_mods = 0; +	if (!input_config || input_config->xkb_numlock != 0) { +		xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_NUM); +		if (mod_index != XKB_MOD_INVALID) { +		       locked_mods |= (uint32_t)1 << mod_index; +		} +	} +	if (input_config && input_config->xkb_capslock > 0) { +		xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS); +		if (mod_index != XKB_MOD_INVALID) { +		       locked_mods |= (uint32_t)1 << mod_index; +		} +	} +	if (locked_mods) { +		wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, locked_mods, 0); +		uint32_t leds = 0; +		for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) { +			if (xkb_state_led_index_is_active(wlr_device->keyboard->xkb_state, +					wlr_device->keyboard->led_indexes[i])) { +				leds |= (1 << i); +			} +		} +		wlr_keyboard_led_update(wlr_device->keyboard, leds); +	} +  	if (input_config && input_config->repeat_delay != INT_MIN  			&& input_config->repeat_rate != INT_MIN) {  		wlr_keyboard_set_repeat_info(wlr_device->keyboard, diff --git a/sway/meson.build b/sway/meson.build index 649a3ac2..d92bb905 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -128,8 +128,10 @@ sway_sources = files(  	'commands/input/scroll_method.c',  	'commands/input/tap.c',  	'commands/input/tap_button_map.c', +	'commands/input/xkb_capslock.c',  	'commands/input/xkb_layout.c',  	'commands/input/xkb_model.c', +	'commands/input/xkb_numlock.c',  	'commands/input/xkb_options.c',  	'commands/input/xkb_rules.c',  	'commands/input/xkb_variant.c', diff --git a/sway/sway-input.5.scd b/sway/sway-input.5.scd index b6391431..fa311971 100644 --- a/sway/sway-input.5.scd +++ b/sway/sway-input.5.scd @@ -33,6 +33,14 @@ For more information on these xkb configuration options, see  *input* <identifier> xkb\_variant <variant>  	Sets the variant of the keyboard like _dvorak_ or _colemak_. +The following commands may only be used in the configuration file. + +*input* <identifier> xkb\_capslock enabled|disabled +	Initially enables or disables CapsLock, the default is disabled. + +*input* <identifier> xkb\_numlock enabled|disabled +	Initially enables or disables NumLock, the default is enabled. +  ## MAPPING CONFIGURATION  *input* <identifier> map\_to\_output <identifier>  | 
