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) {
workspace 3 output VGA-1
workspace "4: output" output VGA-2
workspace bleh output LVDS1/I_1
+# See #3646
+workspace foo output a b c "a b c"
EOT
$expected = <<'EOT';
cfg_workspace(3, VGA-1)
cfg_workspace(4: output, VGA-2)
cfg_workspace(bleh, LVDS1/I_1)
+cfg_workspace(foo, a)
+cfg_workspace((null), b)
+cfg_workspace((null), c)
+cfg_workspace((null), a b c)
EOT
is(parser_calls($config),
workspace 2 output fake-3 fake-4 fake-0 fake-1
workspace 3 output these outputs do not exist but these do: fake-0 fake-3
workspace 4 output whitespace fake-0
-workspace special output doesnotexist1 doesnotexist2 doesnotexist3
+workspace foo output doesnotexist1 doesnotexist2 doesnotexist3
+workspace bar output doesnotexist
+workspace bar output fake-0
EOT
$pid = launch_with_config($config);
do_test('5', 'fake-1', 'Numbered initialization for fake-1');
do_test('6', 'fake-2', 'Numbered initialization for fake-2');
-cmd 'focus output fake-0, workspace special';
-check_output('special', 'fake-0', 'Workspace with only non-existing assigned outputs opened in current output.');
+cmd 'focus output fake-0, workspace foo';
+check_output('foo', 'fake-0', 'Workspace with only non-existing assigned outputs opened in current output');
+
+cmd 'focus output fake-0, workspace bar';
+check_output('bar', 'fake-0', 'Second workspace assignment line ignored');
# Moving assigned workspaces.
cmd 'workspace 2, move workspace to output left';