fix(windows): drop the orphaned in-process gamepad forwarding hooks
ci / web (push) Successful in 1m7s
ci / docs-site (push) Successful in 1m0s
ci / bench (push) Successful in 5m49s
android-screenshots / screenshots (push) Successful in 3m17s
ci / rust (push) Successful in 17m50s
decky / build-publish (push) Successful in 18s
windows / build (aarch64-pc-windows-msvc) (push) Failing after 59s
apple / swift (push) Successful in 4m25s
windows / build (x86_64-pc-windows-msvc) (push) Failing after 5m22s
android / android (push) Successful in 14m55s
arch / build-publish (push) Successful in 13m12s
deb / build-publish (push) Successful in 11m29s
web-screenshots / screenshots (push) Successful in 2m42s
docker / deploy-docs (push) Successful in 12s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 10s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 9s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 6m10s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 9s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 11s
linux-client-screenshots / screenshots (push) Successful in 7m16s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 12m58s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 13m36s
windows-host / package (push) Successful in 15m17s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 4m10s
release / apple (push) Successful in 22m45s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 3m59s
flatpak / build-publish (push) Successful in 5m41s
apple / screenshots (push) Successful in 19m29s
ci / web (push) Successful in 1m7s
ci / docs-site (push) Successful in 1m0s
ci / bench (push) Successful in 5m49s
android-screenshots / screenshots (push) Successful in 3m17s
ci / rust (push) Successful in 17m50s
decky / build-publish (push) Successful in 18s
windows / build (aarch64-pc-windows-msvc) (push) Failing after 59s
apple / swift (push) Successful in 4m25s
windows / build (x86_64-pc-windows-msvc) (push) Failing after 5m22s
android / android (push) Successful in 14m55s
arch / build-publish (push) Successful in 13m12s
deb / build-publish (push) Successful in 11m29s
web-screenshots / screenshots (push) Successful in 2m42s
docker / deploy-docs (push) Successful in 12s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 10s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 9s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 6m10s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 9s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 11s
linux-client-screenshots / screenshots (push) Successful in 7m16s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 12m58s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 13m36s
windows-host / package (push) Successful in 15m17s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 4m10s
release / apple (push) Successful in 22m45s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 3m59s
flatpak / build-publish (push) Successful in 5m41s
apple / screenshots (push) Successful in 19m29s
Removing the builtin stream path (ef580825) left GamepadService's attach/detach/
active/auto_pref + the Ctl::Attach/Detach variants with no callers — the spawned
punktfunk-session binary owns pad forwarding now. The client still compiled, but
clippy -D warnings tripped on the dead code. Drop the forwarding hooks + the
active-pad mirror; the service keeps pads() (Settings list) and set_pinned()
(persist the forwarded-pad selection the session child reads).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -74,30 +74,26 @@ fn pref_for_type(t: sdl3::gamepad::GamepadType) -> GamepadPref {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum Ctl {
|
enum Ctl {
|
||||||
Attach(Arc<NativeClient>),
|
|
||||||
Detach,
|
|
||||||
Pin(Option<String>),
|
Pin(Option<String>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GamepadService {
|
pub struct GamepadService {
|
||||||
pads: Arc<Mutex<Vec<PadInfo>>>,
|
pads: Arc<Mutex<Vec<PadInfo>>>,
|
||||||
active: Arc<Mutex<Option<PadInfo>>>,
|
|
||||||
// `Arc<Mutex<…>>` (not a bare `Sender`, which is `!Sync`) so the service is `Sync` — the
|
// `Arc<Mutex<…>>` (not a bare `Sender`, which is `!Sync`) so the service is `Sync` — the
|
||||||
// WinUI app shares it across the UI thread and the session-pump thread (attach/detach).
|
// WinUI app shares it across the UI thread and the settings-pin path.
|
||||||
ctl: Arc<Mutex<Sender<Ctl>>>,
|
ctl: Arc<Mutex<Sender<Ctl>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GamepadService {
|
impl GamepadService {
|
||||||
pub fn start() -> GamepadService {
|
pub fn start() -> GamepadService {
|
||||||
let pads = Arc::new(Mutex::new(Vec::new()));
|
let pads = Arc::new(Mutex::new(Vec::new()));
|
||||||
let active = Arc::new(Mutex::new(None));
|
|
||||||
let (ctl, ctl_rx) = std::sync::mpsc::channel();
|
let (ctl, ctl_rx) = std::sync::mpsc::channel();
|
||||||
let (p, a) = (pads.clone(), active.clone());
|
let p = pads.clone();
|
||||||
if let Err(e) = std::thread::Builder::new()
|
if let Err(e) = std::thread::Builder::new()
|
||||||
.name("punktfunk-gamepad".into())
|
.name("punktfunk-gamepad".into())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
if let Err(e) = run(&p, &a, &ctl_rx) {
|
if let Err(e) = run(&p, &ctl_rx) {
|
||||||
tracing::warn!(error = %e, "gamepad service ended — pads disabled");
|
tracing::warn!(error = %e, "gamepad service ended — pads disabled");
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -106,7 +102,6 @@ impl GamepadService {
|
|||||||
}
|
}
|
||||||
GamepadService {
|
GamepadService {
|
||||||
pads,
|
pads,
|
||||||
active,
|
|
||||||
ctl: Arc::new(Mutex::new(ctl)),
|
ctl: Arc::new(Mutex::new(ctl)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,33 +111,13 @@ impl GamepadService {
|
|||||||
self.pads.lock().unwrap().clone()
|
self.pads.lock().unwrap().clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn active(&self) -> Option<PadInfo> {
|
|
||||||
self.active.lock().unwrap().clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Pin the forwarded controller by stable key (`PadInfo::key`) — `None` = automatic.
|
/// Pin the forwarded controller by stable key (`PadInfo::key`) — `None` = automatic.
|
||||||
/// The pin survives the pad disconnecting: it re-applies the moment a matching
|
/// The pin survives the pad disconnecting: it re-applies the moment a matching
|
||||||
/// controller shows up again (same semantics as `pf-client-core`'s service).
|
/// controller shows up again (same semantics as `pf-client-core`'s service). The spawned
|
||||||
|
/// `punktfunk-session` binary owns the actual forwarding; this persists the selection.
|
||||||
pub fn set_pinned(&self, key: Option<String>) {
|
pub fn set_pinned(&self, key: Option<String>) {
|
||||||
let _ = self.ctl.lock().unwrap().send(Ctl::Pin(key));
|
let _ = self.ctl.lock().unwrap().send(Ctl::Pin(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn attach(&self, connector: Arc<NativeClient>) {
|
|
||||||
let _ = self.ctl.lock().unwrap().send(Ctl::Attach(connector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn detach(&self) {
|
|
||||||
let _ = self.ctl.lock().unwrap().send(Ctl::Detach);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// What "Automatic" resolves to right now — the virtual pad matching the physical one
|
|
||||||
/// (Swift parity); no pad connected leaves the host's own default.
|
|
||||||
pub fn auto_pref(&self) -> GamepadPref {
|
|
||||||
match self.active() {
|
|
||||||
Some(p) => p.pref,
|
|
||||||
None => GamepadPref::Auto,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(connector: &NativeClient, kind: InputKind, code: u32, x: i32) {
|
fn send(connector: &NativeClient, kind: InputKind, code: u32, x: i32) {
|
||||||
@@ -404,11 +379,7 @@ impl Worker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
fn run(
|
fn run(pads_out: &Mutex<Vec<PadInfo>>, ctl: &Receiver<Ctl>) -> Result<(), String> {
|
||||||
pads_out: &Mutex<Vec<PadInfo>>,
|
|
||||||
active_out: &Mutex<Option<PadInfo>>,
|
|
||||||
ctl: &Receiver<Ctl>,
|
|
||||||
) -> Result<(), String> {
|
|
||||||
// Off-main-thread + no video subsystem: keep SDL away from signals, poll pads on its own
|
// Off-main-thread + no video subsystem: keep SDL away from signals, poll pads on its own
|
||||||
// thread.
|
// thread.
|
||||||
sdl3::hint::set("SDL_NO_SIGNAL_HANDLERS", "1");
|
sdl3::hint::set("SDL_NO_SIGNAL_HANDLERS", "1");
|
||||||
@@ -437,23 +408,12 @@ fn run(
|
|||||||
let mut list: Vec<PadInfo> = w.order.iter().filter_map(|&id| w.pad_info(id)).collect();
|
let mut list: Vec<PadInfo> = w.order.iter().filter_map(|&id| w.pad_info(id)).collect();
|
||||||
list.reverse(); // most recent first — the Settings list order
|
list.reverse(); // most recent first — the Settings list order
|
||||||
*pads_out.lock().unwrap() = list;
|
*pads_out.lock().unwrap() = list;
|
||||||
*active_out.lock().unwrap() = w.active_id().and_then(|id| w.pad_info(id));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// Control plane from the UI thread.
|
// Control plane from the UI thread.
|
||||||
loop {
|
loop {
|
||||||
match ctl.try_recv() {
|
match ctl.try_recv() {
|
||||||
Ok(Ctl::Attach(c)) => {
|
|
||||||
w.attached = Some(c);
|
|
||||||
w.last_axis = [i32::MIN; 6];
|
|
||||||
w.set_sensors(true);
|
|
||||||
}
|
|
||||||
Ok(Ctl::Detach) => {
|
|
||||||
w.flush_held();
|
|
||||||
w.set_sensors(false);
|
|
||||||
w.attached = None;
|
|
||||||
}
|
|
||||||
Ok(Ctl::Pin(key)) => {
|
Ok(Ctl::Pin(key)) => {
|
||||||
let before = w.active_id();
|
let before = w.active_id();
|
||||||
w.pinned = key;
|
w.pinned = key;
|
||||||
|
|||||||
Reference in New Issue
Block a user