diff options
author | Drew DeVault <sir@cmpwn.com> | 2016-11-03 08:32:10 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-03 08:32:10 -0600 |
commit | e9ac0492b7ec55d34d9209f2ff3e08de5c014d65 (patch) | |
tree | ee822e5e219275c84446709c349de630d7441055 | |
parent | Log LD_LIBRARY_PATH (diff) | |
parent | swap unnecessary function for strndup (diff) | |
download | sway-e9ac0492b7ec55d34d9209f2ff3e08de5c014d65.tar.gz sway-e9ac0492b7ec55d34d9209f2ff3e08de5c014d65.tar.zst sway-e9ac0492b7ec55d34d9209f2ff3e08de5c014d65.zip |
Merge pull request #965 from thejan2009/swaybar-colours
Fix some colour settings in swaybar
-rw-r--r-- | include/sway/commands.h | 4 | ||||
-rw-r--r-- | include/sway/config.h | 39 | ||||
-rw-r--r-- | include/swaybar/bar.h | 2 | ||||
-rw-r--r-- | include/swaybar/config.h | 4 | ||||
-rw-r--r-- | sway/commands.c | 4 | ||||
-rw-r--r-- | sway/commands/bar/colors.c | 183 | ||||
-rw-r--r-- | sway/config.c | 63 | ||||
-rw-r--r-- | sway/ipc-json.c | 38 | ||||
-rw-r--r-- | swaybar/ipc.c | 23 | ||||
-rw-r--r-- | swaybar/render.c | 24 |
10 files changed, 229 insertions, 155 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h index a46f41a3..db5e94d9 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h | |||
@@ -160,12 +160,14 @@ sway_cmd bar_cmd_workspace_buttons; | |||
160 | 160 | ||
161 | sway_cmd bar_colors_cmd_active_workspace; | 161 | sway_cmd bar_colors_cmd_active_workspace; |
162 | sway_cmd bar_colors_cmd_background; | 162 | sway_cmd bar_colors_cmd_background; |
163 | sway_cmd bar_colors_cmd_background; | 163 | sway_cmd bar_colors_cmd_focused_background; |
164 | sway_cmd bar_colors_cmd_binding_mode; | 164 | sway_cmd bar_colors_cmd_binding_mode; |
165 | sway_cmd bar_colors_cmd_focused_workspace; | 165 | sway_cmd bar_colors_cmd_focused_workspace; |
166 | sway_cmd bar_colors_cmd_inactive_workspace; | 166 | sway_cmd bar_colors_cmd_inactive_workspace; |
167 | sway_cmd bar_colors_cmd_separator; | 167 | sway_cmd bar_colors_cmd_separator; |
168 | sway_cmd bar_colors_cmd_focused_separator; | ||
168 | sway_cmd bar_colors_cmd_statusline; | 169 | sway_cmd bar_colors_cmd_statusline; |
170 | sway_cmd bar_colors_cmd_focused_statusline; | ||
169 | sway_cmd bar_colors_cmd_urgent_workspace; | 171 | sway_cmd bar_colors_cmd_urgent_workspace; |
170 | 172 | ||
171 | sway_cmd input_cmd_accel_profile; | 173 | sway_cmd input_cmd_accel_profile; |
diff --git a/include/sway/config.h b/include/sway/config.h index a14b7e48..8d077ee7 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -145,24 +145,27 @@ struct bar_config { | |||
145 | bool verbose; | 145 | bool verbose; |
146 | pid_t pid; | 146 | pid_t pid; |
147 | struct { | 147 | struct { |
148 | char background[10]; | 148 | char *background; |
149 | char statusline[10]; | 149 | char *statusline; |
150 | char separator[10]; | 150 | char *separator; |
151 | char focused_workspace_border[10]; | 151 | char *focused_background; |
152 | char focused_workspace_bg[10]; | 152 | char *focused_statusline; |
153 | char focused_workspace_text[10]; | 153 | char *focused_separator; |
154 | char active_workspace_border[10]; | 154 | char *focused_workspace_border; |
155 | char active_workspace_bg[10]; | 155 | char *focused_workspace_bg; |
156 | char active_workspace_text[10]; | 156 | char *focused_workspace_text; |
157 | char inactive_workspace_border[10]; | 157 | char *active_workspace_border; |
158 | char inactive_workspace_bg[10]; | 158 | char *active_workspace_bg; |
159 | char inactive_workspace_text[10]; | 159 | char *active_workspace_text; |
160 | char urgent_workspace_border[10]; | 160 | char *inactive_workspace_border; |
161 | char urgent_workspace_bg[10]; | 161 | char *inactive_workspace_bg; |
162 | char urgent_workspace_text[10]; | 162 | char *inactive_workspace_text; |
163 | char binding_mode_border[10]; | 163 | char *urgent_workspace_border; |
164 | char binding_mode_bg[10]; | 164 | char *urgent_workspace_bg; |
165 | char binding_mode_text[10]; | 165 | char *urgent_workspace_text; |
166 | char *binding_mode_border; | ||
167 | char *binding_mode_bg; | ||
168 | char *binding_mode_text; | ||
166 | } colors; | 169 | } colors; |
167 | }; | 170 | }; |
168 | 171 | ||
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index a3c511d9..697a48c2 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h | |||
@@ -9,6 +9,7 @@ struct bar { | |||
9 | struct config *config; | 9 | struct config *config; |
10 | struct status_line *status; | 10 | struct status_line *status; |
11 | list_t *outputs; | 11 | list_t *outputs; |
12 | struct output *focused_output; | ||
12 | 13 | ||
13 | int ipc_event_socketfd; | 14 | int ipc_event_socketfd; |
14 | int ipc_socketfd; | 15 | int ipc_socketfd; |
@@ -22,6 +23,7 @@ struct output { | |||
22 | list_t *workspaces; | 23 | list_t *workspaces; |
23 | char *name; | 24 | char *name; |
24 | int idx; | 25 | int idx; |
26 | bool focused; | ||
25 | }; | 27 | }; |
26 | 28 | ||
27 | struct workspace { | 29 | struct workspace { |
diff --git a/include/swaybar/config.h b/include/swaybar/config.h index 934116ca..04b12cd4 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h | |||
@@ -40,6 +40,10 @@ struct config { | |||
40 | uint32_t statusline; | 40 | uint32_t statusline; |
41 | uint32_t separator; | 41 | uint32_t separator; |
42 | 42 | ||
43 | uint32_t focused_background; | ||
44 | uint32_t focused_statusline; | ||
45 | uint32_t focused_separator; | ||
46 | |||
43 | struct box_colors focused_workspace; | 47 | struct box_colors focused_workspace; |
44 | struct box_colors active_workspace; | 48 | struct box_colors active_workspace; |
45 | struct box_colors inactive_workspace; | 49 | struct box_colors inactive_workspace; |
diff --git a/sway/commands.c b/sway/commands.c index 3236ff6c..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) | |||
255 | buffer[7] = 'f'; | 255 | buffer[7] = 'f'; |
256 | buffer[8] = 'f'; | 256 | buffer[8] = 'f'; |
257 | } | 257 | } |
258 | buffer[9] = '\0'; | ||
258 | 259 | ||
259 | return NULL; | 260 | return NULL; |
260 | } | 261 | } |
@@ -277,6 +278,9 @@ static struct cmd_handler bar_colors_handlers[] = { | |||
277 | { "active_workspace", bar_colors_cmd_active_workspace }, | 278 | { "active_workspace", bar_colors_cmd_active_workspace }, |
278 | { "background", bar_colors_cmd_background }, | 279 | { "background", bar_colors_cmd_background }, |
279 | { "binding_mode", bar_colors_cmd_binding_mode }, | 280 | { "binding_mode", bar_colors_cmd_binding_mode }, |
281 | { "focused_background", bar_colors_cmd_focused_background }, | ||
282 | { "focused_separator", bar_colors_cmd_focused_separator }, | ||
283 | { "focused_statusline", bar_colors_cmd_focused_statusline }, | ||
280 | { "focused_workspace", bar_colors_cmd_focused_workspace }, | 284 | { "focused_workspace", bar_colors_cmd_focused_workspace }, |
281 | { "inactive_workspace", bar_colors_cmd_inactive_workspace }, | 285 | { "inactive_workspace", bar_colors_cmd_inactive_workspace }, |
282 | { "separator", bar_colors_cmd_separator }, | 286 | { "separator", bar_colors_cmd_separator }, |
diff --git a/sway/commands/bar/colors.c b/sway/commands/bar/colors.c index 9e374d88..f6fb520a 100644 --- a/sway/commands/bar/colors.c +++ b/sway/commands/bar/colors.c | |||
@@ -1,160 +1,123 @@ | |||
1 | #include <string.h> | 1 | #include <string.h> |
2 | #include "sway/commands.h" | 2 | #include "sway/commands.h" |
3 | 3 | ||
4 | struct cmd_results *bar_cmd_colors(int argc, char **argv) { | 4 | static struct cmd_results *parse_single_color(char **color, const char *cmd_name, int argc, char **argv) { |
5 | struct cmd_results *error = NULL; | 5 | struct cmd_results *error = NULL; |
6 | if ((error = checkarg(argc, "colors", EXPECTED_EQUAL_TO, 1))) { | 6 | if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { |
7 | return error; | 7 | return error; |
8 | } | 8 | } |
9 | 9 | ||
10 | if (strcmp("{", argv[0]) != 0) { | 10 | if (!*color) { |
11 | return cmd_results_new(CMD_INVALID, "colors", | 11 | *color = malloc(10); |
12 | "Expected '{' at the start of colors config definition."); | ||
13 | } | ||
14 | |||
15 | return cmd_results_new(CMD_BLOCK_BAR_COLORS, NULL, NULL); | ||
16 | } | ||
17 | |||
18 | struct cmd_results *bar_colors_cmd_active_workspace(int argc, char **argv) { | ||
19 | struct cmd_results *error = NULL; | ||
20 | if ((error = checkarg(argc, "active_workspace", EXPECTED_EQUAL_TO, 3))) { | ||
21 | return error; | ||
22 | } | 12 | } |
23 | 13 | ||
24 | if ((error = add_color("active_workspace_border", config->current_bar->colors.active_workspace_border, argv[0]))) { | 14 | error = add_color(cmd_name, *color, argv[0]); |
25 | return error; | 15 | if (error) { |
26 | } | ||
27 | |||
28 | if ((error = add_color("active_workspace_bg", config->current_bar->colors.active_workspace_bg, argv[1]))) { | ||
29 | return error; | ||
30 | } | ||
31 | |||
32 | if ((error = add_color("active_workspace_text", config->current_bar->colors.active_workspace_text, argv[2]))) { | ||
33 | return error; | 16 | return error; |
34 | } | 17 | } |
35 | 18 | ||
36 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 19 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
37 | } | 20 | } |
38 | 21 | ||
39 | struct cmd_results *bar_colors_cmd_background(int argc, char **argv) { | 22 | static struct cmd_results *parse_three_colors(char ***colors, const char *cmd_name, int argc, char **argv) { |
40 | struct cmd_results *error = NULL; | 23 | struct cmd_results *error = NULL; |
41 | if ((error = checkarg(argc, "background", EXPECTED_EQUAL_TO, 1))) { | 24 | if (argc != 3) { |
42 | return error; | 25 | return cmd_results_new(CMD_INVALID, cmd_name, "Requires exactly three color values"); |
43 | } | 26 | } |
44 | 27 | ||
45 | if ((error = add_color("background", config->current_bar->colors.background, argv[0]))) { | 28 | int i; |
46 | return error; | 29 | for (i = 0; i < 3; i++) { |
30 | if (!*colors[i]) { | ||
31 | *(colors[i]) = malloc(10); | ||
32 | } | ||
33 | error = add_color(cmd_name, *(colors[i]), argv[i]); | ||
34 | if (error) { | ||
35 | return error; | ||
36 | } | ||
47 | } | 37 | } |
48 | 38 | ||
49 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 39 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
50 | } | 40 | } |
51 | 41 | ||
52 | struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { | 42 | struct cmd_results *bar_cmd_colors(int argc, char **argv) { |
53 | struct cmd_results *error = NULL; | 43 | struct cmd_results *error = NULL; |
54 | if ((error = checkarg(argc, "binding_mode", EXPECTED_EQUAL_TO, 3))) { | 44 | if ((error = checkarg(argc, "colors", EXPECTED_EQUAL_TO, 1))) { |
55 | return error; | ||
56 | } | ||
57 | |||
58 | if ((error = add_color("binding_mode_border", config->current_bar->colors.binding_mode_border, argv[0]))) { | ||
59 | return error; | ||
60 | } | ||
61 | |||
62 | if ((error = add_color("binding_mode_bg", config->current_bar->colors.binding_mode_bg, argv[1]))) { | ||
63 | return error; | 45 | return error; |
64 | } | 46 | } |
65 | 47 | ||
66 | if ((error = add_color("binding_mode_text", config->current_bar->colors.binding_mode_text, argv[2]))) { | 48 | if (strcmp("{", argv[0]) != 0) { |
67 | return error; | 49 | return cmd_results_new(CMD_INVALID, "colors", |
50 | "Expected '{' at the start of colors config definition."); | ||
68 | } | 51 | } |
69 | 52 | ||
70 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 53 | return cmd_results_new(CMD_BLOCK_BAR_COLORS, NULL, NULL); |
71 | } | 54 | } |
72 | 55 | ||
73 | struct cmd_results *bar_colors_cmd_focused_workspace(int argc, char **argv) { | 56 | struct cmd_results *bar_colors_cmd_active_workspace(int argc, char **argv) { |
74 | struct cmd_results *error = NULL; | 57 | char **colors[3] = { |
75 | if ((error = checkarg(argc, "focused_workspace", EXPECTED_EQUAL_TO, 3))) { | 58 | &(config->current_bar->colors.active_workspace_border), |
76 | return error; | 59 | &(config->current_bar->colors.active_workspace_bg), |
77 | } | 60 | &(config->current_bar->colors.active_workspace_text) |
61 | }; | ||
62 | return parse_three_colors(colors, "active_workspace", argc, argv); | ||
63 | } | ||
78 | 64 | ||
79 | if ((error = add_color("focused_workspace_border", config->current_bar->colors.focused_workspace_border, argv[0]))) { | 65 | struct cmd_results *bar_colors_cmd_background(int argc, char **argv) { |
80 | return error; | 66 | return parse_single_color(&(config->current_bar->colors.background), "background", argc, argv); |
81 | } | 67 | } |
82 | 68 | ||
83 | if ((error = add_color("focused_workspace_bg", config->current_bar->colors.focused_workspace_bg, argv[1]))) { | 69 | struct cmd_results *bar_colors_cmd_focused_background(int argc, char **argv) { |
84 | return error; | 70 | return parse_single_color(&(config->current_bar->colors.focused_background), "focused_background", argc, argv); |
85 | } | 71 | } |
86 | 72 | ||
87 | if ((error = add_color("focused_workspace_text", config->current_bar->colors.focused_workspace_text, argv[2]))) { | 73 | struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { |
88 | return error; | 74 | char **colors[3] = { |
89 | } | 75 | &(config->current_bar->colors.binding_mode_border), |
76 | &(config->current_bar->colors.binding_mode_bg), | ||
77 | &(config->current_bar->colors.binding_mode_text) | ||
78 | }; | ||
79 | return parse_three_colors(colors, "binding_mode", argc, argv); | ||
80 | } | ||
90 | 81 | ||
91 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 82 | struct cmd_results *bar_colors_cmd_focused_workspace(int argc, char **argv) { |
83 | char **colors[3] = { | ||
84 | &(config->current_bar->colors.focused_workspace_border), | ||
85 | &(config->current_bar->colors.focused_workspace_bg), | ||
86 | &(config->current_bar->colors.focused_workspace_text) | ||
87 | }; | ||
88 | return parse_three_colors(colors, "focused_workspace", argc, argv); | ||
92 | } | 89 | } |
93 | 90 | ||
94 | struct cmd_results *bar_colors_cmd_inactive_workspace(int argc, char **argv) { | 91 | struct cmd_results *bar_colors_cmd_inactive_workspace(int argc, char **argv) { |
95 | struct cmd_results *error = NULL; | 92 | char **colors[3] = { |
96 | if ((error = checkarg(argc, "inactive_workspace", EXPECTED_EQUAL_TO, 3))) { | 93 | &(config->current_bar->colors.inactive_workspace_border), |
97 | return error; | 94 | &(config->current_bar->colors.inactive_workspace_bg), |
98 | } | 95 | &(config->current_bar->colors.inactive_workspace_text) |
99 | 96 | }; | |
100 | if ((error = add_color("inactive_workspace_border", config->current_bar->colors.inactive_workspace_border, argv[0]))) { | 97 | return parse_three_colors(colors, "inactive_workspace", argc, argv); |
101 | return error; | ||
102 | } | ||
103 | |||
104 | if ((error = add_color("inactive_workspace_bg", config->current_bar->colors.inactive_workspace_bg, argv[1]))) { | ||
105 | return error; | ||
106 | } | ||
107 | |||
108 | if ((error = add_color("inactive_workspace_text", config->current_bar->colors.inactive_workspace_text, argv[2]))) { | ||
109 | return error; | ||
110 | } | ||
111 | |||
112 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
113 | } | 98 | } |
114 | 99 | ||
115 | struct cmd_results *bar_colors_cmd_separator(int argc, char **argv) { | 100 | struct cmd_results *bar_colors_cmd_separator(int argc, char **argv) { |
116 | struct cmd_results *error = NULL; | 101 | return parse_single_color(&(config->current_bar->colors.separator), "separator", argc, argv); |
117 | if ((error = checkarg(argc, "separator", EXPECTED_EQUAL_TO, 1))) { | 102 | } |
118 | return error; | ||
119 | } | ||
120 | |||
121 | if ((error = add_color("separator", config->current_bar->colors.separator, argv[0]))) { | ||
122 | return error; | ||
123 | } | ||
124 | 103 | ||
125 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 104 | struct cmd_results *bar_colors_cmd_focused_separator(int argc, char **argv) { |
105 | return parse_single_color(&(config->current_bar->colors.focused_separator), "focused_separator", argc, argv); | ||
126 | } | 106 | } |
127 | 107 | ||
128 | struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { | 108 | struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { |
129 | struct cmd_results *error = NULL; | 109 | return parse_single_color(&(config->current_bar->colors.statusline), "statusline", argc, argv); |
130 | if ((error = checkarg(argc, "statusline", EXPECTED_EQUAL_TO, 1))) { | 110 | } |
131 | return error; | ||
132 | } | ||
133 | |||
134 | if ((error = add_color("statusline", config->current_bar->colors.statusline, argv[0]))) { | ||
135 | return error; | ||
136 | } | ||
137 | 111 | ||
138 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 112 | struct cmd_results *bar_colors_cmd_focused_statusline(int argc, char **argv) { |
113 | return parse_single_color(&(config->current_bar->colors.focused_separator), "focused_separator", argc, argv); | ||
139 | } | 114 | } |
140 | 115 | ||
141 | struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) { | 116 | struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) { |
142 | struct cmd_results *error = NULL; | 117 | char **colors[3] = { |
143 | if ((error = checkarg(argc, "urgent_workspace", EXPECTED_EQUAL_TO, 3))) { | 118 | &(config->current_bar->colors.urgent_workspace_border), |
144 | return error; | 119 | &(config->current_bar->colors.urgent_workspace_bg), |
145 | } | 120 | &(config->current_bar->colors.urgent_workspace_text) |
146 | 121 | }; | |
147 | if ((error = add_color("urgent_workspace_border", config->current_bar->colors.urgent_workspace_border, argv[0]))) { | 122 | return parse_three_colors(colors, "urgent_workspace", argc, argv); |
148 | return error; | ||
149 | } | ||
150 | |||
151 | if ((error = add_color("urgent_workspace_bg", config->current_bar->colors.urgent_workspace_bg, argv[1]))) { | ||
152 | return error; | ||
153 | } | ||
154 | |||
155 | if ((error = add_color("urgent_workspace_text", config->current_bar->colors.urgent_workspace_text, argv[2]))) { | ||
156 | return error; | ||
157 | } | ||
158 | |||
159 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
160 | } | 123 | } |
diff --git a/sway/config.c b/sway/config.c index 7a41a3c8..7d5999d8 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -70,6 +70,28 @@ static void free_bar(struct bar_config *bar) { | |||
70 | terminate_swaybar(bar->pid); | 70 | terminate_swaybar(bar->pid); |
71 | } | 71 | } |
72 | 72 | ||
73 | free(bar->colors.background); | ||
74 | free(bar->colors.statusline); | ||
75 | free(bar->colors.separator); | ||
76 | free(bar->colors.focused_background); | ||
77 | free(bar->colors.focused_statusline); | ||
78 | free(bar->colors.focused_separator); | ||
79 | free(bar->colors.focused_workspace_border); | ||
80 | free(bar->colors.focused_workspace_bg); | ||
81 | free(bar->colors.focused_workspace_text); | ||
82 | free(bar->colors.active_workspace_border); | ||
83 | free(bar->colors.active_workspace_bg); | ||
84 | free(bar->colors.active_workspace_text); | ||
85 | free(bar->colors.inactive_workspace_border); | ||
86 | free(bar->colors.inactive_workspace_bg); | ||
87 | free(bar->colors.inactive_workspace_text); | ||
88 | free(bar->colors.urgent_workspace_border); | ||
89 | free(bar->colors.urgent_workspace_bg); | ||
90 | free(bar->colors.urgent_workspace_text); | ||
91 | free(bar->colors.binding_mode_border); | ||
92 | free(bar->colors.binding_mode_bg); | ||
93 | free(bar->colors.binding_mode_text); | ||
94 | |||
73 | free(bar); | 95 | free(bar); |
74 | } | 96 | } |
75 | 97 | ||
@@ -1132,24 +1154,29 @@ struct bar_config *default_bar_config(void) { | |||
1132 | bar->verbose = false; | 1154 | bar->verbose = false; |
1133 | bar->pid = 0; | 1155 | bar->pid = 0; |
1134 | // set default colors | 1156 | // set default colors |
1135 | strcpy(bar->colors.background, "#000000ff"); | 1157 | bar->colors.background = strndup("#000000ff", 9); |
1136 | strcpy(bar->colors.statusline, "#ffffffff"); | 1158 | bar->colors.statusline = strndup("#ffffffff", 9); |
1137 | strcpy(bar->colors.separator, "#666666ff"); | 1159 | bar->colors.separator = strndup("#666666ff", 9); |
1138 | strcpy(bar->colors.focused_workspace_border, "#4c7899ff"); | 1160 | bar->colors.focused_workspace_border = strndup("#4c7899ff", 9); |
1139 | strcpy(bar->colors.focused_workspace_bg, "#285577ff"); | 1161 | bar->colors.focused_workspace_bg = strndup("#285577ff", 9); |
1140 | strcpy(bar->colors.focused_workspace_text, "#ffffffff"); | 1162 | bar->colors.focused_workspace_text = strndup("#ffffffff", 9); |
1141 | strcpy(bar->colors.active_workspace_border, "#333333ff"); | 1163 | bar->colors.active_workspace_border = strndup("#333333ff", 9); |
1142 | strcpy(bar->colors.active_workspace_bg, "#5f676aff"); | 1164 | bar->colors.active_workspace_bg = strndup("#5f676aff", 9); |
1143 | strcpy(bar->colors.active_workspace_text, "#ffffffff"); | 1165 | bar->colors.active_workspace_text = strndup("#ffffffff", 9); |
1144 | strcpy(bar->colors.inactive_workspace_border, "#333333ff"); | 1166 | bar->colors.inactive_workspace_border = strndup("#333333ff", 9); |
1145 | strcpy(bar->colors.inactive_workspace_bg,"#222222ff"); | 1167 | bar->colors.inactive_workspace_bg = strndup("#222222ff", 9); |
1146 | strcpy(bar->colors.inactive_workspace_text, "#888888ff"); | 1168 | bar->colors.inactive_workspace_text = strndup("#888888ff", 9); |
1147 | strcpy(bar->colors.urgent_workspace_border, "#2f343aff"); | 1169 | bar->colors.urgent_workspace_border = strndup("#2f343aff", 9); |
1148 | strcpy(bar->colors.urgent_workspace_bg,"#900000ff"); | 1170 | bar->colors.urgent_workspace_bg = strndup("#900000ff", 9); |
1149 | strcpy(bar->colors.urgent_workspace_text, "#ffffffff"); | 1171 | bar->colors.urgent_workspace_text = strndup("#ffffffff", 9); |
1150 | strcpy(bar->colors.binding_mode_border, "#2f343aff"); | 1172 | // if the following colors stay undefined, they fall back to background, |
1151 | strcpy(bar->colors.binding_mode_bg,"#900000ff"); | 1173 | // statusline, separator and urgent_workspace_*. |
1152 | strcpy(bar->colors.binding_mode_text, "#ffffffff"); | 1174 | bar->colors.focused_background = NULL; |
1175 | bar->colors.focused_statusline = NULL; | ||
1176 | bar->colors.focused_separator = NULL; | ||
1177 | bar->colors.binding_mode_border = NULL; | ||
1178 | bar->colors.binding_mode_bg = NULL; | ||
1179 | bar->colors.binding_mode_text = NULL; | ||
1153 | 1180 | ||
1154 | list_add(config->bars, bar); | 1181 | list_add(config->bars, bar); |
1155 | 1182 | ||
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index eb77a654..e65e9de3 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -312,6 +312,24 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { | |||
312 | json_object_object_add(colors, "statusline", json_object_new_string(bar->colors.statusline)); | 312 | json_object_object_add(colors, "statusline", json_object_new_string(bar->colors.statusline)); |
313 | json_object_object_add(colors, "separator", json_object_new_string(bar->colors.separator)); | 313 | json_object_object_add(colors, "separator", json_object_new_string(bar->colors.separator)); |
314 | 314 | ||
315 | if (bar->colors.focused_background) { | ||
316 | json_object_object_add(colors, "focused_background", json_object_new_string(bar->colors.focused_background)); | ||
317 | } else { | ||
318 | json_object_object_add(colors, "focused_background", json_object_new_string(bar->colors.background)); | ||
319 | } | ||
320 | |||
321 | if (bar->colors.focused_statusline) { | ||
322 | json_object_object_add(colors, "focused_statusline", json_object_new_string(bar->colors.focused_statusline)); | ||
323 | } else { | ||
324 | json_object_object_add(colors, "focused_statusline", json_object_new_string(bar->colors.statusline)); | ||
325 | } | ||
326 | |||
327 | if (bar->colors.focused_separator) { | ||
328 | json_object_object_add(colors, "focused_separator", json_object_new_string(bar->colors.focused_separator)); | ||
329 | } else { | ||
330 | json_object_object_add(colors, "focused_separator", json_object_new_string(bar->colors.separator)); | ||
331 | } | ||
332 | |||
315 | json_object_object_add(colors, "focused_workspace_border", json_object_new_string(bar->colors.focused_workspace_border)); | 333 | json_object_object_add(colors, "focused_workspace_border", json_object_new_string(bar->colors.focused_workspace_border)); |
316 | json_object_object_add(colors, "focused_workspace_bg", json_object_new_string(bar->colors.focused_workspace_bg)); | 334 | json_object_object_add(colors, "focused_workspace_bg", json_object_new_string(bar->colors.focused_workspace_bg)); |
317 | json_object_object_add(colors, "focused_workspace_text", json_object_new_string(bar->colors.focused_workspace_text)); | 335 | json_object_object_add(colors, "focused_workspace_text", json_object_new_string(bar->colors.focused_workspace_text)); |
@@ -328,9 +346,23 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { | |||
328 | json_object_object_add(colors, "urgent_workspace_bg", json_object_new_string(bar->colors.urgent_workspace_bg)); | 346 | json_object_object_add(colors, "urgent_workspace_bg", json_object_new_string(bar->colors.urgent_workspace_bg)); |
329 | json_object_object_add(colors, "urgent_workspace_text", json_object_new_string(bar->colors.urgent_workspace_text)); | 347 | json_object_object_add(colors, "urgent_workspace_text", json_object_new_string(bar->colors.urgent_workspace_text)); |
330 | 348 | ||
331 | json_object_object_add(colors, "binding_mode_border", json_object_new_string(bar->colors.binding_mode_border)); | 349 | if (bar->colors.binding_mode_border) { |
332 | json_object_object_add(colors, "binding_mode_bg", json_object_new_string(bar->colors.binding_mode_bg)); | 350 | json_object_object_add(colors, "binding_mode_border", json_object_new_string(bar->colors.binding_mode_border)); |
333 | json_object_object_add(colors, "binding_mode_text", json_object_new_string(bar->colors.binding_mode_text)); | 351 | } else { |
352 | json_object_object_add(colors, "binding_mode_border", json_object_new_string(bar->colors.urgent_workspace_border)); | ||
353 | } | ||
354 | |||
355 | if (bar->colors.binding_mode_bg) { | ||
356 | json_object_object_add(colors, "binding_mode_bg", json_object_new_string(bar->colors.binding_mode_bg)); | ||
357 | } else { | ||
358 | json_object_object_add(colors, "binding_mode_bg", json_object_new_string(bar->colors.urgent_workspace_bg)); | ||
359 | } | ||
360 | |||
361 | if (bar->colors.binding_mode_text) { | ||
362 | json_object_object_add(colors, "binding_mode_text", json_object_new_string(bar->colors.binding_mode_text)); | ||
363 | } else { | ||
364 | json_object_object_add(colors, "binding_mode_text", json_object_new_string(bar->colors.urgent_workspace_text)); | ||
365 | } | ||
334 | 366 | ||
335 | json_object_object_add(json, "colors", colors); | 367 | json_object_object_add(json, "colors", colors); |
336 | 368 | ||
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 2c092853..8d2f4e9a 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -108,6 +108,7 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
108 | 108 | ||
109 | if (colors) { | 109 | if (colors) { |
110 | json_object *background, *statusline, *separator; | 110 | json_object *background, *statusline, *separator; |
111 | json_object *focused_background, *focused_statusline, *focused_separator; | ||
111 | json_object *focused_workspace_border, *focused_workspace_bg, *focused_workspace_text; | 112 | json_object *focused_workspace_border, *focused_workspace_bg, *focused_workspace_text; |
112 | json_object *inactive_workspace_border, *inactive_workspace_bg, *inactive_workspace_text; | 113 | json_object *inactive_workspace_border, *inactive_workspace_bg, *inactive_workspace_text; |
113 | json_object *active_workspace_border, *active_workspace_bg, *active_workspace_text; | 114 | json_object *active_workspace_border, *active_workspace_bg, *active_workspace_text; |
@@ -116,6 +117,9 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
116 | json_object_object_get_ex(colors, "background", &background); | 117 | json_object_object_get_ex(colors, "background", &background); |
117 | json_object_object_get_ex(colors, "statusline", &statusline); | 118 | json_object_object_get_ex(colors, "statusline", &statusline); |
118 | json_object_object_get_ex(colors, "separator", &separator); | 119 | json_object_object_get_ex(colors, "separator", &separator); |
120 | json_object_object_get_ex(colors, "focused_background", &focused_background); | ||
121 | json_object_object_get_ex(colors, "focused_statusline", &focused_statusline); | ||
122 | json_object_object_get_ex(colors, "focused_separator", &focused_separator); | ||
119 | json_object_object_get_ex(colors, "focused_workspace_border", &focused_workspace_border); | 123 | json_object_object_get_ex(colors, "focused_workspace_border", &focused_workspace_border); |
120 | json_object_object_get_ex(colors, "focused_workspace_bg", &focused_workspace_bg); | 124 | json_object_object_get_ex(colors, "focused_workspace_bg", &focused_workspace_bg); |
121 | json_object_object_get_ex(colors, "focused_workspace_text", &focused_workspace_text); | 125 | json_object_object_get_ex(colors, "focused_workspace_text", &focused_workspace_text); |
@@ -143,6 +147,18 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
143 | config->colors.separator = parse_color(json_object_get_string(separator)); | 147 | config->colors.separator = parse_color(json_object_get_string(separator)); |
144 | } | 148 | } |
145 | 149 | ||
150 | if (focused_background) { | ||
151 | config->colors.focused_background = parse_color(json_object_get_string(focused_background)); | ||
152 | } | ||
153 | |||
154 | if (focused_statusline) { | ||
155 | config->colors.focused_statusline = parse_color(json_object_get_string(focused_statusline)); | ||
156 | } | ||
157 | |||
158 | if (focused_separator) { | ||
159 | config->colors.focused_separator = parse_color(json_object_get_string(focused_separator)); | ||
160 | } | ||
161 | |||
146 | if (focused_workspace_border) { | 162 | if (focused_workspace_border) { |
147 | config->colors.focused_workspace.border = parse_color(json_object_get_string(focused_workspace_border)); | 163 | config->colors.focused_workspace.border = parse_color(json_object_get_string(focused_workspace_border)); |
148 | } | 164 | } |
@@ -235,6 +251,13 @@ static void ipc_update_workspaces(struct bar *bar) { | |||
235 | ws->name = strdup(json_object_get_string(name)); | 251 | ws->name = strdup(json_object_get_string(name)); |
236 | ws->visible = json_object_get_boolean(visible); | 252 | ws->visible = json_object_get_boolean(visible); |
237 | ws->focused = json_object_get_boolean(focused); | 253 | ws->focused = json_object_get_boolean(focused); |
254 | if (ws->focused) { | ||
255 | if (bar->focused_output) { | ||
256 | bar->focused_output->focused = false; | ||
257 | } | ||
258 | bar->focused_output = output; | ||
259 | output->focused = true; | ||
260 | } | ||
238 | ws->urgent = json_object_get_boolean(urgent); | 261 | ws->urgent = json_object_get_boolean(urgent); |
239 | list_add(output->workspaces, ws); | 262 | list_add(output->workspaces, ws); |
240 | } | 263 | } |
diff --git a/swaybar/render.c b/swaybar/render.c index a9f1991d..2eae997f 100644 --- a/swaybar/render.c +++ b/swaybar/render.c | |||
@@ -49,7 +49,7 @@ static void render_sharp_line(cairo_t *cairo, uint32_t color, double x, double y | |||
49 | } | 49 | } |
50 | } | 50 | } |
51 | 51 | ||
52 | static void render_block(struct window *window, struct config *config, struct status_block *block, double *x, bool edge) { | 52 | static void render_block(struct window *window, struct config *config, struct status_block *block, double *x, bool edge, bool is_focused) { |
53 | int width, height, sep_width; | 53 | int width, height, sep_width; |
54 | get_text_size(window->cairo, window->font, &width, &height, | 54 | get_text_size(window->cairo, window->font, &width, &height, |
55 | window->scale, block->markup, "%s", block->full_text); | 55 | window->scale, block->markup, "%s", block->full_text); |
@@ -159,7 +159,11 @@ static void render_block(struct window *window, struct config *config, struct st | |||
159 | 159 | ||
160 | // render separator | 160 | // render separator |
161 | if (!edge && block->separator) { | 161 | if (!edge && block->separator) { |
162 | cairo_set_source_u32(window->cairo, config->colors.separator); | 162 | if (is_focused) { |
163 | cairo_set_source_u32(window->cairo, config->colors.focused_separator); | ||
164 | } else { | ||
165 | cairo_set_source_u32(window->cairo, config->colors.separator); | ||
166 | } | ||
163 | if (config->sep_symbol) { | 167 | if (config->sep_symbol) { |
164 | offset = pos + (block->separator_block_width - sep_width) / 2; | 168 | offset = pos + (block->separator_block_width - sep_width) / 2; |
165 | cairo_move_to(window->cairo, offset, margin); | 169 | cairo_move_to(window->cairo, offset, margin); |
@@ -275,6 +279,7 @@ void render(struct output *output, struct config *config, struct status_line *li | |||
275 | 279 | ||
276 | struct window *window = output->window; | 280 | struct window *window = output->window; |
277 | cairo_t *cairo = window->cairo; | 281 | cairo_t *cairo = window->cairo; |
282 | bool is_focused = output->focused; | ||
278 | 283 | ||
279 | // Clear | 284 | // Clear |
280 | cairo_save(cairo); | 285 | cairo_save(cairo); |
@@ -285,11 +290,20 @@ void render(struct output *output, struct config *config, struct status_line *li | |||
285 | cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); | 290 | cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); |
286 | 291 | ||
287 | // Background | 292 | // Background |
288 | cairo_set_source_u32(cairo, config->colors.background); | 293 | if (is_focused) { |
294 | cairo_set_source_u32(cairo, config->colors.focused_background); | ||
295 | } else { | ||
296 | cairo_set_source_u32(cairo, config->colors.background); | ||
297 | } | ||
289 | cairo_paint(cairo); | 298 | cairo_paint(cairo); |
290 | 299 | ||
291 | // Command output | 300 | // Command output |
292 | cairo_set_source_u32(cairo, config->colors.statusline); | 301 | if (is_focused) { |
302 | cairo_set_source_u32(cairo, config->colors.focused_statusline); | ||
303 | } else { | ||
304 | cairo_set_source_u32(cairo, config->colors.statusline); | ||
305 | } | ||
306 | |||
293 | int width, height; | 307 | int width, height; |
294 | 308 | ||
295 | if (line->protocol == TEXT) { | 309 | if (line->protocol == TEXT) { |
@@ -305,7 +319,7 @@ void render(struct output *output, struct config *config, struct status_line *li | |||
305 | for (i = line->block_line->length - 1; i >= 0; --i) { | 319 | for (i = line->block_line->length - 1; i >= 0; --i) { |
306 | struct status_block *block = line->block_line->items[i]; | 320 | struct status_block *block = line->block_line->items[i]; |
307 | if (block->full_text && block->full_text[0]) { | 321 | if (block->full_text && block->full_text[0]) { |
308 | render_block(window, config, block, &pos, edge); | 322 | render_block(window, config, block, &pos, edge, is_focused); |
309 | edge = false; | 323 | edge = false; |
310 | } | 324 | } |
311 | } | 325 | } |