bool read_config(FILE *file, struct sway_config *config) { bool success = true; enum cmd_status block = CMD_BLOCK_END; int line_number = 0; char *line; while (!feof(file)) { line = read_line(file); if (!line) { continue; } line_number++; line = strip_whitespace(line); if (line[0] == '#') { free(line); continue; } struct cmd_results *res; if (block == CMD_BLOCK_COMMANDS) { // Special case res = config_commands_command(line); } else { res = config_command(line, block); } switch(res->status) { case CMD_FAILURE: case CMD_INVALID: sway_log(L_ERROR, "Error on line %i '%s': %s (%s)", line_number, line, res->error, config->current_config); success = false; break; case CMD_DEFER: sway_log(L_DEBUG, "Defferring command `%s'", line); list_add(config->cmd_queue, strdup(line)); break; case CMD_BLOCK_MODE: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_MODE; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_INPUT: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_INPUT; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_BAR: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_BAR; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_BAR_COLORS: if (block == CMD_BLOCK_BAR) { block = CMD_BLOCK_BAR_COLORS; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_COMMANDS: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_COMMANDS; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_IPC: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_IPC; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_IPC_EVENTS: if (block == CMD_BLOCK_IPC) { block = CMD_BLOCK_IPC_EVENTS; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_END: switch(block) { case CMD_BLOCK_MODE: sway_log(L_DEBUG, "End of mode block"); config->current_mode = config->modes->items[0]; block = CMD_BLOCK_END; break; case CMD_BLOCK_INPUT: sway_log(L_DEBUG, "End of input block"); current_input_config = NULL; block = CMD_BLOCK_END; break; case CMD_BLOCK_BAR: sway_log(L_DEBUG, "End of bar block"); config->current_bar = NULL; block = CMD_BLOCK_END; break; case CMD_BLOCK_BAR_COLORS: sway_log(L_DEBUG, "End of bar colors block"); block = CMD_BLOCK_BAR; break; case CMD_BLOCK_COMMANDS: sway_log(L_DEBUG, "End of commands block"); block = CMD_BLOCK_END; break; case CMD_BLOCK_IPC: sway_log(L_DEBUG, "End of IPC block"); block = CMD_BLOCK_END; break; case CMD_BLOCK_IPC_EVENTS: sway_log(L_DEBUG, "End of IPC events block"); block = CMD_BLOCK_IPC; break; case CMD_BLOCK_END: sway_log(L_ERROR, "Unmatched }"); break; default:; } default:; } free(line); free_cmd_results(res); } return success; }
bool read_config(FILE *file, bool is_active) { struct sway_config *old_config = config; config = calloc(1, sizeof(struct sway_config)); config_defaults(config); config->reading = true; if (is_active) { sway_log(L_DEBUG, "Performing configuration file reload"); config->reloading = true; config->active = true; } bool success = true; enum cmd_status block = CMD_BLOCK_END; int line_number = 0; char *line; while (!feof(file)) { line = read_line(file); line_number++; line = strip_whitespace(line); if (line[0] == '#') { continue; } struct cmd_results *res = config_command(line, block); switch(res->status) { case CMD_FAILURE: case CMD_INVALID: sway_log(L_ERROR, "Error on line %i '%s': %s", line_number, line, res->error); success = false; break; case CMD_DEFER: sway_log(L_DEBUG, "Defferring command `%s'", line); list_add(config->cmd_queue, strdup(line)); break; case CMD_BLOCK_MODE: if (block == CMD_BLOCK_END) { block = CMD_BLOCK_MODE; } else { sway_log(L_ERROR, "Invalid block '%s'", line); } break; case CMD_BLOCK_END: switch(block) { case CMD_BLOCK_MODE: sway_log(L_DEBUG, "End of mode block"); config->current_mode = config->modes->items[0]; break; case CMD_BLOCK_END: sway_log(L_ERROR, "Unmatched }"); break; default:; } default:; } free(line); free(res); } if (is_active) { config->reloading = false; arrange_windows(&root_container, -1, -1); } if (old_config) { free_config(old_config); } config->reading = false; return success; }