diff options
author | Alex Maese <memaese@hotmail.com> | 2019-04-12 11:28:48 -0500 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2019-04-17 23:29:43 -0400 |
commit | 8d4f8aea4654c6071e243900b5dbf18e1cd62fd6 (patch) | |
tree | b2c0ae87e55df809dc00f63862563204ab8945f9 /sway | |
parent | Create unbindsym and unbindcode commands (diff) | |
download | sway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.tar.gz sway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.tar.zst sway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.zip |
Add unbindswitch command
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 1 | ||||
-rw-r--r-- | sway/commands/bind.c | 152 | ||||
-rw-r--r-- | sway/sway.5.scd | 3 |
3 files changed, 102 insertions, 54 deletions
diff --git a/sway/commands.c b/sway/commands.c index 267c7de8..237bfc28 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -93,6 +93,7 @@ static struct cmd_handler handlers[] = { | |||
93 | { "titlebar_border_thickness", cmd_titlebar_border_thickness }, | 93 | { "titlebar_border_thickness", cmd_titlebar_border_thickness }, |
94 | { "titlebar_padding", cmd_titlebar_padding }, | 94 | { "titlebar_padding", cmd_titlebar_padding }, |
95 | { "unbindcode", cmd_unbindcode }, | 95 | { "unbindcode", cmd_unbindcode }, |
96 | { "unbindswitch", cmd_unbindswitch }, | ||
96 | { "unbindsym", cmd_unbindsym }, | 97 | { "unbindsym", cmd_unbindsym }, |
97 | { "workspace", cmd_workspace }, | 98 | { "workspace", cmd_workspace }, |
98 | { "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth }, | 99 | { "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth }, |
diff --git a/sway/commands/bind.c b/sway/commands/bind.c index fad7f850..dc7e0b19 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c | |||
@@ -196,6 +196,59 @@ static struct cmd_results *identify_key(const char* name, bool first_key, | |||
196 | return NULL; | 196 | return NULL; |
197 | } | 197 | } |
198 | 198 | ||
199 | static struct cmd_results *switch_binding_add( | ||
200 | struct sway_switch_binding *binding, const char *bindtype, | ||
201 | const char *switchcombo, bool warn) { | ||
202 | list_t *mode_bindings = config->current_mode->switch_bindings; | ||
203 | // overwrite the binding if it already exists | ||
204 | bool overwritten = false; | ||
205 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
206 | struct sway_switch_binding *config_binding = mode_bindings->items[i]; | ||
207 | if (binding_switch_compare(binding, config_binding)) { | ||
208 | sway_log(SWAY_INFO, "Overwriting binding '%s' to `%s` from `%s`", | ||
209 | switchcombo, binding->command, config_binding->command); | ||
210 | if (warn) { | ||
211 | config_add_swaynag_warning("Overwriting binding" | ||
212 | "'%s' to `%s` from `%s`", | ||
213 | switchcombo, binding->command, | ||
214 | config_binding->command); | ||
215 | } | ||
216 | free_switch_binding(config_binding); | ||
217 | mode_bindings->items[i] = binding; | ||
218 | overwritten = true; | ||
219 | } | ||
220 | } | ||
221 | |||
222 | if (!overwritten) { | ||
223 | list_add(mode_bindings, binding); | ||
224 | sway_log(SWAY_DEBUG, "%s - Bound %s to command `%s`", | ||
225 | bindtype, switchcombo, binding->command); | ||
226 | } | ||
227 | |||
228 | return cmd_results_new(CMD_SUCCESS, NULL); | ||
229 | } | ||
230 | |||
231 | static struct cmd_results *switch_binding_remove( | ||
232 | struct sway_switch_binding *binding, const char *bindtype, | ||
233 | const char *switchcombo) { | ||
234 | list_t *mode_bindings = config->current_mode->switch_bindings; | ||
235 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
236 | struct sway_switch_binding *config_binding = mode_bindings->items[i]; | ||
237 | if (binding_switch_compare(binding, config_binding)) { | ||
238 | free_switch_binding(config_binding); | ||
239 | free_switch_binding(binding); | ||
240 | list_del(mode_bindings, i); | ||
241 | sway_log(SWAY_DEBUG, "%s - Unbound %s switch", | ||
242 | bindtype, switchcombo); | ||
243 | return cmd_results_new(CMD_SUCCESS, NULL); | ||
244 | } | ||
245 | } | ||
246 | |||
247 | free_switch_binding(binding); | ||
248 | return cmd_results_new(CMD_FAILURE, "Could not find switch binding `%s`", | ||
249 | switchcombo); | ||
250 | } | ||
251 | |||
199 | static struct cmd_results *binding_add(struct sway_binding *binding, | 252 | static struct cmd_results *binding_add(struct sway_binding *binding, |
200 | list_t *mode_bindings, const char *bindtype, | 253 | list_t *mode_bindings, const char *bindtype, |
201 | const char *keycombo, bool warn) { | 254 | const char *keycombo, bool warn) { |
@@ -375,26 +428,17 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | |||
375 | return binding_add(binding, mode_bindings, bindtype, argv[0], warn); | 428 | return binding_add(binding, mode_bindings, bindtype, argv[0], warn); |
376 | } | 429 | } |
377 | 430 | ||
378 | struct cmd_results *cmd_bindsym(int argc, char **argv) { | 431 | struct cmd_results *cmd_bind_or_unbind_switch(int argc, char **argv, |
379 | return cmd_bindsym_or_bindcode(argc, argv, false, false); | 432 | bool unbind) { |
380 | } | 433 | int minargs = 2; |
381 | 434 | char *bindtype = "bindswitch"; | |
382 | struct cmd_results *cmd_bindcode(int argc, char **argv) { | 435 | if (unbind) { |
383 | return cmd_bindsym_or_bindcode(argc, argv, true, false); | 436 | minargs--; |
384 | } | 437 | bindtype = "unbindswitch"; |
385 | 438 | } | |
386 | struct cmd_results *cmd_unbindsym(int argc, char **argv) { | ||
387 | return cmd_bindsym_or_bindcode(argc, argv, false, true); | ||
388 | } | ||
389 | |||
390 | struct cmd_results *cmd_unbindcode(int argc, char **argv) { | ||
391 | return cmd_bindsym_or_bindcode(argc, argv, true, true); | ||
392 | } | ||
393 | |||
394 | struct cmd_results *cmd_bindswitch(int argc, char **argv) { | ||
395 | 439 | ||
396 | struct cmd_results *error = NULL; | 440 | struct cmd_results *error = NULL; |
397 | if ((error = checkarg(argc, "bindswitch", EXPECTED_AT_LEAST, 2))) { | 441 | if ((error = checkarg(argc, bindtype, EXPECTED_AT_LEAST, minargs))) { |
398 | return error; | 442 | return error; |
399 | } | 443 | } |
400 | struct sway_switch_binding *binding = calloc(1, sizeof(struct sway_switch_binding)); | 444 | struct sway_switch_binding *binding = calloc(1, sizeof(struct sway_switch_binding)); |
@@ -417,20 +461,19 @@ struct cmd_results *cmd_bindswitch(int argc, char **argv) { | |||
417 | argc--; | 461 | argc--; |
418 | } | 462 | } |
419 | 463 | ||
420 | if (argc < 2) { | 464 | if (argc < minargs) { |
421 | free(binding); | 465 | free(binding); |
422 | return cmd_results_new(CMD_FAILURE, | 466 | return cmd_results_new(CMD_FAILURE, |
423 | "Invalid bindswitch command (expected at least 2 " | 467 | "Invalid %s command (expected at least %d " |
424 | "non-option arguments, got %d)", argc); | 468 | "non-option arguments, got %d)", bindtype, minargs, argc); |
425 | } | 469 | } |
426 | binding->command = join_args(argv + 1, argc - 1); | ||
427 | 470 | ||
428 | list_t *split = split_string(argv[0], ":"); | 471 | list_t *split = split_string(argv[0], ":"); |
429 | if (split->length != 2) { | 472 | if (split->length != 2) { |
430 | free_switch_binding(binding); | 473 | free_switch_binding(binding); |
431 | return cmd_results_new(CMD_FAILURE, | 474 | return cmd_results_new(CMD_FAILURE, |
432 | "Invalid bindswitch command (expected two arguments with " | 475 | "Invalid %s command (expected binding with the form " |
433 | "format <switch>:<state> <action>, got %d)", argc); | 476 | "<switch>:<state>)", bindtype, argc); |
434 | } | 477 | } |
435 | if (strcmp(split->items[0], "tablet") == 0) { | 478 | if (strcmp(split->items[0], "tablet") == 0) { |
436 | binding->type = WLR_SWITCH_TYPE_TABLET_MODE; | 479 | binding->type = WLR_SWITCH_TYPE_TABLET_MODE; |
@@ -439,8 +482,8 @@ struct cmd_results *cmd_bindswitch(int argc, char **argv) { | |||
439 | } else { | 482 | } else { |
440 | free_switch_binding(binding); | 483 | free_switch_binding(binding); |
441 | return cmd_results_new(CMD_FAILURE, | 484 | return cmd_results_new(CMD_FAILURE, |
442 | "Invalid bindswitch command (expected switch binding: " | 485 | "Invalid %s command (expected switch binding: " |
443 | "unknown switch %s)", split->items[0]); | 486 | "unknown switch %s)", bindtype, split->items[0]); |
444 | } | 487 | } |
445 | if (strcmp(split->items[1], "on") == 0) { | 488 | if (strcmp(split->items[1], "on") == 0) { |
446 | binding->state = WLR_SWITCH_STATE_ON; | 489 | binding->state = WLR_SWITCH_STATE_ON; |
@@ -451,40 +494,41 @@ struct cmd_results *cmd_bindswitch(int argc, char **argv) { | |||
451 | } else { | 494 | } else { |
452 | free_switch_binding(binding); | 495 | free_switch_binding(binding); |
453 | return cmd_results_new(CMD_FAILURE, | 496 | return cmd_results_new(CMD_FAILURE, |
454 | "Invalid bindswitch command " | 497 | "Invalid %s command " |
455 | "(expected switch state: unknown state %d)", | 498 | "(expected switch state: unknown state %d)", |
456 | split->items[0]); | 499 | bindtype, split->items[0]); |
457 | } | 500 | } |
458 | list_free_items_and_destroy(split); | 501 | list_free_items_and_destroy(split); |
459 | 502 | ||
460 | list_t *mode_bindings = config->current_mode->switch_bindings; | 503 | if (unbind) { |
461 | 504 | return switch_binding_remove(binding, bindtype, argv[0]); | |
462 | // overwrite the binding if it already exists | ||
463 | bool overwritten = false; | ||
464 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
465 | struct sway_switch_binding *config_binding = mode_bindings->items[i]; | ||
466 | if (binding_switch_compare(binding, config_binding)) { | ||
467 | sway_log(SWAY_INFO, "Overwriting binding '%s' to `%s` from `%s`", | ||
468 | argv[0], binding->command, config_binding->command); | ||
469 | if (warn) { | ||
470 | config_add_swaynag_warning("Overwriting binding" | ||
471 | "'%s' to `%s` from `%s`", | ||
472 | argv[0], binding->command, | ||
473 | config_binding->command); | ||
474 | } | ||
475 | free_switch_binding(config_binding); | ||
476 | mode_bindings->items[i] = binding; | ||
477 | overwritten = true; | ||
478 | } | ||
479 | } | 505 | } |
506 | binding->command = join_args(argv + 1, argc - 1); | ||
507 | return switch_binding_add(binding, bindtype, argv[0], warn); | ||
508 | } | ||
480 | 509 | ||
481 | if (!overwritten) { | 510 | struct cmd_results *cmd_bindsym(int argc, char **argv) { |
482 | list_add(mode_bindings, binding); | 511 | return cmd_bindsym_or_bindcode(argc, argv, false, false); |
483 | } | 512 | } |
484 | 513 | ||
485 | sway_log(SWAY_DEBUG, "bindswitch - Bound %s to command `%s`", | 514 | struct cmd_results *cmd_bindcode(int argc, char **argv) { |
486 | argv[0], binding->command); | 515 | return cmd_bindsym_or_bindcode(argc, argv, true, false); |
487 | return cmd_results_new(CMD_SUCCESS, NULL); | 516 | } |
517 | |||
518 | struct cmd_results *cmd_unbindsym(int argc, char **argv) { | ||
519 | return cmd_bindsym_or_bindcode(argc, argv, false, true); | ||
520 | } | ||
521 | |||
522 | struct cmd_results *cmd_unbindcode(int argc, char **argv) { | ||
523 | return cmd_bindsym_or_bindcode(argc, argv, true, true); | ||
524 | } | ||
525 | |||
526 | struct cmd_results *cmd_bindswitch(int argc, char **argv) { | ||
527 | return cmd_bind_or_unbind_switch(argc, argv, false); | ||
528 | } | ||
529 | |||
530 | struct cmd_results *cmd_unbindswitch(int argc, char **argv) { | ||
531 | return cmd_bind_or_unbind_switch(argc, argv, true); | ||
488 | } | 532 | } |
489 | 533 | ||
490 | /** | 534 | /** |
diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 5d94eced..80193651 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd | |||
@@ -644,6 +644,9 @@ The default colors are: | |||
644 | to _yes_, the marks will be shown on the _left_ side instead of the | 644 | to _yes_, the marks will be shown on the _left_ side instead of the |
645 | _right_ side. | 645 | _right_ side. |
646 | 646 | ||
647 | *unbindswitch* <switch>:<state> | ||
648 | Removes a binding for when <switch> changes to <state>. | ||
649 | |||
647 | *unbindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--input-device=<device>] <key combo> | 650 | *unbindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--input-device=<device>] <key combo> |
648 | Removes the binding for _key combo_ that was previously bound with the | 651 | Removes the binding for _key combo_ that was previously bound with the |
649 | given flags. If _input-device_ is given, only the binding for that | 652 | given flags. If _input-device_ is given, only the binding for that |