Expose the mux multiplexing settings in the Core settings UI (#10055)

* Exposed the mux multiplexing settings in the core settings UI. Now it's possible to change the default concurrency value of 8 without editing config.json.

* Adjust

* Adjust

---------

Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
This commit is contained in:
Aredelya
2026-09-04 06:48:42 +03:00
committed by GitHub
parent df32b4d6cc
commit fe2e219b7a
8 changed files with 215 additions and 2 deletions

View File

@@ -4545,6 +4545,42 @@ namespace ServiceLib.Resx {
}
}
/// <summary>
/// 查找类似 Xray Mux setting 的本地化字符串。
/// </summary>
public static string TbSettingsMux4Ray {
get {
return ResourceManager.GetString("TbSettingsMux4Ray", resourceCulture);
}
}
/// <summary>
/// 查找类似 Xray Mux concurrency 的本地化字符串。
/// </summary>
public static string TbSettingsMux4RayConcurrency {
get {
return ResourceManager.GetString("TbSettingsMux4RayConcurrency", resourceCulture);
}
}
/// <summary>
/// 查找类似 Xray Mux XUDP concurrency 的本地化字符串。
/// </summary>
public static string TbSettingsMux4RayXudpConcurrency {
get {
return ResourceManager.GetString("TbSettingsMux4RayXudpConcurrency", resourceCulture);
}
}
/// <summary>
/// 查找类似 Xray Mux XUDP proxy UDP443 的本地化字符串。
/// </summary>
public static string TbSettingsMux4RayXudpProxyUDP443 {
get {
return ResourceManager.GetString("TbSettingsMux4RayXudpProxyUDP443", resourceCulture);
}
}
/// <summary>
/// 查找类似 sing-box Mux Protocol 的本地化字符串。
/// </summary>

View File

@@ -1023,6 +1023,15 @@
<data name="TbSettingsMux4SboxProtocol" xml:space="preserve">
<value>sing-box Mux Protocol</value>
</data>
<data name="TbSettingsMux4RayConcurrency" xml:space="preserve">
<value>Xray Mux concurrency</value>
</data>
<data name="TbSettingsMux4RayXudpConcurrency" xml:space="preserve">
<value>Xray Mux XUDP concurrency</value>
</data>
<data name="TbSettingsMux4RayXudpProxyUDP443" xml:space="preserve">
<value>Xray Mux XUDP proxy UDP443</value>
</data>
<data name="TbRoutingRuleProcess" xml:space="preserve">
<value>Process (Linux/Windows)</value>
</data>
@@ -1875,4 +1884,7 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbDNS" xml:space="preserve">
<value>DNS</value>
</data>
<data name="TbSettingsMux4Ray" xml:space="preserve">
<value>Xray Mux setting</value>
</data>
</root>

View File

@@ -1876,4 +1876,7 @@
<data name="TbDNS" xml:space="preserve">
<value>DNS</value>
</data>
<data name="TbSettingsMux4Ray" xml:space="preserve">
<value>Xray Mux 设置</value>
</data>
</root>

View File

@@ -22,6 +22,9 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
[Reactive] public partial string DefUserAgent { get; set; }
[Reactive] public partial string SendThrough { get; set; }
[Reactive] public partial string BindInterface { get; set; }
[Reactive] public partial int? Mux4RayConcurrency { get; set; }
[Reactive] public partial int? Mux4RayXudpConcurrency { get; set; }
[Reactive] public partial string Mux4RayXudpProxyUDP443 { get; set; }
[Reactive] public partial string Mux4SboxProtocol { get; set; }
[Reactive] public partial bool EnableCacheFile4Sbox { get; set; }
[Reactive] public partial int? HyUpMbps { get; set; }
@@ -152,6 +155,9 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
DefUserAgent = _config.CoreBasicItem.DefUserAgent;
SendThrough = _config.CoreBasicItem.SendThrough ?? string.Empty;
BindInterface = _config.CoreBasicItem.BindInterface ?? string.Empty;
Mux4RayConcurrency = _config.Mux4RayItem.Concurrency;
Mux4RayXudpConcurrency = _config.Mux4RayItem.XudpConcurrency;
Mux4RayXudpProxyUDP443 = _config.Mux4RayItem.XudpProxyUDP443 ?? string.Empty;
Mux4SboxProtocol = _config.Mux4SboxItem.Protocol;
EnableCacheFile4Sbox = _config.CoreBasicItem.EnableCacheFile4Sbox;
HyUpMbps = _config.HysteriaItem.UpMbps;
@@ -327,6 +333,9 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
_config.CoreBasicItem.DefUserAgent = DefUserAgent;
_config.CoreBasicItem.SendThrough = SendThrough.TrimEx();
_config.CoreBasicItem.BindInterface = BindInterface.TrimEx();
_config.Mux4RayItem.Concurrency = Mux4RayConcurrency > 0 ? Mux4RayConcurrency : null;
_config.Mux4RayItem.XudpConcurrency = Mux4RayXudpConcurrency > 0 ? Mux4RayXudpConcurrency : null;
_config.Mux4RayItem.XudpProxyUDP443 = Mux4RayXudpProxyUDP443.NullIfEmpty();
_config.Mux4SboxItem.Protocol = Mux4SboxProtocol;
_config.CoreBasicItem.EnableCacheFile4Sbox = EnableCacheFile4Sbox;
_config.HysteriaItem.UpMbps = HyUpMbps ?? 0;

View File

