diff options
Diffstat (limited to 'swaybar/render.c')
-rw-r--r-- | swaybar/render.c | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/swaybar/render.c b/swaybar/render.c index 2eae997f..0b2ac438 100644 --- a/swaybar/render.c +++ b/swaybar/render.c | |||
@@ -8,6 +8,10 @@ | |||
8 | #include "swaybar/config.h" | 8 | #include "swaybar/config.h" |
9 | #include "swaybar/status_line.h" | 9 | #include "swaybar/status_line.h" |
10 | #include "swaybar/render.h" | 10 | #include "swaybar/render.h" |
11 | #ifdef ENABLE_TRAY | ||
12 | #include "swaybar/tray/tray.h" | ||
13 | #include "swaybar/tray/sni.h" | ||
14 | #endif | ||
11 | #include "log.h" | 15 | #include "log.h" |
12 | 16 | ||
13 | 17 | ||
@@ -297,6 +301,72 @@ void render(struct output *output, struct config *config, struct status_line *li | |||
297 | } | 301 | } |
298 | cairo_paint(cairo); | 302 | cairo_paint(cairo); |
299 | 303 | ||
304 | #ifdef ENABLE_TRAY | ||
305 | // Tray icons | ||
306 | uint32_t tray_padding = config->tray_padding; | ||
307 | unsigned int tray_width = window->width * window->scale; | ||
308 | const int item_size = (window->height * window->scale) - (2 * tray_padding); | ||
309 | |||
310 | if (item_size < 0) { | ||
311 | // Can't render items if the padding is too large | ||
312 | goto no_tray; | ||
313 | } | ||
314 | |||
315 | if (config->tray_output && strcmp(config->tray_output, output->name) != 0) { | ||
316 | goto no_tray; | ||
317 | } | ||
318 | |||
319 | for (int i = 0; i < tray->items->length; ++i) { | ||
320 | struct StatusNotifierItem *item = | ||
321 | tray->items->items[i]; | ||
322 | if (!item->image) { | ||
323 | continue; | ||
324 | } | ||
325 | |||
326 | struct sni_icon_ref *render_item = NULL; | ||
327 | int j; | ||
328 | for (j = i; j < output->items->length; ++j) { | ||
329 | struct sni_icon_ref *ref = | ||
330 | output->items->items[j]; | ||
331 | if (ref->ref == item) { | ||
332 | render_item = ref; | ||
333 | break; | ||
334 | } else { | ||
335 | sni_icon_ref_free(ref); | ||
336 | list_del(output->items, j); | ||
337 | } | ||
338 | } | ||
339 | |||
340 | if (!render_item) { | ||
341 | render_item = sni_icon_ref_create(item, item_size); | ||
342 | list_add(output->items, render_item); | ||
343 | } else if (item->dirty) { | ||
344 | // item needs re-render | ||
345 | sni_icon_ref_free(render_item); | ||
346 | output->items->items[j] = render_item = | ||
347 | sni_icon_ref_create(item, item_size); | ||
348 | } | ||
349 | |||
350 | tray_width -= tray_padding; | ||
351 | tray_width -= item_size; | ||
352 | |||
353 | cairo_set_source_surface(cairo, render_item->icon, tray_width, tray_padding); | ||
354 | cairo_rectangle(cairo, tray_width, tray_padding, item_size, item_size); | ||
355 | cairo_fill(cairo); | ||
356 | |||
357 | item->dirty = false; | ||
358 | } | ||
359 | |||
360 | |||
361 | if (tray_width != window->width * window->scale) { | ||
362 | tray_width -= tray_padding; | ||
363 | } | ||
364 | |||
365 | no_tray: | ||
366 | #else | ||
367 | const int tray_width = window->width * window->scale; | ||
368 | #endif | ||
369 | |||
300 | // Command output | 370 | // Command output |
301 | if (is_focused) { | 371 | if (is_focused) { |
302 | cairo_set_source_u32(cairo, config->colors.focused_statusline); | 372 | cairo_set_source_u32(cairo, config->colors.focused_statusline); |
@@ -309,12 +379,11 @@ void render(struct output *output, struct config *config, struct status_line *li | |||
309 | if (line->protocol == TEXT) { | 379 | if (line->protocol == TEXT) { |
310 | get_text_size(window->cairo, window->font, &width, &height, | 380 | get_text_size(window->cairo, window->font, &width, &height, |
311 | window->scale, config->pango_markup, "%s", line->text_line); | 381 | window->scale, config->pango_markup, "%s", line->text_line); |
312 | cairo_move_to(cairo, (window->width * window->scale) | 382 | cairo_move_to(cairo, tray_width - margin - width, margin); |
313 | - margin - width, margin); | ||
314 | pango_printf(window->cairo, window->font, window->scale, | 383 | pango_printf(window->cairo, window->font, window->scale, |
315 | config->pango_markup, "%s", line->text_line); | 384 | config->pango_markup, "%s", line->text_line); |
316 | } else if (line->protocol == I3BAR && line->block_line) { | 385 | } else if (line->protocol == I3BAR && line->block_line) { |
317 | double pos = (window->width * window->scale) - 0.5; | 386 | double pos = tray_width - 0.5; |
318 | bool edge = true; | 387 | bool edge = true; |
319 | for (i = line->block_line->length - 1; i >= 0; --i) { | 388 | for (i = line->block_line->length - 1; i >= 0; --i) { |
320 | struct status_block *block = line->block_line->items[i]; | 389 | struct status_block *block = line->block_line->items[i]; |