diff options
-rw-r--r-- | include/swaybar/bar.h | 1 | ||||
-rw-r--r-- | swaybar/bar.c | 3 | ||||
-rw-r--r-- | swaybar/tray/tray.c | 23 |
3 files changed, 26 insertions, 1 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 6f2a7083..96c4365c 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h | |||
@@ -29,6 +29,7 @@ struct output { | |||
29 | char *name; | 29 | char *name; |
30 | int idx; | 30 | int idx; |
31 | bool focused; | 31 | bool focused; |
32 | bool active; | ||
32 | }; | 33 | }; |
33 | 34 | ||
34 | struct workspace { | 35 | struct workspace { |
diff --git a/swaybar/bar.c b/swaybar/bar.c index 9cd17303..49a698b7 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c | |||
@@ -295,9 +295,12 @@ void bar_run(struct bar *bar) { | |||
295 | for (i = 0; i < bar->outputs->length; ++i) { | 295 | for (i = 0; i < bar->outputs->length; ++i) { |
296 | struct output *output = bar->outputs->items[i]; | 296 | struct output *output = bar->outputs->items[i]; |
297 | if (window_prerender(output->window) && output->window->cairo) { | 297 | if (window_prerender(output->window) && output->window->cairo) { |
298 | output->active = true; | ||
298 | render(output, bar->config, bar->status); | 299 | render(output, bar->config, bar->status); |
299 | window_render(output->window); | 300 | window_render(output->window); |
300 | wl_display_flush(output->registry->display); | 301 | wl_display_flush(output->registry->display); |
302 | } else { | ||
303 | output->active = false; | ||
301 | } | 304 | } |
302 | } | 305 | } |
303 | } | 306 | } |
diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index 3c5492f7..a5248f6c 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c | |||
@@ -372,6 +372,24 @@ uint32_t tray_render(struct output *output, struct config *config) { | |||
372 | return tray_width; | 372 | return tray_width; |
373 | } | 373 | } |
374 | 374 | ||
375 | bool clean_item = false; | ||
376 | // Clean item if only one output has tray or this is the last output | ||
377 | if (swaybar.outputs->length == 1 || config->tray_output || output->idx == swaybar.outputs->length-1) { | ||
378 | clean_item = true; | ||
379 | // More trickery is needed in case you plug off secondary outputs on live | ||
380 | } else { | ||
381 | int active_outputs = 0; | ||
382 | for (int i = 0; i < swaybar.outputs->length; i++) { | ||
383 | struct output *output = swaybar.outputs->items[i]; | ||
384 | if (output->active) { | ||
385 | active_outputs++; | ||
386 | } | ||
387 | } | ||
388 | if (active_outputs == 1) { | ||
389 | clean_item = true; | ||
390 | } | ||
391 | } | ||
392 | |||
375 | for (int i = 0; i < tray->items->length; ++i) { | 393 | for (int i = 0; i < tray->items->length; ++i) { |
376 | struct StatusNotifierItem *item = | 394 | struct StatusNotifierItem *item = |
377 | tray->items->items[i]; | 395 | tray->items->items[i]; |
@@ -398,6 +416,7 @@ uint32_t tray_render(struct output *output, struct config *config) { | |||
398 | list_add(output->items, render_item); | 416 | list_add(output->items, render_item); |
399 | } else if (item->dirty) { | 417 | } else if (item->dirty) { |
400 | // item needs re-render | 418 | // item needs re-render |
419 | sway_log(L_DEBUG, "Redrawing item %d for output %d", i, output->idx); | ||
401 | sni_icon_ref_free(render_item); | 420 | sni_icon_ref_free(render_item); |
402 | output->items->items[j] = render_item = | 421 | output->items->items[j] = render_item = |
403 | sni_icon_ref_create(item, item_size); | 422 | sni_icon_ref_create(item, item_size); |
@@ -413,7 +432,9 @@ uint32_t tray_render(struct output *output, struct config *config) { | |||
413 | cairo_fill(cairo); | 432 | cairo_fill(cairo); |
414 | cairo_set_operator(cairo, op); | 433 | cairo_set_operator(cairo, op); |
415 | 434 | ||
416 | item->dirty = false; | 435 | if (clean_item) { |
436 | item->dirty = false; | ||
437 | } | ||
417 | } | 438 | } |
418 | 439 | ||
419 | 440 | ||