Skip to content

Commit bfe8076

Browse files
committed
fix(vdd): remove vdd_display_configs from config system and revert unrelated changes
Remove vdd_display_configs from config.cpp registration since it is auto-managed by VDD persistence, not user-configurable. Read configs directly from the config file in main.cpp instead. Revert i18n label lookup in config.html (unrelated to VDD feature) and non-default locale changes (should go through Crowdin).
1 parent 6ae5ab1 commit bfe8076

7 files changed

Lines changed: 26 additions & 97 deletions

File tree

src/config.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,6 @@ namespace config {
530530
1080, // virtual_display_height
531531
144, // virtual_display_refresh_rate
532532
0, // virtual_display_count
533-
{}, // virtual_display_configs
534533
}, // vdd
535534

536535
0, // max_bitrate
@@ -1205,7 +1204,6 @@ namespace config {
12051204
int_f(vars, "vdd_height", video.vdd.virtual_display_height);
12061205
int_f(vars, "vdd_refresh_rate", video.vdd.virtual_display_refresh_rate);
12071206
int_f(vars, "vdd_display_count", video.vdd.virtual_display_count);
1208-
string_f(vars, "vdd_display_configs", video.vdd.virtual_display_configs);
12091207
{
12101208
int value = 0;
12111209
int_between_f(vars, "dd_wa_hdr_toggle_delay", value, {0, 3000});

src/config.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ namespace config {
158158
int virtual_display_height; ///< Virtual display height
159159
int virtual_display_refresh_rate; ///< Virtual display refresh rate
160160
int virtual_display_count; ///< Number of persisted virtual displays to restore on startup
161-
std::string virtual_display_configs; ///< Persisted virtual display configurations (JSON array)
162161
} vdd;
163162

164163
int max_bitrate; // Maximum bitrate, sets ceiling in kbps for bitrate requested from client

src/main.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
// standard includes
66
#include <codecvt>
77
#include <csignal>
8+
#include <cstring>
89
#include <filesystem>
910
#include <fstream>
11+
#include <sstream>
1012
#include <iostream>
1113

1214
// lib includes
@@ -20,6 +22,7 @@
2022
#include "confighttp.h"
2123
#include "display_device.h"
2224
#include "entry_handler.h"
25+
#include "file_handler.h"
2326
#include "globals.h"
2427
#include "httpcommon.h"
2528
#include "logging.h"
@@ -129,12 +132,26 @@ void mainThreadLoop(const std::shared_ptr<safe::event_t<bool>> &shutdown_event)
129132
* @brief Restore virtual displays from persisted config.
130133
*
131134
* Called during startup when a physical display already exists. Reads
132-
* vdd_display_configs (JSON array) from config and re-creates each
133-
* display at its previously saved resolution/refresh. Falls back to
134-
* the count-based approach with default config values if JSON is empty.
135+
* vdd_display_configs (JSON array line) directly from the Sunshine config
136+
* file and re-creates each display at its previously saved resolution/refresh.
137+
* Falls back to the count-based approach with default config values if the
138+
* JSON line is missing or empty.
135139
*/
136140
static void restore_persisted_virtual_displays() {
137-
const auto &json_str = config::video.vdd.virtual_display_configs;
141+
// Read vdd_display_configs directly from the config file (it is not a
142+
// user-configurable option and is intentionally not registered in config.cpp).
143+
std::string json_str;
144+
if (auto content = file_handler::read_file(config::sunshine.config_file.c_str()); !content.empty()) {
145+
std::istringstream stream(content);
146+
std::string line;
147+
while (std::getline(stream, line)) {
148+
if (line.starts_with("vdd_display_configs = ")) {
149+
json_str = line.substr(std::strlen("vdd_display_configs = "));
150+
break;
151+
}
152+
}
153+
}
154+
138155
if (!json_str.empty()) {
139156
try {
140157
auto configs = nlohmann::json::parse(json_str);

src_assets/common/assets/web/config.html

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,14 +368,9 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
368368
const options = [];
369369
this.tabs.forEach(tab => {
370370
Object.keys(tab.options).forEach(key => {
371-
const i18nKey = 'config.' + key;
372-
const translated = this.$t(i18nKey);
373-
const label = translated === i18nKey
374-
? key.replaceAll('_', ' ').replaceAll(/\b\w/g, l => l.toUpperCase())
375-
: translated;
376371
options.push({
377372
key: key,
378-
label: label,
373+
label: key.replaceAll('_', ' ').replaceAll(/\b\w/g, l => l.toUpperCase()),
379374
tab: tab.name,
380375
tabId: tab.id
381376
});

src_assets/common/assets/web/public/assets/locale/zh.json

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -375,13 +375,6 @@
375375
"upnp_desc": "为公网串流自动配置端口转发",
376376
"vaapi_strict_rc_buffer": "在AMD GPU上严格强制执行H.264/HEVC帧比特率限制",
377377
"vaapi_strict_rc_buffer_desc": "启用此选项可以在场景更改时避免在网络上放置帧,但在移动时可能会降低视频质量。",
378-
"vdd_display_count": "持久化虚拟显示器数量",
379-
"vdd_display_count_desc": "启动时恢复的虚拟显示器数量(自动设置)",
380-
"vdd_enabled": "启用虚拟显示器",
381-
"vdd_enabled_desc": "未检测到物理显示器时自动创建虚拟显示器",
382-
"vdd_height": "虚拟显示器高度",
383-
"vdd_refresh_rate": "虚拟显示器刷新率",
384-
"vdd_width": "虚拟显示器宽度",
385378
"virtual_sink": "虚拟音频输出设备",
386379
"virtual_sink_desc": "手动指定要使用的虚拟音频设备。如果未设置,则会自动选择设备。我们强烈建议将此字段留空,以便使用自动设备选择!",
387380
"virtual_sink_placeholder": "Steam Streaming Speakers",
@@ -393,39 +386,7 @@
393386
"wan_encryption_mode": "公网加密模式",
394387
"wan_encryption_mode_1": "为支持的客户端启用(默认)",
395388
"wan_encryption_mode_2": "强制所有客户端使用",
396-
"wan_encryption_mode_desc": "这决定了在公网串流时是否加密。加密会降低串流性能,尤其是在性能较弱的主机和客户端上。",
397-
"vdd_tab_title": "虚拟显示器 (VDD)",
398-
"vdd_not_initialized": "VDD 驱动未初始化。请先安装 Parsec VDD 驱动。",
399-
"vdd_driver_status": "驱动状态",
400-
"vdd_connected": "已连接",
401-
"vdd_not_connected": "未连接",
402-
"vdd_active_displays": "活跃显示器",
403-
"vdd_refresh": "刷新",
404-
"vdd_presets": "预设",
405-
"vdd_hz": "刷新率",
406-
"vdd_validation_hint": "宽度: 320-7680, 高度: 240-4320, 刷新率: 30-240",
407-
"vdd_add_display": "添加显示器",
408-
"vdd_remove_all": "移除全部",
409-
"vdd_virtual_displays": "虚拟显示器",
410-
"vdd_col_index": "#",
411-
"vdd_col_device": "设备",
412-
"vdd_col_resolution": "分辨率",
413-
"vdd_col_refresh": "刷新率",
414-
"vdd_col_action": "操作",
415-
"vdd_remove": "移除",
416-
"vdd_no_displays": "没有活跃的虚拟显示器。点击「添加显示器」创建一个。",
417-
"vdd_driver_installation": "驱动安装",
418-
"vdd_driver_install_text": "从这里下载并安装 Parsec VDD 驱动",
419-
"vdd_requires_admin": "(需要管理员权限)",
420-
"vdd_only_windows": "虚拟显示器仅在 Windows 上受支持。",
421-
"vdd_fetch_error": "获取 VDD 状态失败",
422-
"vdd_add_error": "添加显示器失败",
423-
"vdd_remove_error": "移除显示器失败",
424-
"vdd_remove_all_error": "移除全部显示器失败",
425-
"vdd_remove_all_success": "所有虚拟显示器已移除",
426-
"vdd_input_width": "宽度",
427-
"vdd_input_height": "高度",
428-
"vdd_input_hz": "刷新率"
389+
"wan_encryption_mode_desc": "这决定了在公网串流时是否加密。加密会降低串流性能,尤其是在性能较弱的主机和客户端上。"
429390
},
430391
"index": {
431392
"description": "Sunshine 是供 Moonlight 使用的自建游戏串流服务。",

src_assets/common/assets/web/public/assets/locale/zh_TW.json

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -375,13 +375,6 @@
375375
"upnp_desc": "自動設定透過網際網路串流的連接埠轉發",
376376
"vaapi_strict_rc_buffer": "在 AMD GPU 上嚴格執行 H.264/HEVC 的幀位元率限制",
377377
"vaapi_strict_rc_buffer_desc": "啟用此選項可以避免場景變換時在網路上發生畫面掉幀,但可能會降低畫面移動時的影像品質。",
378-
"vdd_display_count": "持久化虛擬顯示器數量",
379-
"vdd_display_count_desc": "啟動時恢復的虛擬顯示器數量(自動設定)",
380-
"vdd_enabled": "啟用虛擬顯示器",
381-
"vdd_enabled_desc": "未偵測到實體顯示器時自動建立虛擬顯示器",
382-
"vdd_height": "虛擬顯示器高度",
383-
"vdd_refresh_rate": "虛擬顯示器更新率",
384-
"vdd_width": "虛擬顯示器寬度",
385378
"virtual_sink": "虛擬音訊輸出",
386379
"virtual_sink_desc": "手動指定要使用的虛擬音訊裝置。如果未設定,則會自動選擇裝置。我們強烈建議將此欄位留空,以使用自動裝置選擇!",
387380
"virtual_sink_placeholder": "Steam 串流喇叭",
@@ -393,39 +386,7 @@
393386
"wan_encryption_mode": "WAN 加密模式",
394387
"wan_encryption_mode_1": "對支援的用戶端啟用(預設)",
395388
"wan_encryption_mode_2": "所有用戶端都需要",
396-
"wan_encryption_mode_desc": "這會決定在網際網路上串流時,何時會使用加密。加密可能會降低串流效能,尤其是在效能較低的主機和用戶端上。",
397-
"vdd_tab_title": "虛擬顯示器 (VDD)",
398-
"vdd_not_initialized": "VDD 驅動未初始化。請先安裝 Parsec VDD 驅動。",
399-
"vdd_driver_status": "驅動狀態",
400-
"vdd_connected": "已連線",
401-
"vdd_not_connected": "未連線",
402-
"vdd_active_displays": "活躍顯示器",
403-
"vdd_refresh": "重新整理",
404-
"vdd_presets": "預設",
405-
"vdd_input_width": "寬度",
406-
"vdd_input_height": "高度",
407-
"vdd_input_hz": "更新率",
408-
"vdd_hz": "更新率",
409-
"vdd_validation_hint": "寬度: 320-7680, 高度: 240-4320, 更新率: 30-240",
410-
"vdd_add_display": "新增顯示器",
411-
"vdd_remove_all": "移除全部",
412-
"vdd_virtual_displays": "虛擬顯示器",
413-
"vdd_col_index": "#",
414-
"vdd_col_device": "裝置",
415-
"vdd_col_resolution": "解析度",
416-
"vdd_col_refresh": "更新率",
417-
"vdd_col_action": "操作",
418-
"vdd_remove": "移除",
419-
"vdd_no_displays": "沒有活躍的虛擬顯示器。點選「新增顯示器」建立一個。",
420-
"vdd_driver_installation": "驅動安裝",
421-
"vdd_driver_install_text": "從這裡下載並安裝 Parsec VDD 驅動",
422-
"vdd_requires_admin": "(需要管理員權限)",
423-
"vdd_only_windows": "虛擬顯示器僅在 Windows 上受支援。",
424-
"vdd_fetch_error": "取得 VDD 狀態失敗",
425-
"vdd_add_error": "新增顯示器失敗",
426-
"vdd_remove_error": "移除顯示器失敗",
427-
"vdd_remove_all_error": "移除全部顯示器失敗",
428-
"vdd_remove_all_success": "所有虛擬顯示器已移除"
389+
"wan_encryption_mode_desc": "這會決定在網際網路上串流時,何時會使用加密。加密可能會降低串流效能,尤其是在效能較低的主機和用戶端上。"
429390
},
430391
"index": {
431392
"description": "Sunshine 是 Moonlight 的自架遊戲串流主機。",

tests/integration/test_config_consistency.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,7 @@ TEST_F(ConfigConsistencyTest, AllConfigOptionsExistInAllFiles) {
445445

446446
// Options that are internal/special and shouldn't be in UI/docs
447447
const std::set<std::string, std::less<>> internalOptions = {
448-
"flags", // Internal config flags, not user-configurable
449-
"vdd_display_configs" // Automatically managed by VDD persistence
448+
"flags" // Internal config flags, not user-configurable
450449
};
451450

452451
std::vector<std::string> missingFromFiles;
@@ -628,8 +627,7 @@ TEST_F(ConfigConsistencyTest, TestFrameworkDetectsMissingOptions) {
628627

629628
// Options that are internal/special and shouldn't be in UI/docs
630629
std::set<std::string, std::less<>> internalOptions = {
631-
"flags", // Internal config flags, not user-configurable
632-
"vdd_display_configs" // Automatically managed by VDD persistence
630+
"flags" // Internal config flags, not user-configurable
633631
};
634632

635633
std::vector<std::string> missingFromFiles;

0 commit comments

Comments
 (0)