X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcfgparse.y;h=ec3dde0ba3b2c897cf8f2106ac37975144a5f284;hb=f2b73b64beee5831a5def220a951fe8e90fca195;hp=178434d178da1c77243b7adec3aba21bd460f007;hpb=9d15a00ba83ccf0e5750f2d3b552c24188099edf;p=i3%2Fi3 diff --git a/src/cfgparse.y b/src/cfgparse.y index 178434d1..ec3dde0b 100644 --- a/src/cfgparse.y +++ b/src/cfgparse.y @@ -15,6 +15,10 @@ static pid_t configerror_pid = -1; static Match current_match; static Barconfig current_bar; +/* The pattern which was specified by the user, for example -misc-fixed-*. We + * store this in a separate variable because in the i3 config struct we just + * store the i3Font. */ +static char *font_pattern; typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yylex(struct context *context); @@ -99,7 +103,9 @@ static int detect_version(char *buf) { strncasecmp(bind, "focus down", strlen("focus down")) == 0 || strncasecmp(bind, "border normal", strlen("border normal")) == 0 || strncasecmp(bind, "border 1pixel", strlen("border 1pixel")) == 0 || - strncasecmp(bind, "border borderless", strlen("border borderless")) == 0) { + strncasecmp(bind, "border borderless", strlen("border borderless")) == 0 || + strncasecmp(bind, "--no-startup-id", strlen("--no-startup-id")) == 0 || + strncasecmp(bind, "bar", strlen("bar")) == 0) { printf("deciding for version 4 due to this line: %.*s\n", (int)(walk-line), line); return 4; } @@ -611,6 +617,7 @@ void parse_file(const char *f) { yylex_destroy(); FREE(context->line_copy); free(context); + FREE(font_pattern); free(new); free(buf); @@ -693,14 +700,15 @@ void parse_file(const char *f) { %token TOK_BAR_OUTPUT "output (bar)" %token TOK_BAR_TRAY_OUTPUT "tray_output" %token TOK_BAR_SOCKET_PATH "socket_path" -%token TOK_BAR_MODE "mode" +%token TOK_BAR_MODE "mode (bar)" %token TOK_BAR_HIDE "hide" %token TOK_BAR_DOCK "dock" %token TOK_BAR_POSITION "position" %token TOK_BAR_BOTTOM "bottom" %token TOK_BAR_TOP "top" %token TOK_BAR_STATUS_COMMAND "status_command" -%token TOK_BAR_FONT "font" +%token TOK_BAR_I3BAR_COMMAND "i3bar_command" +%token TOK_BAR_FONT "font (bar)" %token TOK_BAR_WORKSPACE_BUTTONS "workspace_buttons" %token TOK_BAR_VERBOSE "verbose" %token TOK_BAR_COLORS "colors" @@ -710,6 +718,7 @@ void parse_file(const char *f) { %token TOK_BAR_COLOR_ACTIVE_WORKSPACE "active_workspace" %token TOK_BAR_COLOR_INACTIVE_WORKSPACE "inactive_workspace" %token TOK_BAR_COLOR_URGENT_WORKSPACE "urgent_workspace" +%token TOK_NO_STARTUP_ID "--no-startup-id" %token TOK_MARK "mark" %token TOK_CLASS "class" @@ -734,8 +743,10 @@ void parse_file(const char *f) { %type popup_setting %type bar_position_position %type bar_mode_mode +%type optional_no_startup_id %type command %type word_or_number +%type qstring_or_number %type optional_workspace_name %type workspace_name %type window_class @@ -930,7 +941,10 @@ criterion: } ; - +qstring_or_number: + QUOTEDSTRING + | NUMBER { sasprintf(&$$, "%d", $1); } + ; word_or_number: WORD @@ -996,6 +1010,10 @@ bar: *(x++) = (rand() % 26) + 'a'; } + /* If no font was explicitly set, we use the i3 font as default */ + if (!current_bar.font && font_pattern) + current_bar.font = sstrdup(font_pattern); + /* Copy the current (static) structure into a dynamically allocated * one, then cleanup our static one. */ Barconfig *bar_config = scalloc(sizeof(Barconfig)); @@ -1014,6 +1032,7 @@ barlines: barline: comment | bar_status_command + | bar_i3bar_command | bar_output | bar_tray_output | bar_position @@ -1040,6 +1059,15 @@ bar_status_command: } ; +bar_i3bar_command: + TOK_BAR_I3BAR_COMMAND STR + { + DLOG("should add i3bar_command %s\n", $2); + FREE(current_bar.i3bar_command); + current_bar.i3bar_command = $2; + } + ; + bar_output: TOK_BAR_OUTPUT STR { @@ -1335,40 +1363,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; + + 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("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; + 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 { @@ -1496,23 +1523,30 @@ restart_state: ; exec: - TOKEXEC STR + TOKEXEC optional_no_startup_id STR { struct Autostart *new = smalloc(sizeof(struct Autostart)); - new->command = $2; + new->command = $3; + new->no_startup_id = $2; TAILQ_INSERT_TAIL(&autostarts, new, autostarts); } ; exec_always: - TOKEXEC_ALWAYS STR + TOKEXEC_ALWAYS optional_no_startup_id STR { struct Autostart *new = smalloc(sizeof(struct Autostart)); - new->command = $2; + new->command = $3; + new->no_startup_id = $2; TAILQ_INSERT_TAIL(&autostarts_always, new, autostarts_always); } ; +optional_no_startup_id: + /* empty */ { $$ = false; } + | TOK_NO_STARTUP_ID { $$ = true; } + ; + terminal: TOKTERMINAL STR { @@ -1525,8 +1559,10 @@ font: TOKFONT STR { config.font = load_font($2, true); + set_font(&config.font); printf("font %s\n", $2); - free($2); + FREE(font_pattern); + font_pattern = $2; } ;