From 82f1393cbb7383179eab2d10ff679a975d1f5c43 Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 19 Sep 2018 11:37:24 +0200 Subject: swaybar: handle hotplugging Don't kill and respawn swaybars on hotplug. --- swaybar/render.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'swaybar/render.c') diff --git a/swaybar/render.c b/swaybar/render.c index 97690338..1f2dcc30 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -1,4 +1,5 @@ #define _POSIX_C_SOURCE 200809L +#include #include #include #include @@ -480,6 +481,8 @@ static uint32_t render_to_cairo(cairo_t *cairo, } void render_frame(struct swaybar *bar, struct swaybar_output *output) { + assert(output->surface != NULL); + struct swaybar_hotspot *hotspot, *tmp; wl_list_for_each_safe(hotspot, tmp, &output->hotspots, link) { if (hotspot->destroy) { -- cgit v1.2.3 From 8a5ff5a4dbcefabaaeae98c1c53befcb986ba117 Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 20 Sep 2018 19:31:03 +0200 Subject: swaybar: don't wl_display_roundtrip on each frame This was the source of numerous bugs, from hotplug events not being received to segfaults because wl_display_roundtrip was making the bar process unplug events while blocking in an iteration over all outputs. --- swaybar/bar.c | 1 + swaybar/render.c | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'swaybar/render.c') diff --git a/swaybar/bar.c b/swaybar/bar.c index 49a8ece1..69069f40 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -558,6 +558,7 @@ void bar_run(struct swaybar *bar) { } while (1) { event_loop_poll(); + wl_display_flush(bar->display); } } diff --git a/swaybar/render.c b/swaybar/render.c index 1f2dcc30..26db80cb 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -510,7 +510,6 @@ void render_frame(struct swaybar *bar, struct swaybar_output *output) { // TODO: this could infinite loop if the compositor assigns us a // different height than what we asked for wl_surface_commit(output->surface); - wl_display_roundtrip(bar->display); } else if (height > 0) { // Replay recording into shm and send it off output->current_buffer = get_next_buffer(bar->shm, @@ -536,7 +535,6 @@ void render_frame(struct swaybar *bar, struct swaybar_output *output) { wl_surface_damage(output->surface, 0, 0, output->width, output->height); wl_surface_commit(output->surface); - wl_display_roundtrip(bar->display); } cairo_surface_destroy(recorder); cairo_destroy(cairo); -- cgit v1.2.3