bar_cmd_colors: remove add_color

This is the third commit in a series of commits to refactor color
handling in sway. This removes add_color from commands.c. It was only
being used by bar_cmd_colors. This also changes the functions to use
parse_color which is used to validate rgb(a) colors throughout the code
base and is also what i3bar is using to parse the colors after they are
passed over ipc. After parsing the color and ensuring it is valid, the
rgba hex string is then generated using snprintf. This refactor also
ensures that all the colors for the command are valid before applying
any of them.
master
Brian Ashworth 5 years ago committed by Simon Ser
parent 66dc33296c
commit f898ca9a83

@ -88,8 +88,6 @@ void free_cmd_results(struct cmd_results *results);
*/ */
char *cmd_results_to_json(list_t *res_list); char *cmd_results_to_json(list_t *res_list);
struct cmd_results *add_color(char *buffer, const char *color);
/** /**
* TODO: Move this function and its dependent functions to container.c. * TODO: Move this function and its dependent functions to container.c.
*/ */

@ -567,34 +567,3 @@ char *cmd_results_to_json(list_t *res_list) {
json_object_put(result_array); json_object_put(result_array);
return res; return res;
} }
/**
* Check and add color to buffer.
*
* return error object, or NULL if color is valid.
*/
struct cmd_results *add_color(char *buffer, const char *color) {
int len = strlen(color);
if (len != 7 && len != 9) {
return cmd_results_new(CMD_INVALID,
"Invalid color definition %s", color);
}
if (color[0] != '#') {
return cmd_results_new(CMD_INVALID,
"Invalid color definition %s", color);
}
for (int i = 1; i < len; ++i) {
if (!isxdigit(color[i])) {
return cmd_results_new(CMD_INVALID,
"Invalid color definition %s", color);
}
}
strcpy(buffer, color);
// add default alpha channel if color was defined without it
if (len == 7) {
buffer[7] = 'f';
buffer[8] = 'f';
}
buffer[9] = '\0';
return NULL;
}

@ -1,5 +1,7 @@
#include <string.h> #include <string.h>
#include "sway/commands.h" #include "sway/commands.h"
#include "log.h"
#include "util.h"
// Must be in alphabetical order for bsearch // Must be in alphabetical order for bsearch
static struct cmd_handler bar_colors_handlers[] = { static struct cmd_handler bar_colors_handlers[] = {
@ -16,38 +18,53 @@ static struct cmd_handler bar_colors_handlers[] = {
{ "urgent_workspace", bar_colors_cmd_urgent_workspace }, { "urgent_workspace", bar_colors_cmd_urgent_workspace },
}; };
static char *hex_to_rgba_hex(const char *hex) {
uint32_t color;
if (!parse_color(hex, &color)) {
return NULL;
}
char *rgba = malloc(10);
snprintf(rgba, 10, "#%08x", color);
return rgba;
}
static struct cmd_results *parse_single_color(char **color, static struct cmd_results *parse_single_color(char **color,
const char *cmd_name, int argc, char **argv) { const char *cmd_name, int argc, char **argv) {
struct cmd_results *error = NULL; struct cmd_results *error = NULL;
if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) {
return error; return error;
} }
if (!*color && !(*color = malloc(10))) {
return NULL; char *rgba = hex_to_rgba_hex(argv[0]);
} if (!*rgba) {
error = add_color(*color, argv[0]); return cmd_results_new(CMD_INVALID, "Invalid color: %s", argv[0]);
if (error) {
return error;
} }
free(*color);
*color = rgba;
return cmd_results_new(CMD_SUCCESS, NULL); return cmd_results_new(CMD_SUCCESS, NULL);
} }
static struct cmd_results *parse_three_colors(char ***colors, static struct cmd_results *parse_three_colors(char ***colors,
const char *cmd_name, int argc, char **argv) { const char *cmd_name, int argc, char **argv) {
struct cmd_results *error = NULL; struct cmd_results *error = NULL;
if (argc != 3) { if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 3))) {
return cmd_results_new(CMD_INVALID, return error;
"Command '%s' requires exactly three color values", cmd_name);
} }
for (size_t i = 0; i < 3; i++) {
if (!*colors[i] && !(*(colors[i]) = malloc(10))) { char *rgba[3] = {0};
return NULL; for (int i = 0; i < 3; i++) {
rgba[i] = hex_to_rgba_hex(argv[i]);
if (!rgba[i]) {
return cmd_results_new(CMD_INVALID, "Invalid color: %s", argv[i]);
} }
error = add_color(*(colors[i]), argv[i]);
if (error) {
return error;
} }
for (int i = 0; i < 3; i++) {
free(*colors[i]);
*colors[i] = rgba[i];
} }
return cmd_results_new(CMD_SUCCESS, NULL); return cmd_results_new(CMD_SUCCESS, NULL);
} }

Loading…
Cancel
Save