From 9514a8c0e21a81909b31da89fa01020b12b2038a Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 12 Jul 2026 21:52:42 +0200 Subject: [PATCH] fix(client): correct Linux/Windows "Forwarded controller" copy for multi-controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The relm4 (Linux) and native (Windows) shells spawn punktfunk-session, which since the native-plane rework forwards ALL controllers by default — but the "Forwarded controller" settings dropdowns still described the pre-rework world ("Automatic (most recent)", "Exactly one controller is forwarded to the host"). The dropdown already lists every detected pad and wires set_pinned(None)=all / set_pinned(key)=single-player; this fixes only the misleading labels, subtitle, tooltip, and stale leading comments to match: Automatic forwards every real controller (each its own player); pick one to force single-player. cargo check -p punktfunk-client-linux green; Windows is windows-gated (pure string edits, CI windows.yml). Co-Authored-By: Claude Opus 4.8 (1M context) --- clients/linux/src/ui_settings.rs | 13 +++++++------ clients/windows/src/app/settings.rs | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/clients/linux/src/ui_settings.rs b/clients/linux/src/ui_settings.rs index 0fbe235d..2c4a5704 100644 --- a/clients/linux/src/ui_settings.rs +++ b/clients/linux/src/ui_settings.rs @@ -347,13 +347,14 @@ pub fn show( stream.add(stats_row.widget()); let input = adw::PreferencesGroup::builder().title("Input").build(); - // Which physical controller forwards as pad 0: automatic = the most recently connected - // real pad (Steam's virtual pad skipped). A pin is persisted by stable key - // (`Settings::forward_pad`), so it survives restarts — and disconnects: an offline - // pinned pad keeps its entry here instead of silently snapping back to Automatic. + // Controller forwarding: Automatic forwards EVERY real controller, each as its own pad + // (Steam's virtual pad skipped); pinning one restricts the session to that single + // controller (single-player). The pin is persisted by stable key (`Settings::forward_pad`), + // so it survives restarts — and disconnects: an offline pinned pad keeps its entry here + // instead of silently snapping back to Automatic. let pads = gamepads.pads(); let saved_pin = settings.borrow().forward_pad.clone(); - let mut pad_names = vec!["Automatic (most recent)".to_string()]; + let mut pad_names = vec!["Automatic (all controllers)".to_string()]; let mut pad_keys: Vec = Vec::new(); for p in &pads { let kind = p.kind_label(); @@ -379,7 +380,7 @@ pub fn show( if pads.is_empty() { "No controllers detected" } else { - "Exactly one controller is forwarded to the host" + "All controllers are forwarded, each as its own player; pick one to force single-player" }, &pad_names.iter().map(String::as_str).collect::>(), ); diff --git a/clients/windows/src/app/settings.rs b/clients/windows/src/app/settings.rs index 55d9eadb..eea03438 100644 --- a/clients/windows/src/app/settings.rs +++ b/clients/windows/src/app/settings.rs @@ -267,12 +267,13 @@ pub(crate) fn settings_page( ); // --- Input ----------------------------------------------------------------------------- - // Which physical controller forwards as pad 0: automatic = the most recently connected. - // Persisted by stable key (`Settings::forward_pad`, GTK parity) so the pin survives - // restarts AND reaches the spawned session binary, whose service applies the same key. + // Controller forwarding: Automatic forwards EVERY real controller, each as its own pad; + // pinning one restricts the session to that single controller (single-player). Persisted + // by stable key (`Settings::forward_pad`, GTK parity) so the pin survives restarts AND + // reaches the spawned session binary, whose service applies the same key. let pads = ctx.gamepad.pads(); let (fwd_names, fwd_i) = { - let mut names = vec!["Automatic (most recent)".to_string()]; + let mut names = vec!["Automatic (all controllers)".to_string()]; names.extend(pads.iter().map(|p| { let kind = p.kind_label(); if kind.is_empty() { @@ -309,8 +310,8 @@ pub(crate) fn settings_page( s.save(); }) .tooltip( - "Exactly one controller is forwarded to the host; \u{201C}Automatic\u{201D} \ - picks the most recently connected.", + "Every connected controller is forwarded, each as its own player. Pick one \ + to force single-player \u{2014} only it reaches the host.", ) }; let (pad_names, pad_i) = presets(GAMEPADS, |v| {