diff --git a/src/Bar.zig b/src/Bar.zig index b19bd3a..66c8b54 100644 --- a/src/Bar.zig +++ b/src/Bar.zig @@ -319,8 +319,6 @@ pub fn draw(bar: *Bar) !void { // Attach the buffer to the surface const surfaces = bar.surfaces orelse return error.NoSurfaces; const wl_surface = surfaces.wl_surface; - // sync_next_commit ensures frame-perfect application - surfaces.river_shell_surface.syncNextCommit(); wl_surface.setBufferScale(scale); wl_surface.attach(buffer.wl_buffer, 0, 0); wl_surface.damageBuffer(0, 0, render_width, render_height); diff --git a/src/main.zig b/src/main.zig index ba9eceb..078db64 100644 --- a/src/main.zig +++ b/src/main.zig @@ -124,9 +124,16 @@ fn run(wl_display: *wl.Display, context: *Context) !void { }; while (true) { - const errno = wl_display.flush(); - if (errno != .SUCCESS) { - fatal("wl_display flush failed: E{s}", .{@tagName(errno)}); + const flush_errno = wl_display.flush(); + if (flush_errno == .AGAIN) { + // Send buffer is full; ask poll to wake us when the socket is writable + // again so we can retry the flush at the top of the next iteration. + pollfds[poll_wayland].events = posix.POLL.IN | posix.POLL.OUT; + } else if (flush_errno != .SUCCESS) { + fatal("wl_display flush failed: E{s}", .{@tagName(flush_errno)}); + } else { + // Flush succeeded; stop polling for writability. + pollfds[poll_wayland].events = posix.POLL.IN; } // Get the number of milliseconds to the top of the next second