@@ -40,7 +40,7 @@
<Grid
Margin="{StaticResource Margin4}"
ColumnDefinitions="Auto,Auto,*"
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<TextBlock
Grid.Row="0"
@@ -471,6 +471,75 @@
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsSendThroughTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="24"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsMux4Ray}" />
<Button
Grid.Row="24"
Grid.Column="1"
Margin="{StaticResource MarginLr8}"
HorizontalAlignment="Left"
Classes="IconButton">
<Button.Content>
<PathIcon Data="{StaticResource SemiIconMore}">
<PathIcon.RenderTransform>
<RotateTransform Angle="90" />
</PathIcon.RenderTransform>
</PathIcon>
</Button.Content>
<Button.Flyout>
<Flyout>
<StackPanel Margin="{StaticResource Margin8}">
<Grid ColumnDefinitions="Auto,Auto" RowDefinitions="Auto,Auto,Auto">
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsMux4RayConcurrency}" />
<TextBox
x:Name="txtmux4RayConcurrency"
Grid.Row="0"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin4}"
PlaceholderText="8" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsMux4RayXudpConcurrency}" />
<TextBox
x:Name="txtmux4RayXudpConcurrency"
Grid.Row="1"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin4}"
PlaceholderText="16" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsMux4RayXudpProxyUDP443}" />
<ComboBox
x:Name="cmbmux4RayXudpProxyUDP443"
Grid.Row="2"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin4}" />
</Grid>
</StackPanel>
</Flyout>
</Button.Flyout>
</Button>
</Grid>
</ScrollViewer>
</TabItem>

View File

@@ -30,6 +30,7 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
cmbdefFingerprint.ItemsSource = Global.Fingerprints;
cmbdefUserAgent.ItemsSource = Global.UserAgent;
cmbmux4SboxProtocol.ItemsSource = Global.SingboxMuxs;
cmbmux4RayXudpProxyUDP443.ItemsSource = new[] { "reject", "skip" };
cmbMtu.ItemsSource = Global.TunMtus;
cmbStack.ItemsSource = Global.TunStacks;
cmbIcmpRoutingPolicy.ItemsSource = Global.TunIcmpRoutingPolicies;
@@ -80,6 +81,9 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
this.Bind(ViewModel, vm => vm.DefFingerprint, v => v.cmbdefFingerprint.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.DefUserAgent, v => v.cmbdefUserAgent.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.BindInterface, v => v.txtbindInterface.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayConcurrency, v => v.txtmux4RayConcurrency.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayXudpConcurrency, v => v.txtmux4RayXudpConcurrency.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayXudpProxyUDP443, v => v.cmbmux4RayXudpProxyUDP443.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SendThrough, v => v.txtsendThrough.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4SboxProtocol, v => v.cmbmux4SboxProtocol.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.EnableCacheFile4Sbox, v => v.togenableCacheFile4Sbox.IsChecked).DisposeWith(disposables);

View File

@@ -74,6 +74,7 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
@@ -535,6 +536,82 @@
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsSendThroughTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="24"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsMux4Ray}" />
<materialDesign:PopupBox
Grid.Row="24"
Grid.Column="1"
HorizontalAlignment="Left"
StaysOpen="True"
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
<StackPanel Margin="{StaticResource Margin8}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsMux4RayConcurrency}"
TextWrapping="Wrap" />
<TextBox
x:Name="txtmux4RayConcurrency"
Grid.Row="0"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin8}"
Style="{StaticResource DefTextBox}" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsMux4RayXudpConcurrency}"
TextWrapping="Wrap" />
<TextBox
x:Name="txtmux4RayXudpConcurrency"
Grid.Row="1"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin8}"
Style="{StaticResource DefTextBox}" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsMux4RayXudpProxyUDP443}"
TextWrapping="Wrap" />
<ComboBox
x:Name="cmbmux4RayXudpProxyUDP443"
Grid.Row="2"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" />
</Grid>
</StackPanel>
</materialDesign:PopupBox>
</Grid>
</ScrollViewer>
</TabItem>
@@ -1365,7 +1442,6 @@
HorizontalAlignment="Left"
Style="{StaticResource DefComboBox}" />
<TextBlock
Grid.Row="11"
Grid.Column="0"

View File

@@ -26,6 +26,7 @@ public partial class OptionSettingWindow
cmbdefFingerprint.ItemsSource = Global.Fingerprints;
cmbdefUserAgent.ItemsSource = Global.UserAgent;
cmbmux4SboxProtocol.ItemsSource = Global.SingboxMuxs;
cmbmux4RayXudpProxyUDP443.ItemsSource = new[] { "reject", "skip" };
cmbMtu.ItemsSource = Global.TunMtus;
cmbStack.ItemsSource = Global.TunStacks;
cmbIcmpRoutingPolicy.ItemsSource = Global.TunIcmpRoutingPolicies;
@@ -77,6 +78,9 @@ public partial class OptionSettingWindow
this.Bind(ViewModel, vm => vm.DefUserAgent, v => v.cmbdefUserAgent.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SendThrough, v => v.txtsendThrough.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.BindInterface, v => v.txtbindInterface.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayConcurrency, v => v.txtmux4RayConcurrency.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayXudpConcurrency, v => v.txtmux4RayXudpConcurrency.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4RayXudpProxyUDP443, v => v.cmbmux4RayXudpProxyUDP443.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Mux4SboxProtocol, v => v.cmbmux4SboxProtocol.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.EnableCacheFile4Sbox, v => v.togenableCacheFile4Sbox.IsChecked).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.HyUpMbps, v => v.txtUpMbps.Text).DisposeWith(disposables);