X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcfgparse.y;h=dbe227ddffd1b2bcce745d1c04cd8a2efc878e74;hb=fb90a556c88027b2ba639037bacb55770414a4e2;hp=252df5d08a24191bd0cd3674c8e512dcdc719157;hpb=af1871e41433b63682bf90f6d03a6f99cdc12b56;p=i3%2Fi3 diff --git a/src/cfgparse.y b/src/cfgparse.y index 252df5d0..dbe227dd 100644 --- a/src/cfgparse.y +++ b/src/cfgparse.y @@ -103,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; } @@ -550,15 +552,15 @@ void parse_file(const char *f) { /* We need to convert this v3 configuration */ char *converted = migrate_config(new, stbuf.st_size); if (converted != NULL) { - printf("\n"); - printf("****************************************************************\n"); - printf("NOTE: Automatically converted configuration file from v3 to v4.\n"); - printf("\n"); - printf("Please convert your config file to v4. You can use this command:\n"); - printf(" mv %s %s.O\n", f, f); - printf(" i3-migrate-config-to-v4 %s.O > %s\n", f, f); - printf("****************************************************************\n"); - printf("\n"); + ELOG("\n"); + ELOG("****************************************************************\n"); + ELOG("NOTE: Automatically converted configuration file from v3 to v4.\n"); + ELOG("\n"); + ELOG("Please convert your config file to v4. You can use this command:\n"); + ELOG(" mv %s %s.O\n", f, f); + ELOG(" i3-migrate-config-to-v4 %s.O > %s\n", f, f); + ELOG("****************************************************************\n"); + ELOG("\n"); free(new); new = converted; } else { @@ -609,6 +611,9 @@ void parse_file(const char *f) { } if (context->has_errors || context->has_warnings) { + ELOG("FYI: You are using i3 version " I3_VERSION "\n"); + if (version == 3) + ELOG("Please convert your configfile first, then fix any remaining errors (see above).\n"); start_configerror_nagbar(f); } @@ -705,6 +710,7 @@ void parse_file(const char *f) { %token TOK_BAR_BOTTOM "bottom" %token TOK_BAR_TOP "top" %token TOK_BAR_STATUS_COMMAND "status_command" +%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" @@ -715,6 +721,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" @@ -739,8 +746,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 @@ -935,7 +944,10 @@ criterion: } ; - +qstring_or_number: + QUOTEDSTRING + | NUMBER { sasprintf(&$$, "%d", $1); } + ; word_or_number: WORD @@ -1023,6 +1035,7 @@ barlines: barline: comment | bar_status_command + | bar_i3bar_command | bar_output | bar_tray_output | bar_position @@ -1049,6 +1062,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 { @@ -1344,40 +1366,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 { @@ -1505,45 +1526,30 @@ restart_state: ; exec: - TOKEXEC STR + TOKEXEC optional_no_startup_id STR { - char *command = $2; - bool no_startup_id = false; - if (strncasecmp($2, "--no-startup-id ", strlen("--no-startup-id ")) == 0) { - no_startup_id = true; - /* We need to make a copy here, otherwise we leak the - * --no-startup-id bytes in the beginning of the string */ - command = sstrdup(command + strlen("--no-startup-id ")); - free($2); - } - struct Autostart *new = smalloc(sizeof(struct Autostart)); - new->command = command; - new->no_startup_id = no_startup_id; + 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 { - char *command = $2; - bool no_startup_id = false; - if (strncasecmp($2, "--no-startup-id ", strlen("--no-startup-id ")) == 0) { - no_startup_id = true; - /* We need to make a copy here, otherwise we leak the - * --no-startup-id bytes in the beginning of the string */ - command = sstrdup(command + strlen("--no-startup-id ")); - free($2); - } - struct Autostart *new = smalloc(sizeof(struct Autostart)); - new->command = command; - new->no_startup_id = no_startup_id; + 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 { @@ -1556,6 +1562,7 @@ font: TOKFONT STR { config.font = load_font($2, true); + set_font(&config.font); printf("font %s\n", $2); FREE(font_pattern); font_pattern = $2;