Fix #1099: Allow spaces in worspace names

This commit allows unquoted spaces in worspace names in order to keep
compatability with i3. The names _must not_ contain the string "output"
which is documented in 'sway.5' because how sway detects the `move
<workspace> output <output>` command. Also I documented that "number"
may be used before the worspace name without affecting how the name is
evaluated.
master
Calvin Lee 8 years ago
parent d6ac3021ce
commit d47d3d78de

@ -12,12 +12,44 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
if ((error = checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1))) { if ((error = checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1))) {
return error; return error;
} }
if (argc == 1 || (argc >= 2 && strcasecmp(argv[0], "number") == 0) ) {
int output_location = -1;
for (int i = 0; i < argc; ++i) {
if (strcasecmp(argv[i], "output") == 0) {
output_location = i;
break;
}
}
if (output_location >= 0) {
if ((error = checkarg(argc, "workspace", EXPECTED_EQUAL_TO, output_location + 2))) {
return error;
}
struct workspace_output *wso = calloc(1, sizeof(struct workspace_output));
if (!wso) {
return cmd_results_new(CMD_FAILURE, "workspace output",
"Unable to allocate workspace output");
}
wso->workspace = join_args(argv, argc - 2);
wso->output = strdup(argv[output_location]);
int i = -1;
if ((i = list_seq_find(config->workspace_outputs, workspace_output_cmp_workspace, wso)) != -1) {
struct workspace_output *old = config->workspace_outputs->items[i];
free(old); // workspaces can only be assigned to a single output
list_del(config->workspace_outputs, i);
}
sway_log(L_DEBUG, "Assigning workspace %s to output %s", wso->workspace, wso->output);
list_add(config->workspace_outputs, wso);
if (!config->reading) {
// TODO: Move workspace to output. (don't do so when reloading)
}
}
else {
if (config->reading || !config->active) { if (config->reading || !config->active) {
return cmd_results_new(CMD_DEFER, "workspace", NULL); return cmd_results_new(CMD_DEFER, "workspace", NULL);
} }
swayc_t *ws = NULL; swayc_t *ws = NULL;
if (argc >= 2) { if (strcasecmp(argv[0], "number") == 0) {
if (!(ws = workspace_by_number(argv[1]))) { if (!(ws = workspace_by_number(argv[1]))) {
char *name = join_args(argv + 1, argc - 1); char *name = join_args(argv + 1, argc - 1);
ws = workspace_create(name); ws = workspace_create(name);
@ -41,9 +73,11 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
ws = workspace_create(prev_workspace_name); ws = workspace_create(prev_workspace_name);
} }
} else { } else {
if (!(ws = workspace_by_name(argv[0]))) { char *name = join_args(argv, argc);
ws = workspace_create(argv[0]); if (!(ws = workspace_by_name(name))) {
ws = workspace_create(name);
} }
free(name);
} }
swayc_t *old_output = swayc_active_output(); swayc_t *old_output = swayc_active_output();
workspace_switch(ws); workspace_switch(ws);
@ -55,30 +89,6 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
center_pointer_on(focused); center_pointer_on(focused);
} }
} }
} else {
if (strcasecmp(argv[1], "output") == 0) {
if ((error = checkarg(argc, "workspace", EXPECTED_EQUAL_TO, 3))) {
return error;
}
struct workspace_output *wso = calloc(1, sizeof(struct workspace_output));
if (!wso) {
return cmd_results_new(CMD_FAILURE, "workspace output",
"Unable to allocate workspace output");
}
wso->workspace = strdup(argv[0]);
wso->output = strdup(argv[2]);
int i = -1;
if ((i = list_seq_find(config->workspace_outputs, workspace_output_cmp_workspace, wso)) != -1) {
struct workspace_output *old = config->workspace_outputs->items[i];
free(old); // workspaces can only be assigned to a single output
list_del(config->workspace_outputs, i);
}
sway_log(L_DEBUG, "Assigning workspace %s to output %s", argv[0], argv[2]);
list_add(config->workspace_outputs, wso);
if (!config->reading) {
// TODO: Move workspace to output. (don't do so when reloading)
}
}
} }
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }

@ -364,8 +364,11 @@ The default colors are:
be configured with perfectly aligned adjacent positions for this option to be configured with perfectly aligned adjacent positions for this option to
have any effect. have any effect.
**workspace** <name>:: **workspace** [number] <name>::
Switches to the specified workspace. Switches to the specified workspace. The string "number" is optional. The
worspace _name_, if unquoted, may not contain the string "output", as sway
will assume that the command is moving a worspace to an output, as described
below.
**workspace** <prev|next>:: **workspace** <prev|next>::
Switches to the next workspace on the current output or on the next output Switches to the next workspace on the current output or on the next output

Loading…
Cancel
Save