Fix build
(Never wanna merge again)
This commit is contained in:
@@ -486,8 +486,7 @@ namespace config {
|
|||||||
{}, // mode_remapping
|
{}, // mode_remapping
|
||||||
{} // wa
|
{} // wa
|
||||||
}, // display_device
|
}, // display_device
|
||||||
|
1, // min_fps_factor
|
||||||
1 // min_fps_factor
|
|
||||||
"1920x1080x60", // fallback_mode
|
"1920x1080x60", // fallback_mode
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -583,20 +583,11 @@ namespace confighttp {
|
|||||||
|
|
||||||
print_req(request);
|
print_req(request);
|
||||||
|
|
||||||
pt::ptree outputTree;
|
|
||||||
auto g = util::fail_guard([&]() {
|
|
||||||
std::ostringstream data;
|
|
||||||
pt::write_json(data, outputTree);
|
|
||||||
response->write(data.str());
|
|
||||||
});
|
|
||||||
|
|
||||||
auto args = request->parse_query_string();
|
auto args = request->parse_query_string();
|
||||||
if (
|
if (
|
||||||
args.find("uuid"s) == std::end(args)
|
args.find("uuid"s) == std::end(args)
|
||||||
) {
|
) {
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, "Missing a required parameter to delete app");
|
||||||
outputTree.put("error", "Missing a required launch parameter");
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,6 +610,10 @@ namespace confighttp {
|
|||||||
fileTree.push_back(std::make_pair("apps", newApps));
|
fileTree.push_back(std::make_pair("apps", newApps));
|
||||||
|
|
||||||
pt::write_json(config::stream.file_apps, fileTree);
|
pt::write_json(config::stream.file_apps, fileTree);
|
||||||
|
|
||||||
|
pt::ptree outputTree;
|
||||||
|
outputTree.put("status", true);
|
||||||
|
send_response(response, outputTree);
|
||||||
}
|
}
|
||||||
catch (std::exception &e) {
|
catch (std::exception &e) {
|
||||||
BOOST_LOG(warning) << "DeleteApp: "sv << e.what();
|
BOOST_LOG(warning) << "DeleteApp: "sv << e.what();
|
||||||
@@ -1019,12 +1014,6 @@ namespace confighttp {
|
|||||||
|
|
||||||
pt::ptree outputTree;
|
pt::ptree outputTree;
|
||||||
|
|
||||||
auto g = util::fail_guard([&]() {
|
|
||||||
std::ostringstream data;
|
|
||||||
pt::write_json(data, outputTree);
|
|
||||||
response->write(data.str());
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto args = request->parse_query_string();
|
auto args = request->parse_query_string();
|
||||||
auto it = args.find("passphrase");
|
auto it = args.find("passphrase");
|
||||||
@@ -1049,12 +1038,11 @@ namespace confighttp {
|
|||||||
outputTree.put("name", config::nvhttp.sunshine_name);
|
outputTree.put("name", config::nvhttp.sunshine_name);
|
||||||
outputTree.put("status", true);
|
outputTree.put("status", true);
|
||||||
outputTree.put("message", "OTP created, effective within 3 minutes.");
|
outputTree.put("message", "OTP created, effective within 3 minutes.");
|
||||||
|
send_response(response, outputTree);
|
||||||
}
|
}
|
||||||
catch (std::exception &e) {
|
catch (std::exception &e) {
|
||||||
BOOST_LOG(warning) << "OTP creation failed: "sv << e.what();
|
BOOST_LOG(warning) << "OTP creation failed: "sv << e.what();
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, e.what());
|
||||||
outputTree.put("message", e.what());
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,24 +1057,17 @@ namespace confighttp {
|
|||||||
|
|
||||||
pt::ptree inputTree, outputTree;
|
pt::ptree inputTree, outputTree;
|
||||||
|
|
||||||
auto g = util::fail_guard([&]() {
|
|
||||||
std::ostringstream data;
|
|
||||||
pt::write_json(data, outputTree);
|
|
||||||
response->write(data.str());
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pt::read_json(ss, inputTree);
|
pt::read_json(ss, inputTree);
|
||||||
std::string uuid = inputTree.get<std::string>("uuid");
|
std::string uuid = inputTree.get<std::string>("uuid");
|
||||||
std::string name = inputTree.get<std::string>("name");
|
std::string name = inputTree.get<std::string>("name");
|
||||||
auto perm = (crypto::PERM)inputTree.get<uint32_t>("perm") & crypto::PERM::_all;
|
auto perm = (crypto::PERM)inputTree.get<uint32_t>("perm") & crypto::PERM::_all;
|
||||||
outputTree.put("status", nvhttp::update_device_info(uuid, name, perm));
|
outputTree.put("status", nvhttp::update_device_info(uuid, name, perm));
|
||||||
|
send_response(response, outputTree);
|
||||||
}
|
}
|
||||||
catch (std::exception &e) {
|
catch (std::exception &e) {
|
||||||
BOOST_LOG(warning) << "Update Client: "sv << e.what();
|
BOOST_LOG(warning) << "Update Client: "sv << e.what();
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, e.what());
|
||||||
outputTree.put("error", e.what());
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1155,19 +1136,11 @@ namespace confighttp {
|
|||||||
|
|
||||||
pt::ptree outputTree;
|
pt::ptree outputTree;
|
||||||
|
|
||||||
auto g = util::fail_guard([&]() {
|
|
||||||
std::ostringstream data;
|
|
||||||
pt::write_json(data, outputTree);
|
|
||||||
response->write(data.str());
|
|
||||||
});
|
|
||||||
|
|
||||||
auto args = request->parse_query_string();
|
auto args = request->parse_query_string();
|
||||||
if (
|
if (
|
||||||
args.find("uuid"s) == std::end(args)
|
args.find("uuid"s) == std::end(args)
|
||||||
) {
|
) {
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, "Missing a required launch parameter");
|
||||||
outputTree.put("error", "Missing a required launch parameter");
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1190,14 +1163,12 @@ namespace confighttp {
|
|||||||
auto launch_session = nvhttp::make_launch_session(true, appid, args, &named_cert);
|
auto launch_session = nvhttp::make_launch_session(true, appid, args, &named_cert);
|
||||||
auto err = proc::proc.execute(appid, app, launch_session);
|
auto err = proc::proc.execute(appid, app, launch_session);
|
||||||
if (err) {
|
if (err) {
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, err == 503
|
||||||
outputTree.put("error",
|
|
||||||
err == 503
|
|
||||||
? "Failed to initialize video capture/encoding. Is a display connected and turned on?"
|
? "Failed to initialize video capture/encoding. Is a display connected and turned on?"
|
||||||
: "Failed to start the specified application");
|
: "Failed to start the specified application");
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
outputTree.put("status", true);
|
outputTree.put("status", true);
|
||||||
|
send_response(response, outputTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -1205,8 +1176,7 @@ namespace confighttp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG(error) << "Couldn't find app with uuid ["sv << uuid << ']';
|
BOOST_LOG(error) << "Couldn't find app with uuid ["sv << uuid << ']';
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, "Cannot find requested application");
|
||||||
outputTree.put("error", "Cannot find requested application");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1220,12 +1190,6 @@ namespace confighttp {
|
|||||||
|
|
||||||
pt::ptree inputTree, outputTree;
|
pt::ptree inputTree, outputTree;
|
||||||
|
|
||||||
auto g = util::fail_guard([&]() {
|
|
||||||
std::ostringstream data;
|
|
||||||
pt::write_json(data, outputTree);
|
|
||||||
response->write(data.str());
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pt::read_json(ss, inputTree);
|
pt::read_json(ss, inputTree);
|
||||||
std::string uuid = inputTree.get<std::string>("uuid");
|
std::string uuid = inputTree.get<std::string>("uuid");
|
||||||
@@ -1233,9 +1197,9 @@ namespace confighttp {
|
|||||||
}
|
}
|
||||||
catch (std::exception &e) {
|
catch (std::exception &e) {
|
||||||
BOOST_LOG(warning) << "Disconnect: "sv << e.what();
|
BOOST_LOG(warning) << "Disconnect: "sv << e.what();
|
||||||
outputTree.put("status", false);
|
bad_request(response, request, e.what());
|
||||||
outputTree.put("error", e.what());
|
|
||||||
}
|
}
|
||||||
|
send_response(response, outputTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -986,17 +986,12 @@ namespace nvhttp {
|
|||||||
print_req<SunshineHTTPS>(request);
|
print_req<SunshineHTTPS>(request);
|
||||||
|
|
||||||
pt::ptree tree;
|
pt::ptree tree;
|
||||||
bool revert_display_configuration { false };
|
|
||||||
auto g = util::fail_guard([&]() {
|
auto g = util::fail_guard([&]() {
|
||||||
std::ostringstream data;
|
std::ostringstream data;
|
||||||
|
|
||||||
pt::write_xml(data, tree);
|
pt::write_xml(data, tree);
|
||||||
response->write(data.str());
|
response->write(data.str());
|
||||||
response->close_connection_after_response = true;
|
response->close_connection_after_response = true;
|
||||||
|
|
||||||
if (revert_display_configuration) {
|
|
||||||
display_device::revert_configuration();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
auto named_cert_p = get_verified_cert(request);
|
auto named_cert_p = get_verified_cert(request);
|
||||||
@@ -1084,9 +1079,6 @@ namespace nvhttp {
|
|||||||
tree.put("root.gamesession", 1);
|
tree.put("root.gamesession", 1);
|
||||||
|
|
||||||
rtsp_stream::launch_session_raise(launch_session);
|
rtsp_stream::launch_session_raise(launch_session);
|
||||||
|
|
||||||
// Stream was started successfully, we will revert the config when the app or session terminates
|
|
||||||
revert_display_configuration = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -166,13 +166,6 @@ namespace proc {
|
|||||||
// Save the original output name in case we modify it temporary later
|
// Save the original output name in case we modify it temporary later
|
||||||
std::string output_name_orig = config::video.output_name;
|
std::string output_name_orig = config::video.output_name;
|
||||||
|
|
||||||
// Executed when returning from function
|
|
||||||
auto fg = util::fail_guard([&]() {
|
|
||||||
// Restore to user defined output name
|
|
||||||
config::video.output_name = output_name_orig;
|
|
||||||
terminate();
|
|
||||||
});
|
|
||||||
|
|
||||||
_app = app;
|
_app = app;
|
||||||
_app_id = app_id;
|
_app_id = app_id;
|
||||||
_launch_session = launch_session;
|
_launch_session = launch_session;
|
||||||
@@ -199,7 +192,19 @@ namespace proc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (config::video.headless_mode || launch_session->virtual_display || _app.virtual_display) {
|
bool create_virtual_display = config::video.headless_mode || launch_session->virtual_display || _app.virtual_display;
|
||||||
|
|
||||||
|
// Executed when returning from function
|
||||||
|
auto fg = util::fail_guard([&]() {
|
||||||
|
// Restore to user defined output name
|
||||||
|
config::video.output_name = output_name_orig;
|
||||||
|
terminate();
|
||||||
|
if (!create_virtual_display) {
|
||||||
|
display_device::revert_configuration();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (create_virtual_display) {
|
||||||
if (vDisplayDriverStatus != VDISPLAY::DRIVER_STATUS::OK) {
|
if (vDisplayDriverStatus != VDISPLAY::DRIVER_STATUS::OK) {
|
||||||
// Try init driver again
|
// Try init driver again
|
||||||
initVDisplayDriver();
|
initVDisplayDriver();
|
||||||
@@ -280,7 +285,19 @@ namespace proc {
|
|||||||
config::video.output_name = this->display_name;
|
config::video.output_name = this->display_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
display_device::configure_display(config::video, *launch_session);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Executed when returning from function
|
||||||
|
auto fg = util::fail_guard([&]() {
|
||||||
|
// Restore to user defined output name
|
||||||
|
config::video.output_name = output_name_orig;
|
||||||
|
terminate();
|
||||||
|
display_device::revert_configuration();
|
||||||
|
});
|
||||||
|
|
||||||
|
display_device::configure_display(config::video, *launch_session);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Probe encoders again before streaming to ensure our chosen
|
// Probe encoders again before streaming to ensure our chosen
|
||||||
@@ -419,7 +436,9 @@ namespace proc {
|
|||||||
|
|
||||||
// We should have got the actual streaming display by now
|
// We should have got the actual streaming display by now
|
||||||
std::string currentDisplay = this->display_name;
|
std::string currentDisplay = this->display_name;
|
||||||
if (!currentDisplay.empty()) {
|
if (currentDisplay.empty()) {
|
||||||
|
BOOST_LOG(warning) << "Not getting current display in time! HDR will not be toggled.";
|
||||||
|
} else {
|
||||||
auto currentDisplayW = platf::from_utf8(currentDisplay).c_str();
|
auto currentDisplayW = platf::from_utf8(currentDisplay).c_str();
|
||||||
|
|
||||||
this->initial_display = currentDisplay;
|
this->initial_display = currentDisplay;
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
#include "crypto.h"
|
#include "crypto.h"
|
||||||
#include "thread_safe.h"
|
#include "thread_safe.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// Resolve circular dependencies
|
// Resolve circular dependencies
|
||||||
namespace stream {
|
namespace stream {
|
||||||
struct session_t;
|
struct session_t;
|
||||||
|
|||||||
@@ -273,12 +273,13 @@
|
|||||||
default="true"
|
default="true"
|
||||||
></Checkbox>
|
></Checkbox>
|
||||||
<!-- use virtual display -->
|
<!-- use virtual display -->
|
||||||
<div class="mb-3 form-check" v-if="platform === 'windows'">
|
<Checkbox class="mb-3"
|
||||||
<label for="virtualDisplay" class="form-check-label">{{ $t('apps.virtual_display') }}</label>
|
id="virtualDisplay"
|
||||||
<input type="checkbox" class="form-check-input" id="virtualDisplay" v-model="editForm['virtual-display']"
|
label="apps.virtual_display"
|
||||||
true-value="true" false-value="false" />
|
desc="apps.virtual_display_desc"
|
||||||
<div class="form-text">{{ $t('apps.virtual_display_desc') }}</div>
|
v-model="editForm['exclude-global-prep-cmd']"
|
||||||
</div>
|
default="false"
|
||||||
|
></Checkbox>
|
||||||
<!-- set virtual display to primary -->
|
<!-- set virtual display to primary -->
|
||||||
<div class="mb-3 form-check" v-if="platform === 'windows' && editForm['virtual-display'] == 'true'">
|
<div class="mb-3 form-check" v-if="platform === 'windows' && editForm['virtual-display'] == 'true'">
|
||||||
<label for="virtualDisplayPrimary" class="form-check-label">{{ $t('apps.virtual_display_primary') }}</label>
|
<label for="virtualDisplayPrimary" class="form-check-label">{{ $t('apps.virtual_display_primary') }}</label>
|
||||||
@@ -399,7 +400,6 @@
|
|||||||
import { initApp } from './init'
|
import { initApp } from './init'
|
||||||
import Navbar from './Navbar.vue'
|
import Navbar from './Navbar.vue'
|
||||||
import Checkbox from './Checkbox.vue'
|
import Checkbox from './Checkbox.vue'
|
||||||
import PlatformLayout from './PlatformLayout.vue'
|
|
||||||
import { Dropdown } from 'bootstrap/dist/js/bootstrap'
|
import { Dropdown } from 'bootstrap/dist/js/bootstrap'
|
||||||
|
|
||||||
const newApp = {
|
const newApp = {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
<general
|
<general
|
||||||
v-if="currentTab === 'general'"
|
v-if="currentTab === 'general'"
|
||||||
:config="config"
|
:config="config"
|
||||||
|
:global-prep-cmd="global_prep_cmd"
|
||||||
:server-cmd="server_cmd"
|
:server-cmd="server_cmd"
|
||||||
:platform="platform">
|
:platform="platform">
|
||||||
</general>
|
</general>
|
||||||
@@ -135,6 +136,7 @@
|
|||||||
config: null,
|
config: null,
|
||||||
currentTab: "general",
|
currentTab: "general",
|
||||||
vdisplayStatus: "1",
|
vdisplayStatus: "1",
|
||||||
|
global_prep_cmd: [],
|
||||||
server_cmd: [],
|
server_cmd: [],
|
||||||
tabs: [ // TODO: Move the options to each Component instead, encapsulate.
|
tabs: [ // TODO: Move the options to each Component instead, encapsulate.
|
||||||
{
|
{
|
||||||
@@ -144,8 +146,8 @@
|
|||||||
"locale": "en",
|
"locale": "en",
|
||||||
"sunshine_name": "",
|
"sunshine_name": "",
|
||||||
"min_log_level": 2,
|
"min_log_level": 2,
|
||||||
"global_prep_cmd": "[]",
|
"global_prep_cmd": [],
|
||||||
"server_cmd": "[]",
|
"server_cmd": [],
|
||||||
"notify_pre_releases": "disabled",
|
"notify_pre_releases": "disabled",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -362,7 +364,7 @@
|
|||||||
|
|
||||||
this.config.global_prep_cmd = this.config.global_prep_cmd || [];
|
this.config.global_prep_cmd = this.config.global_prep_cmd || [];
|
||||||
this.config.server_cmd = this.config.server_cmd || [];
|
this.config.server_cmd = this.config.server_cmd || [];
|
||||||
this.global_prep_cmd = JSON.parse(this.config.global_prep_cmd);
|
this.global_prep_cmd = this.config.global_prep_cmd;
|
||||||
this.server_cmd = JSON.parse(this.config.server_cmd);
|
this.server_cmd = JSON.parse(this.config.server_cmd);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -371,9 +373,6 @@
|
|||||||
this.$forceUpdate()
|
this.$forceUpdate()
|
||||||
},
|
},
|
||||||
serialize() {
|
serialize() {
|
||||||
this.config.global_prep_cmd = JSON.stringify(this.global_prep_cmd.filter(cmd => cmd.do || cmd.undo));
|
|
||||||
this.config.server_cmd = JSON.stringify(this.server_cmd.filter(cmd => cmd.name && cmd.cmd));
|
|
||||||
|
|
||||||
// Validate fallback mode
|
// Validate fallback mode
|
||||||
if (this.config.fallback_mode && !this.config.fallback_mode.match(/^\d+x\d+x\d+$/)) {
|
if (this.config.fallback_mode && !this.config.fallback_mode.match(/^\d+x\d+x\d+$/)) {
|
||||||
this.config.fallback_mode = fallbackDisplayModeCache;
|
this.config.fallback_mode = fallbackDisplayModeCache;
|
||||||
@@ -381,8 +380,9 @@
|
|||||||
fallbackDisplayModeCache = this.config.fallback_mode;
|
fallbackDisplayModeCache = this.config.fallback_mode;
|
||||||
}
|
}
|
||||||
let config = JSON.parse(JSON.stringify(this.config));
|
let config = JSON.parse(JSON.stringify(this.config));
|
||||||
config.global_prep_cmd = JSON.stringify(config.global_prep_cmd);
|
config.global_prep_cmd = JSON.stringify(this.global_prep_cmd.filter(cmd => cmd.do || cmd.undo));
|
||||||
config.dd_mode_remapping = JSON.stringify(config.dd_mode_remapping);
|
config.dd_mode_remapping = JSON.stringify(config.dd_mode_remapping);
|
||||||
|
config.server_cmd = JSON.stringify(this.server_cmd.filter(cmd => cmd.name && cmd.cmd));
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
save() {
|
save() {
|
||||||
|
|||||||
@@ -84,17 +84,19 @@ const validateFallbackMode = (event) => {
|
|||||||
default="true"
|
default="true"
|
||||||
></Checkbox>
|
></Checkbox>
|
||||||
|
|
||||||
<div class="mb-3 form-check">
|
<Checkbox class="mb-3"
|
||||||
<input type="checkbox" class="form-check-input" id="keep_sink_default" v-model="config.keep_sink_default" true-value="enabled" false-value="disabled"/>
|
id="keep_sink_default"
|
||||||
<label for="keep_sink_default" class="form-check-label">{{ $t('config.keep_sink_default') }}</label>
|
locale-prefix="config"
|
||||||
<div class="form-text pre-wrap">{{ $t('config.keep_sink_default_desc') }}</div>
|
v-model="config.keep_sink_default"
|
||||||
</div>
|
default="true"
|
||||||
|
></Checkbox>
|
||||||
|
|
||||||
<div class="mb-3 form-check">
|
<Checkbox class="mb-3"
|
||||||
<input type="checkbox" class="form-check-input" id="auto_capture_sink" v-model="config.auto_capture_sink" true-value="enabled" false-value="disabled"/>
|
id="auto_capture_sink"
|
||||||
<label for="auto_capture_sink" class="form-check-label">{{ $t('config.auto_capture_sink') }}</label>
|
locale-prefix="config"
|
||||||
<div class="form-text pre-wrap">{{ $t('config.auto_capture_sink_desc') }}</div>
|
v-model="config.auto_capture_sink"
|
||||||
</div>
|
default="true"
|
||||||
|
></Checkbox>
|
||||||
</template>
|
</template>
|
||||||
</PlatformLayout>
|
</PlatformLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ onMounted(() => {
|
|||||||
<div id="global_prep_cmd" class="mb-3 d-flex flex-column">
|
<div id="global_prep_cmd" class="mb-3 d-flex flex-column">
|
||||||
<label class="form-label">{{ $t('config.global_prep_cmd') }}</label>
|
<label class="form-label">{{ $t('config.global_prep_cmd') }}</label>
|
||||||
<div class="form-text">{{ $t('config.global_prep_cmd_desc') }}</div>
|
<div class="form-text">{{ $t('config.global_prep_cmd_desc') }}</div>
|
||||||
<table class="table" v-if="config.global_prep_cmd.length > 0">
|
<table class="table" v-if="globalPrepCmd.length > 0">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col"><i class="fas fa-play"></i> {{ $t('_common.do_cmd') }}</th>
|
<th scope="col"><i class="fas fa-play"></i> {{ $t('_common.do_cmd') }}</th>
|
||||||
@@ -111,7 +111,7 @@ onMounted(() => {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="(c, i) in config.global_prep_cmd">
|
<tr v-for="(c, i) in globalPrepCmd">
|
||||||
<td>
|
<td>
|
||||||
<input type="text" class="form-control monospace" v-model="c.do" />
|
<input type="text" class="form-control monospace" v-model="c.do" />
|
||||||
</td>
|
</td>
|
||||||
@@ -191,18 +191,20 @@ onMounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Enable Pairing -->
|
<!-- Enable Pairing -->
|
||||||
<div class="mb-3 form-check">
|
<Checkbox class="mb-3"
|
||||||
<input type="checkbox" class="form-check-input" id="enable_pairing" v-model="config.enable_pairing" true-value="enabled" false-value="disabled"/>
|
id="enable_pairing"
|
||||||
<label for="enable_pairing" class="form-check-label">{{ $t('config.enable_pairing') }}</label>
|
locale-prefix="config"
|
||||||
<div class="form-text">{{ $t('config.enable_pairing_desc') }}</div>
|
v-model="config.enable_pairing"
|
||||||
</div>
|
default="true"
|
||||||
|
></Checkbox>
|
||||||
|
|
||||||
<!-- Hide Tray Controls -->
|
<!-- Hide Tray Controls -->
|
||||||
<div class="mb-3 form-check">
|
<Checkbox class="mb-3"
|
||||||
<input type="checkbox" class="form-check-input" id="hide_tray_controls" v-model="config.hide_tray_controls" true-value="enabled" false-value="disabled"/>
|
id="hide_tray_controls"
|
||||||
<label for="hide_tray_controls" class="form-check-label">{{ $t('config.hide_tray_controls') }}</label>
|
locale-prefix="config"
|
||||||
<div class="form-text">{{ $t('config.hide_tray_controls_desc') }}</div>
|
v-model="config.hide_tray_controls"
|
||||||
</div>
|
default="false"
|
||||||
|
></Checkbox>
|
||||||
|
|
||||||
<!-- Notify Pre-Releases -->
|
<!-- Notify Pre-Releases -->
|
||||||
<Checkbox class="mb-3"
|
<Checkbox class="mb-3"
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ function addRemappingEntry() {
|
|||||||
<h2 class="accordion-header">
|
<h2 class="accordion-header">
|
||||||
<button class="accordion-button" type="button" data-bs-toggle="collapse"
|
<button class="accordion-button" type="button" data-bs-toggle="collapse"
|
||||||
data-bs-target="#panelsStayOpen-collapseOne">
|
data-bs-target="#panelsStayOpen-collapseOne">
|
||||||
{{ $t('config.dd_options_header') }}
|
{{ $t('config.dd_options_header') }} {{ $t('dd_options_header_vdd_na') }}
|
||||||
</button>
|
</button>
|
||||||
</h2>
|
</h2>
|
||||||
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show"
|
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show"
|
||||||
|
|||||||
@@ -92,7 +92,7 @@
|
|||||||
"virtual_display": "Always use Virtual Display",
|
"virtual_display": "Always use Virtual Display",
|
||||||
"virtual_display_desc": "Always use virtual display on this app, overriding client request. Please make sure the SudoVDA driver is installed and enabled.",
|
"virtual_display_desc": "Always use virtual display on this app, overriding client request. Please make sure the SudoVDA driver is installed and enabled.",
|
||||||
"virtual_display_primary": "Enforce Virtual Display Primary",
|
"virtual_display_primary": "Enforce Virtual Display Primary",
|
||||||
"virtual_display_primary_desc": "Automatically set the virtual display as primary display when the app starts. Virtual display will always be set to primary when client requests to use virtual display. (Recommended to keep on)",
|
"virtual_display_primary_desc": "Automatically set the virtual display as primary display when the app starts. Virtual display will always be set to primary when client requests to use virtual display. (Recommended to keep on) [Broken on Windows 11 24H2]",
|
||||||
"resolution_scale_factor": "Resolution Scale Factor",
|
"resolution_scale_factor": "Resolution Scale Factor",
|
||||||
"resolution_scale_factor_desc": "Scale the client requested resolution based on this factor. e.g. 2000x1000 with a factor of 120% will become 2400x1200. Overrides client requested factor when the number isn't 100%. This option won't affect client requested streaming resolution.",
|
"resolution_scale_factor_desc": "Scale the client requested resolution based on this factor. e.g. 2000x1000 with a factor of 120% will become 2400x1200. Overrides client requested factor when the number isn't 100%. This option won't affect client requested streaming resolution.",
|
||||||
"use_app_identity": "Use App Identity",
|
"use_app_identity": "Use App Identity",
|
||||||
@@ -201,6 +201,7 @@
|
|||||||
"dd_mode_remapping_requested_fps": "Requested FPS",
|
"dd_mode_remapping_requested_fps": "Requested FPS",
|
||||||
"dd_mode_remapping_requested_resolution": "Requested resolution",
|
"dd_mode_remapping_requested_resolution": "Requested resolution",
|
||||||
"dd_options_header": "Advanced display device options",
|
"dd_options_header": "Advanced display device options",
|
||||||
|
"dd_options_header_vdd_na": "(Does not work with Virtual Display)",
|
||||||
"dd_refresh_rate_option": "Refresh rate",
|
"dd_refresh_rate_option": "Refresh rate",
|
||||||
"dd_refresh_rate_option_auto": "Use FPS value provided by the client (default)",
|
"dd_refresh_rate_option_auto": "Use FPS value provided by the client (default)",
|
||||||
"dd_refresh_rate_option_disabled": "Do not change refresh rate",
|
"dd_refresh_rate_option_disabled": "Do not change refresh rate",
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
"virtual_display": "总是使用虚拟显示器",
|
"virtual_display": "总是使用虚拟显示器",
|
||||||
"virtual_display_desc": "在使用这个 App 的时候总是使用虚拟显示器,覆盖客户端请求。请确保 SudoVDA 虚拟显示器驱动已安装并启用。",
|
"virtual_display_desc": "在使用这个 App 的时候总是使用虚拟显示器,覆盖客户端请求。请确保 SudoVDA 虚拟显示器驱动已安装并启用。",
|
||||||
"virtual_display_primary": "强制设置虚拟显示器为主显示器",
|
"virtual_display_primary": "强制设置虚拟显示器为主显示器",
|
||||||
"virtual_display_primary_desc": "在 App 启动时强制将虚拟显示器设为主显示器。当客户端请求使用虚拟显示器时将无条件设为主显示器。(覆盖全局设置,推荐保持开启)",
|
"virtual_display_primary_desc": "在 App 启动时强制将虚拟显示器设为主显示器。当客户端请求使用虚拟显示器时将无条件设为主显示器。(覆盖全局设置,推荐保持开启)[Windows 11 24H2 不可用]",
|
||||||
"resolution_scale_factor": "分辨率缩放比例",
|
"resolution_scale_factor": "分辨率缩放比例",
|
||||||
"resolution_scale_factor_desc": "基于此比例缩放客户端请求的分辨率。例如 2000x1000 缩放 120% 将变成 2400x1200。当此项为非 100% 时覆盖客户端请求的缩放比例。此选项不会影响客户端请求的串流分辨率。",
|
"resolution_scale_factor_desc": "基于此比例缩放客户端请求的分辨率。例如 2000x1000 缩放 120% 将变成 2400x1200。当此项为非 100% 时覆盖客户端请求的缩放比例。此选项不会影响客户端请求的串流分辨率。",
|
||||||
"use_app_identity": "使用 App 身份",
|
"use_app_identity": "使用 App 身份",
|
||||||
@@ -198,6 +198,7 @@
|
|||||||
"dd_mode_remapping_requested_fps": "请求FPS",
|
"dd_mode_remapping_requested_fps": "请求FPS",
|
||||||
"dd_mode_remapping_requested_resolution": "请求的决议",
|
"dd_mode_remapping_requested_resolution": "请求的决议",
|
||||||
"dd_options_header": "高级显示设备选项",
|
"dd_options_header": "高级显示设备选项",
|
||||||
|
"dd_options_header_vdd_na": "(使用虚拟显示器时不可用)",
|
||||||
"dd_refresh_rate_option": "刷新率",
|
"dd_refresh_rate_option": "刷新率",
|
||||||
"dd_refresh_rate_option_auto": "使用客户端提供的 FPS 值 (默认)",
|
"dd_refresh_rate_option_auto": "使用客户端提供的 FPS 值 (默认)",
|
||||||
"dd_refresh_rate_option_disabled": "不要改变刷新率",
|
"dd_refresh_rate_option_disabled": "不要改变刷新率",
|
||||||
|
|||||||
Reference in New Issue
Block a user