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
This commit is contained in:
Michael Stapelberg 2011-10-27 22:43:53 +01:00
parent a4cb4a64d4
commit 5227b29b0f

View File

@ -741,6 +741,7 @@ void parse_file(const char *f) {
%type <number> bar_mode_mode %type <number> bar_mode_mode
%type <string> command %type <string> command
%type <string> word_or_number %type <string> word_or_number
%type <string> qstring_or_number
%type <string> optional_workspace_name %type <string> optional_workspace_name
%type <string> workspace_name %type <string> workspace_name
%type <string> window_class %type <string> window_class
@ -935,7 +936,10 @@ criterion:
} }
; ;
qstring_or_number:
QUOTEDSTRING
| NUMBER { sasprintf(&$$, "%d", $1); }
;
word_or_number: word_or_number:
WORD WORD
@ -1344,40 +1348,39 @@ workspace_bar:
; ;
workspace: workspace:
TOKWORKSPACE NUMBER TOKOUTPUT OUTPUT optional_workspace_name TOKWORKSPACE qstring_or_number TOKOUTPUT OUTPUT optional_workspace_name
{ {
int ws_num = $2; char *ws_name = $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;
}
DLOG("Should assign workspace %s to output %s\n", ws_name, $4); if ($5 != NULL) {
/* Check for earlier assignments of the same workspace so that we ELOG("The old (v3) syntax workspace <number> output <output> <name> is deprecated.\n");
* dont have assignments of a single workspace to different ELOG("Please use the new syntax: workspace \"<workspace>\" output <output>\n");
* outputs */ ELOG("In your case, the following should work:\n");
struct Workspace_Assignment *assignment; ELOG(" workspace \"%s\" output %s\n", $5, $4);
bool duplicate = false; ws_name = $5;
TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { context->has_warnings = true;
if (strcasecmp(assignment->name, ws_name) == 0) { }
ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n",
ws_name); DLOG("Assigning workspace \"%s\" to output \"%s\"\n", ws_name, $4);
assignment->output = $4; /* Check for earlier assignments of the same workspace so that we
duplicate = true; * dont have assignments of a single workspace to different
} * outputs */
} struct Workspace_Assignment *assignment;
if (!duplicate) { bool duplicate = false;
assignment = scalloc(sizeof(struct Workspace_Assignment)); TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
assignment->name = ws_name; if (strcasecmp(assignment->name, ws_name) == 0) {
ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n",
ws_name);
assignment->output = $4; 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 | TOKWORKSPACE NUMBER workspace_name
{ {