Use assigned workspace name for output

Instead of relying on bindings being configured, primarily source
new workspace names from workspace-output assignments.

Fixes #2435
This commit is contained in:
minus 2018-08-12 14:41:41 +02:00
parent 146cc0a441
commit 18e425eda6
1 changed files with 13 additions and 2 deletions

View File

@ -120,6 +120,8 @@ static void workspace_name_from_binding(const struct sway_binding * binding,
name = argsep(&cmdlist, ",;");
}
// TODO: support "move container to workspace" bindings as well
if (strcmp("workspace", cmd) == 0 && name) {
char *_target = strdup(name);
_target = do_var_replacement(_target);
@ -189,8 +191,8 @@ static void workspace_name_from_binding(const struct sway_binding * binding,
char *workspace_next_name(const char *output_name) {
wlr_log(WLR_DEBUG, "Workspace: Generating new workspace name for output %s",
output_name);
// Scan all workspace bindings to find the next available workspace name,
// if none are found/available then default to a number
// Scan for available workspace names by looking through output-workspace
// assignments primarily, falling back to bindings and numbers.
struct sway_mode *mode = config->current_mode;
int order = INT_MAX;
@ -203,6 +205,15 @@ char *workspace_next_name(const char *output_name) {
workspace_name_from_binding(mode->keycode_bindings->items[i],
output_name, &order, &target);
}
for (int i = 0; i < config->workspace_outputs->length; ++i) {
// Unlike with bindings, this does not guarantee order
const struct workspace_output *wso = config->workspace_outputs->items[i];
if (strcmp(wso->output, output_name) == 0
&& workspace_by_name(wso->workspace) == NULL) {
free(target);
target = strdup(wso->workspace);
}
}
if (target != NULL) {
return target;
}