From 870e5be2a63d3b7e977ff15d4214a1bd56c7d7eb Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Mon, 6 Jan 2025 19:47:12 +0100 Subject: [PATCH] kms: Use scaled sizes for placing new outputs --- src/backend/kms/device.rs | 12 +++--------- src/backend/kms/mod.rs | 2 +- src/config/mod.rs | 11 +++++++++++ src/shell/mod.rs | 2 +- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index 4ba95a1a..aa932230 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -277,7 +277,7 @@ impl State { ) { Ok((output, should_expose)) => { if should_expose { - w += output.config().transformed_size().w as u32; + w += output.geometry().size.w as u32; wl_outputs.push(output.clone()); } device.outputs.insert(conn, output); @@ -345,13 +345,7 @@ impl State { .find_map(|(crtc, surface)| (surface.connector == conn).then_some(crtc)) .cloned() { - let surface = device.surfaces.remove(&crtc).unwrap(); - if surface.output.mirroring().is_none() { - // TODO: move up later outputs? - w = w.saturating_sub( - surface.output.config().transformed_size().w as u32, - ); - } + device.surfaces.remove(&crtc).unwrap(); } if !changes.added.iter().any(|(c, _)| c == &conn) { @@ -376,7 +370,7 @@ impl State { ) { Ok((output, should_expose)) => { if should_expose { - w += output.config().transformed_size().w as u32; + w += output.geometry().size.w as u32; outputs_added.push(output.clone()); } diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index 6ad43fd1..0b350e18 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -635,7 +635,7 @@ impl KmsState { startup_done.clone(), )?; if output.mirroring().is_none() { - w += output.config().transformed_size().w as u32; + w += output.geometry().size.w as u32; } } } diff --git a/src/config/mod.rs b/src/config/mod.rs index edf13d30..bfd4e73f 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -3,6 +3,7 @@ use crate::{ shell::Shell, state::{BackendData, State}, + utils::prelude::OutputExt, wayland::protocols::{ output_configuration::OutputConfigurationState, workspace::WorkspaceUpdateGuard, }, @@ -476,6 +477,16 @@ impl Config { output_state.update(); self.write_outputs(output_state.outputs()); } else { + // we don't have a config, so lets generate somewhat sane positions + let mut w = 0; + for output in outputs.iter().filter(|o| o.mirroring().is_none()) { + { + let mut config = output.config_mut(); + config.position = (w, 0); + } + w += output.geometry().size.w as u32; + } + if let Err(err) = backend.apply_config_for_outputs( false, loop_handle, diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 5824156e..6b722089 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -3617,7 +3617,7 @@ impl Shell { .unwrap() .take() .unwrap_or(ManagedLayer::Floating); - + match previous_layer { ManagedLayer::Tiling if workspace.tiling_enabled => { let focus_stack = workspace.focus_stack.get(seat);