Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Configure initial state for numlock/capslock #2330

Merged
merged 5 commits into from
Jul 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/sway/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,8 +213,10 @@ sway_cmd input_cmd_scroll_button;
sway_cmd input_cmd_scroll_method;
sway_cmd input_cmd_tap;
sway_cmd input_cmd_tap_button_map;
sway_cmd input_cmd_xkb_capslock;
sway_cmd input_cmd_xkb_layout;
sway_cmd input_cmd_xkb_model;
sway_cmd input_cmd_xkb_numlock;
sway_cmd input_cmd_xkb_options;
sway_cmd input_cmd_xkb_rules;
sway_cmd input_cmd_xkb_variant;
Expand Down
3 changes: 3 additions & 0 deletions include/sway/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ struct input_config {
char *xkb_rules;
char *xkb_variant;

int xkb_numlock;
int xkb_capslock;

struct input_config_mapped_from_region *mapped_from_region;
char *mapped_to_output;

Expand Down
21 changes: 20 additions & 1 deletion sway/commands/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))) {
Expand All @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions sway/commands/input/xkb_capslock.c
Original file line number Diff line number Diff line change
@@ -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);
}
33 changes: 33 additions & 0 deletions sway/commands/input/xkb_numlock.c
Original file line number Diff line number Diff line change
@@ -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);
}
8 changes: 8 additions & 0 deletions sway/config/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 =
Expand Down
26 changes: 26 additions & 0 deletions sway/input/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions sway/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
8 changes: 8 additions & 0 deletions sway/sway-input.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down