|  |  |  | @ -513,6 +513,49 @@ bool load_include_configs(const char *path, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	return true; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static int detect_brace_on_following_line(FILE *file, char *line, | 
			
		
	
		
			
				
					|  |  |  |  | 		int line_number) { | 
			
		
	
		
			
				
					|  |  |  |  | 	int lines = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (line[strlen(line) - 1] != '{' && line[strlen(line) - 1] != '}') { | 
			
		
	
		
			
				
					|  |  |  |  | 		char *peeked = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 		do { | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(L_DEBUG, "Peeking line %d", line_number + lines + 1); | 
			
		
	
		
			
				
					|  |  |  |  | 			free(peeked); | 
			
		
	
		
			
				
					|  |  |  |  | 			peeked = peek_line(file, lines); | 
			
		
	
		
			
				
					|  |  |  |  | 			if (peeked) { | 
			
		
	
		
			
				
					|  |  |  |  | 				peeked = strip_whitespace(peeked); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			lines++; | 
			
		
	
		
			
				
					|  |  |  |  | 		} while (peeked && strlen(peeked) == 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (peeked && strlen(peeked) == 1 && peeked[0] == '{') { | 
			
		
	
		
			
				
					|  |  |  |  | 			for (int i = 0; i < lines; i++) { | 
			
		
	
		
			
				
					|  |  |  |  | 				free(peeked); | 
			
		
	
		
			
				
					|  |  |  |  | 				peeked = read_line(file); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			lines = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		free(peeked); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	return lines; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static char *expand_line(char *block, char *line, bool add_brace) { | 
			
		
	
		
			
				
					|  |  |  |  | 	int size = (block ? strlen(block) + 1 : 0) + strlen(line) | 
			
		
	
		
			
				
					|  |  |  |  | 		+ (add_brace ? 2 : 0) + 1; | 
			
		
	
		
			
				
					|  |  |  |  | 	char *expanded = calloc(1, size); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!expanded) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(L_ERROR, "Cannot allocate expanded line buffer"); | 
			
		
	
		
			
				
					|  |  |  |  | 		return NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	strcat(expanded, block ? block : ""); | 
			
		
	
		
			
				
					|  |  |  |  | 	strcat(expanded, block ? " " : ""); | 
			
		
	
		
			
				
					|  |  |  |  | 	strcat(expanded, line); | 
			
		
	
		
			
				
					|  |  |  |  | 	strcat(expanded, add_brace ? " {" : ""); | 
			
		
	
		
			
				
					|  |  |  |  | 	return expanded; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 	bool success = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	int line_number = 0; | 
			
		
	
	
		
			
				
					|  |  |  | @ -535,19 +578,27 @@ bool read_config(FILE *file, struct sway_config *config) { | 
			
		
	
		
			
				
					|  |  |  |  | 			free(line); | 
			
		
	
		
			
				
					|  |  |  |  | 			continue; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		char *full = calloc(strlen(block ? block : "") + strlen(line) + 2, 1); | 
			
		
	
		
			
				
					|  |  |  |  | 		strcat(full, block ? block : ""); | 
			
		
	
		
			
				
					|  |  |  |  | 		strcat(full, block ? " " : ""); | 
			
		
	
		
			
				
					|  |  |  |  | 		strcat(full, line); | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(L_DEBUG, "Expanded line: %s", full); | 
			
		
	
		
			
				
					|  |  |  |  | 		int brace_detected = detect_brace_on_following_line(file, line, | 
			
		
	
		
			
				
					|  |  |  |  | 				line_number); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (brace_detected > 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 			line_number += brace_detected; | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(L_DEBUG, "Detected open brace on line %d", line_number); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		char *expanded = expand_line(block, line, brace_detected > 0); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!expanded) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(L_DEBUG, "Expanded line: %s", expanded); | 
			
		
	
		
			
				
					|  |  |  |  | 		struct cmd_results *res; | 
			
		
	
		
			
				
					|  |  |  |  | 		if (block && strcmp(block, "<commands>") == 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 			// Special case
 | 
			
		
	
		
			
				
					|  |  |  |  | 			res = config_commands_command(full); | 
			
		
	
		
			
				
					|  |  |  |  | 			res = config_commands_command(expanded); | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			res = config_command(full); | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(L_DEBUG, "Entering c_c"); | 
			
		
	
		
			
				
					|  |  |  |  | 			res = config_command(expanded); | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(L_DEBUG, "Exiting c_c"); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		free(full); | 
			
		
	
		
			
				
					|  |  |  |  | 		free(expanded); | 
			
		
	
		
			
				
					|  |  |  |  | 		switch(res->status) { | 
			
		
	
		
			
				
					|  |  |  |  | 		case CMD_FAILURE: | 
			
		
	
		
			
				
					|  |  |  |  | 		case CMD_INVALID: | 
			
		
	
	
		
			
				
					|  |  |  | 
 |