From 5227b29b0fa44611977b2c27c14509c8347f5304 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 27 Oct 2011 22:43:53 +0100 Subject: [PATCH] Make named workspace assignments work again Please note that you need a quoted string for the workspace name. Example: workspace "1: www" output HDMI2 Fixes: #456 --- src/cfgparse.y | 63 ++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/cfgparse.y b/src/cfgparse.y index 252df5d0..9bce2f37 100644 --- a/src/cfgparse.y +++ b/src/cfgparse.y @@ -741,6 +741,7 @@ void parse_file(const char *f) { %type bar_mode_mode %type command %type word_or_number +%type qstring_or_number %type optional_workspace_name %type workspace_name %type window_class @@ -935,7 +936,10 @@ criterion: } ; - +qstring_or_number: + QUOTEDSTRING + | NUMBER { sasprintf(&$$, "%d", $1); } + ; word_or_number: WORD @@ -1344,40 +1348,39 @@ workspace_bar: ; workspace: - TOKWORKSPACE NUMBER TOKOUTPUT OUTPUT optional_workspace_name + TOKWORKSPACE qstring_or_number TOKOUTPUT OUTPUT optional_workspace_name { - int ws_num = $2; - if (ws_num < 1) { - DLOG("Invalid workspace assignment, workspace number %d out of range\n", ws_num); - } else { - char *ws_name = NULL; - if ($5 == NULL) { - sasprintf(&ws_name, "%d", ws_num); - } else { - ws_name = $5; - } + char *ws_name = $2; - DLOG("Should assign workspace %s to output %s\n", ws_name, $4); - /* Check for earlier assignments of the same workspace so that we - * don’t have assignments of a single workspace to different - * outputs */ - struct Workspace_Assignment *assignment; - bool duplicate = false; - TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { - if (strcasecmp(assignment->name, ws_name) == 0) { - ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n", - ws_name); - assignment->output = $4; - duplicate = true; - } - } - if (!duplicate) { - assignment = scalloc(sizeof(struct Workspace_Assignment)); - assignment->name = ws_name; + if ($5 != NULL) { + ELOG("The old (v3) syntax workspace output is deprecated.\n"); + ELOG("Please use the new syntax: workspace \"\" output \n"); + ELOG("In your case, the following should work:\n"); + ELOG(" workspace \"%s\" output %s\n", $5, $4); + ws_name = $5; + context->has_warnings = true; + } + + DLOG("Assigning workspace \"%s\" to output \"%s\"\n", ws_name, $4); + /* Check for earlier assignments of the same workspace so that we + * don’t have assignments of a single workspace to different + * outputs */ + struct Workspace_Assignment *assignment; + bool duplicate = false; + TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { + if (strcasecmp(assignment->name, ws_name) == 0) { + ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n", + ws_name); assignment->output = $4; - TAILQ_INSERT_TAIL(&ws_assignments, assignment, ws_assignments); + duplicate = true; } } + if (!duplicate) { + assignment = scalloc(sizeof(struct Workspace_Assignment)); + assignment->name = ws_name; + assignment->output = $4; + TAILQ_INSERT_TAIL(&ws_assignments, assignment, ws_assignments); + } } | TOKWORKSPACE NUMBER workspace_name {