From 8ddafeeaae44db77bfdb55d1776513d88a58f68e Mon Sep 17 00:00:00 2001 From: Mikkel Oscar Lyderik Date: Fri, 4 Mar 2016 16:44:49 +0100 Subject: [PATCH] Fix assigning workspaces to outputs It's possible to assign workspaces to certain outputs using the command: workspace output However, this did not work in some cases where the workspace was assigned before the given output was made available to sway. This patch fixes those cases. --- include/workspace.h | 2 +- sway/container.c | 2 +- sway/layout.c | 2 +- sway/workspace.c | 26 ++++++++++++++++++++++++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/include/workspace.h b/include/workspace.h index c69ccdbb..6911e3d4 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 2db7b218..e4c20bc9 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 dca4e47f..e9998bc8 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 ad989de9..90edc6e9 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;