|  |  |  | @ -117,6 +117,7 @@ void free_config(struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	free(config->floating_scroll_left_cmd); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(config->floating_scroll_right_cmd); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(config->font); | 
			
		
	
		
			
				
					|  |  |  |  | 	free((char *)config->current_config_path); | 
			
		
	
		
			
				
					|  |  |  |  | 	free((char *)config->current_config); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(config); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -205,6 +206,7 @@ static void config_defaults(struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!(config->active_bar_modifiers = create_list())) goto cleanup; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!(config->config_chain = create_list())) goto cleanup; | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config_path = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// borders
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -304,8 +306,6 @@ static char *get_config_path(void) { | 
			
		
	
		
			
				
					|  |  |  |  | 	return NULL; // Not reached
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const char *current_config_path; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static bool load_config(const char *path, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (path == NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(WLR_ERROR, "Unable to find a config file!"); | 
			
		
	
	
		
			
				
					|  |  |  | @ -313,7 +313,6 @@ static bool load_config(const char *path, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_log(WLR_INFO, "Loading config from %s", path); | 
			
		
	
		
			
				
					|  |  |  |  | 	current_config_path = path; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct stat sb; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -333,7 +332,6 @@ static bool load_config(const char *path, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(WLR_ERROR, "Error(s) loading config!"); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	current_config_path = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	return true; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -358,7 +356,7 @@ bool load_main_config(const char *file, bool is_active) { | 
			
		
	
		
			
				
					|  |  |  |  | 		config->active = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config = path; | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config_path = path; | 
			
		
	
		
			
				
					|  |  |  |  | 	list_add(config->config_chain, path); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	config->reading = true; | 
			
		
	
	
		
			
				
					|  |  |  | @ -428,7 +426,7 @@ bool load_main_config(const char *file, bool is_active) { | 
			
		
	
		
			
				
					|  |  |  |  | static bool load_include_config(const char *path, const char *parent_dir, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	// save parent config
 | 
			
		
	
		
			
				
					|  |  |  |  | 	const char *parent_config = config->current_config; | 
			
		
	
		
			
				
					|  |  |  |  | 	const char *parent_config = config->current_config_path; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	char *full_path; | 
			
		
	
		
			
				
					|  |  |  |  | 	int len = strlen(path); | 
			
		
	
	
		
			
				
					|  |  |  | @ -466,25 +464,25 @@ static bool load_include_config(const char *path, const char *parent_dir, | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config = real_path; | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config_path = real_path; | 
			
		
	
		
			
				
					|  |  |  |  | 	list_add(config->config_chain, real_path); | 
			
		
	
		
			
				
					|  |  |  |  | 	int index = config->config_chain->length - 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!load_config(real_path, config)) { | 
			
		
	
		
			
				
					|  |  |  |  | 		free(real_path); | 
			
		
	
		
			
				
					|  |  |  |  | 		config->current_config = parent_config; | 
			
		
	
		
			
				
					|  |  |  |  | 		config->current_config_path = parent_config; | 
			
		
	
		
			
				
					|  |  |  |  | 		list_del(config->config_chain, index); | 
			
		
	
		
			
				
					|  |  |  |  | 		return false; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// restore current_config
 | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config = parent_config; | 
			
		
	
		
			
				
					|  |  |  |  | 	// restore current_config_path
 | 
			
		
	
		
			
				
					|  |  |  |  | 	config->current_config_path = parent_config; | 
			
		
	
		
			
				
					|  |  |  |  | 	return true; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool load_include_configs(const char *path, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	char *wd = getcwd(NULL, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 	char *parent_path = strdup(config->current_config); | 
			
		
	
		
			
				
					|  |  |  |  | 	char *parent_path = strdup(config->current_config_path); | 
			
		
	
		
			
				
					|  |  |  |  | 	const char *parent_dir = dirname(parent_path); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (chdir(parent_dir) < 0) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -561,6 +559,23 @@ static char *expand_line(const char *block, const char *line, bool add_brace) { | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	bool reading_main_config = false; | 
			
		
	
		
			
				
					|  |  |  |  | 	char *current_config, *config_pos; | 
			
		
	
		
			
				
					|  |  |  |  | 	long config_size = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (config->current_config == NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		reading_main_config = true; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		fseek(file, 0, SEEK_END); | 
			
		
	
		
			
				
					|  |  |  |  | 		config_size = ftell(file); | 
			
		
	
		
			
				
					|  |  |  |  | 		rewind(file); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		config_pos = current_config = malloc(config_size + 1); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (current_config == NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(WLR_ERROR, "Unable to allocate buffer for config contents"); | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	bool success = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	int line_number = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	char *line; | 
			
		
	
	
		
			
				
					|  |  |  | @ -573,6 +588,14 @@ bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		line_number++; | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (reading_main_config) { | 
			
		
	
		
			
				
					|  |  |  |  | 			size_t l = strlen(line); | 
			
		
	
		
			
				
					|  |  |  |  | 			memcpy(config_pos, line, l); // don't copy terminating character
 | 
			
		
	
		
			
				
					|  |  |  |  | 			config_pos += l; | 
			
		
	
		
			
				
					|  |  |  |  | 			*config_pos++ = '\n'; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		line = strip_whitespace(line); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (line[0] == '#') { | 
			
		
	
		
			
				
					|  |  |  |  | 			free(line); | 
			
		
	
	
		
			
				
					|  |  |  | @ -592,6 +615,8 @@ bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!expanded) { | 
			
		
	
		
			
				
					|  |  |  |  | 			list_foreach(stack, free); | 
			
		
	
		
			
				
					|  |  |  |  | 			list_free(stack); | 
			
		
	
		
			
				
					|  |  |  |  | 			free(line); | 
			
		
	
		
			
				
					|  |  |  |  | 			free(current_config); | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(WLR_DEBUG, "Expanded line: %s", expanded); | 
			
		
	
	
		
			
				
					|  |  |  | @ -607,7 +632,7 @@ bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 		case CMD_FAILURE: | 
			
		
	
		
			
				
					|  |  |  |  | 		case CMD_INVALID: | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(WLR_ERROR, "Error on line %i '%s': %s (%s)", line_number, | 
			
		
	
		
			
				
					|  |  |  |  | 				line, res->error, config->current_config); | 
			
		
	
		
			
				
					|  |  |  |  | 				line, res->error, config->current_config_path); | 
			
		
	
		
			
				
					|  |  |  |  | 			success = false; | 
			
		
	
		
			
				
					|  |  |  |  | 			break; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -652,6 +677,10 @@ bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	list_foreach(stack, free); | 
			
		
	
		
			
				
					|  |  |  |  | 	list_free(stack); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (reading_main_config) { | 
			
		
	
		
			
				
					|  |  |  |  | 		current_config[config_size - 1] = '\0'; | 
			
		
	
		
			
				
					|  |  |  |  | 		config->current_config = current_config; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	return success; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |