From a55785993e8ef6aad38862cb1a9e1ccaad3c340d Mon Sep 17 00:00:00 2001 From: apassert <249084898+apassert@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:09:51 +0200 Subject: [PATCH] config: sort outputs by connector for deterministic fallback layout When no saved configuration matches the current output set, positions were assigned in hotplug/registration order. On hotplug races (e.g. reconnecting monitors through a KVM switch) outputs can appear in arbitrary order, producing a swapped left/right layout that then gets persisted to outputs.ron, poisoning all future reconnects. Sort outputs by connector name before generating fallback positions so the layout is deterministic regardless of arrival order. AI disclosure: implemented with the assistance of an LLM coding agent, directed, reviewed, and tested by the author. Signed-off-by: apassert <249084898+apassert@users.noreply.github.com> --- src/config/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index d3d2919b..4d2fad9b 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -541,7 +541,13 @@ impl Config { primary.config_mut().xwayland_primary = true; } } - for output in outputs.iter().filter(|o| o.mirroring().is_none()) { + // sort by connector name for a deterministic layout independent of hotplug order + let mut sorted_outputs = outputs + .iter() + .filter(|o| o.mirroring().is_none()) + .collect::>(); + sorted_outputs.sort_by_key(|o| o.name()); + for output in sorted_outputs { { let mut config = output.config_mut(); config.position = (w, 0);