From 24b1a566de336e08695918680eecf9bb8d5eac27 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Tue, 9 Jun 2020 17:04:38 +0200 Subject: [PATCH] transactions: revert c0d7e71 --- river/Output.zig | 6 ++-- river/Root.zig | 65 ++++++++---------------------------------- river/View.zig | 46 ++++++++---------------------- river/VoidView.zig | 2 +- river/XdgToplevel.zig | 6 ++-- river/XwaylandView.zig | 10 +++---- 6 files changed, 36 insertions(+), 99 deletions(-) diff --git a/river/Output.zig b/river/Output.zig index c15bb1f..d97ebfb 100644 --- a/river/Output.zig +++ b/river/Output.zig @@ -334,8 +334,8 @@ pub fn layoutMasterStack(self: *Self, visible_count: u32, output_tags: u32, posi new_box.width -= delta_size; new_box.height -= delta_size; - // Set the view's next box to the new dimensions - view.next_box = new_box; + // Set the view's pending box to the new dimensions + view.pending_box = new_box; i += 1; } @@ -391,7 +391,7 @@ pub fn layoutFull(self: *Self, visible_count: u32, output_tags: u32) void { .height = layout_height, }; - view.next_box = new_box; + view.pending_box = new_box; i += 1; } diff --git a/river/Root.zig b/river/Root.zig index b034f39..11ec344 100644 --- a/river/Root.zig +++ b/river/Root.zig @@ -132,63 +132,27 @@ fn startTransaction(self: *Self) void { var view_it = ViewStack(View).iterator(output.views.first, std.math.maxInt(u32)); while (view_it.next()) |view_node| { const view = &view_node.view; + // Clear the serial in case this transaction is interrupting a prior one. + view.pending_serial = null; - switch (view.configureAction()) { - .override => { - view.configure(); - - // Some clients do not ack a configure if the requested - // size is the same as their current size. Configures of - // this nature may be sent if a pending configure is - // interrupted by a configure returning to the original - // size. - if (view.pending_box.?.width == view.current_box.width and - view.pending_box.?.height == view.current_box.height) - { - view.pending_serial = null; - } else { - std.debug.assert(view.pending_serial != null); - self.pending_configures += 1; - } - }, - .new_configure => { - view.configure(); - self.pending_configures += 1; - std.debug.assert(view.pending_serial != null); - }, - .old_configure => { - self.pending_configures += 1; - if (view.next_box) |next_box| { - view.pending_box.?.x = next_box.x; - view.pending_box.?.y = next_box.y; - view.next_box = null; - } - }, - .noop => { - if (view.next_box) |next_box| { - view.pending_box = view.next_box; - view.next_box = null; - } - std.debug.assert(view.pending_serial == null); - }, - } - - // If there is a saved buffer present, then this transaction is - // interrupting a previous transaction and we should keep the old - // buffer. - if (view.stashed_buffer == null) { - view.stashBuffer(); + if (view.needsConfigure()) { + view.configure(); + self.pending_configures += 1; // We save the current buffer, so we can send an early // frame done event to give the client a head start on // redrawing. view.sendFrameDone(); } + + // If there is a saved buffer present, then this transaction is interrupting + // a previous transaction and we should keep the old buffer. + if (view.stashed_buffer == null) { + view.stashBuffer(); + } } } - // If there are views that need configures, start a timer and wait for - // configure events before committing. if (self.pending_configures > 0) { Log.Debug.log( "Started transaction with {} pending configures.", @@ -201,10 +165,6 @@ fn startTransaction(self: *Self) void { self.commitTransaction(); } } else { - // No views need configures, clear the current timer in case we are - // interrupting another transaction and commit. - if (c.wl_event_source_timer_update(self.transaction_timer, 0) < 0) - Log.Error.log("Error disarming timer", .{}); self.commitTransaction(); } } @@ -223,7 +183,7 @@ pub fn notifyConfigured(self: *Self) void { self.pending_configures -= 1; if (self.pending_configures == 0) { // Disarm the timer, as we didn't timeout - if (c.wl_event_source_timer_update(self.transaction_timer, 0) < 0) + if (c.wl_event_source_timer_update(self.transaction_timer, 0) == -1) Log.Error.log("Error disarming timer", .{}); self.commitTransaction(); } @@ -263,7 +223,6 @@ fn commitTransaction(self: *Self) void { const view = &view_node.view; // Ensure that all pending state is cleared view.pending_serial = null; - std.debug.assert(view.next_box == null); if (view.pending_box) |state| { view.current_box = state; view.pending_box = null; diff --git a/river/View.zig b/river/View.zig index dcb6027..af5d9b9 100644 --- a/river/View.zig +++ b/river/View.zig @@ -55,13 +55,8 @@ focused: bool, /// The current output-relative coordinates and dimensions of the view current_box: Box, - -/// The dimensions sent with the most recent configure pending_box: ?Box, -/// The dimensions to be used for the next configure -next_box: ?Box, - /// The dimensions the view would have taken if we didn't force it to tile natural_width: u32, natural_height: u32, @@ -116,40 +111,23 @@ pub fn deinit(self: Self) void { } } -/// Returns true if a configure needs to be sent to ensure the next_box is -/// applied correctly. -pub fn configureAction(self: Self) enum { override, new_configure, old_configure, noop } { - // If we have a pending box, check if the next box is different from the - // pending box. If we do not have a pending box, check if the next box is - // different from the current box. - if (self.pending_box) |pending_box| - if (self.next_box) |next_box| { - if (next_box.width != pending_box.width or next_box.height != pending_box.height) { - return .override; - } else { - return .old_configure; - } - }; - - if (self.next_box) |next_box| - if (next_box.width != self.current_box.width or next_box.height != self.current_box.height) - return .new_configure; - - return .noop; +pub fn needsConfigure(self: Self) bool { + if (self.pending_box) |pending_box| { + return pending_box.width != self.current_box.width or + pending_box.height != self.current_box.height; + } else { + return false; + } } -/// Tell the client to assume the size of next_box. Set pending_box to -/// next_box and next_box to null. -pub fn configure(self: *Self) void { - if (self.next_box) |next_box| { +pub fn configure(self: Self) void { + if (self.pending_box) |pending_box| { switch (self.impl) { - .xdg_toplevel => |xdg_toplevel| xdg_toplevel.configure(next_box), - .xwayland_view => |xwayland_view| xwayland_view.configure(next_box), + .xdg_toplevel => |xdg_toplevel| xdg_toplevel.configure(pending_box), + .xwayland_view => |xwayland_view| xwayland_view.configure(pending_box), } - self.pending_box = next_box; - self.next_box = null; } else { - Log.Error.log("configure called on View with null next_box", .{}); + Log.Error.log("Configure called on a View with no pending box", .{}); } } diff --git a/river/VoidView.zig b/river/VoidView.zig index 4f71d81..fca2321 100644 --- a/river/VoidView.zig +++ b/river/VoidView.zig @@ -23,7 +23,7 @@ const c = @import("c.zig"); const Box = @import("Box.zig"); -pub fn configure(self: Self, box: Box) void { +pub fn configure(self: Self, pending_box: Box) void { unreachable; } diff --git a/river/XdgToplevel.zig b/river/XdgToplevel.zig index 4726146..88e7dce 100644 --- a/river/XdgToplevel.zig +++ b/river/XdgToplevel.zig @@ -63,11 +63,11 @@ pub fn init(self: *Self, view: *View, wlr_xdg_surface: *c.wlr_xdg_surface) void c.wl_signal_add(&self.wlr_xdg_surface.events.unmap, &self.listen_unmap); } -pub fn configure(self: Self, box: Box) void { +pub fn configure(self: Self, pending_box: Box) void { self.view.pending_serial = c.wlr_xdg_toplevel_set_size( self.wlr_xdg_surface, - box.width, - box.height, + pending_box.width, + pending_box.height, ); } diff --git a/river/XwaylandView.zig b/river/XwaylandView.zig index bb0b07a..681d9d1 100644 --- a/river/XwaylandView.zig +++ b/river/XwaylandView.zig @@ -58,13 +58,13 @@ pub fn init(self: *Self, view: *View, wlr_xwayland_surface: *c.wlr_xwayland_surf } /// Tell the client to take a new size -pub fn configure(self: Self, box: Box) void { +pub fn configure(self: Self, pending_box: Box) void { c.wlr_xwayland_surface_configure( self.wlr_xwayland_surface, - @intCast(i16, box.x), - @intCast(i16, box.y), - @intCast(u16, box.width), - @intCast(u16, box.height), + @intCast(i16, pending_box.x), + @intCast(i16, pending_box.y), + @intCast(u16, pending_box.width), + @intCast(u16, pending_box.height), ); // Xwayland surfaces don't use serials, so we will just assume they have // configured the next time they commit. Set pending serial to a dummy