aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-06-09 17:04:38 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-06-09 17:04:38 +0200
commit24b1a566de336e08695918680eecf9bb8d5eac27 (patch)
treec152d4e0ae98a5e5abb6e71f9c73a5c309ea8e19
parent7c094420edb4892dc181f39bad0c4ec641444f9c (diff)
downloadriver-24b1a566de336e08695918680eecf9bb8d5eac27.tar.gz
river-24b1a566de336e08695918680eecf9bb8d5eac27.tar.xz
transactions: revert c0d7e71
-rw-r--r--river/Output.zig6
-rw-r--r--river/Root.zig65
-rw-r--r--river/View.zig46
-rw-r--r--river/VoidView.zig2
-rw-r--r--river/XdgToplevel.zig6
-rw-r--r--river/XwaylandView.zig10
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