summaryrefslogtreecommitdiffstats
path: root/swaybar/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar/render.c')
-rw-r--r--swaybar/render.c75
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
365no_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];