diff options
-rw-r--r-- | include/sway/commands.h | 2 | ||||
-rw-r--r-- | sway/commands/bar.c | 2 | ||||
-rw-r--r-- | sway/commands/bar/bind.c | 106 | ||||
-rw-r--r-- | sway/sway-bar.5.scd | 6 |
4 files changed, 87 insertions, 29 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h index 0347ad5e..cfe2aa07 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h | |||
@@ -217,6 +217,8 @@ sway_cmd bar_cmd_tray_bindcode; | |||
217 | sway_cmd bar_cmd_tray_bindsym; | 217 | sway_cmd bar_cmd_tray_bindsym; |
218 | sway_cmd bar_cmd_tray_output; | 218 | sway_cmd bar_cmd_tray_output; |
219 | sway_cmd bar_cmd_tray_padding; | 219 | sway_cmd bar_cmd_tray_padding; |
220 | sway_cmd bar_cmd_unbindcode; | ||
221 | sway_cmd bar_cmd_unbindsym; | ||
220 | sway_cmd bar_cmd_wrap_scroll; | 222 | sway_cmd bar_cmd_wrap_scroll; |
221 | sway_cmd bar_cmd_workspace_buttons; | 223 | sway_cmd bar_cmd_workspace_buttons; |
222 | 224 | ||
diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 82441f9e..73be7040 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c | |||
@@ -32,6 +32,8 @@ static struct cmd_handler bar_handlers[] = { | |||
32 | { "tray_bindsym", bar_cmd_tray_bindsym }, | 32 | { "tray_bindsym", bar_cmd_tray_bindsym }, |
33 | { "tray_output", bar_cmd_tray_output }, | 33 | { "tray_output", bar_cmd_tray_output }, |
34 | { "tray_padding", bar_cmd_tray_padding }, | 34 | { "tray_padding", bar_cmd_tray_padding }, |
35 | { "unbindcode", bar_cmd_unbindcode }, | ||
36 | { "unbindsym", bar_cmd_unbindsym }, | ||
35 | { "workspace_buttons", bar_cmd_workspace_buttons }, | 37 | { "workspace_buttons", bar_cmd_workspace_buttons }, |
36 | { "wrap_scroll", bar_cmd_wrap_scroll }, | 38 | { "wrap_scroll", bar_cmd_wrap_scroll }, |
37 | }; | 39 | }; |
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 | ||
12 | static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) { | 12 | static 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 | |||
38 | static 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 | |||
63 | static 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 | ||
78 | struct cmd_results *bar_cmd_bindcode(int argc, char **argv) { | 118 | struct 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 | ||
82 | struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { | 122 | struct 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 | |||
126 | struct cmd_results *bar_cmd_unbindcode(int argc, char **argv) { | ||
127 | return bar_cmd_bind(argc, argv, true, true); | ||
128 | } | ||
129 | |||
130 | struct cmd_results *bar_cmd_unbindsym(int argc, char **argv) { | ||
131 | return bar_cmd_bind(argc, argv, false, true); | ||
84 | } | 132 | } |
diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index 1f4ceaf2..a3df1160 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd | |||
@@ -112,6 +112,12 @@ Sway allows configuring swaybar in the sway configuration file. | |||
112 | the bar. This value will be multiplied by the output scale. The default is | 112 | the bar. This value will be multiplied by the output scale. The default is |
113 | _3_. | 113 | _3_. |
114 | 114 | ||
115 | *unbindcode* [--release] <event-code> | ||
116 | Removes the binding with the given <event-code>. | ||
117 | |||
118 | *unbindsym* [--release] button[1-9]|<event-name> | ||
119 | Removes the binding with the given <button> or <event-name>. | ||
120 | |||
115 | ## TRAY | 121 | ## TRAY |
116 | 122 | ||
117 | Swaybar provides a system tray where third-party applications may place icons. | 123 | Swaybar provides a system tray where third-party applications may place icons. |