2508b72062
Two problems, one feature. The gamepad/couch UI existed but you had to
already know it was there:
- On the hosts page its card only rendered when a controller was CONNECTED,
so with no pad plugged in there was no visible entry point at all -- the
only other door being a per-host overflow menu behind a "..." nobody
opens. The card now always shows, with copy that adapts to whether a pad
is present, so the feature is findable before you own the hardware.
- There was no way to start it directly. An HTPC or TV box wants the couch
interface as its first screen, not the desktop shell. "punktfunk-client
--console" now hands straight off to it (fullscreen unless --windowed),
which covers shortcuts, Steam entries, autostart and Task Scheduler.
The Start-menu tile needs its own executable: an MSIX <Application> cannot
pass arguments to a full-trust exe, so "punktfunk-client.exe --console" is
not expressible there. punktfunk-console.exe is a ~20-line hand-off to the
session binary's browse mode, staged into the package and given its own
tile ("Punktfunk Console").
Nothing new is implemented behind either door: a bare "--browse" was
already a complete standalone client (host list, discovery, PIN pairing,
settings, Wake-on-LAN, library). It just had no front door.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
39 lines
1.6 KiB
Rust
39 lines
1.6 KiB
Rust
//! `punktfunk-console.exe` — the couch/HTPC entry point.
|
|
//!
|
|
//! Exists because an MSIX `<Application>` cannot pass ARGUMENTS to a full-trust executable:
|
|
//! a second Start-menu tile therefore cannot simply be "punktfunk-client.exe --console", it
|
|
//! needs its own executable. This is that executable, and it is deliberately nothing but a
|
|
//! hand-off — it starts the session binary's `--browse` mode (the complete controller-driven
|
|
//! client: host list, discovery, PIN pairing, settings, Wake-on-LAN, library) fullscreen and
|
|
//! mirrors its exit code, so whatever supervises this process sees the real result.
|
|
//!
|
|
//! `--windowed` keeps it in a window; everything else is the session binary's own business.
|
|
|
|
// No console window: this is launched from a Start-menu tile / shortcut, and a flashing
|
|
// console behind the couch UI looks like a crash.
|
|
#![cfg_attr(windows, windows_subsystem = "windows")]
|
|
|
|
#[cfg(windows)]
|
|
fn main() {
|
|
// The session binary ships beside us in the package; fall back to PATH for a dev run.
|
|
let session = std::env::current_exe()
|
|
.ok()
|
|
.map(|e| e.with_file_name("punktfunk-session.exe"))
|
|
.filter(|p| p.exists())
|
|
.unwrap_or_else(|| "punktfunk-session".into());
|
|
|
|
let mut cmd = std::process::Command::new(session);
|
|
cmd.arg("--browse");
|
|
if !std::env::args().any(|a| a == "--windowed") {
|
|
cmd.arg("--fullscreen");
|
|
}
|
|
match cmd.status() {
|
|
Ok(st) => std::process::exit(st.code().unwrap_or(0)),
|
|
Err(_) => std::process::exit(1),
|
|
}
|
|
}
|
|
|
|
/// The workspace builds on Linux/macOS too; there is nothing to launch there.
|
|
#[cfg(not(windows))]
|
|
fn main() {}
|