diff options
Diffstat (limited to 'sway')
| -rw-r--r-- | sway/commands.c | 1 | ||||
| -rw-r--r-- | sway/commands/bar/colors.c | 222 | ||||
| -rw-r--r-- | sway/config.c | 68 | ||||
| -rw-r--r-- | sway/ipc-json.c | 12 | 
4 files changed, 124 insertions, 179 deletions
| diff --git a/sway/commands.c b/sway/commands.c index 872e9fc3..de29a7af 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -255,6 +255,7 @@ struct cmd_results *add_color(const char *name, char *buffer, const char *color)  		buffer[7] = 'f';  		buffer[8] = 'f';  	} +	buffer[9] = '\0';  	return NULL;  } diff --git a/sway/commands/bar/colors.c b/sway/commands/bar/colors.c index 8fb7fe27..f6fb520a 100644 --- a/sway/commands/bar/colors.c +++ b/sway/commands/bar/colors.c @@ -1,211 +1,123 @@  #include <string.h>  #include "sway/commands.h" -struct cmd_results *bar_cmd_colors(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "colors", EXPECTED_EQUAL_TO, 1))) { -		return error; -	} - -	if (strcmp("{", argv[0]) != 0) { -		return cmd_results_new(CMD_INVALID, "colors", -				"Expected '{' at the start of colors config definition."); -	} - -	return cmd_results_new(CMD_BLOCK_BAR_COLORS, NULL, NULL); -} - -struct cmd_results *bar_colors_cmd_active_workspace(int argc, char **argv) { +static struct cmd_results *parse_single_color(char **color, const char *cmd_name, int argc, char **argv) {  	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "active_workspace", EXPECTED_EQUAL_TO, 3))) { +	if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) {  		return error;  	} -	if ((error = add_color("active_workspace_border", config->current_bar->colors.active_workspace_border, argv[0]))) { -		return error; +	if (!*color) { +		*color = malloc(10);  	} -	if ((error = add_color("active_workspace_bg", config->current_bar->colors.active_workspace_bg, argv[1]))) { -		return error; -	} - -	if ((error = add_color("active_workspace_text", config->current_bar->colors.active_workspace_text, argv[2]))) { +	error = add_color(cmd_name, *color, argv[0]); +	if (error) {  		return error;  	}  	return cmd_results_new(CMD_SUCCESS, NULL, NULL);  } -struct cmd_results *bar_colors_cmd_background(int argc, char **argv) { +static struct cmd_results *parse_three_colors(char ***colors, const char *cmd_name, int argc, char **argv) {  	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "background", EXPECTED_EQUAL_TO, 1))) { -		return error; +	if (argc != 3) { +		return cmd_results_new(CMD_INVALID, cmd_name, "Requires exactly three color values");  	} -	if ((error = add_color("background", config->current_bar->colors.background, argv[0]))) { -		return error; +	int i; +	for (i = 0; i < 3; i++) { +		if (!*colors[i]) { +			*(colors[i]) = malloc(10); +		} +		error = add_color(cmd_name, *(colors[i]), argv[i]); +		if (error) { +			return error; +		}  	}  	return cmd_results_new(CMD_SUCCESS, NULL, NULL);  } -struct cmd_results *bar_colors_cmd_focused_background(int argc, char **argv) { +struct cmd_results *bar_cmd_colors(int argc, char **argv) {  	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "focused_background", EXPECTED_EQUAL_TO, 1))) { +	if ((error = checkarg(argc, "colors", EXPECTED_EQUAL_TO, 1))) {  		return error;  	} -	if ((error = add_color("focused_background", config->current_bar->colors.focused_background, argv[0]))) { -		return error; -	}else { -		config->current_bar->colors.has_focused_background = true; +	if (strcmp("{", argv[0]) != 0) { +		return cmd_results_new(CMD_INVALID, "colors", +				"Expected '{' at the start of colors config definition.");  	} -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	return cmd_results_new(CMD_BLOCK_BAR_COLORS, NULL, NULL);  } -struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "binding_mode", EXPECTED_EQUAL_TO, 3))) { -		return error; -	} - -	if ((error = add_color("binding_mode_border", config->current_bar->colors.binding_mode_border, argv[0]))) { -		return error; -	} else { -		config->current_bar->colors.has_binding_mode_border = true; -	} +struct cmd_results *bar_colors_cmd_active_workspace(int argc, char **argv) { +	char **colors[3] = { +		&(config->current_bar->colors.active_workspace_border), +		&(config->current_bar->colors.active_workspace_bg), +		&(config->current_bar->colors.active_workspace_text) +	}; +	return parse_three_colors(colors, "active_workspace", argc, argv); +} -	if ((error = add_color("binding_mode_bg", config->current_bar->colors.binding_mode_bg, argv[1]))) { -		return error; -	} else { -		config->current_bar->colors.has_binding_mode_bg = true; -	} +struct cmd_results *bar_colors_cmd_background(int argc, char **argv) { +	return parse_single_color(&(config->current_bar->colors.background), "background", argc, argv); +} -	if ((error = add_color("binding_mode_text", config->current_bar->colors.binding_mode_text, argv[2]))) { -		return error; -	} else { -		config->current_bar->colors.has_binding_mode_text = true; -	} +struct cmd_results *bar_colors_cmd_focused_background(int argc, char **argv) { +	return parse_single_color(&(config->current_bar->colors.focused_background), "focused_background", argc, argv); +} -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { +	char **colors[3] = { +		&(config->current_bar->colors.binding_mode_border), +		&(config->current_bar->colors.binding_mode_bg), +		&(config->current_bar->colors.binding_mode_text) +	}; +	return parse_three_colors(colors, "binding_mode", argc, argv);  }  struct cmd_results *bar_colors_cmd_focused_workspace(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "focused_workspace", EXPECTED_EQUAL_TO, 3))) { -		return error; -	} - -	if ((error = add_color("focused_workspace_border", config->current_bar->colors.focused_workspace_border, argv[0]))) { -		return error; -	} - -	if ((error = add_color("focused_workspace_bg", config->current_bar->colors.focused_workspace_bg, argv[1]))) { -		return error; -	} - -	if ((error = add_color("focused_workspace_text", config->current_bar->colors.focused_workspace_text, argv[2]))) { -		return error; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	char **colors[3] = { +		&(config->current_bar->colors.focused_workspace_border), +		&(config->current_bar->colors.focused_workspace_bg), +		&(config->current_bar->colors.focused_workspace_text) +	}; +	return parse_three_colors(colors, "focused_workspace", argc, argv);  }  struct cmd_results *bar_colors_cmd_inactive_workspace(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "inactive_workspace", EXPECTED_EQUAL_TO, 3))) { -		return error; -	} - -	if ((error = add_color("inactive_workspace_border", config->current_bar->colors.inactive_workspace_border, argv[0]))) { -		return error; -	} - -	if ((error = add_color("inactive_workspace_bg", config->current_bar->colors.inactive_workspace_bg, argv[1]))) { -		return error; -	} - -	if ((error = add_color("inactive_workspace_text", config->current_bar->colors.inactive_workspace_text, argv[2]))) { -		return error; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	char **colors[3] = { +		&(config->current_bar->colors.inactive_workspace_border), +		&(config->current_bar->colors.inactive_workspace_bg), +		&(config->current_bar->colors.inactive_workspace_text) +	}; +	return parse_three_colors(colors, "inactive_workspace", argc, argv);  }  struct cmd_results *bar_colors_cmd_separator(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "separator", EXPECTED_EQUAL_TO, 1))) { -		return error; -	} - -	if ((error = add_color("separator", config->current_bar->colors.separator, argv[0]))) { -		return error; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	return parse_single_color(&(config->current_bar->colors.separator), "separator", argc, argv);  }  struct cmd_results *bar_colors_cmd_focused_separator(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "focused_separator", EXPECTED_EQUAL_TO, 1))) { -		return error; -	} - -	if ((error = add_color("focused_separator", config->current_bar->colors.focused_separator, argv[0]))) { -		return error; -	} else { -		config->current_bar->colors.has_focused_separator = true; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	return parse_single_color(&(config->current_bar->colors.focused_separator), "focused_separator", argc, argv);  }  struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "statusline", EXPECTED_EQUAL_TO, 1))) { -		return error; -	} - -	if ((error = add_color("statusline", config->current_bar->colors.statusline, argv[0]))) { -		return error; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	return parse_single_color(&(config->current_bar->colors.statusline), "statusline", argc, argv);  }  struct cmd_results *bar_colors_cmd_focused_statusline(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "focused_statusline", EXPECTED_EQUAL_TO, 1))) { -		return error; -	} - -	if ((error = add_color("focused_statusline", config->current_bar->colors.focused_statusline, argv[0]))) { -		return error; -	} else { -		config->current_bar->colors.has_focused_statusline = true; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	return parse_single_color(&(config->current_bar->colors.focused_separator), "focused_separator", argc, argv);  }  struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) { -	struct cmd_results *error = NULL; -	if ((error = checkarg(argc, "urgent_workspace", EXPECTED_EQUAL_TO, 3))) { -		return error; -	} - -	if ((error = add_color("urgent_workspace_border", config->current_bar->colors.urgent_workspace_border, argv[0]))) { -		return error; -	} - -	if ((error = add_color("urgent_workspace_bg", config->current_bar->colors.urgent_workspace_bg, argv[1]))) { -		return error; -	} - -	if ((error = add_color("urgent_workspace_text", config->current_bar->colors.urgent_workspace_text, argv[2]))) { -		return error; -	} - -	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +	char **colors[3] = { +		&(config->current_bar->colors.urgent_workspace_border), +		&(config->current_bar->colors.urgent_workspace_bg), +		&(config->current_bar->colors.urgent_workspace_text) +	}; +	return parse_three_colors(colors, "urgent_workspace", argc, argv);  } diff --git a/sway/config.c b/sway/config.c index 6d4cf2ff..d790afa2 100644 --- a/sway/config.c +++ b/sway/config.c @@ -70,6 +70,28 @@ static void free_bar(struct bar_config *bar) {  		terminate_swaybar(bar->pid);  	} +	free(bar->colors.background); +	free(bar->colors.statusline); +	free(bar->colors.separator); +	free(bar->colors.focused_background); +	free(bar->colors.focused_statusline); +	free(bar->colors.focused_separator); +	free(bar->colors.focused_workspace_border); +	free(bar->colors.focused_workspace_bg); +	free(bar->colors.focused_workspace_text); +	free(bar->colors.active_workspace_border); +	free(bar->colors.active_workspace_bg); +	free(bar->colors.active_workspace_text); +	free(bar->colors.inactive_workspace_border); +	free(bar->colors.inactive_workspace_bg); +	free(bar->colors.inactive_workspace_text); +	free(bar->colors.urgent_workspace_border); +	free(bar->colors.urgent_workspace_bg); +	free(bar->colors.urgent_workspace_text); +	free(bar->colors.binding_mode_border); +	free(bar->colors.binding_mode_bg); +	free(bar->colors.binding_mode_text); +  	free(bar);  } @@ -1109,6 +1131,12 @@ struct sway_binding *sway_binding_dup(struct sway_binding *sb) {  	return new_sb;  } +static void set_bar_color(char **name, char *value) { +	// every color has 9 characters plus \0 +	*name = malloc(10); +	strcpy(*name, value); +} +  struct bar_config *default_bar_config(void) {  	struct bar_config *bar = NULL;  	bar = malloc(sizeof(struct bar_config)); @@ -1132,24 +1160,28 @@ struct bar_config *default_bar_config(void) {  	bar->verbose = false;  	bar->pid = 0;  	// set default colors -	strcpy(bar->colors.background, "#000000ff"); -	strcpy(bar->colors.statusline, "#ffffffff"); -	strcpy(bar->colors.separator, "#666666ff"); -	strcpy(bar->colors.focused_workspace_border, "#4c7899ff"); -	strcpy(bar->colors.focused_workspace_bg, "#285577ff"); -	strcpy(bar->colors.focused_workspace_text, "#ffffffff"); -	strcpy(bar->colors.active_workspace_border, "#333333ff"); -	strcpy(bar->colors.active_workspace_bg, "#5f676aff"); -	strcpy(bar->colors.active_workspace_text, "#ffffffff"); -	strcpy(bar->colors.inactive_workspace_border, "#333333ff"); -	strcpy(bar->colors.inactive_workspace_bg,"#222222ff"); -	strcpy(bar->colors.inactive_workspace_text, "#888888ff"); -	strcpy(bar->colors.urgent_workspace_border, "#2f343aff"); -	strcpy(bar->colors.urgent_workspace_bg,"#900000ff"); -	strcpy(bar->colors.urgent_workspace_text, "#ffffffff"); -	bar->colors.has_binding_mode_border = false; -	bar->colors.has_binding_mode_bg = false; -	bar->colors.has_binding_mode_text = false; +	set_bar_color(&(bar->colors.background), "#000000ff"); +	set_bar_color(&(bar->colors.statusline), "#ffffffff"); +	set_bar_color(&(bar->colors.separator), "#666666ff"); +	set_bar_color(&(bar->colors.focused_workspace_border), "#4c7899ff"); +	set_bar_color(&(bar->colors.focused_workspace_bg), "#285577ff"); +	set_bar_color(&(bar->colors.focused_workspace_text), "#ffffffff"); +	set_bar_color(&(bar->colors.active_workspace_border), "#333333ff"); +	set_bar_color(&(bar->colors.active_workspace_bg), "#5f676aff"); +	set_bar_color(&(bar->colors.active_workspace_text), "#ffffffff"); +	set_bar_color(&(bar->colors.inactive_workspace_border), "#333333ff"); +	set_bar_color(&(bar->colors.inactive_workspace_bg),"#222222ff"); +	set_bar_color(&(bar->colors.inactive_workspace_text), "#888888ff"); +	set_bar_color(&(bar->colors.urgent_workspace_border), "#2f343aff"); +	set_bar_color(&(bar->colors.urgent_workspace_bg),"#900000ff"); +	set_bar_color(&(bar->colors.urgent_workspace_text), "#ffffffff"); + +	bar->colors.focused_background = NULL; +	bar->colors.focused_statusline = NULL; +	bar->colors.focused_separator = NULL; +	bar->colors.binding_mode_border = NULL; +	bar->colors.binding_mode_bg = NULL; +	bar->colors.binding_mode_text = NULL;  	list_add(config->bars, bar); diff --git a/sway/ipc-json.c b/sway/ipc-json.c index c21d28af..e65e9de3 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -312,19 +312,19 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) {  	json_object_object_add(colors, "statusline", json_object_new_string(bar->colors.statusline));  	json_object_object_add(colors, "separator", json_object_new_string(bar->colors.separator)); -	if (bar->colors.has_focused_background) { +	if (bar->colors.focused_background) {  		json_object_object_add(colors, "focused_background", json_object_new_string(bar->colors.focused_background));  	} else {  		json_object_object_add(colors, "focused_background", json_object_new_string(bar->colors.background));  	} -	if (bar->colors.has_focused_statusline) { +	if (bar->colors.focused_statusline) {  		json_object_object_add(colors, "focused_statusline", json_object_new_string(bar->colors.focused_statusline));  	} else {  		json_object_object_add(colors, "focused_statusline", json_object_new_string(bar->colors.statusline));  	} -	if (bar->colors.has_focused_separator) { +	if (bar->colors.focused_separator) {  		json_object_object_add(colors, "focused_separator", json_object_new_string(bar->colors.focused_separator));  	} else {  		json_object_object_add(colors, "focused_separator", json_object_new_string(bar->colors.separator)); @@ -346,19 +346,19 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) {  	json_object_object_add(colors, "urgent_workspace_bg", json_object_new_string(bar->colors.urgent_workspace_bg));  	json_object_object_add(colors, "urgent_workspace_text", json_object_new_string(bar->colors.urgent_workspace_text)); -	if (bar->colors.has_binding_mode_border) { +	if (bar->colors.binding_mode_border) {  		json_object_object_add(colors, "binding_mode_border", json_object_new_string(bar->colors.binding_mode_border));  	} else {  		json_object_object_add(colors, "binding_mode_border", json_object_new_string(bar->colors.urgent_workspace_border));  	} -	if (bar->colors.has_binding_mode_bg) { +	if (bar->colors.binding_mode_bg) {  		json_object_object_add(colors, "binding_mode_bg", json_object_new_string(bar->colors.binding_mode_bg));  	} else {  		json_object_object_add(colors, "binding_mode_bg", json_object_new_string(bar->colors.urgent_workspace_bg));  	} -	if (bar->colors.has_binding_mode_text) { +	if (bar->colors.binding_mode_text) {  		json_object_object_add(colors, "binding_mode_text", json_object_new_string(bar->colors.binding_mode_text));  	} else {  		json_object_object_add(colors, "binding_mode_text", json_object_new_string(bar->colors.urgent_workspace_text)); | 
