aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Alex Maese <memaese@hotmail.com>2019-04-12 11:28:48 -0500
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-04-17 23:29:43 -0400
commit8d4f8aea4654c6071e243900b5dbf18e1cd62fd6 (patch)
treeb2c0ae87e55df809dc00f63862563204ab8945f9
parentCreate unbindsym and unbindcode commands (diff)
downloadsway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.tar.gz
sway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.tar.zst
sway-8d4f8aea4654c6071e243900b5dbf18e1cd62fd6.zip
Add unbindswitch command
-rw-r--r--include/sway/commands.h1
-rw-r--r--sway/commands.c1
-rw-r--r--sway/commands/bind.c152
-rw-r--r--sway/sway.5.scd3
4 files changed, 103 insertions, 54 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h
index 96d68e9e..0347ad5e 100644
--- a/include/sway/commands.h
+++ b/include/sway/commands.h
@@ -182,6 +182,7 @@ sway_cmd cmd_title_format;
182sway_cmd cmd_titlebar_border_thickness; 182sway_cmd cmd_titlebar_border_thickness;
183sway_cmd cmd_titlebar_padding; 183sway_cmd cmd_titlebar_padding;
184sway_cmd cmd_unbindcode; 184sway_cmd cmd_unbindcode;
185sway_cmd cmd_unbindswitch;
185sway_cmd cmd_unbindsym; 186sway_cmd cmd_unbindsym;
186sway_cmd cmd_unmark; 187sway_cmd cmd_unmark;
187sway_cmd cmd_urgent; 188sway_cmd cmd_urgent;
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
199static 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
231static 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
199static struct cmd_results *binding_add(struct sway_binding *binding, 252static 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
378struct cmd_results *cmd_bindsym(int argc, char **argv) { 431struct 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";
382struct 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 }
386struct cmd_results *cmd_unbindsym(int argc, char **argv) {
387 return cmd_bindsym_or_bindcode(argc, argv, false, true);
388}
389
390struct cmd_results *cmd_unbindcode(int argc, char **argv) {
391 return cmd_bindsym_or_bindcode(argc, argv, true, true);
392}
393
394struct 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) { 510struct 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`", 514struct 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
518struct cmd_results *cmd_unbindsym(int argc, char **argv) {
519 return cmd_bindsym_or_bindcode(argc, argv, false, true);
520}
521
522struct cmd_results *cmd_unbindcode(int argc, char **argv) {
523 return cmd_bindsym_or_bindcode(argc, argv, true, true);
524}
525
526struct cmd_results *cmd_bindswitch(int argc, char **argv) {
527 return cmd_bind_or_unbind_switch(argc, argv, false);
528}
529
530struct 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