summaryrefslogtreecommitdiff
path: root/sway/input/switch.c
diff options
context:
space:
mode:
authorBrian Ashworth <[email protected]>2019-05-30 03:30:08 -0400
committerSimon Ser <[email protected]>2019-05-30 10:47:42 +0300
commit6afb392823d27ec69bedc8fd74263c3d072cca29 (patch)
treea1a72a233a2ef8e89240b7702d7c9eabb3444bf0 /sway/input/switch.c
parent2c6a10c4ba8e1ab97db81677e32ca1580e4f0430 (diff)
bindings: allow unlocked and locked bindings
This changes the behavior of bindings to make the `BINDING_LOCKED` flag conflicting, which will allow for both unlocked and locked bindings. If there are two matching bindings and one has `--locked` and the other does not, the one with `--locked` will be preferred when locked and the one without will be preferred when unlocked. If there are two matching bindings and one has both a matching `--input-device=<input>` and `--locked` and the other has neither, the former will be preferred for both unlocked and locked. This also refactors `get_active_binding` in `sway/input/keyboard.c` to make it easier to read.
Diffstat (limited to 'sway/input/switch.c')
-rw-r--r--sway/input/switch.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sway/input/switch.c b/sway/input/switch.c
index a8769713..d825c5c3 100644
--- a/sway/input/switch.c
+++ b/sway/input/switch.c
@@ -38,6 +38,7 @@ static void handle_switch_toggle(struct wl_listener *listener, void *data) {
sway_log(SWAY_DEBUG, "%s: type %d state %d", device_identifier, type, state);
list_t *bindings = config->current_mode->switch_bindings;
+ struct sway_switch_binding *matched_binding = NULL;
for (int i = 0; i < bindings->length; ++i) {
struct sway_switch_binding *binding = bindings->items[i];
if (binding->type != type) {
@@ -52,10 +53,19 @@ static void handle_switch_toggle(struct wl_listener *listener, void *data) {
continue;
}
- struct sway_binding *dummy_binding = calloc(1, sizeof(struct sway_binding));
+ matched_binding = binding;
+
+ if (binding_locked == input_inhibited) {
+ break;
+ }
+ }
+
+ if (matched_binding) {
+ struct sway_binding *dummy_binding =
+ calloc(1, sizeof(struct sway_binding));
dummy_binding->type = BINDING_SWITCH;
- dummy_binding->flags = binding->flags;
- dummy_binding->command = binding->command;
+ dummy_binding->flags = matched_binding->flags;
+ dummy_binding->command = matched_binding->command;
seat_execute_command(seat, dummy_binding);
free(dummy_binding);