aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/bar
diff options
context:
space:
mode:
authorLibravatar Alex Maese <memaese@hotmail.com>2019-04-12 11:30:36 -0500
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-04-17 23:29:43 -0400
commit35ddd9aab3c386345176d7ea1f5814f152ba16bd (patch)
tree41a5115333712b51f56147df4b8ceaab3c45cff2 /sway/commands/bar
parentAdd unbindswitch command (diff)
downloadsway-35ddd9aab3c386345176d7ea1f5814f152ba16bd.tar.gz
sway-35ddd9aab3c386345176d7ea1f5814f152ba16bd.tar.zst
sway-35ddd9aab3c386345176d7ea1f5814f152ba16bd.zip
Add unbindsym/unbindcode command for swaybar
Diffstat (limited to 'sway/commands/bar')
-rw-r--r--sway/commands/bar/bind.c106
1 files changed, 77 insertions, 29 deletions
diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c
index 17030a05..f94b4811 100644
--- a/sway/commands/bar/bind.c
+++ b/sway/commands/bar/bind.c
@@ -9,10 +9,70 @@
9#include "log.h" 9#include "log.h"
10#include "stringop.h" 10#include "stringop.h"
11 11
12static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) { 12static struct cmd_results *binding_add(struct bar_binding *binding,
13 const char *command = code ? "bar bindcode" : "bar bindsym"; 13 list_t *mode_bindings) {
14 const char *name = get_mouse_button_name(binding->button);
15 bool overwritten = false;
16 for (int i = 0; i < mode_bindings->length; i++) {
17 struct bar_binding *other = mode_bindings->items[i];
18 if (other->button == binding->button &&
19 other->release == binding->release) {
20 overwritten = true;
21 mode_bindings->items[i] = binding;
22 free_bar_binding(other);
23 sway_log(SWAY_DEBUG, "[bar %s] Updated binding for %u (%s)%s",
24 config->current_bar->id, binding->button, name,
25 binding->release ? " - release" : "");
26 break;
27 }
28 }
29 if (!overwritten) {
30 list_add(mode_bindings, binding);
31 sway_log(SWAY_DEBUG, "[bar %s] Added binding for %u (%s)%s",
32 config->current_bar->id, binding->button, name,
33 binding->release ? " - release" : "");
34 }
35 return cmd_results_new(CMD_SUCCESS, NULL);
36}
37
38static struct cmd_results *binding_remove(struct bar_binding *binding,
39 list_t *mode_bindings) {
40 const char *name = get_mouse_button_name(binding->button);
41 for (int i = 0; i < mode_bindings->length; i++) {
42 struct bar_binding *other = mode_bindings->items[i];
43 if (other->button == binding->button &&
44 other->release == binding->release) {
45 sway_log(SWAY_DEBUG, "[bar %s] Unbound binding for %u (%s)%s",
46 config->current_bar->id, binding->button, name,
47 binding->release ? " - release" : "");
48 free_bar_binding(other);
49 free_bar_binding(binding);
50 list_del(mode_bindings, i);
51 return cmd_results_new(CMD_SUCCESS, NULL);
52 }
53 }
54
55 struct cmd_results *error = cmd_results_new(CMD_FAILURE, "Could not "
56 "find binding for [bar %s]" " Button %u (%s)%s",
57 config->current_bar->id, binding->button, name,
58 binding->release ? " - release" : "");
59 free_bar_binding(binding);
60 return error;
61}
62
63static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code,
64 bool unbind) {
65 int minargs = 2;
66 const char *command;
67 if (unbind) {
68 minargs--;
69 command = code ? "bar unbindcode" : "bar unbindsym";
70 } else {
71 command = code ? "bar bindcode" : "bar bindsym";
72 }
73
14 struct cmd_results *error = NULL; 74 struct cmd_results *error = NULL;
15 if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, 2))) { 75 if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, minargs))) {
16 return error; 76 return error;
17 } 77 }
18 if (!config->current_bar) { 78 if (!config->current_bar) {
@@ -46,39 +106,27 @@ static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) {
46 free_bar_binding(binding); 106 free_bar_binding(binding);
47 return cmd_results_new(CMD_INVALID, "Unknown button %s", argv[0]); 107 return cmd_results_new(CMD_INVALID, "Unknown button %s", argv[0]);
48 } 108 }
49 const char *name = get_mouse_button_name(binding->button);
50
51 binding->command = join_args(argv + 1, argc - 1);
52
53 list_t *bindings = config->current_bar->bindings; 109 list_t *bindings = config->current_bar->bindings;
54 bool overwritten = false; 110 if (unbind) {
55 for (int i = 0; i < bindings->length; i++) { 111 return binding_remove(binding, bindings);
56 struct bar_binding *other = bindings->items[i];
57 if (other->button == binding->button &&
58 other->release == binding->release) {
59 overwritten = true;
60 bindings->items[i] = binding;
61 free_bar_binding(other);
62 sway_log(SWAY_DEBUG, "[bar %s] Updated binding for %u (%s)%s",
63 config->current_bar->id, binding->button, name,
64 binding->release ? " - release" : "");
65 break;
66 }
67 }
68 if (!overwritten) {
69 list_add(bindings, binding);
70 sway_log(SWAY_DEBUG, "[bar %s] Added binding for %u (%s)%s",
71 config->current_bar->id, binding->button, name,
72 binding->release ? " - release" : "");
73 } 112 }
74 113
75 return cmd_results_new(CMD_SUCCESS, NULL); 114 binding->command = join_args(argv + 1, argc - 1);
115 return binding_add(binding, bindings);
76} 116}
77 117
78struct cmd_results *bar_cmd_bindcode(int argc, char **argv) { 118struct cmd_results *bar_cmd_bindcode(int argc, char **argv) {
79 return bar_cmd_bind(argc, argv, true); 119 return bar_cmd_bind(argc, argv, true, false);
80} 120}
81 121
82struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { 122struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
83 return bar_cmd_bind(argc, argv, false); 123 return bar_cmd_bind(argc, argv, false, false);
124}
125
126struct cmd_results *bar_cmd_unbindcode(int argc, char **argv) {
127 return bar_cmd_bind(argc, argv, true, true);
128}
129
130struct cmd_results *bar_cmd_unbindsym(int argc, char **argv) {
131 return bar_cmd_bind(argc, argv, false, true);
84} 132}