aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-09 17:40:19 +0100
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-09 18:07:47 +0100
commitf8b260d4a1295df68ef1ff7db89f21e6032d64c7 (patch)
tree228810591abade5a021f6b2ea1da8f22826f4ee9 /sway
parentUnescape string after doing var replacement (diff)
downloadsway-f8b260d4a1295df68ef1ff7db89f21e6032d64c7.tar.gz
sway-f8b260d4a1295df68ef1ff7db89f21e6032d64c7.tar.zst
sway-f8b260d4a1295df68ef1ff7db89f21e6032d64c7.zip
Add support for bincode command
If a bindsym and bincode maps to the same combination, the last one will overwrite any previous mappings.
Diffstat (limited to 'sway')
-rw-r--r--sway/commands.c75
-rw-r--r--sway/config.c20
-rw-r--r--sway/handlers.c13
-rw-r--r--sway/input_state.c3
4 files changed, 104 insertions, 7 deletions
diff --git a/sway/commands.c b/sway/commands.c
index f3f7efbf..0025fcb1 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -35,6 +35,7 @@ struct cmd_handler {
35}; 35};
36 36
37static sway_cmd cmd_bar; 37static sway_cmd cmd_bar;
38static sway_cmd cmd_bindcode;
38static sway_cmd cmd_bindsym; 39static sway_cmd cmd_bindsym;
39static sway_cmd cmd_debuglog; 40static sway_cmd cmd_debuglog;
40static sway_cmd cmd_exec; 41static sway_cmd cmd_exec;
@@ -168,6 +169,7 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) {
168 binding->keys = create_list(); 169 binding->keys = create_list();
169 binding->modifiers = 0; 170 binding->modifiers = 0;
170 binding->release = false; 171 binding->release = false;
172 binding->bindcode = false;
171 173
172 // Handle --release 174 // Handle --release
173 if (strcmp("--release", argv[0]) == 0) { 175 if (strcmp("--release", argv[0]) == 0) {
@@ -222,6 +224,78 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) {
222 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 224 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
223} 225}
224 226
227static struct cmd_results *cmd_bindcode(int argc, char **argv) {
228 struct cmd_results *error = NULL;
229 if ((error = checkarg(argc, "bindcode", EXPECTED_MORE_THAN, 1))) {
230 return error;
231 } else if (!config->reading) {
232 return cmd_results_new(CMD_FAILURE, "bindcode", "Can only be used in config file.");
233 }
234
235
236 struct sway_binding *binding = malloc(sizeof(struct sway_binding));
237 binding->keys = create_list();
238 binding->modifiers = 0;
239 binding->release = false;
240 binding->bindcode = true;
241
242 // Handle --release
243 if (strcmp("--release", argv[0]) == 0) {
244 if (argc >= 3) {
245 binding->release = true;
246 argv++;
247 argc--;
248 } else {
249 return cmd_results_new(CMD_FAILURE, "bindcode",
250 "Invalid bindcode command"
251 "(expected more than 2 arguments, got %d)", argc);
252 }
253 }
254
255 binding->command = join_args(argv + 1, argc - 1);
256
257 list_t *split = split_string(argv[0], "+");
258 for (int i = 0; i < split->length; ++i) {
259 // Check for a modifier key
260 uint32_t mod;
261 if ((mod = get_modifier_mask_by_name(split->items[i])) > 0) {
262 binding->modifiers |= mod;
263 continue;
264 }
265 // parse keycode
266 int keycode = (int)strtol(split->items[i], NULL, 10);
267 if (!xkb_keycode_is_legal_x11(keycode)) {
268 error = cmd_results_new(CMD_INVALID, "bindcode", "Invalid keycode '%s'", (char *)split->items[i]);
269 free_sway_binding(binding);
270 list_free(split);
271 return error;
272 }
273 xkb_keycode_t *key = malloc(sizeof(xkb_keycode_t));
274 *key = keycode;
275 list_add(binding->keys, key);
276 }
277 free_flat_list(split);
278
279 struct sway_mode *mode = config->current_mode;
280 int i = list_seq_find(mode->bindings, sway_binding_cmp_keys, binding);
281 if (i > -1) {
282 struct sway_binding *dup = mode->bindings->items[i];
283 if (dup->bindcode) {
284 sway_log(L_DEBUG, "bindcode - '%s' already exists, overwriting", argv[0]);
285 } else {
286 sway_log(L_DEBUG, "bindcode - '%s' already exists as bindsym, overwriting", argv[0]);
287 }
288 free_sway_binding(dup);
289 list_del(mode->bindings, i);
290 }
291 binding->order = binding_order++;
292 list_add(mode->bindings, binding);
293 list_qsort(mode->bindings, sway_binding_cmp_qsort);
294
295 sway_log(L_DEBUG, "bindcode - Bound %s to command %s", argv[0], binding->command);
296 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
297}
298
225static struct cmd_results *cmd_exec_always(int argc, char **argv) { 299static struct cmd_results *cmd_exec_always(int argc, char **argv) {
226 struct cmd_results *error = NULL; 300 struct cmd_results *error = NULL;
227 if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL); 301 if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL);
@@ -1552,6 +1626,7 @@ static struct cmd_results *cmd_ws_auto_back_and_forth(int argc, char **argv) {
1552/* Keep alphabetized */ 1626/* Keep alphabetized */
1553static struct cmd_handler handlers[] = { 1627static struct cmd_handler handlers[] = {
1554 { "bar", cmd_bar }, 1628 { "bar", cmd_bar },
1629 { "bindcode", cmd_bindcode },
1555 { "bindsym", cmd_bindsym }, 1630 { "bindsym", cmd_bindsym },
1556 { "debuglog", cmd_debuglog }, 1631 { "debuglog", cmd_debuglog },
1557 { "default_orientation", cmd_orientation }, 1632 { "default_orientation", cmd_orientation },
diff --git a/sway/config.c b/sway/config.c
index d923eea5..ae6a02b1 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -652,15 +652,27 @@ int sway_binding_cmp_keys(const void *a, const void *b) {
652 } else if (binda->modifiers < bindb->modifiers) { 652 } else if (binda->modifiers < bindb->modifiers) {
653 return -1; 653 return -1;
654 } 654 }
655 struct wlc_modifiers no_mods = { 0, 0 };
655 for (int i = 0; i < binda->keys->length; i++) { 656 for (int i = 0; i < binda->keys->length; i++) {
656 xkb_keysym_t *ka = binda->keys->items[i], 657 xkb_keysym_t ka = *(xkb_keysym_t *)binda->keys->items[i],
657 *kb = bindb->keys->items[i]; 658 kb = *(xkb_keysym_t *)bindb->keys->items[i];
658 if (*ka > *kb) { 659 if (binda->bindcode) {
660 uint32_t *keycode = binda->keys->items[i];
661 ka = wlc_keyboard_get_keysym_for_key(*keycode, &no_mods);
662 }
663
664 if (bindb->bindcode) {
665 uint32_t *keycode = bindb->keys->items[i];
666 kb = wlc_keyboard_get_keysym_for_key(*keycode, &no_mods);
667 }
668
669 if (ka > kb) {
659 return 1; 670 return 1;
660 } else if (*ka < *kb) { 671 } else if (ka < kb) {
661 return -1; 672 return -1;
662 } 673 }
663 } 674 }
675
664 return 0; 676 return 0;
665} 677}
666 678
diff --git a/sway/handlers.c b/sway/handlers.c
index 76778450..60bfac87 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -363,9 +363,16 @@ static bool handle_bindsym(struct sway_binding *binding) {
363 bool match = false; 363 bool match = false;
364 int i; 364 int i;
365 for (i = 0; i < binding->keys->length; ++i) { 365 for (i = 0; i < binding->keys->length; ++i) {
366 xkb_keysym_t *key = binding->keys->items[i]; 366 if (binding->bindcode) {
367 if ((match = check_key(*key, 0)) == false) { 367 xkb_keycode_t *key = binding->keys->items[i];
368 break; 368 if ((match = check_key(0, *key)) == false) {
369 break;
370 }
371 } else {
372 xkb_keysym_t *key = binding->keys->items[i];
373 if ((match = check_key(*key, 0)) == false) {
374 break;
375 }
369 } 376 }
370 } 377 }
371 378
diff --git a/sway/input_state.c b/sway/input_state.c
index 86868083..41ec5712 100644
--- a/sway/input_state.c
+++ b/sway/input_state.c
@@ -73,6 +73,9 @@ static uint8_t find_key(uint32_t key_sym, uint32_t key_code, bool update) {
73 key_state_array[i].alt_sym = key_sym; 73 key_state_array[i].alt_sym = key_sym;
74 break; 74 break;
75 } 75 }
76 if (key_sym == 0 && key_code != 0 && key_state_array[i].key_code == key_code) {
77 break;
78 }
76 } 79 }
77 return i; 80 return i;
78} 81}