aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/commands.h2
-rw-r--r--sway/commands.c31
-rw-r--r--sway/commands/bar/colors.c49
3 files changed, 33 insertions, 49 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h
index 982125c1..f992b441 100644
--- a/include/sway/commands.h
+++ b/include/sway/commands.h
@@ -88,8 +88,6 @@ void free_cmd_results(struct cmd_results *results);
*/
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.
*/
diff --git a/sway/commands.c b/sway/commands.c
index e7f1eafe..751dbe9c 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -567,34 +567,3 @@ char *cmd_results_to_json(list_t *res_list) {
json_object_put(result_array);
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;
-}
diff --git a/sway/commands/bar/colors.c b/sway/commands/bar/colors.c
index 7921db0d..ea2b912d 100644
--- a/sway/commands/bar/colors.c
+++ b/sway/commands/bar/colors.c
@@ -1,5 +1,7 @@
#include <string.h>
#include "sway/commands.h"
+#include "log.h"
+#include "util.h"
// Must be in alphabetical order for bsearch
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 },
};
+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,
const char *cmd_name, int argc, char **argv) {
struct cmd_results *error = NULL;
if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) {
return error;
}
- if (!*color && !(*color = malloc(10))) {
- return NULL;
- }
- error = add_color(*color, argv[0]);
- if (error) {
- return error;
+
+ char *rgba = hex_to_rgba_hex(argv[0]);
+ if (!*rgba) {
+ return cmd_results_new(CMD_INVALID, "Invalid color: %s", argv[0]);
}
+
+ free(*color);
+ *color = rgba;
return cmd_results_new(CMD_SUCCESS, NULL);
}
static struct cmd_results *parse_three_colors(char ***colors,
const char *cmd_name, int argc, char **argv) {
struct cmd_results *error = NULL;
- if (argc != 3) {
- return cmd_results_new(CMD_INVALID,
- "Command '%s' requires exactly three color values", cmd_name);
+ if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 3))) {
+ return error;
}
- for (size_t i = 0; i < 3; i++) {
- if (!*colors[i] && !(*(colors[i]) = malloc(10))) {
- return NULL;
- }
- error = add_color(*(colors[i]), argv[i]);
- if (error) {
- return error;
+
+ char *rgba[3] = {0};
+ 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]);
}
}
+
+ for (int i = 0; i < 3; i++) {
+ free(*colors[i]);
+ *colors[i] = rgba[i];
+ }
+
return cmd_results_new(CMD_SUCCESS, NULL);
}