summaryrefslogtreecommitdiffstats
path: root/sway/commands/bar/colors.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/bar/colors.c')
-rw-r--r--sway/commands/bar/colors.c49
1 files changed, 33 insertions, 16 deletions
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 @@
1#include <string.h> 1#include <string.h>
2#include "sway/commands.h" 2#include "sway/commands.h"
3#include "log.h"
4#include "util.h"
3 5
4// Must be in alphabetical order for bsearch 6// Must be in alphabetical order for bsearch
5static struct cmd_handler bar_colors_handlers[] = { 7static struct cmd_handler bar_colors_handlers[] = {
@@ -16,38 +18,53 @@ static struct cmd_handler bar_colors_handlers[] = {
16 { "urgent_workspace", bar_colors_cmd_urgent_workspace }, 18 { "urgent_workspace", bar_colors_cmd_urgent_workspace },
17}; 19};
18 20
21static char *hex_to_rgba_hex(const char *hex) {
22 uint32_t color;
23 if (!parse_color(hex, &color)) {
24 return NULL;
25 }
26 char *rgba = malloc(10);
27 snprintf(rgba, 10, "#%08x", color);
28 return rgba;
29}
30
19static struct cmd_results *parse_single_color(char **color, 31static struct cmd_results *parse_single_color(char **color,
20 const char *cmd_name, int argc, char **argv) { 32 const char *cmd_name, int argc, char **argv) {
21 struct cmd_results *error = NULL; 33 struct cmd_results *error = NULL;
22 if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { 34 if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) {
23 return error; 35 return error;
24 } 36 }
25 if (!*color && !(*color = malloc(10))) { 37
26 return NULL; 38 char *rgba = hex_to_rgba_hex(argv[0]);
27 } 39 if (!*rgba) {
28 error = add_color(*color, argv[0]); 40 return cmd_results_new(CMD_INVALID, "Invalid color: %s", argv[0]);
29 if (error) {
30 return error;
31 } 41 }
42
43 free(*color);
44 *color = rgba;
32 return cmd_results_new(CMD_SUCCESS, NULL); 45 return cmd_results_new(CMD_SUCCESS, NULL);
33} 46}
34 47
35static struct cmd_results *parse_three_colors(char ***colors, 48static struct cmd_results *parse_three_colors(char ***colors,
36 const char *cmd_name, int argc, char **argv) { 49 const char *cmd_name, int argc, char **argv) {
37 struct cmd_results *error = NULL; 50 struct cmd_results *error = NULL;
38 if (argc != 3) { 51 if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 3))) {
39 return cmd_results_new(CMD_INVALID, 52 return error;
40 "Command '%s' requires exactly three color values", cmd_name);
41 } 53 }
42 for (size_t i = 0; i < 3; i++) { 54
43 if (!*colors[i] && !(*(colors[i]) = malloc(10))) { 55 char *rgba[3] = {0};
44 return NULL; 56 for (int i = 0; i < 3; i++) {
45 } 57 rgba[i] = hex_to_rgba_hex(argv[i]);
46 error = add_color(*(colors[i]), argv[i]); 58 if (!rgba[i]) {
47 if (error) { 59 return cmd_results_new(CMD_INVALID, "Invalid color: %s", argv[i]);
48 return error;
49 } 60 }
50 } 61 }
62
63 for (int i = 0; i < 3; i++) {
64 free(*colors[i]);
65 *colors[i] = rgba[i];
66 }
67
51 return cmd_results_new(CMD_SUCCESS, NULL); 68 return cmd_results_new(CMD_SUCCESS, NULL);
52} 69}
53 70