diff options
author | Alex Maese <memaese@hotmail.com> | 2019-04-12 11:26:23 -0500 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2019-04-17 23:29:43 -0400 |
commit | 852f1f0b349b63fe3c71e39ab1d3e87642a5c2d4 (patch) | |
tree | fe5530575cce89937289036fd144575a297906c4 | |
parent | swaymsg: add timeout and type checks (diff) | |
download | sway-852f1f0b349b63fe3c71e39ab1d3e87642a5c2d4.tar.gz sway-852f1f0b349b63fe3c71e39ab1d3e87642a5c2d4.tar.zst sway-852f1f0b349b63fe3c71e39ab1d3e87642a5c2d4.zip |
Create unbindsym and unbindcode commands
-rw-r--r-- | include/sway/commands.h | 2 | ||||
-rw-r--r-- | sway/commands.c | 2 | ||||
-rw-r--r-- | sway/commands/bind.c | 114 | ||||
-rw-r--r-- | sway/sway.5.scd | 8 |
4 files changed, 91 insertions, 35 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h index 2b66904c..96d68e9e 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h | |||
@@ -181,6 +181,8 @@ sway_cmd cmd_title_align; | |||
181 | sway_cmd cmd_title_format; | 181 | sway_cmd cmd_title_format; |
182 | sway_cmd cmd_titlebar_border_thickness; | 182 | sway_cmd cmd_titlebar_border_thickness; |
183 | sway_cmd cmd_titlebar_padding; | 183 | sway_cmd cmd_titlebar_padding; |
184 | sway_cmd cmd_unbindcode; | ||
185 | sway_cmd cmd_unbindsym; | ||
184 | sway_cmd cmd_unmark; | 186 | sway_cmd cmd_unmark; |
185 | sway_cmd cmd_urgent; | 187 | sway_cmd cmd_urgent; |
186 | sway_cmd cmd_workspace; | 188 | sway_cmd cmd_workspace; |
diff --git a/sway/commands.c b/sway/commands.c index d0bf402b..267c7de8 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -92,6 +92,8 @@ static struct cmd_handler handlers[] = { | |||
92 | { "title_align", cmd_title_align }, | 92 | { "title_align", cmd_title_align }, |
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 }, | ||
96 | { "unbindsym", cmd_unbindsym }, | ||
95 | { "workspace", cmd_workspace }, | 97 | { "workspace", cmd_workspace }, |
96 | { "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth }, | 98 | { "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth }, |
97 | }; | 99 | }; |
diff --git a/sway/commands/bind.c b/sway/commands/bind.c index 9a937c61..fad7f850 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c | |||
@@ -196,12 +196,70 @@ 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 *binding_add(struct sway_binding *binding, | ||
200 | list_t *mode_bindings, const char *bindtype, | ||
201 | const char *keycombo, bool warn) { | ||
202 | // overwrite the binding if it already exists | ||
203 | bool overwritten = false; | ||
204 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
205 | struct sway_binding *config_binding = mode_bindings->items[i]; | ||
206 | if (binding_key_compare(binding, config_binding)) { | ||
207 | sway_log(SWAY_INFO, "Overwriting binding '%s' for device '%s' " | ||
208 | "to `%s` from `%s`", keycombo, binding->input, | ||
209 | binding->command, config_binding->command); | ||
210 | if (warn) { | ||
211 | config_add_swaynag_warning("Overwriting binding" | ||
212 | "'%s' for device '%s' to `%s` from `%s`", | ||
213 | keycombo, binding->input, binding->command, | ||
214 | config_binding->command); | ||
215 | } | ||
216 | free_sway_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` for device '%s'", | ||
225 | bindtype, keycombo, binding->command, binding->input); | ||
226 | } | ||
227 | |||
228 | return cmd_results_new(CMD_SUCCESS, NULL); | ||
229 | } | ||
230 | |||
231 | static struct cmd_results *binding_remove(struct sway_binding *binding, | ||
232 | list_t *mode_bindings, const char *bindtype, | ||
233 | const char *keycombo) { | ||
234 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
235 | struct sway_binding *config_binding = mode_bindings->items[i]; | ||
236 | if (binding_key_compare(binding, config_binding)) { | ||
237 | sway_log(SWAY_DEBUG, "%s - Unbound `%s` from device '%s'", | ||
238 | bindtype, keycombo, binding->input); | ||
239 | free_sway_binding(config_binding); | ||
240 | free_sway_binding(binding); | ||
241 | list_del(mode_bindings, i); | ||
242 | return cmd_results_new(CMD_SUCCESS, NULL); | ||
243 | } | ||
244 | } | ||
245 | free_sway_binding(binding); | ||
246 | return cmd_results_new(CMD_FAILURE, "Could not find binding `%s` " | ||
247 | "for the given flags", keycombo); | ||
248 | } | ||
249 | |||
199 | static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | 250 | static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, |
200 | bool bindcode) { | 251 | bool bindcode, bool unbind) { |
201 | const char *bindtype = bindcode ? "bindcode" : "bindsym"; | 252 | const char *bindtype; |
253 | int minargs = 2; | ||
254 | if (unbind) { | ||
255 | bindtype = bindcode ? "unbindcode" : "unbindsym"; | ||
256 | minargs--; | ||
257 | } else { | ||
258 | bindtype = bindcode ? "bindcode": "bindsym"; | ||
259 | } | ||
202 | 260 | ||
203 | struct cmd_results *error = NULL; | 261 | struct cmd_results *error = NULL; |
204 | if ((error = checkarg(argc, bindtype, EXPECTED_AT_LEAST, 2))) { | 262 | if ((error = checkarg(argc, bindtype, EXPECTED_AT_LEAST, minargs))) { |
205 | return error; | 263 | return error; |
206 | } | 264 | } |
207 | 265 | ||
@@ -248,15 +306,14 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | |||
248 | BINDING_MOUSECODE : BINDING_MOUSESYM; | 306 | BINDING_MOUSECODE : BINDING_MOUSESYM; |
249 | } | 307 | } |
250 | 308 | ||
251 | if (argc < 2) { | 309 | if (argc < minargs) { |
252 | free_sway_binding(binding); | 310 | free_sway_binding(binding); |
253 | return cmd_results_new(CMD_FAILURE, | 311 | return cmd_results_new(CMD_FAILURE, |
254 | "Invalid %s command " | 312 | "Invalid %s command " |
255 | "(expected at least 2 non-option arguments, got %d)", bindtype, argc); | 313 | "(expected at least %d non-option arguments, got %d)", |
314 | bindtype, minargs, argc); | ||
256 | } | 315 | } |
257 | 316 | ||
258 | binding->command = join_args(argv + 1, argc - 1); | ||
259 | |||
260 | list_t *split = split_string(argv[0], "+"); | 317 | list_t *split = split_string(argv[0], "+"); |
261 | for (int i = 0; i < split->length; ++i) { | 318 | for (int i = 0; i < split->length; ++i) { |
262 | // Check for a modifier key | 319 | // Check for a modifier key |
@@ -287,7 +344,6 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | |||
287 | list_add(binding->keys, key); | 344 | list_add(binding->keys, key); |
288 | } | 345 | } |
289 | list_free_items_and_destroy(split); | 346 | list_free_items_and_destroy(split); |
290 | binding->order = binding_order++; | ||
291 | 347 | ||
292 | // refine region of interest for mouse binding once we are certain | 348 | // refine region of interest for mouse binding once we are certain |
293 | // that this is one | 349 | // that this is one |
@@ -310,41 +366,29 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | |||
310 | mode_bindings = config->current_mode->mouse_bindings; | 366 | mode_bindings = config->current_mode->mouse_bindings; |
311 | } | 367 | } |
312 | 368 | ||
313 | // overwrite the binding if it already exists | 369 | if (unbind) { |
314 | bool overwritten = false; | 370 | return binding_remove(binding, mode_bindings, bindtype, argv[0]); |
315 | for (int i = 0; i < mode_bindings->length; ++i) { | ||
316 | struct sway_binding *config_binding = mode_bindings->items[i]; | ||
317 | if (binding_key_compare(binding, config_binding)) { | ||
318 | sway_log(SWAY_INFO, "Overwriting binding '%s' for device '%s' " | ||
319 | "to `%s` from `%s`", argv[0], binding->input, | ||
320 | binding->command, config_binding->command); | ||
321 | if (warn) { | ||
322 | config_add_swaynag_warning("Overwriting binding" | ||
323 | "'%s' for device '%s' to `%s` from `%s`", | ||
324 | argv[0], binding->input, binding->command, | ||
325 | config_binding->command); | ||
326 | } | ||
327 | free_sway_binding(config_binding); | ||
328 | mode_bindings->items[i] = binding; | ||
329 | overwritten = true; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | if (!overwritten) { | ||
334 | list_add(mode_bindings, binding); | ||
335 | } | 371 | } |
336 | 372 | ||
337 | sway_log(SWAY_DEBUG, "%s - Bound %s to command `%s` for device '%s'", | 373 | binding->command = join_args(argv + 1, argc - 1); |
338 | bindtype, argv[0], binding->command, binding->input); | 374 | binding->order = binding_order++; |
339 | return cmd_results_new(CMD_SUCCESS, NULL); | 375 | return binding_add(binding, mode_bindings, bindtype, argv[0], warn); |
340 | } | 376 | } |
341 | 377 | ||
342 | struct cmd_results *cmd_bindsym(int argc, char **argv) { | 378 | struct cmd_results *cmd_bindsym(int argc, char **argv) { |
343 | return cmd_bindsym_or_bindcode(argc, argv, false); | 379 | return cmd_bindsym_or_bindcode(argc, argv, false, false); |
344 | } | 380 | } |
345 | 381 | ||
346 | struct cmd_results *cmd_bindcode(int argc, char **argv) { | 382 | struct cmd_results *cmd_bindcode(int argc, char **argv) { |
347 | return cmd_bindsym_or_bindcode(argc, argv, true); | 383 | return cmd_bindsym_or_bindcode(argc, argv, true, false); |
384 | } | ||
385 | |||
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); | ||
348 | } | 392 | } |
349 | 393 | ||
350 | struct cmd_results *cmd_bindswitch(int argc, char **argv) { | 394 | struct cmd_results *cmd_bindswitch(int argc, char **argv) { |
diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 1de06d3e..5d94eced 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd | |||
@@ -644,6 +644,14 @@ 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 | *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 | ||
649 | given flags. If _input-device_ is given, only the binding for that | ||
650 | input device will be unbound. | ||
651 | |||
652 | *unbindcode* [--whole-window] [--border] [--exclude-titlebar] [--release] [input-device=<device>] <code> | ||
653 | is also available for unbinding with key/button codes instead of key/button names. | ||
654 | |||
647 | *unmark* [<identifier>] | 655 | *unmark* [<identifier>] |
648 | *unmark* will remove _identifier_ from the list of current marks on a | 656 | *unmark* will remove _identifier_ from the list of current marks on a |
649 | window. If _identifier_ is omitted, all marks are removed. | 657 | window. If _identifier_ is omitted, all marks are removed. |