From 41b80c28dfafb9bc13b68e4d5d2811d311b59863 Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Wed, 11 Jul 2018 22:03:06 +0200 Subject: [PATCH 1/6] add scroll button option This commit introduces a scroll_button option, which is intended to be used with scroll_method. Now user can edit his sway config and add an scroll_button option to device section. --- include/sway/commands.h | 1 + include/sway/config.h | 1 + sway/commands/input.c | 1 + sway/commands/input/scroll_button.c | 31 +++++++++++++++++++++++++++++ sway/config/input.c | 4 ++++ sway/input/input-manager.c | 6 ++++++ sway/meson.build | 1 + 7 files changed, 45 insertions(+) create mode 100644 sway/commands/input/scroll_button.c diff --git a/include/sway/commands.h b/include/sway/commands.h index dda0606a..32d6cefd 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -207,6 +207,7 @@ sway_cmd input_cmd_natural_scroll; sway_cmd input_cmd_pointer_accel; sway_cmd input_cmd_repeat_delay; sway_cmd input_cmd_repeat_rate; +sway_cmd input_cmd_scroll_button; sway_cmd input_cmd_scroll_method; sway_cmd input_cmd_tap; sway_cmd input_cmd_xkb_layout; diff --git a/include/sway/config.h b/include/sway/config.h index 99575274..75acd4f2 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -75,6 +75,7 @@ struct input_config { float pointer_accel; int repeat_delay; int repeat_rate; + int scroll_button; int scroll_method; int send_events; int tap; diff --git a/sway/commands/input.c b/sway/commands/input.c index 574e1f8c..e7906b0e 100644 --- a/sway/commands/input.c +++ b/sway/commands/input.c @@ -20,6 +20,7 @@ static struct cmd_handler input_handlers[] = { { "pointer_accel", input_cmd_pointer_accel }, { "repeat_delay", input_cmd_repeat_delay }, { "repeat_rate", input_cmd_repeat_rate }, + { "scroll_button", input_cmd_scroll_button }, { "scroll_method", input_cmd_scroll_method }, { "tap", input_cmd_tap }, { "xkb_layout", input_cmd_xkb_layout }, diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c new file mode 100644 index 00000000..a9d697cf --- /dev/null +++ b/sway/commands/input/scroll_button.c @@ -0,0 +1,31 @@ +#include +#include +#include "sway/config.h" +#include "sway/commands.h" +#include "sway/input/input-manager.h" + +struct cmd_results *input_cmd_scroll_button(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "scroll_button", 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, "scroll_button", + "No input device defined."); + } + struct input_config *new_config = + new_input_config(current_input_config->identifier); + + int scroll_button = atoi(argv[0]); + if (scroll_button < 1 || scroll_button > 10) { + free_input_config(new_config); + return cmd_results_new(CMD_INVALID, "scroll_button", + "Input out of range [1, 10]"); + } + new_config->scroll_button = scroll_button; + + 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 9840df18..62d77cf7 100644 --- a/sway/config/input.c +++ b/sway/config/input.c @@ -28,6 +28,7 @@ struct input_config *new_input_config(const char* identifier) { input->accel_profile = INT_MIN; input->pointer_accel = FLT_MIN; input->scroll_method = INT_MIN; + input->scroll_button = INT_MIN; input->left_handed = INT_MIN; input->repeat_delay = INT_MIN; input->repeat_rate = INT_MIN; @@ -70,6 +71,9 @@ void merge_input_config(struct input_config *dst, struct input_config *src) { if (src->scroll_method != INT_MIN) { dst->scroll_method = src->scroll_method; } + if (src->scroll_button != INT_MIN) { + dst->scroll_button= src->scroll_button; + } if (src->send_events != INT_MIN) { dst->send_events = src->send_events; } diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index daaf1fb6..b18989d0 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -158,6 +158,12 @@ static void input_manager_libinput_config_pointer( libinput_device_config_accel_set_speed(libinput_device, ic->pointer_accel); } + if (ic->scroll_button != INT_MIN) { + wlr_log(WLR_DEBUG, "libinput_config_pointer(%s) scroll_set_button(%d)", + ic->identifier, ic->scroll_button); + libinput_device_config_scroll_set_button(libinput_device, + ic->scroll_button); + } if (ic->scroll_method != INT_MIN) { wlr_log(WLR_DEBUG, "libinput_config_pointer(%s) scroll_set_method(%d)", ic->identifier, ic->scroll_method); diff --git a/sway/meson.build b/sway/meson.build index 72192917..6fc78db3 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -118,6 +118,7 @@ sway_sources = files( 'commands/input/pointer_accel.c', 'commands/input/repeat_delay.c', 'commands/input/repeat_rate.c', + 'commands/input/scroll_button.c', 'commands/input/scroll_method.c', 'commands/input/tap.c', 'commands/input/xkb_layout.c', From 08edaf4e76124a676e9457015e4451b05c355520 Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Thu, 12 Jul 2018 12:08:53 +0200 Subject: [PATCH 2/6] increase maximum value of button identifier and also cleanup spaces --- sway/commands/input/scroll_button.c | 2 +- sway/config/input.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c index a9d697cf..7a0fd2e4 100644 --- a/sway/commands/input/scroll_button.c +++ b/sway/commands/input/scroll_button.c @@ -19,7 +19,7 @@ struct cmd_results *input_cmd_scroll_button(int argc, char **argv) { new_input_config(current_input_config->identifier); int scroll_button = atoi(argv[0]); - if (scroll_button < 1 || scroll_button > 10) { + if (scroll_button < 0 || scroll_button > 1000) { free_input_config(new_config); return cmd_results_new(CMD_INVALID, "scroll_button", "Input out of range [1, 10]"); diff --git a/sway/config/input.c b/sway/config/input.c index 62d77cf7..cbd7d5f0 100644 --- a/sway/config/input.c +++ b/sway/config/input.c @@ -27,8 +27,8 @@ struct input_config *new_input_config(const char* identifier) { input->natural_scroll = INT_MIN; input->accel_profile = INT_MIN; input->pointer_accel = FLT_MIN; - input->scroll_method = INT_MIN; input->scroll_button = INT_MIN; + input->scroll_method = INT_MIN; input->left_handed = INT_MIN; input->repeat_delay = INT_MIN; input->repeat_rate = INT_MIN; @@ -72,7 +72,7 @@ void merge_input_config(struct input_config *dst, struct input_config *src) { dst->scroll_method = src->scroll_method; } if (src->scroll_button != INT_MIN) { - dst->scroll_button= src->scroll_button; + dst->scroll_button = src->scroll_button; } if (src->send_events != INT_MIN) { dst->send_events = src->send_events; From 20d6c7c2e4c079e8c7c2e441c738598b74a058b5 Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Thu, 12 Jul 2018 15:35:14 +0200 Subject: [PATCH 3/6] add paragraph to sway-input man page The added paragraph describes how to get button identifier and set it in config. --- sway/sway-input.5.scd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sway/sway-input.5.scd b/sway/sway-input.5.scd index cf7a6385..4bc66394 100644 --- a/sway/sway-input.5.scd +++ b/sway/sway-input.5.scd @@ -92,6 +92,11 @@ For more information on these xkb configuration options, see *input* scroll\_method none|two\_finger|edge|on\_button\_down Changes the scroll method for the specified input device. +*input* scroll\_button + Sets button used for scroll\_method on\_button\_down. The button identifier + can be obtained from `libinput debug-events`. + If set to 0, it disables the scroll\_button on\_button\_down. + *input* tap enabled|disabled Enables or disables tap for specified input device. From 094edcbea2f587942afdb539efb5a9e46b53113a Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Thu, 12 Jul 2018 15:50:42 +0200 Subject: [PATCH 4/6] rm constraint for max value of button identifier updated error message to be more adequate for current contraint --- sway/commands/input/scroll_button.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c index 7a0fd2e4..d19f3516 100644 --- a/sway/commands/input/scroll_button.c +++ b/sway/commands/input/scroll_button.c @@ -19,10 +19,10 @@ struct cmd_results *input_cmd_scroll_button(int argc, char **argv) { new_input_config(current_input_config->identifier); int scroll_button = atoi(argv[0]); - if (scroll_button < 0 || scroll_button > 1000) { + if (scroll_button < 0) { free_input_config(new_config); return cmd_results_new(CMD_INVALID, "scroll_button", - "Input out of range [1, 10]"); + "Scroll button identifier cannot be negative"); } new_config->scroll_button = scroll_button; From 89db5b57165a0805c9e79aafdb7cf047e877152f Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Thu, 12 Jul 2018 23:50:34 +0200 Subject: [PATCH 5/6] expanded error detection for scroll button option Now the scroll_button will not accept: - letters on string beginning; - negative numbers. What is tolerated: - letters after number; - rational numbers: the fraction after dot will be omitted. --- sway/commands/input/scroll_button.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c index d19f3516..6345b71b 100644 --- a/sway/commands/input/scroll_button.c +++ b/sway/commands/input/scroll_button.c @@ -18,11 +18,17 @@ struct cmd_results *input_cmd_scroll_button(int argc, char **argv) { struct input_config *new_config = new_input_config(current_input_config->identifier); - int scroll_button = atoi(argv[0]); + char *endptr; + long scroll_button = strtol(*argv, &endptr, 10); + if (endptr == *argv && scroll_button == 0) { + free_input_config(new_config); + return cmd_results_new(CMD_INVALID, "scroll_button", + "Scroll button identifier must be an integer."); + } if (scroll_button < 0) { free_input_config(new_config); return cmd_results_new(CMD_INVALID, "scroll_button", - "Scroll button identifier cannot be negative"); + "Scroll button identifier cannot be negative."); } new_config->scroll_button = scroll_button; From f8bc928b2d3f5166e8d51422c07bc16ca35b0b83 Mon Sep 17 00:00:00 2001 From: Robert Kubosz Date: Fri, 13 Jul 2018 11:39:39 +0200 Subject: [PATCH 6/6] add error handling for scroll button out of range user will be informed if the scroll button indentifier values causes underflow or overflow. --- sway/commands/input/scroll_button.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c index 6345b71b..350fcca2 100644 --- a/sway/commands/input/scroll_button.c +++ b/sway/commands/input/scroll_button.c @@ -1,5 +1,6 @@ #include #include +#include #include "sway/config.h" #include "sway/commands.h" #include "sway/input/input-manager.h" @@ -18,13 +19,19 @@ struct cmd_results *input_cmd_scroll_button(int argc, char **argv) { struct input_config *new_config = new_input_config(current_input_config->identifier); + errno = 0; char *endptr; - long scroll_button = strtol(*argv, &endptr, 10); + int scroll_button = strtol(*argv, &endptr, 10); if (endptr == *argv && scroll_button == 0) { free_input_config(new_config); return cmd_results_new(CMD_INVALID, "scroll_button", "Scroll button identifier must be an integer."); } + if (errno == ERANGE) { + free_input_config(new_config); + return cmd_results_new(CMD_INVALID, "scroll_button", + "Scroll button identifier out of range."); + } if (scroll_button < 0) { free_input_config(new_config); return cmd_results_new(CMD_INVALID, "scroll_button",