feat(client/linux): settings revamp on the Apple category map + parity pieces
apple / swift (push) Successful in 1m19s
apple / screenshots (push) Successful in 6m23s
ci / web (push) Successful in 45s
ci / docs-site (push) Successful in 50s
ci / bench (push) Successful in 7m5s
decky / build-publish (push) Successful in 20s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 10s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 10s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 11s
docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 10s
arch / build-publish (push) Successful in 12m23s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 11s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m4s
android / android (push) Successful in 17m51s
deb / build-publish (push) Successful in 12m9s
flatpak / build-publish (push) Successful in 7m3s
deb / build-publish-host (push) Successful in 12m19s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Failing after 5m18s
ci / rust (push) Successful in 26m40s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 16m3s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 15m49s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Failing after 6m11s
docker / deploy-docs (push) Successful in 25s
windows / build (aarch64-pc-windows-msvc) (push) Failing after 5m34s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 8m58s

One page of everything becomes the cross-client map (the Apple 2026-07
revamp, same shape the Windows client just adopted): General / Display /
Input / Audio / Controllers pages with per-field captions, dynamic where the
meaning depends on the selection (touch mode, resolution, codec). About
stays in the primary menu per GNOME convention; settings search is on.
Combo-row captions are deliberately ONE line — a wrapped subtitle's natural
width crushes the selected-value label into an ellipsis.

New controls, all with existing plumbing: 10-bit HDR (hdr_enabled was
advertised but had no UI), PyroWave in the codec picker (preference-only,
Linux decodes it), a detected-controllers list, auto-wake on connect — gated
at the AppMsg::WakeConnect entry (off: no packet, no wake-and-wait fallback;
the card menu's explicit Wake stays), invert scroll (session plumbing landed
with the Windows parity series), and the GPU + audio endpoint pickers, fed
by a startup worker-thread probe (AppModel::probes) and hidden while empty.

The screenshot harness gains PUNKTFUNK_SHOT_SETTINGS_PAGE to open the
capture on a specific page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 19:32:58 +02:00
parent 40c2f68231
commit 7084ebf78d
3 changed files with 489 additions and 105 deletions
+28 -1
View File
@@ -535,7 +535,34 @@ pub fn run_shot(ctx: &ShotCtx, scene: &str) {
)));
}
"settings" | "03-settings" => {
crate::ui_settings::show(&ctx.window, ctx.settings.clone(), &ctx.gamepad, || {});
// Mock devices so the shot shows the probe-dependent pickers populated.
let dev = |name: &str, description: &str| pf_client_core::audio::AudioDevice {
name: name.to_string(),
description: description.to_string(),
};
let probes = crate::ui_settings::DeviceProbes {
adapters: vec![
"NVIDIA GeForce RTX 4070".to_string(),
"AMD Radeon 780M".to_string(),
],
speakers: vec![dev("alsa_output.mock-hdmi", "HDMI / DisplayPort Audio")],
mics: vec![dev("alsa_input.mock-usb", "USB Microphone Analog Stereo")],
};
let dialog = crate::ui_settings::show(
&ctx.window,
ctx.settings.clone(),
&ctx.gamepad,
&probes,
|| {},
);
// Optional page for the capture (general/display/input/audio/controllers);
// the dialog opens on General otherwise.
if let Ok(page) = std::env::var("PUNKTFUNK_SHOT_SETTINGS_PAGE") {
if !page.is_empty() {
use adw::prelude::PreferencesDialogExt as _;
dialog.set_visible_page_name(&page);
}
}
}
"trust" | "04-trust" => crate::ui_trust::tofu_dialog(&ctx.window, sender, mock_req()),
"pair" | "05-pair" => {