diff options
author | Drew DeVault <sir@cmpwn.com> | 2019-01-13 20:35:45 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-13 20:35:45 -0500 |
commit | 4eb0767414fe404adf1c0b0be7c719f5ac115684 (patch) | |
tree | 472e620249f29c62e50df28faa36c3223d3d1fe4 | |
parent | Merge pull request #3408 from RedSoxFan/bar-padding (diff) | |
parent | get_inputs: add libinput send events mode (diff) | |
download | sway-4eb0767414fe404adf1c0b0be7c719f5ac115684.tar.gz sway-4eb0767414fe404adf1c0b0be7c719f5ac115684.tar.zst sway-4eb0767414fe404adf1c0b0be7c719f5ac115684.zip |
Merge pull request #3398 from RedSoxFan/toggle-input-events
input events: toggle and ipc get_inputs
-rw-r--r-- | sway/commands/input/events.c | 76 | ||||
-rw-r--r-- | sway/ipc-json.c | 21 | ||||
-rw-r--r-- | sway/sway-input.5.scd | 9 | ||||
-rw-r--r-- | swaymsg/main.c | 6 |
4 files changed, 107 insertions, 5 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/ipc-json.c b/sway/ipc-json.c index 09b65e8d..15f89f65 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include "sway/output.h" | 11 | #include "sway/output.h" |
12 | #include "sway/input/input-manager.h" | 12 | #include "sway/input/input-manager.h" |
13 | #include "sway/input/seat.h" | 13 | #include "sway/input/seat.h" |
14 | #include <wlr/backend/libinput.h> | ||
14 | #include <wlr/types/wlr_box.h> | 15 | #include <wlr/types/wlr_box.h> |
15 | #include <wlr/types/wlr_output.h> | 16 | #include <wlr/types/wlr_output.h> |
16 | #include <xkbcommon/xkbcommon.h> | 17 | #include <xkbcommon/xkbcommon.h> |
@@ -598,6 +599,26 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) { | |||
598 | } | 599 | } |
599 | } | 600 | } |
600 | 601 | ||
602 | if (wlr_input_device_is_libinput(device->wlr_device)) { | ||
603 | struct libinput_device *libinput_dev; | ||
604 | libinput_dev = wlr_libinput_get_device_handle(device->wlr_device); | ||
605 | |||
606 | const char *events = "unknown"; | ||
607 | switch (libinput_device_config_send_events_get_mode(libinput_dev)) { | ||
608 | case LIBINPUT_CONFIG_SEND_EVENTS_ENABLED: | ||
609 | events = "enabled"; | ||
610 | break; | ||
611 | case LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE: | ||
612 | events = "disabled_on_external_mouse"; | ||
613 | break; | ||
614 | case LIBINPUT_CONFIG_SEND_EVENTS_DISABLED: | ||
615 | events = "disabled"; | ||
616 | break; | ||
617 | } | ||
618 | json_object_object_add(object, "libinput_send_events", | ||
619 | json_object_new_string(events)); | ||
620 | } | ||
621 | |||
601 | return object; | 622 | return object; |
602 | } | 623 | } |
603 | 624 | ||
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. |
diff --git a/swaymsg/main.c b/swaymsg/main.c index f1bb5e3e..e5eee631 100644 --- a/swaymsg/main.c +++ b/swaymsg/main.c | |||
@@ -113,7 +113,7 @@ static const char *pretty_type_name(const char *name) { | |||
113 | } | 113 | } |
114 | 114 | ||
115 | static void pretty_print_input(json_object *i) { | 115 | static void pretty_print_input(json_object *i) { |
116 | json_object *id, *name, *type, *product, *vendor, *kbdlayout; | 116 | json_object *id, *name, *type, *product, *vendor, *kbdlayout, *events; |
117 | json_object_object_get_ex(i, "identifier", &id); | 117 | json_object_object_get_ex(i, "identifier", &id); |
118 | json_object_object_get_ex(i, "name", &name); | 118 | json_object_object_get_ex(i, "name", &name); |
119 | json_object_object_get_ex(i, "type", &type); | 119 | json_object_object_get_ex(i, "type", &type); |
@@ -139,6 +139,10 @@ static void pretty_print_input(json_object *i) { | |||
139 | json_object_get_string(kbdlayout)); | 139 | json_object_get_string(kbdlayout)); |
140 | } | 140 | } |
141 | 141 | ||
142 | if (json_object_object_get_ex(i, "libinput_send_events", &events)) { | ||
143 | printf(" Libinput Send Events: %s\n", json_object_get_string(events)); | ||
144 | } | ||
145 | |||
142 | printf("\n"); | 146 | printf("\n"); |
143 | } | 147 | } |
144 | 148 | ||