X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fconfig_directives.c;h=fb3fba415ae55200fc89f53da5dd5cf71610aeef;hb=8ce99cdacb7e243c7a75e7bbd54de7a7e8300a7e;hp=7ca6954c555032303061e8e4177d4d227aac6c99;hpb=3aa42cf795c387aba2cc560f7c543353c8a06a08;p=i3%2Fi3 diff --git a/src/config_directives.c b/src/config_directives.c index 7ca6954c..fb3fba41 100644 --- a/src/config_directives.c +++ b/src/config_directives.c @@ -334,30 +334,41 @@ CFGFUN(show_marks, const char *value) { config.show_marks = eval_boolstr(value); } -CFGFUN(workspace, const char *workspace, const char *outputs) { - DLOG("Assigning workspace \"%s\" to outputs \"%s\"\n", workspace, outputs); - /* Check for earlier assignments of the same workspace so that we - * don’t have assignments of a single workspace to different - * outputs */ +static char *current_workspace = NULL; + +CFGFUN(workspace, const char *workspace, const char *output) { struct Workspace_Assignment *assignment; - TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { - if (strcasecmp(assignment->name, workspace) == 0) { - ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n", - workspace); + + /* When a new workspace line is encountered, for the first output word, + * $workspace from the config.spec is non-NULL. Afterwards, the parser calls + * clear_stack() because of the call line. Thus, we have to preserve the + * workspace string. */ + if (workspace) { + FREE(current_workspace); + + TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { + if (strcasecmp(assignment->name, workspace) == 0) { + ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n", + workspace); + return; + } + } + + current_workspace = sstrdup(workspace); + } else { + if (!current_workspace) { + DLOG("Both workspace and current_workspace are NULL, assuming we had an error before\n"); return; } + workspace = current_workspace; } - char *buf = sstrdup(outputs); - char *output = strtok(buf, " "); - while (output != NULL) { - assignment = scalloc(1, sizeof(struct Workspace_Assignment)); - assignment->name = sstrdup(workspace); - assignment->output = sstrdup(output); - TAILQ_INSERT_TAIL(&ws_assignments, assignment, ws_assignments); - output = strtok(NULL, " "); - } - free(buf); + DLOG("Assigning workspace \"%s\" to output \"%s\"\n", workspace, output); + + assignment = scalloc(1, sizeof(struct Workspace_Assignment)); + assignment->name = sstrdup(workspace); + assignment->output = sstrdup(output); + TAILQ_INSERT_TAIL(&ws_assignments, assignment, ws_assignments); } CFGFUN(ipc_socket, const char *path) {