aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/bind.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/bind.c')
-rw-r--r--sway/commands/bind.c170
1 files changed, 0 insertions, 170 deletions
diff --git a/sway/commands/bind.c b/sway/commands/bind.c
deleted file mode 100644
index d9ea37b7..00000000
--- a/sway/commands/bind.c
+++ /dev/null
@@ -1,170 +0,0 @@
1#include <xkbcommon/xkbcommon.h>
2#include <xkbcommon/xkbcommon-names.h>
3#include <strings.h>
4#include "sway/commands.h"
5#include "sway/config.h"
6#include "sway/input_state.h"
7#include "list.h"
8#include "log.h"
9#include "stringop.h"
10#include "util.h"
11
12int binding_order = 0;
13
14struct cmd_results *cmd_bindsym(int argc, char **argv) {
15 struct cmd_results *error = NULL;
16 if ((error = checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1))) {
17 return error;
18 }
19
20 struct sway_binding *binding = malloc(sizeof(struct sway_binding));
21 if (!binding) {
22 return cmd_results_new(CMD_FAILURE, "bindsym",
23 "Unable to allocate binding");
24 }
25 binding->keys = create_list();
26 binding->modifiers = 0;
27 binding->release = false;
28 binding->bindcode = false;
29
30 // Handle --release
31 if (strcmp("--release", argv[0]) == 0) {
32 if (argc >= 3) {
33 binding->release = true;
34 argv++;
35 argc--;
36 } else {
37 free_sway_binding(binding);
38 return cmd_results_new(CMD_FAILURE, "bindsym",
39 "Invalid bindsym command "
40 "(expected more than 2 arguments, got %d)", argc);
41 }
42 }
43
44 binding->command = join_args(argv + 1, argc - 1);
45
46 list_t *split = split_string(argv[0], "+");
47 for (int i = 0; i < split->length; ++i) {
48 // Check for a modifier key
49 uint32_t mod;
50 if ((mod = get_modifier_mask_by_name(split->items[i])) > 0) {
51 binding->modifiers |= mod;
52 continue;
53 }
54 // Check for xkb key
55 xkb_keysym_t sym = xkb_keysym_from_name(split->items[i],
56 XKB_KEYSYM_CASE_INSENSITIVE);
57
58 // Check for mouse binding
59 if (strncasecmp(split->items[i], "button", strlen("button")) == 0 &&
60 strlen(split->items[i]) == strlen("button0")) {
61 sym = ((char *)split->items[i])[strlen("button")] - '1' + M_LEFT_CLICK;
62 }
63 if (!sym) {
64 struct cmd_results *ret = cmd_results_new(CMD_INVALID, "bindsym",
65 "Unknown key '%s'", (char *)split->items[i]);
66 free_sway_binding(binding);
67 free_flat_list(split);
68 return ret;
69 }
70 xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t));
71 if (!key) {
72 free_sway_binding(binding);
73 free_flat_list(split);
74 return cmd_results_new(CMD_FAILURE, "bindsym",
75 "Unable to allocate binding");
76 }
77 *key = sym;
78 list_add(binding->keys, key);
79 }
80 free_flat_list(split);
81
82 struct sway_mode *mode = config->current_mode;
83 int i = list_seq_find(mode->bindings, sway_binding_cmp_keys, binding);
84 if (i > -1) {
85 sway_log(L_DEBUG, "bindsym - '%s' already exists, overwriting", argv[0]);
86 struct sway_binding *dup = mode->bindings->items[i];
87 free_sway_binding(dup);
88 list_del(mode->bindings, i);
89 }
90 binding->order = binding_order++;
91 list_add(mode->bindings, binding);
92 list_qsort(mode->bindings, sway_binding_cmp_qsort);
93
94 sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command);
95 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
96}
97
98struct cmd_results *cmd_bindcode(int argc, char **argv) {
99 struct cmd_results *error = NULL;
100 if ((error = checkarg(argc, "bindcode", EXPECTED_MORE_THAN, 1))) {
101 return error;
102 }
103
104 struct sway_binding *binding = malloc(sizeof(struct sway_binding));
105 if (!binding) {
106 return cmd_results_new(CMD_FAILURE, "bindsym",
107 "Unable to allocate binding");
108 }
109 binding->keys = create_list();
110 binding->modifiers = 0;
111 binding->release = false;
112 binding->bindcode = true;
113
114 // Handle --release
115 if (strcmp("--release", argv[0]) == 0) {
116 if (argc >= 3) {
117 binding->release = true;
118 argv++;
119 argc--;
120 } else {
121 free_sway_binding(binding);
122 return cmd_results_new(CMD_FAILURE, "bindcode",
123 "Invalid bindcode command "
124 "(expected more than 2 arguments, got %d)", argc);
125 }
126 }
127
128 binding->command = join_args(argv + 1, argc - 1);
129
130 list_t *split = split_string(argv[0], "+");
131 for (int i = 0; i < split->length; ++i) {
132 // Check for a modifier key
133 uint32_t mod;
134 if ((mod = get_modifier_mask_by_name(split->items[i])) > 0) {
135 binding->modifiers |= mod;
136 continue;
137 }
138 // parse keycode
139 xkb_keycode_t keycode = (int)strtol(split->items[i], NULL, 10);
140 if (!xkb_keycode_is_legal_ext(keycode)) {
141 error = cmd_results_new(CMD_INVALID, "bindcode", "Invalid keycode '%s'", (char *)split->items[i]);
142 free_sway_binding(binding);
143 list_free(split);
144 return error;
145 }
146 xkb_keycode_t *key = malloc(sizeof(xkb_keycode_t));
147 *key = keycode - 8;
148 list_add(binding->keys, key);
149 }
150 free_flat_list(split);
151
152 struct sway_mode *mode = config->current_mode;
153 int i = list_seq_find(mode->bindings, sway_binding_cmp_keys, binding);
154 if (i > -1) {
155 struct sway_binding *dup = mode->bindings->items[i];
156 if (dup->bindcode) {
157 sway_log(L_DEBUG, "bindcode - '%s' already exists, overwriting", argv[0]);
158 } else {
159 sway_log(L_DEBUG, "bindcode - '%s' already exists as bindsym, overwriting", argv[0]);
160 }
161 free_sway_binding(dup);
162 list_del(mode->bindings, i);
163 }
164 binding->order = binding_order++;
165 list_add(mode->bindings, binding);
166 list_qsort(mode->bindings, sway_binding_cmp_qsort);
167
168 sway_log(L_DEBUG, "bindcode - Bound %s to command %s", argv[0], binding->command);
169 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
170}