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

View File

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