diff options
-rw-r--r-- | include/sway/commands.h | 4 | ||||
-rw-r--r-- | include/sway/config.h | 7 | ||||
-rw-r--r-- | include/swaybar/bar.h | 2 | ||||
-rw-r--r-- | include/swaybar/config.h | 4 | ||||
-rw-r--r-- | sway/commands.c | 3 | ||||
-rw-r--r-- | sway/commands/bar/colors.c | 45 | ||||
-rw-r--r-- | sway/ipc-json.c | 18 | ||||
-rw-r--r-- | swaybar/ipc.c | 23 | ||||
-rw-r--r-- | swaybar/render.c | 24 |
9 files changed, 124 insertions, 6 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 c41bb8b3..9b3cc60c 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -148,6 +148,9 @@ struct bar_config { | |||
148 | char background[10]; | 148 | char background[10]; |
149 | char statusline[10]; | 149 | char statusline[10]; |
150 | char separator[10]; | 150 | char separator[10]; |
151 | char focused_background[10]; | ||
152 | char focused_statusline[10]; | ||
153 | char focused_separator[10]; | ||
151 | char focused_workspace_border[10]; | 154 | char focused_workspace_border[10]; |
152 | char focused_workspace_bg[10]; | 155 | char focused_workspace_bg[10]; |
153 | char focused_workspace_text[10]; | 156 | char focused_workspace_text[10]; |
@@ -164,6 +167,10 @@ struct bar_config { | |||
164 | char binding_mode_bg[10]; | 167 | char binding_mode_bg[10]; |
165 | char binding_mode_text[10]; | 168 | char binding_mode_text[10]; |
166 | 169 | ||
170 | bool has_focused_background; | ||
171 | bool has_focused_statusline; | ||
172 | bool has_focused_separator; | ||
173 | |||
167 | bool has_binding_mode_border; | 174 | bool has_binding_mode_border; |
168 | bool has_binding_mode_bg; | 175 | bool has_binding_mode_bg; |
169 | bool has_binding_mode_text; | 176 | bool has_binding_mode_text; |
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..872e9fc3 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -277,6 +277,9 @@ static struct cmd_handler bar_colors_handlers[] = { | |||
277 | { "active_workspace", bar_colors_cmd_active_workspace }, | 277 | { "active_workspace", bar_colors_cmd_active_workspace }, |
278 | { "background", bar_colors_cmd_background }, | 278 | { "background", bar_colors_cmd_background }, |
279 | { "binding_mode", bar_colors_cmd_binding_mode }, | 279 | { "binding_mode", bar_colors_cmd_binding_mode }, |
280 | { "focused_background", bar_colors_cmd_focused_background }, | ||
281 | { "focused_separator", bar_colors_cmd_focused_separator }, | ||
282 | { "focused_statusline", bar_colors_cmd_focused_statusline }, | ||
280 | { "focused_workspace", bar_colors_cmd_focused_workspace }, | 283 | { "focused_workspace", bar_colors_cmd_focused_workspace }, |
281 | { "inactive_workspace", bar_colors_cmd_inactive_workspace }, | 284 | { "inactive_workspace", bar_colors_cmd_inactive_workspace }, |
282 | { "separator", bar_colors_cmd_separator }, | 285 | { "separator", bar_colors_cmd_separator }, |
diff --git a/sway/commands/bar/colors.c b/sway/commands/bar/colors.c index e9180604..8fb7fe27 100644 --- a/sway/commands/bar/colors.c +++ b/sway/commands/bar/colors.c | |||
@@ -49,6 +49,21 @@ struct cmd_results *bar_colors_cmd_background(int argc, char **argv) { | |||
49 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 49 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
50 | } | 50 | } |
51 | 51 | ||
52 | struct cmd_results *bar_colors_cmd_focused_background(int argc, char **argv) { | ||
53 | struct cmd_results *error = NULL; | ||
54 | if ((error = checkarg(argc, "focused_background", EXPECTED_EQUAL_TO, 1))) { | ||
55 | return error; | ||
56 | } | ||
57 | |||
58 | if ((error = add_color("focused_background", config->current_bar->colors.focused_background, argv[0]))) { | ||
59 | return error; | ||
60 | }else { | ||
61 | config->current_bar->colors.has_focused_background = true; | ||
62 | } | ||
63 | |||
64 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
65 | } | ||
66 | |||
52 | struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { | 67 | struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) { |
53 | struct cmd_results *error = NULL; | 68 | struct cmd_results *error = NULL; |
54 | if ((error = checkarg(argc, "binding_mode", EXPECTED_EQUAL_TO, 3))) { | 69 | if ((error = checkarg(argc, "binding_mode", EXPECTED_EQUAL_TO, 3))) { |
@@ -131,6 +146,21 @@ struct cmd_results *bar_colors_cmd_separator(int argc, char **argv) { | |||
131 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 146 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
132 | } | 147 | } |
133 | 148 | ||
149 | struct cmd_results *bar_colors_cmd_focused_separator(int argc, char **argv) { | ||
150 | struct cmd_results *error = NULL; | ||
151 | if ((error = checkarg(argc, "focused_separator", EXPECTED_EQUAL_TO, 1))) { | ||
152 | return error; | ||
153 | } | ||
154 | |||
155 | if ((error = add_color("focused_separator", config->current_bar->colors.focused_separator, argv[0]))) { | ||
156 | return error; | ||
157 | } else { | ||
158 | config->current_bar->colors.has_focused_separator = true; | ||
159 | } | ||
160 | |||
161 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
162 | } | ||
163 | |||
134 | struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { | 164 | struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { |
135 | struct cmd_results *error = NULL; | 165 | struct cmd_results *error = NULL; |
136 | if ((error = checkarg(argc, "statusline", EXPECTED_EQUAL_TO, 1))) { | 166 | if ((error = checkarg(argc, "statusline", EXPECTED_EQUAL_TO, 1))) { |
@@ -144,6 +174,21 @@ struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) { | |||
144 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 174 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
145 | } | 175 | } |
146 | 176 | ||
177 | struct cmd_results *bar_colors_cmd_focused_statusline(int argc, char **argv) { | ||
178 | struct cmd_results *error = NULL; | ||
179 | if ((error = checkarg(argc, "focused_statusline", EXPECTED_EQUAL_TO, 1))) { | ||
180 | return error; | ||
181 | } | ||
182 | |||
183 | if ((error = add_color("focused_statusline", config->current_bar->colors.focused_statusline, argv[0]))) { | ||
184 | return error; | ||
185 | } else { | ||
186 | config->current_bar->colors.has_focused_statusline = true; | ||
187 | } | ||
188 | |||
189 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
190 | } | ||
191 | |||
147 | struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) { | 192 | struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) { |
148 | struct cmd_results *error = NULL; | 193 | struct cmd_results *error = NULL; |
149 | if ((error = checkarg(argc, "urgent_workspace", EXPECTED_EQUAL_TO, 3))) { | 194 | if ((error = checkarg(argc, "urgent_workspace", EXPECTED_EQUAL_TO, 3))) { |
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 458dc7c2..c21d28af 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.has_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.has_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.has_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)); |
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 | } |