Skip to content

feat: introduce the initial One client - #6

Draft
ReenigneArcher wants to merge 16 commits into
masterfrom
codex/sunshinestream-migration
Draft

ReenigneArcher wants to merge 16 commits into
masterfrom
codex/sunshinestream-migration

Conversation

@ReenigneArcher

@ReenigneArcher ReenigneArcher commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

Description

Introduce the initial One client implementation with a portable C++20 core and shared Qt Quick shell for desktop, touch, and television interfaces.

  • Discover and save Sunshine hosts, pair through TLS, browse applications, and handle launch, resume, and cancel requests.
  • Add a desktop streaming path using moonlight-common-c, FFmpeg video decoding, Opus audio, keyboard/mouse capture, and SDL3 controller support.
  • Include responsive host/library screens, artwork loading, appearance preferences, build presets, and core, protocol, networking, and UI tests.
  • Document bootstrap limitations and platform boundaries, including the Xbox interface placeholder and current H.264 SDR negotiation.
  • Use SunshineStream repository links in the README and CMake project homepage.

Screenshot

Issues Fixed or Closed

Roadmap Issues

Testing

  • Verified the README through GitHub's Markdown renderer and ran git diff --check on the repository metadata changes.
  • Native application builds and tests were not run during this update. The README documents the core and Windows static build/test presets.

Type of Change

  • feat: New feature (non-breaking change which adds functionality)
  • fix: Bug fix (non-breaking change which fixes an issue)
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semicolons, etc.)
  • refactor: Code change that neither fixes a bug nor adds a feature
  • perf: Code change that improves performance
  • test: Adding missing tests or correcting existing tests
  • build: Changes that affect the build system or external dependencies
  • ci: Changes to CI configuration files and scripts
  • chore: Other changes that don't modify src or test files
  • revert: Reverts a previous commit
  • BREAKING CHANGE: Introduces a breaking change (can be combined with any type above)

Checklist

  • Code follows the style guidelines of this project
  • Code has been self-reviewed
  • Code has been commented, particularly in hard-to-understand areas
  • Code docstring/documentation-blocks for new or existing methods/components have been added or updated
  • Tests have been added or updated for new or modified functionality, including regression tests for bug fixes

AI Usage

See our AI usage policy.

  • AI tools were used while preparing this PR

Initial project setup for One, a universal game-streaming client for Sunshine. Adds:
- CMake build system with presets for core and Qt client
- Qt-free C++20 core library with capability-driven UI mode selection
- Shared Qt Quick client with desktop, touch, and television responsive modes
- Android TV detection via UiModeManager; tvOS compile-time path
- Xbox UWP client placeholder
- Core unit tests
- Architecture and platform documentation
- GPL-3.0-only license
- Upstream revision tracking (moonlight-common-c, moonlight-qt, moonlight-android, moonlight-ios, moonlight-xbox)
- Pin moonlight-common-c as a recursive git submodule under core/protocol/vendor
- Add One-owned C++ boundary (StreamConfiguration) wrapping Limelight's STREAM_CONFIGURATION
- Add HostCatalog and Host models to core with merge/find/pairing-state APIs
- Add PairingSession state machine to core
- Add Qt HostListModel backed by HostCatalog, exposed to QML as ComputerModel
- Wire up ComputersPage: host list view, empty-state toggle, and Add Computer dialog
- Add tests for all new units (host_model, pairing_session, stream_configuration, qt host_list_model)
- Add ONE_PROTOCOL_USE_MBEDTLS CMake option; update README and architecture docs
Introduce qmdnsengine-backed `_nvstream._tcp` discovery, persistent client identity, `/serverinfo` queries, and the GameStream pairing flow in the Qt client. The host list model and computers page now surface pairing state and status, while CMake and docs are updated for the new Qt/OpenSSL integration, static dependency preference, and added Qt tests.
- Authenticated `/applist` browsing with ApplicationListClient and ApplicationListModel
- Exact `/launch` and `/resume` request building (buildLaunchQuery, parseLaunchResponse, LaunchClient)
- GamesPage QML with grid layout; ComputersPage now emits gamesRequested via openHost
- StreamLaunchParameters extracted from StreamConfiguration with per-session random AES key
- StreamingSession boundary over moonlight-common-c with VideoRenderer/AudioRenderer/ConnectionListener interfaces
- host_settings helpers extracted from host_list_model; server state/currentgame parsing added to ServerInfo
- One::Protocol linked into Qt client; ApplicationModel context property wired in main.cpp
This change adds the initial desktop media path: FFmpeg H.264 decoding, SDL/Opus audio output, a streaming controller, and a QML stream page. It also introduces cancel handling for launch requests, wires the new backend into the Qt app, and documents the desktop streaming prerequisites and platform status.
Implement end-to-end desktop input for the Qt stream path. This adds a Qt key mapper (including Windows scan-code normalization), input capture/release handling in `StreamVideoOutput`, and wires active sessions so keyboard/mouse events, scrolling, and text can be sent through new `StreamingSession` input APIs. The UI now hides navigation while streaming, shows capture guidance, and documents the Ctrl+Alt+Shift+Z release shortcut. Adds focused protocol and desktop input tests and updates architecture/platform docs to reflect the new input pipeline.
Introduces desktop gamepad support in the Qt client with SDL3: controller discovery, hot-plug arrival/departure, per-frame state updates, and launch-time active controller masks. Extends the protocol session API for controller events, migrates desktop media usage from SDL2 to SDL3 (including audio stream handling), and updates UI/docs/tests to reflect the new controller path and dependency requirements.
This change wires host-driven controller rumble callbacks through the protocol layer into the Qt desktop adapter. Standard and trigger rumble are exposed via SDL3 capability checks, queued onto the UI thread, and stopped on session teardown with zero-intensity feedback. The README and architecture docs were updated to reflect the newly supported feedback features.
Extend the streaming protocol with controller touch, motion, and battery types plus send APIs, native mappings, and host motion-state callbacks. Wire the Qt desktop gamepad path to report touchpad contacts, battery updates, and host-requested accelerometer/gyro telemetry (including gyro unit conversion), add teardown cleanup for telemetry state, and update docs/tests to cover the new behavior.
Adds protocol callbacks and Qt desktop plumbing for RGB LED updates and DualSense adaptive trigger effects. The session layer now exposes controller LEDs and trigger effects to listeners, and the SDL3 desktop adapter translates them into capability-gated LED and PS5 trigger packets with teardown cleanup.
@ReenigneArcher
ReenigneArcher force-pushed the codex/sunshinestream-migration branch from 9aa66a3 to 06fe3ae Compare November 11, 2026 01:51
@ReenigneArcher ReenigneArcher changed the title docs: identify One in SunshineStream feat: introduce the initial One client Nov 11, 2026
@ReenigneArcher
ReenigneArcher marked this pull request as draft November 11, 2026 01:53
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant