feat(input): support per-app gamepad emulation - #932
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (16)
🚧 Files skipped from review as they are similar to previous changes (16)
📜 Recent review details⏰ Context from checks skipped due to timeout. (1)
Summary by CodeRabbit
Walkthrough新增应用级游戏手柄模式配置。配置支持继承、自动、Xbox 360 和 DualShock 4。应用启动时切换模式,应用终止时恢复全局模式。Windows 输入逻辑使用有效模式。 Changes应用级游戏手柄模式
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant AppEditor
participant appService
participant confighttp
participant process
participant WindowsInput
AppEditor->>appService: 提交 gamepad 配置
appService->>confighttp: 传递规范化值
confighttp->>process: 保存应用配置
process->>WindowsInput: 应用有效手柄模式
WindowsInput-->>process: 分配对应控制器类型
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src_assets/common/assets/web/public/assets/locale/bg.json`:
- Around line 133-138: Translate every newly added gamepad_mode,
gamepad_mode_desc, gamepad_mode_inherit, gamepad_mode_auto, gamepad_mode_x360,
and gamepad_mode_ds4 value into its target language in
src_assets/common/assets/web/public/assets/locale/bg.json lines 133-138, cs.json
lines 133-138, ru.json lines 133-138, sv.json lines 133-138, tr.json lines
133-138, and uk.json lines 133-138, preserving the existing keys and JSON
structure.
In `@src_assets/common/assets/web/public/assets/locale/de.json`:
- Around line 133-138: Translate the newly added gamepad_mode,
gamepad_mode_desc, gamepad_mode_inherit, and gamepad_mode_auto values into the
corresponding languages while preserving the product names Xbox 360 and
DualShock 4. Apply the translations in
src_assets/common/assets/web/public/assets/locale/de.json#L133-L138,
es.json#L133-L138, fr.json#L133-L138, it.json#L133-L138, ja.json#L133-L138,
ko.json#L133-L138, pl.json#L133-L138, pt.json#L133-L138, and
pt_BR.json#L133-L138.
In `@src/confighttp.cpp`:
- Around line 850-858: 在 editApp 为空、替换 input_apps_node 之前,遍历完整应用列表并对每个应用的
gamepad 执行与 input_edit_node 相同的处理:删除空值,并仅允许 auto、x360 或
ds4。遇到无效值时设置相同错误响应并终止保存,避免无效配置被成功写入。
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 37ef5285-1985-4acf-b97d-84c08e2cd46b
📒 Files selected for processing (32)
src/confighttp.cppsrc/platform/common.hsrc/platform/linux/input/inputtino.cppsrc/platform/linux/input/legacy_input.cppsrc/platform/macos/input.cppsrc/platform/windows/input.cppsrc/process.cppsrc/process.hsrc_assets/common/assets/web/components/AppEditor.vuesrc_assets/common/assets/web/public/assets/locale/bg.jsonsrc_assets/common/assets/web/public/assets/locale/cs.jsonsrc_assets/common/assets/web/public/assets/locale/de.jsonsrc_assets/common/assets/web/public/assets/locale/en.jsonsrc_assets/common/assets/web/public/assets/locale/en_GB.jsonsrc_assets/common/assets/web/public/assets/locale/en_US.jsonsrc_assets/common/assets/web/public/assets/locale/es.jsonsrc_assets/common/assets/web/public/assets/locale/fr.jsonsrc_assets/common/assets/web/public/assets/locale/it.jsonsrc_assets/common/assets/web/public/assets/locale/ja.jsonsrc_assets/common/assets/web/public/assets/locale/ko.jsonsrc_assets/common/assets/web/public/assets/locale/pl.jsonsrc_assets/common/assets/web/public/assets/locale/pt.jsonsrc_assets/common/assets/web/public/assets/locale/pt_BR.jsonsrc_assets/common/assets/web/public/assets/locale/ru.jsonsrc_assets/common/assets/web/public/assets/locale/sv.jsonsrc_assets/common/assets/web/public/assets/locale/tr.jsonsrc_assets/common/assets/web/public/assets/locale/uk.jsonsrc_assets/common/assets/web/public/assets/locale/zh.jsonsrc_assets/common/assets/web/public/assets/locale/zh_TW.jsonsrc_assets/common/assets/web/services/appService.jssrc_assets/common/assets/web/tests/appService.test.jssrc_assets/common/assets/web/utils/constants.js
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
- GitHub Check: copilot-pull-request-reviewer
- GitHub Check: Windows
🧰 Additional context used
📓 Path-based instructions (3)
src_assets/**/*.{vue,js,html}
⚙️ CodeRabbit configuration file
src_assets/**/*.{vue,js,html}: 基于 Vue.js 的 Web 配置面板。审查 XSS/CSRF 安全性、 组件设计、状态管理和可访问性。
Files:
src_assets/common/assets/web/services/appService.jssrc_assets/common/assets/web/tests/appService.test.jssrc_assets/common/assets/web/utils/constants.jssrc_assets/common/assets/web/components/AppEditor.vue
src/**/*.{cpp,c,h}
⚙️ CodeRabbit configuration file
src/**/*.{cpp,c,h}: Sunshine 核心 C++ 源码,自托管游戏串流服务器。审查要点:内存安全、 线程安全、RAII 资源管理、安全漏洞。注意预处理宏控制的平台相关代码。
Files:
src/process.hsrc/platform/linux/input/inputtino.cppsrc/process.cppsrc/platform/macos/input.cppsrc/platform/linux/input/legacy_input.cppsrc/confighttp.cppsrc/platform/common.hsrc/platform/windows/input.cpp
src/platform/**
⚙️ CodeRabbit configuration file
src/platform/**: 平台抽象层代码(Windows/Linux/macOS)。确保各平台实现一致, 注意 Windows API 调用的错误处理和资源释放。
Files:
src/platform/linux/input/inputtino.cppsrc/platform/macos/input.cppsrc/platform/linux/input/legacy_input.cppsrc/platform/common.hsrc/platform/windows/input.cpp
🧠 Learnings (1)
📚 Learning: 2026-07-27T15:33:54.262Z
Learnt from: Yundi339
Repo: AlkaidLab/foundation-sunshine PR: 848
File: src_assets/common/assets/web/public/assets/locale/ru.json:661-673
Timestamp: 2026-07-27T15:33:54.262Z
Learning: Webhook payload language must follow the backend contract: only locales `zh` and `zh_TW` receive Chinese text in the Sunshine Webhook runtime payload; every other locale (e.g., `ru`) must use English. When updating locale JSON files (like `ru.json`), do not independently translate webhook payload strings for non-`zh` locales—coordinate any full non-Chinese localization with the required backend locale/language-selection changes and corresponding locale updates. Ensure any curl/test payload examples and related UI payload previews (e.g., in `WebhookCard.vue`) match this backend payload-language behavior.
Applied to files:
src_assets/common/assets/web/public/assets/locale/pt.jsonsrc_assets/common/assets/web/public/assets/locale/zh_TW.jsonsrc_assets/common/assets/web/public/assets/locale/en.jsonsrc_assets/common/assets/web/public/assets/locale/pl.jsonsrc_assets/common/assets/web/public/assets/locale/cs.jsonsrc_assets/common/assets/web/public/assets/locale/it.jsonsrc_assets/common/assets/web/public/assets/locale/en_US.jsonsrc_assets/common/assets/web/public/assets/locale/tr.jsonsrc_assets/common/assets/web/public/assets/locale/sv.jsonsrc_assets/common/assets/web/public/assets/locale/pt_BR.jsonsrc_assets/common/assets/web/public/assets/locale/uk.jsonsrc_assets/common/assets/web/public/assets/locale/fr.jsonsrc_assets/common/assets/web/public/assets/locale/ru.jsonsrc_assets/common/assets/web/public/assets/locale/en_GB.jsonsrc_assets/common/assets/web/public/assets/locale/bg.jsonsrc_assets/common/assets/web/public/assets/locale/ko.jsonsrc_assets/common/assets/web/public/assets/locale/zh.jsonsrc_assets/common/assets/web/public/assets/locale/ja.jsonsrc_assets/common/assets/web/public/assets/locale/es.jsonsrc_assets/common/assets/web/public/assets/locale/de.json
🔇 Additional comments (16)
src/platform/common.h (1)
991-996: LGTM!src/process.h (1)
73-73: LGTM!src/process.cpp (1)
178-180: LGTM!Also applies to: 422-423, 833-833, 915-930
src/platform/windows/input.cpp (1)
480-508: LGTM!Also applies to: 1913-1921, 2105-2105, 2514-2514
src/platform/linux/input/inputtino.cpp (1)
44-48: LGTM!src/platform/linux/input/legacy_input.cpp (1)
1189-1193: LGTM!src/platform/macos/input.cpp (1)
388-392: LGTM!src_assets/common/assets/web/utils/constants.js (1)
29-29: LGTM!src_assets/common/assets/web/components/AppEditor.vue (1)
218-235: LGTM!Also applies to: 343-343, 458-460
src_assets/common/assets/web/services/appService.js (1)
210-210: LGTM!src_assets/common/assets/web/tests/appService.test.js (1)
62-62: LGTM!Also applies to: 80-80, 90-98
src_assets/common/assets/web/public/assets/locale/zh.json (1)
133-138: LGTM!src_assets/common/assets/web/public/assets/locale/zh_TW.json (1)
133-138: LGTM!src_assets/common/assets/web/public/assets/locale/en.json (1)
133-138: LGTM!src_assets/common/assets/web/public/assets/locale/en_GB.json (1)
133-138: LGTM!src_assets/common/assets/web/public/assets/locale/en_US.json (1)
133-138: LGTM!
There was a problem hiding this comment.
Pull request overview
Adds per-application Windows gamepad emulation settings to address issue #898 while preserving global defaults.
Changes:
- Adds inherit, auto, Xbox 360, and DualShock 4 modes.
- Applies overrides during app execution and resets them afterward.
- Adds UI controls, validation, tests, and locale keys.
Reviewed changes
Copilot reviewed 32 out of 32 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
src/process.h |
Adds the per-app gamepad mode field. |
src/process.cpp |
Parses and manages override lifecycle. |
src/platform/common.h |
Declares the platform API. |
src/platform/windows/input.cpp |
Applies overrides to ViGEm selection and capabilities. |
src/platform/macos/input.cpp |
Adds the macOS no-op implementation. |
src/platform/linux/input/legacy_input.cpp |
Adds the legacy Linux no-op. |
src/platform/linux/input/inputtino.cpp |
Adds the Inputtino no-op. |
src/confighttp.cpp |
Validates edited app values; bulk-save validation remains incomplete. |
src_assets/common/assets/web/utils/constants.js |
Adds the default app value. |
src_assets/common/assets/web/services/appService.js |
Normalizes gamepad values. |
src_assets/common/assets/web/tests/appService.test.js |
Tests gamepad formatting. |
src_assets/common/assets/web/components/AppEditor.vue |
Adds the Windows gamepad selector. |
src_assets/common/assets/web/public/assets/locale/bg.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/cs.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/de.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/en.json |
Adds English strings. |
src_assets/common/assets/web/public/assets/locale/en_GB.json |
Adds English strings. |
src_assets/common/assets/web/public/assets/locale/en_US.json |
Adds English strings. |
src_assets/common/assets/web/public/assets/locale/es.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/fr.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/it.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/ja.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/ko.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/pl.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/pt.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/pt_BR.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/ru.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/sv.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/tr.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/uk.json |
Adds locale keys. |
src_assets/common/assets/web/public/assets/locale/zh.json |
Adds Simplified Chinese strings. |
src_assets/common/assets/web/public/assets/locale/zh_TW.json |
Adds Traditional Chinese strings. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| auto gamepad = input_edit_node.get_optional<std::string>("gamepad"); | ||
| if (gamepad && gamepad->empty()) { | ||
| input_edit_node.erase("gamepad"); | ||
| } | ||
| else if (gamepad && *gamepad != "auto"sv && *gamepad != "x360"sv && *gamepad != "ds4"sv) { |
改了啥呢
sunshine.conf,也不需要重启服务。apps.json没有该字段时保持原行为。为啥要改
Issue #898 的用户需要部分游戏使用 DS4、另一些旧游戏或 Microsoft Store 游戏使用 X360。全局切换要求退出串流、改配置并重启服务,准备命令 workaround 也容易中断游戏。
这个 MVP 把选择放到应用配置里,让每个应用在创建虚拟手柄前决定类型,同时继续复用成熟的 ViGEm 驱动范围。
UX
验证
node --test src_assets/common/assets/web/tests/*.test.js:97 passednpm run lint:webuinpm run buildgit diff --checksrc/process.cppsrc/confighttp.cppsrc/platform/windows/input.cpp本机全量 CMake 增量构建被旧缓存中 Strawberry GCC 与 MSYS2 headers 混用阻断,失败点位于未修改的
src/config.cpp;交给 CI 的干净工具链继续验收啦。Implements #898