aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--river/Output.zig34
1 files changed, 22 insertions, 12 deletions
diff --git a/river/Output.zig b/river/Output.zig
index 35b98ea..b996da6 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -194,19 +194,29 @@ pub fn create(wlr_output: *wlr.Output) !void {
if (!wlr_output.initRender(server.allocator, server.renderer)) return error.InitRenderFailed;
- var state = wlr.Output.State.init();
- defer state.finish();
-
- state.setEnabled(true);
-
+ // If the list of modes for the output is empty or if no mode in the list of modes works,
+ // we can't enable the output automatically.
+ // It will stay disabled unless the user configures a custom mode which works.
if (wlr_output.preferredMode()) |preferred_mode| {
+ var state = wlr.Output.State.init();
+ defer state.finish();
+
state.setMode(preferred_mode);
+ state.setEnabled(true);
+
+ if (!wlr_output.commitState(&state)) {
+ // It is important to try other modes if the preferred mode fails
+ // which is reported to be helpful in practice with e.g. multiple
+ // high resolution monitors connected through a usb dock.
+ var it = wlr_output.modes.iterator(.forward);
+ while (it.next()) |mode| {
+ if (mode == preferred_mode) continue;
+ state.setMode(mode);
+ if (wlr_output.commitState(&state)) break;
+ }
+ }
}
- // Ignore failure here and create the Output anyways.
- // It will stay disabled unless the user configures a custom mode which may work.
- _ = wlr_output.commitState(&state);
-
var width: c_int = undefined;
var height: c_int = undefined;
wlr_output.effectiveResolution(&width, &height);
@@ -283,7 +293,7 @@ pub fn create(wlr_output: *wlr.Output) !void {
output.active_link.init();
server.root.all_outputs.append(output);
- output.handleEnable();
+ output.handleEnableDisable();
}
pub fn layerSurfaceTree(self: Self, layer: zwlr.LayerShellV1.Layer) *wlr.SceneTree {
@@ -390,7 +400,7 @@ fn handleRequestState(listener: *wl.Listener(*wlr.Output.event.RequestState), ev
}
if (event.state.committed.enabled) {
- output.handleEnable();
+ output.handleEnableDisable();
}
if (event.state.committed.mode) {
@@ -401,7 +411,7 @@ fn handleRequestState(listener: *wl.Listener(*wlr.Output.event.RequestState), ev
}
}
-fn handleEnable(output: *Self) void {
+fn handleEnableDisable(output: *Self) void {
// We can't assert the current state of normal_content/locked_content
// here as this output may be newly created.
if (output.wlr_output.enabled) {