tearing-control: minor cleanups/style improvements
This commit also tweaks the riverctl interface to make the global allow-tearing option apply only to tearing-control-v1 hints from clients. The global option no longer affects tearing/no-tearing rules explicitly created by the user.
This commit is contained in:
parent
066baa5753
commit
f82b2f5816
@ -307,11 +307,10 @@ matches everything while _\*\*_ and the empty string are invalid.
|
|||||||
- *fullscreen*: Make the view fullscreen. Applies only to new views.
|
- *fullscreen*: Make the view fullscreen. Applies only to new views.
|
||||||
- *no-fullscreen*: Don't make the view fullscreen. Applies only to
|
- *no-fullscreen*: Don't make the view fullscreen. Applies only to
|
||||||
new views.
|
new views.
|
||||||
- *tearing*: Enable tearing for view when fullscreen regardless of the
|
- *tearing*: Allow the view to tear when fullscreen regardless of the
|
||||||
supplied tearing hint. Note that tearing additionally requires setting the
|
view's preference. Applies to new and existing views.
|
||||||
*allow-tearing* server option. Applies to new and existing views.
|
- *no-tearing*: Disable tearing for the view regardless of the view's
|
||||||
- *no-tearing*: Disable tearing for view regardless of the supplied
|
preference. Applies to new and existing views.
|
||||||
tearing hint. Applies to new and existing views.
|
|
||||||
|
|
||||||
Both *float* and *no-float* rules are added to the same list,
|
Both *float* and *no-float* rules are added to the same list,
|
||||||
which means that adding a *no-float* rule with the same arguments
|
which means that adding a *no-float* rule with the same arguments
|
||||||
@ -371,7 +370,8 @@ matches everything while _\*\*_ and the empty string are invalid.
|
|||||||
default-attach-mode if any.
|
default-attach-mode if any.
|
||||||
|
|
||||||
*allow-tearing* *enabled*|*disabled*
|
*allow-tearing* *enabled*|*disabled*
|
||||||
Allow windows to tear if requested by either the program or the user.
|
Allow fullscreen views to tear if requested by the view. See also the
|
||||||
|
*tearing* rule to force enable tearing for specific views.
|
||||||
|
|
||||||
*background-color* _0xRRGGBB_|_0xRRGGBBAA_
|
*background-color* _0xRRGGBB_|_0xRRGGBBAA_
|
||||||
Set the background color.
|
Set the background color.
|
||||||
|
@ -31,11 +31,6 @@ const Mode = @import("Mode.zig");
|
|||||||
const RuleList = @import("rule_list.zig").RuleList;
|
const RuleList = @import("rule_list.zig").RuleList;
|
||||||
const View = @import("View.zig");
|
const View = @import("View.zig");
|
||||||
|
|
||||||
pub const AllowTearing = enum {
|
|
||||||
disabled,
|
|
||||||
enabled,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub const AttachMode = union(enum) {
|
pub const AttachMode = union(enum) {
|
||||||
top,
|
top,
|
||||||
bottom,
|
bottom,
|
||||||
@ -73,8 +68,8 @@ pub const Dimensions = struct {
|
|||||||
height: u31,
|
height: u31,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Whether to allow tearing page flips if a view requests it.
|
/// Whether to allow tearing page flips when fullscreen if a view requests it.
|
||||||
allow_tearing: AllowTearing = .disabled,
|
allow_tearing: bool = false,
|
||||||
|
|
||||||
/// Color of background in RGBA with premultiplied alpha (alpha should only affect nested sessions)
|
/// Color of background in RGBA with premultiplied alpha (alpha should only affect nested sessions)
|
||||||
background_color: [4]f32 = [_]f32{ 0.0, 0.16862745, 0.21176471, 1.0 }, // Solarized base03
|
background_color: [4]f32 = [_]f32{ 0.0, 0.16862745, 0.21176471, 1.0 }, // Solarized base03
|
||||||
|
@ -557,18 +557,21 @@ fn renderAndCommit(output: *Output, scene_output: *wlr.SceneOutput) !void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output.allowTearing() and server.config.allow_tearing == .enabled) {
|
if (output.current.fullscreen) |fullscreen| {
|
||||||
state.tearing_page_flip = true;
|
if (fullscreen.allowTearing()) {
|
||||||
|
state.tearing_page_flip = true;
|
||||||
if (!output.wlr_output.testState(&state)) {
|
if (!output.wlr_output.testState(&state)) {
|
||||||
log.debug("tearing page flip test failed for {s}, retrying without tearing", .{output.wlr_output.name});
|
log.debug("tearing page flip test failed for {s}, retrying without tearing", .{
|
||||||
state.tearing_page_flip = false;
|
output.wlr_output.name,
|
||||||
|
});
|
||||||
|
state.tearing_page_flip = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!output.wlr_output.commitState(&state)) return error.CommitFailed;
|
if (!output.wlr_output.commitState(&state)) return error.CommitFailed;
|
||||||
|
|
||||||
if (output.gamma_dirty) output.gamma_dirty = false;
|
output.gamma_dirty = false;
|
||||||
|
|
||||||
if (server.lock_manager.state == .locked or
|
if (server.lock_manager.state == .locked or
|
||||||
(server.lock_manager.state == .waiting_for_lock_surfaces and output.locked_content.node.enabled) or
|
(server.lock_manager.state == .waiting_for_lock_surfaces and output.locked_content.node.enabled) or
|
||||||
@ -642,14 +645,6 @@ fn setTitle(output: Output) void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn allowTearing(output: *Output) bool {
|
|
||||||
if (output.current.fullscreen) |fullscreen_view| {
|
|
||||||
return fullscreen_view.allowTearing();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn handleLayoutNamespaceChange(output: *Output) void {
|
pub fn handleLayoutNamespaceChange(output: *Output) void {
|
||||||
// The user changed the layout namespace of this output. Try to find a
|
// The user changed the layout namespace of this output. Try to find a
|
||||||
// matching layout.
|
// matching layout.
|
||||||
|
@ -61,8 +61,8 @@ const AttachRelativeMode = enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const TearingMode = enum {
|
const TearingMode = enum {
|
||||||
override_false,
|
no_tearing,
|
||||||
override_true,
|
tearing,
|
||||||
window_hint,
|
window_hint,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -184,7 +184,6 @@ foreign_toplevel_handle: ForeignToplevelHandle = .{},
|
|||||||
/// Connector name of the output this view occupied before an evacuation.
|
/// Connector name of the output this view occupied before an evacuation.
|
||||||
output_before_evac: ?[]const u8 = null,
|
output_before_evac: ?[]const u8 = null,
|
||||||
|
|
||||||
// Current tearing mode of the view. Defaults to using the window tearing hint.
|
|
||||||
tearing_mode: TearingMode = .window_hint,
|
tearing_mode: TearingMode = .window_hint,
|
||||||
|
|
||||||
pub fn create(impl: Impl) error{OutOfMemory}!*View {
|
pub fn create(impl: Impl) error{OutOfMemory}!*View {
|
||||||
@ -582,14 +581,19 @@ pub fn getAppId(view: View) ?[*:0]const u8 {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return true if the view can currently tear.
|
/// Return true if tearing should be allowed for the view.
|
||||||
pub fn allowTearing(view: *View) bool {
|
pub fn allowTearing(view: *View) bool {
|
||||||
switch (view.tearing_mode) {
|
switch (view.tearing_mode) {
|
||||||
TearingMode.override_false => return false,
|
.no_tearing => return false,
|
||||||
TearingMode.override_true => return true,
|
.tearing => return true,
|
||||||
TearingMode.window_hint => if (view.rootSurface()) |root_surface| {
|
.window_hint => {
|
||||||
return server.tearing_control_manager.hintFromSurface(root_surface) == .@"async";
|
if (server.config.allow_tearing) {
|
||||||
} else return false,
|
if (view.rootSurface()) |root_surface| {
|
||||||
|
return server.tearing_control_manager.hintFromSurface(root_surface) == .@"async";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +666,7 @@ pub fn map(view: *View) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (server.config.rules.tearing.match(view)) |tearing| {
|
if (server.config.rules.tearing.match(view)) |tearing| {
|
||||||
view.tearing_mode = if (tearing) .override_true else .override_false;
|
view.tearing_mode = if (tearing) .tearing else .no_tearing;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.config.rules.dimensions.match(view)) |dimensions| {
|
if (server.config.rules.dimensions.match(view)) |dimensions| {
|
||||||
|
@ -31,8 +31,11 @@ pub fn allowTearing(
|
|||||||
) Error!void {
|
) Error!void {
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
server.config.allow_tearing = std.meta.stringToEnum(Config.AllowTearing, args[1]) orelse
|
|
||||||
|
const arg = std.meta.stringToEnum(enum { enabled, disabled }, args[1]) orelse
|
||||||
return Error.UnknownOption;
|
return Error.UnknownOption;
|
||||||
|
|
||||||
|
server.config.allow_tearing = arg == .enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn borderWidth(
|
pub fn borderWidth(
|
||||||
|
@ -211,7 +211,7 @@ fn apply_tearing_rules() void {
|
|||||||
if (view.destroying) continue;
|
if (view.destroying) continue;
|
||||||
|
|
||||||
if (server.config.rules.tearing.match(view)) |tearing| {
|
if (server.config.rules.tearing.match(view)) |tearing| {
|
||||||
view.tearing_mode = if (tearing) .override_true else .override_false;
|
view.tearing_mode = if (tearing) .tearing else .no_tearing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user