03a2fabff1
The Settings model always carried arbitrary width/height (0 = native) end to end — only the two UIs' preset lists gated it. Mirror the Apple client's pattern: the touch Resolution dropdown gains a "Custom…" row revealing numeric W×H fields (seeded from the current effective size, coerced even on commit, capped at 8192 — the host's encode.rs stays the validation authority), and the gamepad screen surfaces a stored custom size as a leading "Custom · W × H" choice instead of silently snapping it to Native — a pad can keep a custom size, it just can't type one. Custom-ness is detected from the stored size itself (no persisted flag), so it can never disagree with what's saved. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>