diff --git a/include/workspace.h b/include/workspace.h index c69ccdbbd..6911e3d48 100644 --- a/include/workspace.h +++ b/include/workspace.h @@ -7,7 +7,7 @@ extern char *prev_workspace_name; -char *workspace_next_name(void); +char *workspace_next_name(const char *output_name); swayc_t *workspace_create(const char*); swayc_t *workspace_by_name(const char*); swayc_t *workspace_by_number(const char*); diff --git a/sway/container.c b/sway/container.c index 2db7b218b..e4c20bc9e 100644 --- a/sway/container.c +++ b/sway/container.c @@ -143,7 +143,7 @@ swayc_t *new_output(wlc_handle handle) { } } if (!ws_name) { - ws_name = workspace_next_name(); + ws_name = workspace_next_name(output->name); } // create and initilize default workspace diff --git a/sway/layout.c b/sway/layout.c index dca4e47fc..e9998bc8f 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -364,7 +364,7 @@ void move_workspace_to(swayc_t* workspace, swayc_t* destination) { // make sure source output has a workspace if (src_op->children->length == 0) { - char *ws_name = workspace_next_name(); + char *ws_name = workspace_next_name(src_op->name); swayc_t *ws = new_workspace(src_op, ws_name); ws->is_focused = true; free(ws_name); diff --git a/sway/workspace.c b/sway/workspace.c index ad989de9d..90edc6e98 100644 --- a/sway/workspace.c +++ b/sway/workspace.c @@ -25,8 +25,22 @@ struct workspace_by_number_data { const char *name; }; -char *workspace_next_name(void) { - sway_log(L_DEBUG, "Workspace: Generating new name"); +static bool workspace_valid_on_output(const char *output_name, const char *ws_name) { + int i; + for (i = 0; i < config->workspace_outputs->length; ++i) { + struct workspace_output *wso = config->workspace_outputs->items[i]; + if (strcasecmp(wso->workspace, ws_name) == 0) { + if (strcasecmp(wso->output, output_name) != 0) { + return false; + } + } + } + + return true; +} + +char *workspace_next_name(const char *output_name) { + sway_log(L_DEBUG, "Workspace: Generating new workspace name for output %s", output_name); int i; int l = 1; // Scan all workspace bindings to find the next available workspace name, @@ -73,6 +87,14 @@ char *workspace_next_name(void) { free(_target); continue; } + + // make sure that the workspace can appear on the given + // output + if (!workspace_valid_on_output(output_name, _target)) { + free(_target); + continue; + } + if (binding->order < order) { order = binding->order; target = _target;