diff options
-rw-r--r-- | sway/commands/input/events.c | 76 | ||||
-rw-r--r-- | sway/sway-input.5.scd | 9 |
2 files changed, 81 insertions, 4 deletions
diff --git a/sway/commands/input/events.c b/sway/commands/input/events.c index e7ed69c6..69f46269 100644 --- a/sway/commands/input/events.c +++ b/sway/commands/input/events.c | |||
@@ -1,10 +1,69 @@ | |||
1 | #include <limits.h> | ||
1 | #include <string.h> | 2 | #include <string.h> |
2 | #include <strings.h> | 3 | #include <strings.h> |
4 | #include <wlr/backend/libinput.h> | ||
3 | #include "sway/config.h" | 5 | #include "sway/config.h" |
4 | #include "sway/commands.h" | 6 | #include "sway/commands.h" |
5 | #include "sway/input/input-manager.h" | 7 | #include "sway/input/input-manager.h" |
6 | #include "log.h" | 8 | #include "log.h" |
7 | 9 | ||
10 | static void toggle_send_events_for_device(struct input_config *ic, | ||
11 | struct sway_input_device *input_device) { | ||
12 | struct wlr_input_device *wlr_device = input_device->wlr_device; | ||
13 | if (!wlr_input_device_is_libinput(wlr_device)) { | ||
14 | return; | ||
15 | } | ||
16 | struct libinput_device *libinput_dev | ||
17 | = wlr_libinput_get_device_handle(wlr_device); | ||
18 | |||
19 | enum libinput_config_send_events_mode mode = | ||
20 | libinput_device_config_send_events_get_mode(libinput_dev); | ||
21 | uint32_t possible = | ||
22 | libinput_device_config_send_events_get_modes(libinput_dev); | ||
23 | |||
24 | switch (mode) { | ||
25 | case LIBINPUT_CONFIG_SEND_EVENTS_ENABLED: | ||
26 | mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; | ||
27 | if (possible & mode) { | ||
28 | break; | ||
29 | } | ||
30 | // fall through | ||
31 | case LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE: | ||
32 | mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; | ||
33 | if (possible & mode) { | ||
34 | break; | ||
35 | } | ||
36 | // fall through | ||
37 | case LIBINPUT_CONFIG_SEND_EVENTS_DISABLED: | ||
38 | default: | ||
39 | mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; | ||
40 | break; | ||
41 | } | ||
42 | |||
43 | ic->send_events = mode; | ||
44 | } | ||
45 | |||
46 | static void toggle_send_events(struct input_config *ic) { | ||
47 | struct sway_input_device *input_device = NULL; | ||
48 | wl_list_for_each(input_device, &server.input->devices, link) { | ||
49 | if (strcmp(input_device->identifier, ic->identifier) == 0) { | ||
50 | toggle_send_events_for_device(ic, input_device); | ||
51 | } | ||
52 | } | ||
53 | } | ||
54 | |||
55 | static void toggle_wildcard_send_events() { | ||
56 | struct sway_input_device *input_device = NULL; | ||
57 | wl_list_for_each(input_device, &server.input->devices, link) { | ||
58 | struct input_config *ic = new_input_config(input_device->identifier); | ||
59 | if (!ic) { | ||
60 | break; | ||
61 | } | ||
62 | toggle_send_events_for_device(ic, input_device); | ||
63 | store_input_config(ic); | ||
64 | } | ||
65 | } | ||
66 | |||
8 | struct cmd_results *input_cmd_events(int argc, char **argv) { | 67 | struct cmd_results *input_cmd_events(int argc, char **argv) { |
9 | struct cmd_results *error = NULL; | 68 | struct cmd_results *error = NULL; |
10 | if ((error = checkarg(argc, "events", EXPECTED_AT_LEAST, 1))) { | 69 | if ((error = checkarg(argc, "events", EXPECTED_AT_LEAST, 1))) { |
@@ -23,9 +82,24 @@ struct cmd_results *input_cmd_events(int argc, char **argv) { | |||
23 | } else if (strcasecmp(argv[0], "disabled_on_external_mouse") == 0) { | 82 | } else if (strcasecmp(argv[0], "disabled_on_external_mouse") == 0) { |
24 | ic->send_events = | 83 | ic->send_events = |
25 | LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; | 84 | LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; |
26 | } else { | 85 | } else if (config->reading) { |
27 | return cmd_results_new(CMD_INVALID, "events", | 86 | return cmd_results_new(CMD_INVALID, "events", |
28 | "Expected 'events <enabled|disabled|disabled_on_external_mouse>'"); | 87 | "Expected 'events <enabled|disabled|disabled_on_external_mouse>'"); |
88 | } else if (strcasecmp(argv[0], "toggle") == 0) { | ||
89 | if (strcmp(ic->identifier, "*") == 0) { | ||
90 | // Update the device input configs and then reset the wildcard | ||
91 | // config send events mode so that is does not override the device | ||
92 | // ones. The device ones will be applied when attempting to apply | ||
93 | // the wildcard config | ||
94 | toggle_wildcard_send_events(); | ||
95 | ic->send_events = INT_MIN; | ||
96 | } else { | ||
97 | toggle_send_events(ic); | ||
98 | } | ||
99 | } else { | ||
100 | return cmd_results_new(CMD_INVALID, "events", | ||
101 | "Expected 'events <enabled|disabled|disabled_on_external_mouse|" | ||
102 | "toggle>'"); | ||
29 | } | 103 | } |
30 | 104 | ||
31 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 105 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
diff --git a/sway/sway-input.5.scd b/sway/sway-input.5.scd index 820194a9..c54babaa 100644 --- a/sway/sway-input.5.scd +++ b/sway/sway-input.5.scd | |||
@@ -82,9 +82,12 @@ The following commands may only be used in the configuration file. | |||
82 | *input* <identifier> dwt enabled|disabled | 82 | *input* <identifier> dwt enabled|disabled |
83 | Enables or disables disable-while-typing for the specified input device. | 83 | Enables or disables disable-while-typing for the specified input device. |
84 | 84 | ||
85 | *input* <identifier> events enabled|disabled|disabled\_on\_external\_mouse | 85 | *input* <identifier> events enabled|disabled|disabled\_on\_external\_mouse|toggle |
86 | Enables or disables send\_events for specified input device. (Disabling | 86 | Enables or disables send\_events for specified input device. Disabling |
87 | send\_events disables the input device) | 87 | send\_events disables the input device. The _toggle_ option cannot be used |
88 | in the config. The order is enabled, disabled\_on\_external\_mouse, | ||
89 | disabled, (loop back to enabled). Any mode which is not supported by the | ||
90 | device will be skipped during the toggle. | ||
88 | 91 | ||
89 | *input* <identifier> left\_handed enabled|disabled | 92 | *input* <identifier> left\_handed enabled|disabled |
90 | Enables or disables left handed mode for specified input device. | 93 | Enables or disables left handed mode for specified input device. |