diff --git a/fmt/Preset.hpp b/fmt/Preset.hpp
index 9600298..ff02682 100644
--- a/fmt/Preset.hpp
+++ b/fmt/Preset.hpp
@@ -11,7 +11,7 @@ namespace Preset {
} // namespace Xray
namespace SingBox {
- inline QStringList VpnImplementation = {"gvisor", "system"};
+ inline QStringList VpnImplementation = {"gvisor", "system", "mixed"};
inline QStringList DomainStrategy = {"", "ipv4_only", "ipv6_only", "prefer_ipv4", "prefer_ipv6"};
inline QStringList UtlsFingerPrint = {"", "chrome", "firefox", "edge", "safari", "360", "qq", "ios", "android", "random", "randomized"};
inline QStringList ShadowsocksMethods = {"2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "none", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "rc4-md5", "chacha20-ietf", "xchacha20"};
diff --git a/sub/GroupUpdater.cpp b/sub/GroupUpdater.cpp
index 22de455..45e95a6 100644
--- a/sub/GroupUpdater.cpp
+++ b/sub/GroupUpdater.cpp
@@ -218,7 +218,7 @@ namespace NekoGui_sub {
try {
auto proxies = YAML::Load(str.toStdString())["proxies"];
for (auto proxy: proxies) {
- auto type = Node2QString(proxy["type"]);
+ auto type = Node2QString(proxy["type"]).toLower();
auto type_clash = type;
if (type == "ss" || type == "ssr") type = "shadowsocks";
@@ -233,7 +233,7 @@ namespace NekoGui_sub {
ent->bean->serverAddress = Node2QString(proxy["server"]);
ent->bean->serverPort = Node2Int(proxy["port"]);
- if (type == "shadowsocks") {
+ if (type_clash == "ss") {
auto bean = ent->ShadowSocksBean();
bean->method = Node2QString(proxy["cipher"]).replace("dummy", "none");
bean->password = Node2QString(proxy["password"]);
@@ -271,12 +271,7 @@ namespace NekoGui_sub {
// sing-mux
auto smux = NodeChild(proxy, {"smux"});
- if (Node2Bool(smux["enabled"]) == true) bean->stream->multiplex_status = 1;
-
- auto protocol_n = proxy["protocol"];
- if (protocol_n.IsDefined()) {
- continue; // SSR
- }
+ if (Node2Bool(smux["enabled"])) bean->stream->multiplex_status = 1;
} else if (type == "socks" || type == "http") {
auto bean = ent->SocksHTTPBean();
bean->username = Node2QString(proxy["username"]);
@@ -308,7 +303,7 @@ namespace NekoGui_sub {
// sing-mux
auto smux = NodeChild(proxy, {"smux"});
- if (Node2Bool(smux["enabled"]) == true) bean->stream->multiplex_status = 1;
+ if (Node2Bool(smux["enabled"])) bean->stream->multiplex_status = 1;
// opts
auto ws = NodeChild(proxy, {"ws-opts", "ws-opt"});
@@ -348,7 +343,7 @@ namespace NekoGui_sub {
// sing-mux
auto smux = NodeChild(proxy, {"smux"});
- if (Node2Bool(smux["enabled"]) == true) bean->stream->multiplex_status = 1;
+ if (Node2Bool(smux["enabled"])) bean->stream->multiplex_status = 1;
// meta packet encoding
if (Node2Bool(proxy["xudp"])) bean->stream->packet_encoding = "xudp";
@@ -404,7 +399,6 @@ namespace NekoGui_sub {
auto bean = ent->QUICBean();
bean->hopPort = Node2QString(proxy["ports"]);
- if (bean->serverPort == 0) bean->hopPort = Node2QString(proxy["port"]);
bean->allowInsecure = Node2Bool(proxy["skip-cert-verify"]);
auto alpn = Node2QStringList(proxy["alpn"]);
diff --git a/ui/dialog_vpn_settings.ui b/ui/dialog_vpn_settings.ui
index b214f49..b0e4717 100644
--- a/ui/dialog_vpn_settings.ui
+++ b/ui/dialog_vpn_settings.ui
@@ -48,6 +48,11 @@
System
+ -
+
+ Mixed
+
+
-