diff options
author | crondog <crondog@gmail.com> | 2016-01-15 16:03:34 +1100 |
---|---|---|
committer | crondog <crondog@gmail.com> | 2016-01-15 16:03:34 +1100 |
commit | 81caf89ff848349679bf8f8f059f4cf744d4ab9c (patch) | |
tree | d1f72a37489bfd17beeb7fc6e5ee820c93f541a8 /sway | |
parent | Strip quotes from workspace name v2 (diff) | |
download | sway-81caf89ff848349679bf8f8f059f4cf744d4ab9c.tar.gz sway-81caf89ff848349679bf8f8f059f4cf744d4ab9c.tar.zst sway-81caf89ff848349679bf8f8f059f4cf744d4ab9c.zip |
cmd_assign
This implements cmd_assign. Basically a copy and paste from
cmd_for_window however it has → handling and injects a `move container to
workspace`
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sway/commands.c b/sway/commands.c index 06172ac4..1c7eb962 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -34,6 +34,7 @@ struct cmd_handler { | |||
34 | sway_cmd *handle; | 34 | sway_cmd *handle; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | static sway_cmd cmd_assign; | ||
37 | static sway_cmd cmd_bar; | 38 | static sway_cmd cmd_bar; |
38 | static sway_cmd cmd_bindcode; | 39 | static sway_cmd cmd_bindcode; |
39 | static sway_cmd cmd_bindsym; | 40 | static sway_cmd cmd_bindsym; |
@@ -154,6 +155,47 @@ static struct cmd_results *checkarg(int argc, const char *name, enum expected_ar | |||
154 | return error; | 155 | return error; |
155 | } | 156 | } |
156 | 157 | ||
158 | static struct cmd_results *cmd_assign(int argc, char **argv) { | ||
159 | struct cmd_results *error = NULL; | ||
160 | if ((error = checkarg(argc, "assign", EXPECTED_AT_LEAST, 2))) { | ||
161 | return error; | ||
162 | } | ||
163 | |||
164 | char *criteria = *argv++; | ||
165 | |||
166 | if (strncmp(*argv, "→", 1) == 0) { | ||
167 | argv++; | ||
168 | } | ||
169 | |||
170 | char *movecmd = "move container to workspace "; | ||
171 | int arglen = strlen(*argv); | ||
172 | char *cmdlist = calloc(1, sizeof(movecmd) + arglen); | ||
173 | |||
174 | sprintf(cmdlist, "%s%s", movecmd, *argv); | ||
175 | |||
176 | struct criteria *crit = malloc(sizeof(struct criteria)); | ||
177 | crit->crit_raw = strdup(criteria); | ||
178 | crit->cmdlist = cmdlist; | ||
179 | crit->tokens = create_list(); | ||
180 | char *err_str = extract_crit_tokens(crit->tokens, crit->crit_raw); | ||
181 | |||
182 | if (err_str) { | ||
183 | error = cmd_results_new(CMD_INVALID, "assign", err_str); | ||
184 | free(err_str); | ||
185 | free_criteria(crit); | ||
186 | } else if (crit->tokens->length == 0) { | ||
187 | error = cmd_results_new(CMD_INVALID, "assign", "Found no name/value pairs in criteria"); | ||
188 | free_criteria(crit); | ||
189 | } else if (list_seq_find(config->criteria, criteria_cmp, crit) != -1) { | ||
190 | sway_log(L_DEBUG, "assign: Duplicate, skipping."); | ||
191 | free_criteria(crit); | ||
192 | } else { | ||
193 | sway_log(L_DEBUG, "assign: '%s' -> '%s' added", crit->crit_raw, crit->cmdlist); | ||
194 | list_add(config->criteria, crit); | ||
195 | } | ||
196 | return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
197 | } | ||
198 | |||
157 | int binding_order = 0; | 199 | int binding_order = 0; |
158 | 200 | ||
159 | static struct cmd_results *cmd_bindsym(int argc, char **argv) { | 201 | static struct cmd_results *cmd_bindsym(int argc, char **argv) { |
@@ -1625,6 +1667,7 @@ static struct cmd_results *cmd_ws_auto_back_and_forth(int argc, char **argv) { | |||
1625 | 1667 | ||
1626 | /* Keep alphabetized */ | 1668 | /* Keep alphabetized */ |
1627 | static struct cmd_handler handlers[] = { | 1669 | static struct cmd_handler handlers[] = { |
1670 | { "assign", cmd_assign }, | ||
1628 | { "bar", cmd_bar }, | 1671 | { "bar", cmd_bar }, |
1629 | { "bindcode", cmd_bindcode }, | 1672 | { "bindcode", cmd_bindcode }, |
1630 | { "bindsym", cmd_bindsym }, | 1673 | { "bindsym", cmd_bindsym }, |