diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 8 | ||||
-rw-r--r-- | sway/config.c | 8 | ||||
-rw-r--r-- | sway/stringop.c | 13 |
3 files changed, 28 insertions, 1 deletions
diff --git a/sway/commands.c b/sway/commands.c index 173f0f53..7f24f5ab 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -1318,9 +1318,15 @@ static struct cmd_results *cmd_workspace(int argc, char **argv) { return error; } struct workspace_output *wso = calloc(1, sizeof(struct workspace_output)); - sway_log(L_DEBUG, "Assigning workspace %s to output %s", argv[0], argv[2]); 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. (dont do so when reloading) diff --git a/sway/config.c b/sway/config.c index 725dedd2..2fceb6e2 100644 --- a/sway/config.c +++ b/sway/config.c @@ -375,3 +375,11 @@ char *do_var_replacement(char *str) { } return str; } + +// the naming is intentional (albeit long): a workspace_output_cmp function +// would compare two structs in full, while this method only compares the +// workspace. +int workspace_output_cmp_workspace(const void *a, const void *b) { + const struct workspace_output *wsa = a, *wsb = b; + return lenient_strcmp(wsa->workspace, wsb->workspace); +} diff --git a/sway/stringop.c b/sway/stringop.c index 8d6cac2f..fe5a97ca 100644 --- a/sway/stringop.c +++ b/sway/stringop.c @@ -74,6 +74,19 @@ void strip_quotes(char *str) { *end = '\0'; } +// strcmp that also handles null pointers. +int lenient_strcmp(char *a, char *b) { + if (a == b) { + return 0; + } else if (!a) { + return -1; + } else if (!b) { + return 1; + } else { + return strcmp(a, b); + } +} + list_t *split_string(const char *str, const char *delims) { list_t *res = create_list(); char *copy = strdup(str); |