Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ad22e0a73 | ||
|
|
ca1abb58eb | ||
|
|
3e353944b2 | ||
|
|
007a250f55 | ||
|
|
e9bb6a9951 | ||
|
|
82f236e07b | ||
|
|
17bfe74ecf | ||
|
|
b77827df90 | ||
|
|
a359a508ae | ||
|
|
3a740118f0 | ||
|
|
58d9bcbd14 | ||
|
|
24be7b2180 | ||
|
|
f4c9ca8dff | ||
|
|
9b8181b72b | ||
|
|
1ff1962425 | ||
|
|
9b05736746 | ||
|
|
dec722e693 | ||
|
|
49fa0a4c67 | ||
|
|
0cdc69e1e8 | ||
|
|
0494cc4ce7 | ||
|
|
30d82947d6 | ||
|
|
ec59249d79 | ||
|
|
7eb869ab1d | ||
|
|
d014724a2d | ||
|
|
dfb6cef364 | ||
|
|
0ebf8c9349 | ||
|
|
9dfd89c90d | ||
|
|
f6972125cd | ||
|
|
6e366bf55a | ||
|
|
5e2e45c673 | ||
|
|
f879235564 | ||
|
|
b00aee2ae7 | ||
|
|
28c2159ec3 | ||
|
|
33dcef2285 | ||
|
|
b9acd0ec28 | ||
|
|
7989d5180b | ||
|
|
238086942e | ||
|
|
a704a30242 | ||
|
|
26dd0d0ea5 | ||
|
|
e31a4bcaa9 | ||
|
|
1722dc570b | ||
|
|
3575e69b43 | ||
|
|
373d89874c | ||
|
|
976087ce97 | ||
|
|
69a45788ee | ||
|
|
92e4de12fb | ||
|
|
ea7fdb9b3d | ||
|
|
fe1c043b8e | ||
|
|
146f597a0b | ||
|
|
d2bef312ce | ||
|
|
61f297215d | ||
|
|
639a9fd540 | ||
|
|
3d0428c518 |
@@ -17,6 +17,10 @@
|
|||||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
<system:Double x:Key="MenuItemHeight">26</system:Double>
|
<system:Double x:Key="MenuItemHeight">26</system:Double>
|
||||||
|
<system:Double x:Key="StdFontSize">12</system:Double>
|
||||||
|
<system:Double x:Key="StdFontSize1">13</system:Double>
|
||||||
|
<system:Double x:Key="StdFontSize2">14</system:Double>
|
||||||
|
<system:Double x:Key="StdFontSizeMsg">11</system:Double>
|
||||||
<Thickness
|
<Thickness
|
||||||
x:Key="ServerItemMargin"
|
x:Key="ServerItemMargin"
|
||||||
Bottom="4"
|
Bottom="4"
|
||||||
@@ -33,19 +37,19 @@
|
|||||||
x:Key="ModuleTitle"
|
x:Key="ModuleTitle"
|
||||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
TargetType="{x:Type TextBlock}">
|
TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="FontSize" Value="16" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize2}" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style
|
<Style
|
||||||
x:Key="ToolbarTextBlock"
|
x:Key="ToolbarTextBlock"
|
||||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
TargetType="{x:Type TextBlock}">
|
TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style
|
<Style
|
||||||
x:Key="StatusbarItem"
|
x:Key="StatusbarItem"
|
||||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
TargetType="{x:Type TextBlock}">
|
TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
<Setter Property="Padding" Value="0" />
|
<Setter Property="Padding" Value="0" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style TargetType="{x:Type TextElement}">
|
<Style TargetType="{x:Type TextElement}">
|
||||||
@@ -58,7 +62,7 @@
|
|||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="lvItemSelected" TargetType="{x:Type ListViewItem}">
|
<Style x:Key="lvItemSelected" TargetType="{x:Type ListViewItem}">
|
||||||
<Setter Property="Height" Value="20" />
|
<Setter Property="Height" Value="20" />
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
<Style.Triggers>
|
<Style.Triggers>
|
||||||
<Trigger Property="IsSelected" Value="true">
|
<Trigger Property="IsSelected" Value="true">
|
||||||
<Setter Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" />
|
<Setter Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" />
|
||||||
@@ -76,22 +80,19 @@
|
|||||||
x:Key="ListItemCheckBox"
|
x:Key="ListItemCheckBox"
|
||||||
BasedOn="{StaticResource MaterialDesignUserForegroundCheckBox}"
|
BasedOn="{StaticResource MaterialDesignUserForegroundCheckBox}"
|
||||||
TargetType="{x:Type CheckBox}">
|
TargetType="{x:Type CheckBox}">
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
</Style>
|
|
||||||
<Style x:Key="ListItemChip" TargetType="{x:Type materialDesign:Chip}">
|
|
||||||
<Setter Property="FontSize" Value="11" />
|
|
||||||
</Style>
|
</Style>
|
||||||
<Style
|
<Style
|
||||||
x:Key="DefButton"
|
x:Key="DefButton"
|
||||||
BasedOn="{StaticResource MaterialDesignRaisedButton}"
|
BasedOn="{StaticResource MaterialDesignRaisedButton}"
|
||||||
TargetType="{x:Type ButtonBase}">
|
TargetType="{x:Type ButtonBase}">
|
||||||
<Setter Property="FontSize" Value="14" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style
|
<Style
|
||||||
x:Key="DefContextMenu"
|
x:Key="DefContextMenu"
|
||||||
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
||||||
TargetType="{x:Type ContextMenu}">
|
TargetType="{x:Type ContextMenu}">
|
||||||
<Setter Property="FontSize" Value="13" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||||
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
@@ -99,7 +100,7 @@
|
|||||||
x:Key="ToolbarMenu"
|
x:Key="ToolbarMenu"
|
||||||
BasedOn="{StaticResource MaterialDesignMenu}"
|
BasedOn="{StaticResource MaterialDesignMenu}"
|
||||||
TargetType="{x:Type Menu}">
|
TargetType="{x:Type Menu}">
|
||||||
<Setter Property="FontSize" Value="13" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||||
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
@@ -107,15 +108,41 @@
|
|||||||
x:Key="DefComboBox"
|
x:Key="DefComboBox"
|
||||||
BasedOn="{StaticResource MaterialDesignComboBox}"
|
BasedOn="{StaticResource MaterialDesignComboBox}"
|
||||||
TargetType="{x:Type ComboBox}">
|
TargetType="{x:Type ComboBox}">
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
<Setter Property="HorizontalAlignment" Value="Left" />
|
<Setter Property="HorizontalAlignment" Value="Left" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style
|
<Style
|
||||||
x:Key="DefDataGrid"
|
x:Key="DefDataGrid"
|
||||||
BasedOn="{StaticResource MaterialDesignDataGrid}"
|
BasedOn="{StaticResource MaterialDesignDataGrid}"
|
||||||
TargetType="{x:Type DataGrid}">
|
TargetType="{x:Type DataGrid}">
|
||||||
<Setter Property="FontSize" Value="12" />
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
</Style>
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="DefTextBox"
|
||||||
|
BasedOn="{StaticResource MaterialDesignTextBox}"
|
||||||
|
TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="MyOutlinedTextBox"
|
||||||
|
BasedOn="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||||
|
TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="MyGroupBox"
|
||||||
|
BasedOn="{StaticResource MaterialDesignGroupBox}"
|
||||||
|
TargetType="{x:Type GroupBox}">
|
||||||
|
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="MyChipListBoxItem"
|
||||||
|
BasedOn="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBoxItem}"
|
||||||
|
TargetType="{x:Type ListBoxItem}">
|
||||||
|
<Setter Property="Margin" Value="-2,0" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
||||||
</Application.Resources>
|
</Application.Resources>
|
||||||
|
|||||||
206
v2rayN/v2rayN/Base/DownloaderHelper.cs
Normal file
206
v2rayN/v2rayN/Base/DownloaderHelper.cs
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
using Downloader;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace v2rayN.Base
|
||||||
|
{
|
||||||
|
internal class DownloaderHelper
|
||||||
|
{
|
||||||
|
private static readonly Lazy<DownloaderHelper> _instance = new Lazy<DownloaderHelper>(() => new());
|
||||||
|
public static DownloaderHelper Instance => _instance.Value;
|
||||||
|
|
||||||
|
public DownloaderHelper()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> DownloadStringAsync(IWebProxy webProxy, string url, string? userAgent, int timeout)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cancellationToken = new CancellationTokenSource();
|
||||||
|
cancellationToken.CancelAfter(timeout * 1000);
|
||||||
|
|
||||||
|
Uri uri = new Uri(url);
|
||||||
|
//Authorization Header
|
||||||
|
var headers = new WebHeaderCollection();
|
||||||
|
if (!Utils.IsNullOrEmpty(uri.UserInfo))
|
||||||
|
{
|
||||||
|
headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
var downloadOpt = new DownloadConfiguration()
|
||||||
|
{
|
||||||
|
Timeout = timeout * 1000,
|
||||||
|
MaxTryAgainOnFailover = 2,
|
||||||
|
RequestConfiguration =
|
||||||
|
{
|
||||||
|
Headers = headers,
|
||||||
|
UserAgent = userAgent,
|
||||||
|
Timeout = timeout * 1000,
|
||||||
|
Proxy = webProxy
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
string text = string.Empty;
|
||||||
|
using (var downloader = new DownloadService(downloadOpt))
|
||||||
|
{
|
||||||
|
downloader.DownloadFileCompleted += (sender, value) =>
|
||||||
|
{
|
||||||
|
if (value.Error != null)
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("{0}", value.Error.Message));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
using (var stream = await downloader.DownloadFileTaskAsync(address: url, cancellationToken: cancellationToken.Token))
|
||||||
|
{
|
||||||
|
using (StreamReader reader = new StreamReader(stream))
|
||||||
|
{
|
||||||
|
text = reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadOpt = null;
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task DownloadDataAsync4Speed(IWebProxy webProxy, string url, IProgress<string> progress, int timeout)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("url");
|
||||||
|
}
|
||||||
|
|
||||||
|
var cancellationToken = new CancellationTokenSource();
|
||||||
|
cancellationToken.CancelAfter(timeout * 1000);
|
||||||
|
|
||||||
|
var downloadOpt = new DownloadConfiguration()
|
||||||
|
{
|
||||||
|
Timeout = timeout * 1000,
|
||||||
|
MaxTryAgainOnFailover = 2,
|
||||||
|
RequestConfiguration =
|
||||||
|
{
|
||||||
|
Timeout= timeout * 1000,
|
||||||
|
Proxy = webProxy
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DateTime totalDatetime = DateTime.Now;
|
||||||
|
int totalSecond = 0;
|
||||||
|
var hasValue = false;
|
||||||
|
double maxSpeed = 0;
|
||||||
|
using (var downloader = new DownloadService(downloadOpt))
|
||||||
|
{
|
||||||
|
//downloader.DownloadStarted += (sender, value) =>
|
||||||
|
//{
|
||||||
|
// if (progress != null)
|
||||||
|
// {
|
||||||
|
// progress.Report("Start download data...");
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
downloader.DownloadProgressChanged += (sender, value) =>
|
||||||
|
{
|
||||||
|
TimeSpan ts = (DateTime.Now - totalDatetime);
|
||||||
|
if (progress != null && ts.Seconds > totalSecond)
|
||||||
|
{
|
||||||
|
hasValue = true;
|
||||||
|
totalSecond = ts.Seconds;
|
||||||
|
if (value.BytesPerSecondSpeed > maxSpeed)
|
||||||
|
{
|
||||||
|
maxSpeed = value.BytesPerSecondSpeed;
|
||||||
|
var speed = (maxSpeed / 1000 / 1000).ToString("#0.0");
|
||||||
|
progress.Report(speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloader.DownloadFileCompleted += (sender, value) =>
|
||||||
|
{
|
||||||
|
if (progress != null)
|
||||||
|
{
|
||||||
|
if (!hasValue && value.Error != null)
|
||||||
|
{
|
||||||
|
progress.Report(value.Error?.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
progress.Report("......");
|
||||||
|
|
||||||
|
await downloader.DownloadFileTaskAsync(address: url, cancellationToken: cancellationToken.Token);
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadOpt = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DownloadFileAsync(IWebProxy webProxy, string url, string fileName, IProgress<double> progress, int timeout)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("url");
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(fileName))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("fileName");
|
||||||
|
}
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
{
|
||||||
|
File.Delete(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cancellationToken = new CancellationTokenSource();
|
||||||
|
cancellationToken.CancelAfter(timeout * 1000);
|
||||||
|
|
||||||
|
var downloadOpt = new DownloadConfiguration()
|
||||||
|
{
|
||||||
|
Timeout = timeout * 1000,
|
||||||
|
MaxTryAgainOnFailover = 2,
|
||||||
|
RequestConfiguration =
|
||||||
|
{
|
||||||
|
Timeout= timeout * 1000,
|
||||||
|
Proxy = webProxy
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var progressPercentage = 0;
|
||||||
|
var hasValue = false;
|
||||||
|
using (var downloader = new DownloadService(downloadOpt))
|
||||||
|
{
|
||||||
|
downloader.DownloadStarted += (sender, value) =>
|
||||||
|
{
|
||||||
|
if (progress != null)
|
||||||
|
{
|
||||||
|
progress.Report(0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloader.DownloadProgressChanged += (sender, value) =>
|
||||||
|
{
|
||||||
|
hasValue = true;
|
||||||
|
var percent = (int)value.ProgressPercentage;// Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100);
|
||||||
|
if (progressPercentage != percent && percent % 10 == 0)
|
||||||
|
{
|
||||||
|
progressPercentage = percent;
|
||||||
|
progress.Report(percent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloader.DownloadFileCompleted += (sender, value) =>
|
||||||
|
{
|
||||||
|
if (progress != null)
|
||||||
|
{
|
||||||
|
if (hasValue && value.Error == null)
|
||||||
|
{
|
||||||
|
progress.Report(101);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await downloader.DownloadFileTaskAsync(url, fileName, cancellationToken: cancellationToken.Token);
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadOpt = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using System.IO;
|
using System.Windows.Media;
|
||||||
using System.Windows.Media;
|
using v2rayN.Handler;
|
||||||
|
|
||||||
namespace v2rayN.Converters
|
namespace v2rayN.Converters
|
||||||
{
|
{
|
||||||
@@ -9,8 +9,22 @@ namespace v2rayN.Converters
|
|||||||
|
|
||||||
static MaterialDesignFonts()
|
static MaterialDesignFonts()
|
||||||
{
|
{
|
||||||
var fontPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Resources\Fonts\");
|
try
|
||||||
MyFont = new FontFamily(new Uri($"file:///{fontPath}"), "./#Source Han Sans CN");
|
{
|
||||||
|
var fontFamily = LazyConfig.Instance.GetConfig().uiItem.currentFontFamily;
|
||||||
|
if (!string.IsNullOrEmpty(fontFamily))
|
||||||
|
{
|
||||||
|
var fontPath = Utils.GetFontsPath();
|
||||||
|
MyFont = new FontFamily(new Uri(@$"file:///{fontPath}\"), $"./#{fontFamily}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
if (MyFont is null)
|
||||||
|
{
|
||||||
|
MyFont = new FontFamily("Microsoft YaHei");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
class Global
|
class Global
|
||||||
{
|
{
|
||||||
#region const
|
#region const
|
||||||
|
public const string githubUrl = "https://github.com";
|
||||||
|
public const string githubApiUrl = "https://api.github.com/repos";
|
||||||
public const string v2rayWebsiteUrl = @"https://www.v2fly.org/";
|
public const string v2rayWebsiteUrl = @"https://www.v2fly.org/";
|
||||||
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
|
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
|
||||||
public const string UpdateUrl = AboutUrl + @"/releases";
|
public const string UpdateUrl = AboutUrl + @"/releases";
|
||||||
@@ -17,7 +19,6 @@
|
|||||||
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
||||||
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
||||||
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
||||||
public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test";
|
|
||||||
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
||||||
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
||||||
|
|
||||||
@@ -77,6 +78,7 @@
|
|||||||
public const string CommandClearMsg = "CommandClearMsg";
|
public const string CommandClearMsg = "CommandClearMsg";
|
||||||
public const string DelayUnit = "";
|
public const string DelayUnit = "";
|
||||||
public const string SpeedUnit = "";
|
public const string SpeedUnit = "";
|
||||||
|
public const int MinFontSize = 10;
|
||||||
|
|
||||||
public static readonly List<string> IEProxyProtocols = new List<string> {
|
public static readonly List<string> IEProxyProtocols = new List<string> {
|
||||||
"{ip}:{http_port}",
|
"{ip}:{http_port}",
|
||||||
@@ -95,16 +97,27 @@
|
|||||||
public static readonly List<string> coreTypes = new List<string> { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
|
public static readonly List<string> coreTypes = new List<string> { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
|
||||||
public static readonly List<string> domainStrategys = new List<string> { "AsIs", "IPIfNonMatch", "IPOnDemand" };
|
public static readonly List<string> domainStrategys = new List<string> { "AsIs", "IPIfNonMatch", "IPOnDemand" };
|
||||||
public static readonly List<string> domainMatchers = new List<string> { "linear", "mph", "" };
|
public static readonly List<string> domainMatchers = new List<string> { "linear", "mph", "" };
|
||||||
public static readonly List<string> fingerprints = new List<string> { "chrome", "firefox", "safari", "randomized", "" };
|
public static readonly List<string> fingerprints = new List<string> { "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized", "" };
|
||||||
|
public static readonly List<string> userAgent = new List<string> { "chrome", "firefox", "safari", "edge", "none" };
|
||||||
|
public static readonly Dictionary<string, string> userAgentTxt = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" },
|
||||||
|
{"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" },
|
||||||
|
{"safari","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" },
|
||||||
|
{"edge","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70" },
|
||||||
|
{"none",""}
|
||||||
|
};
|
||||||
public static readonly List<string> allowInsecures = new List<string> { "true", "false", "" };
|
public static readonly List<string> allowInsecures = new List<string> { "true", "false", "" };
|
||||||
public static readonly List<string> domainStrategy4Freedoms = new List<string> { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
public static readonly List<string> domainStrategy4Freedoms = new List<string> { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
||||||
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en", "fa-Ir" };
|
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en", "fa-Ir", "ru" };
|
||||||
public static readonly List<string> alpns = new List<string> { "h2", "http/1.1", "h2,http/1.1", "" };
|
public static readonly List<string> alpns = new List<string> { "h2", "http/1.1", "h2,http/1.1", "" };
|
||||||
public static readonly List<string> LogLevel = new List<string> { "debug", "info", "warning", "error", "none" };
|
public static readonly List<string> LogLevel = new List<string> { "debug", "info", "warning", "error", "none" };
|
||||||
public static readonly List<string> InboundTags = new List<string> { "socks", "http", "socks2", "http2" };
|
public static readonly List<string> InboundTags = new List<string> { "socks", "http", "socks2", "http2" };
|
||||||
public static readonly List<string> Protocols = new List<string> { "http", "tls", "bittorrent" };
|
public static readonly List<string> Protocols = new List<string> { "http", "tls", "bittorrent" };
|
||||||
public static readonly List<string> TunMtus = new List<string> { "9000", "1500" };
|
public static readonly List<string> TunMtus = new List<string> { "9000", "1500" };
|
||||||
public static readonly List<string> TunStacks = new List<string> { "gvisor", "system" };
|
public static readonly List<string> TunStacks = new List<string> { "gvisor", "system" };
|
||||||
|
public static readonly List<string> PresetMsgFilters = new List<string> { "proxy", "direct", "block", "" };
|
||||||
|
public static readonly List<string> SpeedTestUrls = new List<string> { @"http://cachefly.cachefly.net/100mb.test", @"http://cachefly.cachefly.net/10mb.test" };
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -43,18 +43,17 @@ namespace v2rayN.Handler
|
|||||||
if (config == null)
|
if (config == null)
|
||||||
{
|
{
|
||||||
config = new Config
|
config = new Config
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (config.coreBasicItem == null)
|
||||||
|
{
|
||||||
|
config.coreBasicItem = new()
|
||||||
{
|
{
|
||||||
logEnabled = false,
|
logEnabled = false,
|
||||||
loglevel = "warning",
|
loglevel = "warning",
|
||||||
|
|
||||||
//Mux
|
|
||||||
muxEnabled = false,
|
muxEnabled = false,
|
||||||
|
|
||||||
enableStatistics = false,
|
|
||||||
|
|
||||||
statisticsFreshRate = 1,
|
|
||||||
|
|
||||||
enableRoutingAdvanced = true
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,10 +86,17 @@ namespace v2rayN.Handler
|
|||||||
config.inbound[0].protocol = Global.InboundSocks;
|
config.inbound[0].protocol = Global.InboundSocks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//路由规则
|
if (config.routingBasicItem == null)
|
||||||
if (Utils.IsNullOrEmpty(config.domainStrategy))
|
|
||||||
{
|
{
|
||||||
config.domainStrategy = Global.domainStrategys[0];//"IPIfNonMatch";
|
config.routingBasicItem = new()
|
||||||
|
{
|
||||||
|
enableRoutingAdvanced = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
//路由规则
|
||||||
|
if (Utils.IsNullOrEmpty(config.routingBasicItem.domainStrategy))
|
||||||
|
{
|
||||||
|
config.routingBasicItem.domainStrategy = Global.domainStrategys[0];//"IPIfNonMatch";
|
||||||
}
|
}
|
||||||
//if (Utils.IsNullOrEmpty(config.domainMatcher))
|
//if (Utils.IsNullOrEmpty(config.domainMatcher))
|
||||||
//{
|
//{
|
||||||
@@ -130,6 +136,14 @@ namespace v2rayN.Handler
|
|||||||
mtu = 9000,
|
mtu = 9000,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (config.guiItem == null)
|
||||||
|
{
|
||||||
|
config.guiItem = new()
|
||||||
|
{
|
||||||
|
enableStatistics = false,
|
||||||
|
statisticsFreshRate = 1,
|
||||||
|
};
|
||||||
|
}
|
||||||
if (config.uiItem == null)
|
if (config.uiItem == null)
|
||||||
{
|
{
|
||||||
config.uiItem = new UIItem()
|
config.uiItem = new UIItem()
|
||||||
@@ -150,14 +164,6 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
config.constItem = new ConstItem();
|
config.constItem = new ConstItem();
|
||||||
}
|
}
|
||||||
if (Utils.IsNullOrEmpty(config.constItem.speedTestUrl))
|
|
||||||
{
|
|
||||||
config.constItem.speedTestUrl = Global.SpeedTestUrl;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(config.constItem.speedPingTestUrl))
|
|
||||||
{
|
|
||||||
config.constItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions))
|
if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions))
|
||||||
{
|
{
|
||||||
config.constItem.defIEProxyExceptions = Global.IEProxyExceptions;
|
config.constItem.defIEProxyExceptions = Global.IEProxyExceptions;
|
||||||
@@ -167,9 +173,26 @@ namespace v2rayN.Handler
|
|||||||
// config.remoteDNS = "1.1.1.1";
|
// config.remoteDNS = "1.1.1.1";
|
||||||
//}
|
//}
|
||||||
|
|
||||||
if (config.statisticsFreshRate > 100 || config.statisticsFreshRate < 1)
|
if (config.speedTestItem == null)
|
||||||
{
|
{
|
||||||
config.statisticsFreshRate = 1;
|
config.speedTestItem = new();
|
||||||
|
}
|
||||||
|
if (config.speedTestItem.speedTestTimeout < 10)
|
||||||
|
{
|
||||||
|
config.speedTestItem.speedTestTimeout = 10;
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(config.speedTestItem.speedTestUrl))
|
||||||
|
{
|
||||||
|
config.speedTestItem.speedTestUrl = Global.SpeedTestUrls[0];
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(config.speedTestItem.speedPingTestUrl))
|
||||||
|
{
|
||||||
|
config.speedTestItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.guiItem.statisticsFreshRate > 100 || config.guiItem.statisticsFreshRate < 1)
|
||||||
|
{
|
||||||
|
config.guiItem.statisticsFreshRate = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config == null)
|
if (config == null)
|
||||||
@@ -288,20 +311,45 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
config = Utils.FromJson<Config>(Utils.ToJson(configOld));
|
config = Utils.FromJson<Config>(Utils.ToJson(configOld));
|
||||||
if (config.tunModeItem == null)
|
|
||||||
|
if (config.coreBasicItem == null)
|
||||||
{
|
{
|
||||||
config.tunModeItem = new TunModeItem
|
config.coreBasicItem = new()
|
||||||
{
|
{
|
||||||
enableTun = false,
|
logEnabled = configOld.logEnabled,
|
||||||
showWindow = true,
|
loglevel = configOld.loglevel,
|
||||||
mtu = 9000,
|
muxEnabled = configOld.muxEnabled,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.routingBasicItem == null)
|
||||||
|
{
|
||||||
|
config.routingBasicItem = new()
|
||||||
|
{
|
||||||
|
enableRoutingAdvanced = configOld.enableRoutingAdvanced,
|
||||||
|
domainStrategy = configOld.domainStrategy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.guiItem == null)
|
||||||
|
{
|
||||||
|
config.guiItem = new()
|
||||||
|
{
|
||||||
|
enableStatistics = configOld.enableStatistics,
|
||||||
|
statisticsFreshRate = configOld.statisticsFreshRate,
|
||||||
|
keepOlderDedupl = configOld.keepOlderDedupl,
|
||||||
|
ignoreGeoUpdateCore = configOld.ignoreGeoUpdateCore,
|
||||||
|
autoUpdateInterval = configOld.autoUpdateInterval,
|
||||||
|
checkPreReleaseUpdate = configOld.checkPreReleaseUpdate,
|
||||||
|
enableSecurityProtocolTls13 = configOld.enableSecurityProtocolTls13,
|
||||||
|
trayMenuServersLimit = configOld.trayMenuServersLimit,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
GetDefaultServer(ref config);
|
GetDefaultServer(ref config);
|
||||||
GetDefaultRouting(ref config);
|
GetDefaultRouting(ref config);
|
||||||
SaveConfig(ref config);
|
SaveConfig(ref config);
|
||||||
LazyConfig.Instance.SetConfig(ref config);
|
LoadConfig(ref config);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -638,7 +686,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||||
{
|
{
|
||||||
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower();
|
||||||
}
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem);
|
AddServerCommon(ref config, profileItem);
|
||||||
@@ -745,7 +793,7 @@ namespace v2rayN.Handler
|
|||||||
public static int DedupServerList(ref Config config, ref List<ProfileItem> lstProfile)
|
public static int DedupServerList(ref Config config, ref List<ProfileItem> lstProfile)
|
||||||
{
|
{
|
||||||
List<ProfileItem> source = lstProfile;
|
List<ProfileItem> source = lstProfile;
|
||||||
bool keepOlder = config.keepOlderDedupl;
|
bool keepOlder = config.guiItem.keepOlderDedupl;
|
||||||
|
|
||||||
List<ProfileItem> list = new List<ProfileItem>();
|
List<ProfileItem> list = new List<ProfileItem>();
|
||||||
if (!keepOlder) source.Reverse(); // Remove the early items first
|
if (!keepOlder) source.Reverse(); // Remove the early items first
|
||||||
@@ -772,7 +820,7 @@ namespace v2rayN.Handler
|
|||||||
profileItem.configVersion = 2;
|
profileItem.configVersion = 2;
|
||||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||||
{
|
{
|
||||||
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower();
|
||||||
}
|
}
|
||||||
if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
|
if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
|
||||||
{
|
{
|
||||||
@@ -1437,7 +1485,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
if (SqliteHelper.Instance.Table<RoutingItem>().Where(t => t.id == routingItem.id).Count() > 0)
|
if (SqliteHelper.Instance.Table<RoutingItem>().Where(t => t.id == routingItem.id).Count() > 0)
|
||||||
{
|
{
|
||||||
config.routingIndexId = routingItem.id;
|
config.routingBasicItem.routingIndexId = routingItem.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
Global.reloadCore = true;
|
Global.reloadCore = true;
|
||||||
@@ -1448,7 +1496,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
public static RoutingItem GetDefaultRouting(ref Config config)
|
public static RoutingItem GetDefaultRouting(ref Config config)
|
||||||
{
|
{
|
||||||
var item = LazyConfig.Instance.GetRoutingItem(config.routingIndexId);
|
var item = LazyConfig.Instance.GetRoutingItem(config.routingBasicItem.routingIndexId);
|
||||||
if (item is null)
|
if (item is null)
|
||||||
{
|
{
|
||||||
var item2 = SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(t => t.locked == false);
|
var item2 = SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(t => t.locked == false);
|
||||||
@@ -1461,13 +1509,16 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false)
|
public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false)
|
||||||
{
|
{
|
||||||
if (blImportAdvancedRules || LazyConfig.Instance.RoutingItems().Count <= 0)
|
var items = LazyConfig.Instance.RoutingItems();
|
||||||
|
if (blImportAdvancedRules || items.Count <= 0)
|
||||||
{
|
{
|
||||||
|
var maxSort = items.Count;
|
||||||
//Bypass the mainland
|
//Bypass the mainland
|
||||||
var item2 = new RoutingItem()
|
var item2 = new RoutingItem()
|
||||||
{
|
{
|
||||||
remarks = "绕过大陆(Whitelist)",
|
remarks = "绕过大陆(Whitelist)",
|
||||||
url = string.Empty,
|
url = string.Empty,
|
||||||
|
sort = maxSort + 1,
|
||||||
};
|
};
|
||||||
AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white"));
|
AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white"));
|
||||||
|
|
||||||
@@ -1476,6 +1527,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
remarks = "黑名单(Blacklist)",
|
remarks = "黑名单(Blacklist)",
|
||||||
url = string.Empty,
|
url = string.Empty,
|
||||||
|
sort = maxSort + 2,
|
||||||
};
|
};
|
||||||
AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black"));
|
AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black"));
|
||||||
|
|
||||||
@@ -1484,6 +1536,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
remarks = "全局(Global)",
|
remarks = "全局(Global)",
|
||||||
url = string.Empty,
|
url = string.Empty,
|
||||||
|
sort = maxSort + 3,
|
||||||
};
|
};
|
||||||
AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global"));
|
AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global"));
|
||||||
|
|
||||||
|
|||||||
@@ -73,28 +73,29 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
if (blExport)
|
if (blExport)
|
||||||
{
|
{
|
||||||
if (config.logEnabled)
|
if (config.coreBasicItem.logEnabled)
|
||||||
{
|
{
|
||||||
v2rayConfig.log.loglevel = config.loglevel;
|
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v2rayConfig.log.loglevel = config.loglevel;
|
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||||
v2rayConfig.log.access = "";
|
v2rayConfig.log.access = "";
|
||||||
v2rayConfig.log.error = "";
|
v2rayConfig.log.error = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (config.logEnabled)
|
if (config.coreBasicItem.logEnabled)
|
||||||
{
|
{
|
||||||
v2rayConfig.log.loglevel = config.loglevel;
|
var dtNow = DateTime.Now;
|
||||||
v2rayConfig.log.access = Utils.GetLogPath(v2rayConfig.log.access);
|
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||||
v2rayConfig.log.error = Utils.GetLogPath(v2rayConfig.log.error);
|
v2rayConfig.log.access = Utils.GetLogPath($"Vaccess_{dtNow.ToString("yyyy-MM-dd")}.txt");
|
||||||
|
v2rayConfig.log.error = Utils.GetLogPath($"Verror_{dtNow.ToString("yyyy-MM-dd")}.txt");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v2rayConfig.log.loglevel = config.loglevel;
|
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||||
v2rayConfig.log.access = "";
|
v2rayConfig.log.access = "";
|
||||||
v2rayConfig.log.error = "";
|
v2rayConfig.log.error = "";
|
||||||
}
|
}
|
||||||
@@ -186,10 +187,10 @@ namespace v2rayN.Handler
|
|||||||
if (v2rayConfig.routing != null
|
if (v2rayConfig.routing != null
|
||||||
&& v2rayConfig.routing.rules != null)
|
&& v2rayConfig.routing.rules != null)
|
||||||
{
|
{
|
||||||
v2rayConfig.routing.domainStrategy = config.domainStrategy;
|
v2rayConfig.routing.domainStrategy = config.routingBasicItem.domainStrategy;
|
||||||
v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(config.domainMatcher) ? null : config.domainMatcher;
|
v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(config.routingBasicItem.domainMatcher) ? null : config.routingBasicItem.domainMatcher;
|
||||||
|
|
||||||
if (config.enableRoutingAdvanced)
|
if (config.routingBasicItem.enableRoutingAdvanced)
|
||||||
{
|
{
|
||||||
var routing = ConfigHandler.GetDefaultRouting(ref config);
|
var routing = ConfigHandler.GetDefaultRouting(ref config);
|
||||||
if (routing != null)
|
if (routing != null)
|
||||||
@@ -347,8 +348,8 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Mux
|
//Mux
|
||||||
outbound.mux.enabled = config.muxEnabled;
|
outbound.mux.enabled = config.coreBasicItem.muxEnabled;
|
||||||
outbound.mux.concurrency = config.muxEnabled ? 8 : -1;
|
outbound.mux.concurrency = config.coreBasicItem.muxEnabled ? 8 : -1;
|
||||||
|
|
||||||
boundStreamSettings(node, "out", outbound.streamSettings);
|
boundStreamSettings(node, "out", outbound.streamSettings);
|
||||||
|
|
||||||
@@ -451,8 +452,8 @@ namespace v2rayN.Handler
|
|||||||
usersItem.encryption = node.security;
|
usersItem.encryption = node.security;
|
||||||
|
|
||||||
//Mux
|
//Mux
|
||||||
outbound.mux.enabled = config.muxEnabled;
|
outbound.mux.enabled = config.coreBasicItem.muxEnabled;
|
||||||
outbound.mux.concurrency = config.muxEnabled ? 8 : -1;
|
outbound.mux.concurrency = config.coreBasicItem.muxEnabled ? 8 : -1;
|
||||||
|
|
||||||
boundStreamSettings(node, "out", outbound.streamSettings);
|
boundStreamSettings(node, "out", outbound.streamSettings);
|
||||||
|
|
||||||
@@ -546,6 +547,18 @@ namespace v2rayN.Handler
|
|||||||
streamSettings.network = node.GetNetwork();
|
streamSettings.network = node.GetNetwork();
|
||||||
string host = node.requestHost.TrimEx();
|
string host = node.requestHost.TrimEx();
|
||||||
string sni = node.sni;
|
string sni = node.sni;
|
||||||
|
string useragent = "";
|
||||||
|
if (!config.coreBasicItem.defUserAgent.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
useragent = Global.userAgentTxt[config.coreBasicItem.defUserAgent];
|
||||||
|
}
|
||||||
|
catch (KeyNotFoundException)
|
||||||
|
{
|
||||||
|
useragent = config.coreBasicItem.defUserAgent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//if tls
|
//if tls
|
||||||
if (node.streamSecurity == Global.StreamSecurity)
|
if (node.streamSecurity == Global.StreamSecurity)
|
||||||
@@ -554,9 +567,9 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
TlsSettings tlsSettings = new TlsSettings
|
TlsSettings tlsSettings = new TlsSettings
|
||||||
{
|
{
|
||||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||||
alpn = node.GetAlpn(),
|
alpn = node.GetAlpn(),
|
||||||
fingerprint = node.fingerprint
|
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint
|
||||||
};
|
};
|
||||||
if (!string.IsNullOrWhiteSpace(sni))
|
if (!string.IsNullOrWhiteSpace(sni))
|
||||||
{
|
{
|
||||||
@@ -576,9 +589,9 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
TlsSettings xtlsSettings = new TlsSettings
|
TlsSettings xtlsSettings = new TlsSettings
|
||||||
{
|
{
|
||||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||||
alpn = node.GetAlpn(),
|
alpn = node.GetAlpn(),
|
||||||
fingerprint = node.fingerprint
|
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint
|
||||||
};
|
};
|
||||||
if (!string.IsNullOrWhiteSpace(sni))
|
if (!string.IsNullOrWhiteSpace(sni))
|
||||||
{
|
{
|
||||||
@@ -634,19 +647,22 @@ namespace v2rayN.Handler
|
|||||||
WsSettings wsSettings = new WsSettings
|
WsSettings wsSettings = new WsSettings
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
wsSettings.headers = new Headers
|
||||||
|
{
|
||||||
|
};
|
||||||
string path = node.path;
|
string path = node.path;
|
||||||
if (!string.IsNullOrWhiteSpace(host))
|
if (!string.IsNullOrWhiteSpace(host))
|
||||||
{
|
{
|
||||||
wsSettings.headers = new Headers
|
wsSettings.headers.Host = host;
|
||||||
{
|
|
||||||
Host = host
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrWhiteSpace(path))
|
if (!string.IsNullOrWhiteSpace(path))
|
||||||
{
|
{
|
||||||
wsSettings.path = path;
|
wsSettings.path = path;
|
||||||
}
|
}
|
||||||
|
if (!string.IsNullOrWhiteSpace(useragent))
|
||||||
|
{
|
||||||
|
wsSettings.headers.UserAgent = useragent;
|
||||||
|
}
|
||||||
streamSettings.wsSettings = wsSettings;
|
streamSettings.wsSettings = wsSettings;
|
||||||
|
|
||||||
//TlsSettings tlsSettings = new TlsSettings();
|
//TlsSettings tlsSettings = new TlsSettings();
|
||||||
@@ -730,7 +746,7 @@ namespace v2rayN.Handler
|
|||||||
string host2 = string.Join("\",\"", arrHost);
|
string host2 = string.Join("\",\"", arrHost);
|
||||||
request = request.Replace("$requestHost$", $"\"{host2}\"");
|
request = request.Replace("$requestHost$", $"\"{host2}\"");
|
||||||
//request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost()));
|
//request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost()));
|
||||||
|
request = request.Replace("$requestUserAgent$", $"\"{useragent}\"");
|
||||||
//Path
|
//Path
|
||||||
string pathHttp = @"/";
|
string pathHttp = @"/";
|
||||||
if (!Utils.IsNullOrEmpty(node.path))
|
if (!Utils.IsNullOrEmpty(node.path))
|
||||||
@@ -809,7 +825,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
private static int statistic(Config config, ref V2rayConfig v2rayConfig)
|
private static int statistic(Config config, ref V2rayConfig v2rayConfig)
|
||||||
{
|
{
|
||||||
if (config.enableStatistics)
|
if (config.guiItem.enableStatistics)
|
||||||
{
|
{
|
||||||
string tag = Global.InboundAPITagName;
|
string tag = Global.InboundAPITagName;
|
||||||
API apiObj = new API();
|
API apiObj = new API();
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ namespace v2rayN.Handler
|
|||||||
public CoreHandler(Action<bool, string> update)
|
public CoreHandler(Action<bool, string> update)
|
||||||
{
|
{
|
||||||
_updateFunc = update;
|
_updateFunc = update;
|
||||||
|
|
||||||
|
Environment.SetEnvironmentVariable("v2ray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process);
|
||||||
|
Environment.SetEnvironmentVariable("xray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadCore(Config config)
|
public void LoadCore(Config config)
|
||||||
|
|||||||
@@ -33,20 +33,13 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public async Task<int> DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action<bool, string> update)
|
public async Task<int> DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action<bool, string> update)
|
||||||
{
|
{
|
||||||
var hasValue = false;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||||
|
|
||||||
var client = new HttpClient(new SocketsHttpHandler()
|
|
||||||
{
|
|
||||||
Proxy = webProxy
|
|
||||||
});
|
|
||||||
|
|
||||||
var progress = new Progress<string>();
|
var progress = new Progress<string>();
|
||||||
progress.ProgressChanged += (sender, value) =>
|
progress.ProgressChanged += (sender, value) =>
|
||||||
{
|
{
|
||||||
hasValue = true;
|
|
||||||
if (update != null)
|
if (update != null)
|
||||||
{
|
{
|
||||||
string msg = $"{value}";
|
string msg = $"{value}";
|
||||||
@@ -54,22 +47,17 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var cancellationToken = new CancellationTokenSource();
|
await DownloaderHelper.Instance.DownloadDataAsync4Speed(webProxy,
|
||||||
cancellationToken.CancelAfter(downloadTimeout * 1000);
|
|
||||||
await HttpClientHelper.GetInstance().DownloadDataAsync4Speed(client,
|
|
||||||
url,
|
url,
|
||||||
progress,
|
progress,
|
||||||
cancellationToken.Token);
|
downloadTimeout);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
if (!hasValue)
|
update(false, ex.Message);
|
||||||
|
if (ex.InnerException != null)
|
||||||
{
|
{
|
||||||
update(false, ex.Message);
|
update(false, ex.InnerException.Message);
|
||||||
if (ex.InnerException != null)
|
|
||||||
{
|
|
||||||
update(false, ex.InnerException.Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -79,14 +67,9 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||||
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading));
|
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading));
|
||||||
|
|
||||||
var client = new HttpClient(new SocketsHttpHandler()
|
|
||||||
{
|
|
||||||
Proxy = GetWebProxy(blProxy)
|
|
||||||
});
|
|
||||||
|
|
||||||
var progress = new Progress<double>();
|
var progress = new Progress<double>();
|
||||||
progress.ProgressChanged += (sender, value) =>
|
progress.ProgressChanged += (sender, value) =>
|
||||||
{
|
{
|
||||||
@@ -97,12 +80,12 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var cancellationToken = new CancellationTokenSource();
|
var webProxy = GetWebProxy(blProxy);
|
||||||
_ = HttpClientHelper.GetInstance().DownloadFileAsync(client,
|
_ = DownloaderHelper.Instance.DownloadFileAsync(webProxy,
|
||||||
url,
|
url,
|
||||||
Utils.GetTempPath(Utils.GetDownloadFileName(url)),
|
Utils.GetTempPath(Utils.GetDownloadFileName(url)),
|
||||||
progress,
|
progress,
|
||||||
cancellationToken.Token);
|
downloadTimeout);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -118,7 +101,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public async Task<string> UrlRedirectAsync(string url, bool blProxy)
|
public async Task<string> UrlRedirectAsync(string url, bool blProxy)
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||||
var webRequestHandler = new SocketsHttpHandler
|
var webRequestHandler = new SocketsHttpHandler
|
||||||
{
|
{
|
||||||
AllowAutoRedirect = false,
|
AllowAutoRedirect = false,
|
||||||
@@ -138,6 +121,70 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<string> TryDownloadString(string url, bool blProxy, string userAgent)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result1 = await DownloadStringAsync(url, blProxy, userAgent);
|
||||||
|
if (!Utils.IsNullOrEmpty(result1))
|
||||||
|
{
|
||||||
|
return result1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result2 = await DownloadStringViaDownloader(url, blProxy, userAgent);
|
||||||
|
if (!Utils.IsNullOrEmpty(result2))
|
||||||
|
{
|
||||||
|
return result2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var wc = new WebClient())
|
||||||
|
{
|
||||||
|
wc.Proxy = GetWebProxy(blProxy);
|
||||||
|
var result3 = await wc.DownloadStringTaskAsync(url);
|
||||||
|
if (!Utils.IsNullOrEmpty(result3))
|
||||||
|
{
|
||||||
|
return result3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DownloadString
|
/// DownloadString
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -146,7 +193,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||||
var client = new HttpClient(new SocketsHttpHandler()
|
var client = new HttpClient(new SocketsHttpHandler()
|
||||||
{
|
{
|
||||||
Proxy = GetWebProxy(blProxy)
|
Proxy = GetWebProxy(blProxy)
|
||||||
@@ -183,6 +230,38 @@ namespace v2rayN.Handler
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DownloadString
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url"></param>
|
||||||
|
public async Task<string> DownloadStringViaDownloader(string url, bool blProxy, string userAgent)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||||
|
|
||||||
|
var webProxy = GetWebProxy(blProxy);
|
||||||
|
|
||||||
|
if (Utils.IsNullOrEmpty(userAgent))
|
||||||
|
{
|
||||||
|
userAgent = $"{Utils.GetVersion(false)}";
|
||||||
|
}
|
||||||
|
var result = await DownloaderHelper.Instance.DownloadStringAsync(webProxy, url, userAgent, 30);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public int RunAvailabilityCheck(WebProxy webProxy)
|
public int RunAvailabilityCheck(WebProxy webProxy)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -196,7 +275,7 @@ namespace v2rayN.Handler
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var config = LazyConfig.Instance.GetConfig();
|
var config = LazyConfig.Instance.GetConfig();
|
||||||
string status = GetRealPingTime(config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
string status = GetRealPingTime(config.speedTestItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||||
bool noError = Utils.IsNullOrEmpty(status);
|
bool noError = Utils.IsNullOrEmpty(status);
|
||||||
return noError ? responseTime : -1;
|
return noError ? responseTime : -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public List<RoutingItem> RoutingItems()
|
public List<RoutingItem> RoutingItems()
|
||||||
{
|
{
|
||||||
return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).ToList();
|
return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).OrderBy(t => t.sort).ToList();
|
||||||
}
|
}
|
||||||
public RoutingItem GetRoutingItem(string id)
|
public RoutingItem GetRoutingItem(string id)
|
||||||
{
|
{
|
||||||
@@ -209,7 +209,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
coreType = ECoreType.v2rayN,
|
coreType = ECoreType.v2rayN,
|
||||||
coreUrl = Global.NUrl,
|
coreUrl = Global.NUrl,
|
||||||
coreReleaseApiUrl = Global.NUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.NUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||||
coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||||
});
|
});
|
||||||
@@ -220,7 +220,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "wv2ray", "v2ray" },
|
coreExes = new List<string> { "wv2ray", "v2ray" },
|
||||||
arguments = "",
|
arguments = "",
|
||||||
coreUrl = Global.v2flyCoreUrl,
|
coreUrl = Global.v2flyCoreUrl,
|
||||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
match = "V2Ray",
|
match = "V2Ray",
|
||||||
@@ -234,7 +234,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "SagerNet", "v2ray" },
|
coreExes = new List<string> { "SagerNet", "v2ray" },
|
||||||
arguments = "run",
|
arguments = "run",
|
||||||
coreUrl = Global.SagerNetCoreUrl,
|
coreUrl = Global.SagerNetCoreUrl,
|
||||||
coreReleaseApiUrl = Global.SagerNetCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.SagerNetCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl32 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
coreDownloadUrl64 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl64 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
match = "V2Ray",
|
match = "V2Ray",
|
||||||
@@ -248,7 +248,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "v2ray" },
|
coreExes = new List<string> { "v2ray" },
|
||||||
arguments = "run",
|
arguments = "run",
|
||||||
coreUrl = Global.v2flyCoreUrl,
|
coreUrl = Global.v2flyCoreUrl,
|
||||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
match = "V2Ray",
|
match = "V2Ray",
|
||||||
@@ -262,7 +262,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "xray", "wxray" },
|
coreExes = new List<string> { "xray", "wxray" },
|
||||||
arguments = "",
|
arguments = "",
|
||||||
coreUrl = Global.xrayCoreUrl,
|
coreUrl = Global.xrayCoreUrl,
|
||||||
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||||
coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||||
match = "Xray",
|
match = "Xray",
|
||||||
@@ -276,7 +276,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" },
|
coreExes = new List<string> { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" },
|
||||||
arguments = "-f config.json",
|
arguments = "-f config.json",
|
||||||
coreUrl = Global.clashCoreUrl,
|
coreUrl = Global.clashCoreUrl,
|
||||||
coreReleaseApiUrl = Global.clashCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.clashCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip",
|
coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip",
|
||||||
coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip",
|
coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip",
|
||||||
match = "v",
|
match = "v",
|
||||||
@@ -290,7 +290,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" },
|
coreExes = new List<string> { "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" },
|
||||||
arguments = "-f config.json",
|
arguments = "-f config.json",
|
||||||
coreUrl = Global.clashMetaCoreUrl,
|
coreUrl = Global.clashMetaCoreUrl,
|
||||||
coreReleaseApiUrl = Global.clashMetaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.clashMetaCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip",
|
coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip",
|
||||||
coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip",
|
coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip",
|
||||||
match = "v",
|
match = "v",
|
||||||
@@ -304,7 +304,7 @@ namespace v2rayN.Handler
|
|||||||
coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" },
|
coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" },
|
||||||
arguments = "",
|
arguments = "",
|
||||||
coreUrl = Global.hysteriaCoreUrl,
|
coreUrl = Global.hysteriaCoreUrl,
|
||||||
coreReleaseApiUrl = Global.hysteriaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
coreReleaseApiUrl = Global.hysteriaCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||||
coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-386.exe",
|
coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-386.exe",
|
||||||
coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-amd64.exe",
|
coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-amd64.exe",
|
||||||
redirectInfo = true,
|
redirectInfo = true,
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!config.enableRoutingAdvanced)
|
if (!config.routingBasicItem.enableRoutingAdvanced)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -309,9 +309,9 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
var dtNow = DateTime.Now;
|
var dtNow = DateTime.Now;
|
||||||
|
|
||||||
if (config.autoUpdateSubInterval > 0)
|
if (config.guiItem.autoUpdateSubInterval > 0)
|
||||||
{
|
{
|
||||||
if ((dtNow - autoUpdateSubTime).Hours % config.autoUpdateSubInterval == 0)
|
if ((dtNow - autoUpdateSubTime).Hours % config.guiItem.autoUpdateSubInterval == 0)
|
||||||
{
|
{
|
||||||
updateHandle.UpdateSubscriptionProcess(config, "", true, (bool success, string msg) =>
|
updateHandle.UpdateSubscriptionProcess(config, "", true, (bool success, string msg) =>
|
||||||
{
|
{
|
||||||
@@ -324,9 +324,9 @@ namespace v2rayN.Handler
|
|||||||
Thread.Sleep(60000);
|
Thread.Sleep(60000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.autoUpdateInterval > 0)
|
if (config.guiItem.autoUpdateInterval > 0)
|
||||||
{
|
{
|
||||||
if ((dtNow - autoUpdateGeoTime).Hours % config.autoUpdateInterval == 0)
|
if ((dtNow - autoUpdateGeoTime).Hours % config.guiItem.autoUpdateInterval == 0)
|
||||||
{
|
{
|
||||||
updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) =>
|
updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ namespace v2rayN.Handler
|
|||||||
path = item.path,
|
path = item.path,
|
||||||
tls = item.streamSecurity,
|
tls = item.streamSecurity,
|
||||||
sni = item.sni,
|
sni = item.sni,
|
||||||
alpn = item.alpn
|
alpn = item.alpn,
|
||||||
|
fp = item.fingerprint
|
||||||
};
|
};
|
||||||
|
|
||||||
url = Utils.ToJson(vmessQRCode);
|
url = Utils.ToJson(vmessQRCode);
|
||||||
@@ -202,6 +203,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
|
dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
|
||||||
}
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.fingerprint))
|
||||||
|
{
|
||||||
|
dicQuery.Add("fp", Utils.UrlEncode(item.fingerprint));
|
||||||
|
}
|
||||||
|
|
||||||
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp");
|
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp");
|
||||||
|
|
||||||
@@ -408,6 +413,7 @@ namespace v2rayN.Handler
|
|||||||
profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
|
profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
|
||||||
profileItem.sni = Utils.ToString(vmessQRCode.sni);
|
profileItem.sni = Utils.ToString(vmessQRCode.sni);
|
||||||
profileItem.alpn = Utils.ToString(vmessQRCode.alpn);
|
profileItem.alpn = Utils.ToString(vmessQRCode.alpn);
|
||||||
|
profileItem.fingerprint = Utils.ToString(vmessQRCode.fp);
|
||||||
|
|
||||||
return profileItem;
|
return profileItem;
|
||||||
}
|
}
|
||||||
@@ -759,6 +765,7 @@ namespace v2rayN.Handler
|
|||||||
item.streamSecurity = query["security"] ?? "";
|
item.streamSecurity = query["security"] ?? "";
|
||||||
item.sni = query["sni"] ?? "";
|
item.sni = query["sni"] ?? "";
|
||||||
item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
|
item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
|
||||||
|
item.fingerprint = Utils.UrlDecode(query["fp"] ?? "");
|
||||||
item.network = query["type"] ?? "tcp";
|
item.network = query["type"] ?? "tcp";
|
||||||
switch (item.network)
|
switch (item.network)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (it.port <= 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
_selecteds.Add(new ServerTestItem()
|
_selecteds.Add(new ServerTestItem()
|
||||||
{
|
{
|
||||||
indexId = it.indexId,
|
indexId = it.indexId,
|
||||||
@@ -195,10 +199,10 @@ namespace v2rayN.Handler
|
|||||||
private async Task RunSpeedTestAsync()
|
private async Task RunSpeedTestAsync()
|
||||||
{
|
{
|
||||||
int pid = -1;
|
int pid = -1;
|
||||||
if (_actionType == ESpeedActionType.Mixedtest)
|
//if (_actionType == ESpeedActionType.Mixedtest)
|
||||||
{
|
//{
|
||||||
_selecteds = _selecteds.OrderBy(t => t.delay).ToList();
|
// _selecteds = _selecteds.OrderBy(t => t.delay).ToList();
|
||||||
}
|
//}
|
||||||
|
|
||||||
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
@@ -207,10 +211,11 @@ namespace v2rayN.Handler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string url = _config.constItem.speedTestUrl;
|
string url = _config.speedTestItem.speedTestUrl;
|
||||||
|
var timeout = _config.speedTestItem.speedTestTimeout;
|
||||||
|
|
||||||
DownloadHandle downloadHandle = new DownloadHandle();
|
DownloadHandle downloadHandle = new DownloadHandle();
|
||||||
|
|
||||||
var timeout = 8;
|
|
||||||
foreach (var it in _selecteds)
|
foreach (var it in _selecteds)
|
||||||
{
|
{
|
||||||
if (!it.allowTest)
|
if (!it.allowTest)
|
||||||
@@ -221,11 +226,11 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (it.delay < 0)
|
//if (it.delay < 0)
|
||||||
{
|
//{
|
||||||
UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip);
|
// UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip);
|
||||||
continue;
|
// continue;
|
||||||
}
|
//}
|
||||||
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||||
|
|
||||||
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||||
@@ -248,19 +253,73 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
_coreHandler.CoreStopPid(pid);
|
_coreHandler.CoreStopPid(pid);
|
||||||
}
|
}
|
||||||
|
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task RunSpeedTestMulti()
|
||||||
|
{
|
||||||
|
int pid = -1;
|
||||||
|
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||||
|
if (pid < 0)
|
||||||
|
{
|
||||||
|
UpdateFunc("", ResUI.FailedToRunCore);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string url = _config.speedTestItem.speedTestUrl;
|
||||||
|
var timeout = _config.speedTestItem.speedTestTimeout;
|
||||||
|
|
||||||
|
DownloadHandle downloadHandle = new DownloadHandle();
|
||||||
|
|
||||||
|
foreach (var it in _selecteds)
|
||||||
|
{
|
||||||
|
if (!it.allowTest)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it.configType == EConfigType.Custom)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||||
|
|
||||||
|
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||||
|
if (item is null) continue;
|
||||||
|
|
||||||
|
WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
|
||||||
|
_ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (bool success, string msg) =>
|
||||||
|
{
|
||||||
|
decimal.TryParse(msg, out decimal dec);
|
||||||
|
if (dec > 0)
|
||||||
|
{
|
||||||
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", msg);
|
||||||
|
}
|
||||||
|
UpdateFunc(it.indexId, "", msg);
|
||||||
|
});
|
||||||
|
Thread.Sleep(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.Sleep((timeout + 2) * 1000);
|
||||||
|
|
||||||
|
if (pid > 0)
|
||||||
|
{
|
||||||
|
_coreHandler.CoreStopPid(pid);
|
||||||
|
}
|
||||||
|
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task RunMixedtestAsync()
|
private async Task RunMixedtestAsync()
|
||||||
{
|
{
|
||||||
await RunRealPing();
|
await RunRealPing();
|
||||||
|
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
await RunSpeedTestAsync();
|
await RunSpeedTestMulti();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetRealPingTime(DownloadHandle downloadHandle, WebProxy webProxy)
|
public string GetRealPingTime(DownloadHandle downloadHandle, WebProxy webProxy)
|
||||||
{
|
{
|
||||||
string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
string status = downloadHandle.GetRealPingTime(_config.speedTestItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||||
//string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
|
//string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
|
||||||
return FormatOut(Utils.IsNullOrEmpty(status) ? responseTime : -1, Global.DelayUnit);
|
return FormatOut(Utils.IsNullOrEmpty(status) ? responseTime : -1, Global.DelayUnit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace v2rayN.Handler
|
|||||||
public StatisticsHandler(Mode.Config config, Action<ServerSpeedItem> update)
|
public StatisticsHandler(Mode.Config config, Action<ServerSpeedItem> update)
|
||||||
{
|
{
|
||||||
config_ = config;
|
config_ = config;
|
||||||
Enable = config.enableStatistics;
|
Enable = config.guiItem.enableStatistics;
|
||||||
updateFunc_ = update;
|
updateFunc_ = update;
|
||||||
exitFlag_ = false;
|
exitFlag_ = false;
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var sleep = config_.statisticsFreshRate < 1 ? 1 : config_.statisticsFreshRate;
|
var sleep = config_.guiItem.statisticsFreshRate < 1 ? 1 : config_.guiItem.statisticsFreshRate;
|
||||||
Thread.Sleep(1000 * sleep);
|
Thread.Sleep(1000 * sleep);
|
||||||
channel_.ConnectAsync();
|
channel_.ConnectAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,17 @@ namespace v2rayN.Base
|
|||||||
configStr = configStr.Replace("$strict_route$", $"{_config.tunModeItem.strictRoute.ToString().ToLower()}");
|
configStr = configStr.Replace("$strict_route$", $"{_config.tunModeItem.strictRoute.ToString().ToLower()}");
|
||||||
configStr = configStr.Replace("$stack$", $"{_config.tunModeItem.stack}");
|
configStr = configStr.Replace("$stack$", $"{_config.tunModeItem.stack}");
|
||||||
|
|
||||||
|
//logs
|
||||||
|
if (_config.tunModeItem.showWindow)
|
||||||
|
{
|
||||||
|
configStr = configStr.Replace("$log_output$", $"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var dtNow = DateTime.Now;
|
||||||
|
var log_output = $"\"output\": \"{Utils.GetLogPath($"singbox_{dtNow.ToString("yyyy-MM-dd")}.txt")}\", ";
|
||||||
|
configStr = configStr.Replace("$log_output$", $"{log_output.Replace(@"\", @"\\")}");
|
||||||
|
}
|
||||||
|
|
||||||
//port
|
//port
|
||||||
configStr = configStr.Replace("$socksPort$", $"{_socksPort}");
|
configStr = configStr.Replace("$socksPort$", $"{_socksPort}");
|
||||||
@@ -118,13 +129,13 @@ namespace v2rayN.Base
|
|||||||
{
|
{
|
||||||
if (!lstDnsExe.Contains(it2) && it.coreType != ECoreType.sing_box)
|
if (!lstDnsExe.Contains(it2) && it.coreType != ECoreType.sing_box)
|
||||||
{
|
{
|
||||||
lstDnsExe.Add(it2);
|
//lstDnsExe.Add(it2);
|
||||||
lstDnsExe.Add($"{it2}.exe");
|
lstDnsExe.Add($"{it2}.exe");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstDirectExe.Contains(it2))
|
if (!lstDirectExe.Contains(it2))
|
||||||
{
|
{
|
||||||
lstDirectExe.Add(it2);
|
//lstDirectExe.Add(it2);
|
||||||
lstDirectExe.Add($"{it2}.exe");
|
lstDirectExe.Add($"{it2}.exe");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,27 +146,45 @@ namespace v2rayN.Base
|
|||||||
string strDirect = string.Join("\",\"", lstDirectExe.ToArray());
|
string strDirect = string.Join("\",\"", lstDirectExe.ToArray());
|
||||||
configStr = configStr.Replace("$directProcessName$", $"\"{strDirect}\"");
|
configStr = configStr.Replace("$directProcessName$", $"\"{strDirect}\"");
|
||||||
|
|
||||||
|
if (_config.tunModeItem.bypassMode)
|
||||||
|
{
|
||||||
|
//direct ips
|
||||||
|
if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
|
||||||
|
{
|
||||||
|
var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
|
||||||
|
configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
|
||||||
|
}
|
||||||
|
//direct process
|
||||||
|
if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
|
||||||
|
{
|
||||||
|
var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
|
||||||
|
configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//proxy ips
|
||||||
|
if (_config.tunModeItem.proxyIP != null && _config.tunModeItem.proxyIP.Count > 0)
|
||||||
|
{
|
||||||
|
var ips = new { outbound = "proxy", ip_cidr = _config.tunModeItem.proxyIP };
|
||||||
|
configStr = configStr.Replace("$ruleProxyIPs$", "," + Utils.ToJson(ips));
|
||||||
|
}
|
||||||
|
//proxy process
|
||||||
|
if (_config.tunModeItem.proxyProcess != null && _config.tunModeItem.proxyProcess.Count > 0)
|
||||||
|
{
|
||||||
|
var process = new { outbound = "proxy", process_name = _config.tunModeItem.proxyProcess };
|
||||||
|
configStr = configStr.Replace("$ruleProxyProcess$", "," + Utils.ToJson(process));
|
||||||
|
}
|
||||||
|
|
||||||
//ips
|
var final = new { outbound = "direct", inbound = "tun-in" };
|
||||||
if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
|
configStr = configStr.Replace("$ruleFinally$", "," + Utils.ToJson(final));
|
||||||
{
|
|
||||||
var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
|
|
||||||
configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
configStr = configStr.Replace("$ruleDirectIPs$", "");
|
|
||||||
}
|
|
||||||
//process
|
|
||||||
if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
|
|
||||||
{
|
|
||||||
var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
|
|
||||||
configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
configStr = configStr.Replace("$ruleDirectProcess$", "");
|
|
||||||
}
|
}
|
||||||
|
configStr = configStr.Replace("$ruleDirectIPs$", "");
|
||||||
|
configStr = configStr.Replace("$ruleDirectProcess$", "");
|
||||||
|
configStr = configStr.Replace("$ruleProxyIPs$", "");
|
||||||
|
configStr = configStr.Replace("$ruleProxyProcess$", "");
|
||||||
|
configStr = configStr.Replace("$ruleFinally$", "");
|
||||||
|
|
||||||
|
|
||||||
File.WriteAllText(Utils.GetConfigPath(_tunConfigName), configStr);
|
File.WriteAllText(Utils.GetConfigPath(_tunConfigName), configStr);
|
||||||
|
|
||||||
@@ -172,6 +201,7 @@ namespace v2rayN.Base
|
|||||||
KillProcess(_process);
|
KillProcess(_process);
|
||||||
_process.Dispose();
|
_process.Dispose();
|
||||||
_process = null;
|
_process = null;
|
||||||
|
_needRestart = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -213,10 +213,10 @@ namespace v2rayN.Handler
|
|||||||
url = Utils.GetPunycode(url);
|
url = Utils.GetPunycode(url);
|
||||||
|
|
||||||
_updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}");
|
_updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}");
|
||||||
var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent);
|
var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent);
|
||||||
if (blProxy && Utils.IsNullOrEmpty(result))
|
if (blProxy && Utils.IsNullOrEmpty(result))
|
||||||
{
|
{
|
||||||
result = await downloadHandle.DownloadStringAsync(url, false, userAgent);
|
result = await downloadHandle.TryDownloadString(url, false, userAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utils.IsNullOrEmpty(result))
|
if (Utils.IsNullOrEmpty(result))
|
||||||
@@ -278,11 +278,13 @@ namespace v2rayN.Handler
|
|||||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||||
if (File.Exists(fileName))
|
if (File.Exists(fileName))
|
||||||
{
|
{
|
||||||
Global.coreTypes.ForEach(it =>
|
//Global.coreTypes.ForEach(it =>
|
||||||
{
|
//{
|
||||||
string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
|
// string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
|
||||||
File.Copy(fileName, targetPath, true);
|
// File.Copy(fileName, targetPath, true);
|
||||||
});
|
//});
|
||||||
|
string targetPath = Utils.GetBinPath($"{geoName}.dat");
|
||||||
|
File.Copy(fileName, targetPath, true);
|
||||||
|
|
||||||
File.Delete(fileName);
|
File.Delete(fileName);
|
||||||
//_updateFunc(true, "");
|
//_updateFunc(true, "");
|
||||||
|
|||||||
@@ -8,148 +8,31 @@
|
|||||||
{
|
{
|
||||||
#region property
|
#region property
|
||||||
|
|
||||||
/// <summary>
|
public string indexId { get; set; }
|
||||||
/// 允许日志
|
|
||||||
/// </summary>
|
|
||||||
public bool logEnabled
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 日志等级
|
|
||||||
/// </summary>
|
|
||||||
public string loglevel
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string indexId
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 允许Mux多路复用
|
|
||||||
/// </summary>
|
|
||||||
public bool muxEnabled
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public ESysProxyType sysProxyType
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool autoRun { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 启用实时网速和流量统计
|
|
||||||
/// </summary>
|
|
||||||
public bool enableStatistics
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 去重时优先保留较旧(顶部)节点
|
|
||||||
/// </summary>
|
|
||||||
public bool keepOlderDedupl
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 视图刷新率
|
|
||||||
/// </summary>
|
|
||||||
public int statisticsFreshRate
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义远程DNS
|
|
||||||
/// </summary>
|
|
||||||
public string remoteDNS
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public string remoteDNS { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Outbound Freedom domainStrategy
|
/// Outbound Freedom domainStrategy
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string domainStrategy4Freedom
|
public string domainStrategy4Freedom { get; set; }
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
public ESysProxyType sysProxyType { get; set; }
|
||||||
/// 是否允许不安全连接
|
public string systemProxyExceptions { get; set; }
|
||||||
/// </summary>
|
|
||||||
public bool defAllowInsecure
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 域名解析策略
|
|
||||||
/// </summary>
|
|
||||||
public string domainStrategy
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public string domainMatcher
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public string routingIndexId { get; set; }
|
|
||||||
public bool enableRoutingAdvanced
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ignoreGeoUpdateCore
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// systemProxyExceptions
|
|
||||||
/// </summary>
|
|
||||||
public string systemProxyExceptions
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public string systemProxyAdvancedProtocol { get; set; }
|
public string systemProxyAdvancedProtocol { get; set; }
|
||||||
|
|
||||||
public int autoUpdateInterval { get; set; } = 10;
|
|
||||||
|
|
||||||
public int autoUpdateSubInterval { get; set; } = 10;
|
|
||||||
|
|
||||||
public bool checkPreReleaseUpdate { get; set; } = false;
|
|
||||||
|
|
||||||
public bool enableSecurityProtocolTls13
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int trayMenuServersLimit { get; set; } = 20;
|
|
||||||
|
|
||||||
public bool autoHideStartup { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region other entities
|
#region other entities
|
||||||
|
|
||||||
|
public CoreBasicItem coreBasicItem { get; set; }
|
||||||
public TunModeItem tunModeItem { get; set; }
|
public TunModeItem tunModeItem { get; set; }
|
||||||
public KcpItem kcpItem { get; set; }
|
public KcpItem kcpItem { get; set; }
|
||||||
public GrpcItem grpcItem { get; set; }
|
public GrpcItem grpcItem { get; set; }
|
||||||
|
public RoutingBasicItem routingBasicItem { get; set; }
|
||||||
|
public GUIItem guiItem { get; set; }
|
||||||
public UIItem uiItem { get; set; }
|
public UIItem uiItem { get; set; }
|
||||||
public ConstItem constItem { get; set; }
|
public ConstItem constItem { get; set; }
|
||||||
|
public SpeedTestItem speedTestItem { get; set; }
|
||||||
public List<InItem> inbound { get; set; }
|
public List<InItem> inbound { get; set; }
|
||||||
public List<KeyEventItem> globalHotkeys { get; set; }
|
public List<KeyEventItem> globalHotkeys { get; set; }
|
||||||
public List<CoreTypeItem> coreTypeItem { get; set; }
|
public List<CoreTypeItem> coreTypeItem { get; set; }
|
||||||
|
|||||||
@@ -2,6 +2,37 @@
|
|||||||
|
|
||||||
namespace v2rayN.Mode
|
namespace v2rayN.Mode
|
||||||
{
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class CoreBasicItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 允许日志
|
||||||
|
/// </summary>
|
||||||
|
public bool logEnabled { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 日志等级
|
||||||
|
/// </summary>
|
||||||
|
public string loglevel { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 允许Mux多路复用
|
||||||
|
/// </summary>
|
||||||
|
public bool muxEnabled { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否允许不安全连接
|
||||||
|
/// </summary>
|
||||||
|
public bool defAllowInsecure { get; set; }
|
||||||
|
|
||||||
|
public string defFingerprint { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 默认用户代理
|
||||||
|
/// </summary>
|
||||||
|
public string defUserAgent { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class InItem
|
public class InItem
|
||||||
{
|
{
|
||||||
@@ -51,6 +82,30 @@ namespace v2rayN.Mode
|
|||||||
public int initial_windows_size { get; set; }
|
public int initial_windows_size { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class GUIItem
|
||||||
|
{
|
||||||
|
public bool autoRun { get; set; }
|
||||||
|
|
||||||
|
public bool enableStatistics { get; set; }
|
||||||
|
|
||||||
|
public int statisticsFreshRate { get; set; }
|
||||||
|
|
||||||
|
public bool keepOlderDedupl { get; set; }
|
||||||
|
|
||||||
|
public bool ignoreGeoUpdateCore { get; set; } = true;
|
||||||
|
|
||||||
|
public int autoUpdateInterval { get; set; } = 10;
|
||||||
|
|
||||||
|
public int autoUpdateSubInterval { get; set; } = 10;
|
||||||
|
|
||||||
|
public bool checkPreReleaseUpdate { get; set; } = false;
|
||||||
|
|
||||||
|
public bool enableSecurityProtocolTls13 { get; set; }
|
||||||
|
|
||||||
|
public int trayMenuServersLimit { get; set; } = 20;
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class UIItem
|
public class UIItem
|
||||||
{
|
{
|
||||||
@@ -62,16 +117,18 @@ namespace v2rayN.Mode
|
|||||||
public bool colorModeDark { get; set; }
|
public bool colorModeDark { get; set; }
|
||||||
public string? colorPrimaryName { get; set; }
|
public string? colorPrimaryName { get; set; }
|
||||||
public string currentLanguage { get; set; }
|
public string currentLanguage { get; set; }
|
||||||
|
public string currentFontFamily { get; set; }
|
||||||
|
public int currentFontSize { get; set; }
|
||||||
public bool enableDragDropSort { get; set; }
|
public bool enableDragDropSort { get; set; }
|
||||||
public bool doubleClick2Activate { get; set; }
|
public bool doubleClick2Activate { get; set; }
|
||||||
|
public bool autoHideStartup { get; set; } = true;
|
||||||
|
public string mainMsgFilter { get; set; }
|
||||||
public Dictionary<string, int> mainLvColWidth { get; set; }
|
public Dictionary<string, int> mainLvColWidth { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class ConstItem
|
public class ConstItem
|
||||||
{
|
{
|
||||||
public string speedTestUrl { get; set; }
|
|
||||||
public string speedPingTestUrl { get; set; }
|
|
||||||
public string defIEProxyExceptions { get; set; }
|
public string defIEProxyExceptions { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,8 +164,32 @@ namespace v2rayN.Mode
|
|||||||
public string stack { get; set; }
|
public string stack { get; set; }
|
||||||
public int mtu { get; set; }
|
public int mtu { get; set; }
|
||||||
public string customTemplate { get; set; }
|
public string customTemplate { get; set; }
|
||||||
|
public bool bypassMode { get; set; } = true;
|
||||||
public List<string> directIP { get; set; }
|
public List<string> directIP { get; set; }
|
||||||
public List<string> directProcess { get; set; }
|
public List<string> directProcess { get; set; }
|
||||||
|
public List<string> proxyIP { get; set; }
|
||||||
|
public List<string> proxyProcess { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class SpeedTestItem
|
||||||
|
{
|
||||||
|
public int speedTestTimeout { get; set; }
|
||||||
|
public string speedTestUrl { get; set; }
|
||||||
|
public string speedPingTestUrl { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class RoutingBasicItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 域名解析策略
|
||||||
|
/// </summary>
|
||||||
|
public string domainStrategy { get; set; }
|
||||||
|
public string domainMatcher { get; set; }
|
||||||
|
public string routingIndexId { get; set; }
|
||||||
|
public bool enableRoutingAdvanced { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ namespace v2rayN.Mode
|
|||||||
public bool locked { get; set; }
|
public bool locked { get; set; }
|
||||||
public string customIcon { get; set; }
|
public string customIcon { get; set; }
|
||||||
public string domainStrategy { get; set; }
|
public string domainStrategy { get; set; }
|
||||||
|
public int sort { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace v2rayN.Mode
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace v2rayN.Mode
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// v2ray配置文件实体类
|
/// v2ray配置文件实体类
|
||||||
@@ -505,6 +507,12 @@
|
|||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Host { get; set; }
|
public string Host { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户代理
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("User-Agent")]
|
||||||
|
public string UserAgent { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class HttpSettings
|
public class HttpSettings
|
||||||
|
|||||||
@@ -63,5 +63,10 @@
|
|||||||
/// TLS alpn
|
/// TLS alpn
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string alpn { get; set; } = string.Empty;
|
public string alpn { get; set; } = string.Empty;
|
||||||
|
/// <summary>
|
||||||
|
/// TLS fingerprint
|
||||||
|
/// </summary>
|
||||||
|
public string fp { get; set; } = string.Empty;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
141
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
141
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
@@ -70,7 +70,7 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 All servers 的本地化字符串。
|
/// 查找类似 All 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string AllGroupServers {
|
public static string AllGroupServers {
|
||||||
get {
|
get {
|
||||||
@@ -790,7 +790,7 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 One-click test Latency and speed (Ctrl+E) 的本地化字符串。
|
/// 查找类似 One-click multi test Latency and speed (Ctrl+E) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string menuMixedTestServer {
|
public static string menuMixedTestServer {
|
||||||
get {
|
get {
|
||||||
@@ -1761,6 +1761,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Test completed 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string SpeedtestingCompleted {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SpeedtestingCompleted", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Skip test 的本地化字符串。
|
/// 查找类似 Skip test 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2383,6 +2392,24 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 FontFamily(Require restart) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsCurrentFontFamily {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsCurrentFontFamily", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Copy the font TTF file to the directory guiFonts, restart the settings 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsCurrentFontFamilyTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsCurrentFontFamilyTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 AllowInsecure 的本地化字符串。
|
/// 查找类似 AllowInsecure 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2392,6 +2419,33 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Default TLS fingerprint 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefFingerprint {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefFingerprint", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 User-Agent 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefUserAgent {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefUserAgent", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 This parameter is valid only for tcp/http and ws 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefUserAgentTips {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefUserAgentTips", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。
|
/// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2455,6 +2509,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 FontSize 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsFontSize {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsFontSize", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Http Port 的本地化字符串。
|
/// 查找类似 Http Port 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2492,7 +2555,7 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Language 的本地化字符串。
|
/// 查找类似 Language(Restart) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string TbSettingsLanguage {
|
public static string TbSettingsLanguage {
|
||||||
get {
|
get {
|
||||||
@@ -2617,6 +2680,33 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 http port=socks port+1 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsSocksPortTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsSocksPortTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 SpeedTest Single Timeout Value 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsSpeedTestTimeout {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsSpeedTestTimeout", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 SpeedTest Url 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsSpeedTestUrl {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsSpeedTestUrl", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Start on boot 的本地化字符串。
|
/// 查找类似 Start on boot 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2626,6 +2716,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Set this with admin privileges, get admin privileges after startup 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsStartBootTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsStartBootTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Enable Statistics (Require restart) 的本地化字符串。
|
/// 查找类似 Enable Statistics (Require restart) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2689,6 +2788,24 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Bypass Mode 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsTunModeBypassMode {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsTunModeBypassMode", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Enable: If no route matches, the final proxy 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsTunModeBypassModeTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsTunModeBypassModeTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Custom Template 的本地化字符串。
|
/// 查找类似 Custom Template 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2716,6 +2833,24 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Proxy IP CIDR, separated by commas (,) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsTunModeProxyIP {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsTunModeProxyIP", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Proxy Process name, separated by commas (,) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsTunModeProxyProcess {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsTunModeProxyProcess", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Show console 的本地化字符串。
|
/// 查找类似 Show console 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -130,7 +130,7 @@
|
|||||||
<value>فرمت پیکربندی نادرست است</value>
|
<value>فرمت پیکربندی نادرست است</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomServerTips" xml:space="preserve">
|
<data name="CustomServerTips" xml:space="preserve">
|
||||||
<value>Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually.</value>
|
<value>توجه داشته باشید که پیکربندی سفارشی کاملاً به پیکربندی خود شما بستگی دارد و با همه تنظیمات کار نمی کند. اگر می خواهید از پروکسی سیستم استفاده کنید، لطفاً پورت درحال شنود را به صورت دستی تغییر دهید.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Downloading" xml:space="preserve">
|
<data name="Downloading" xml:space="preserve">
|
||||||
<value>درحال دانلود...</value>
|
<value>درحال دانلود...</value>
|
||||||
@@ -187,10 +187,10 @@
|
|||||||
<value>پیکربندی اولیه</value>
|
<value>پیکربندی اولیه</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IsLatestCore" xml:space="preserve">
|
<data name="IsLatestCore" xml:space="preserve">
|
||||||
<value>{0} already up to date.</value>
|
<value>{0} در حال حاضر به روز است.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IsLatestN" xml:space="preserve">
|
<data name="IsLatestN" xml:space="preserve">
|
||||||
<value>{0} already up to date.</value>
|
<value>{0} در حال حاضر به روز است.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvAddress" xml:space="preserve">
|
<data name="LvAddress" xml:space="preserve">
|
||||||
<value>آدرس</value>
|
<value>آدرس</value>
|
||||||
@@ -262,28 +262,28 @@
|
|||||||
<value>شروع به دریافت اشتراک شد</value>
|
<value>شروع به دریافت اشتراک شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgStartUpdating" xml:space="preserve">
|
<data name="MsgStartUpdating" xml:space="preserve">
|
||||||
<value>Start updating {0}...</value>
|
<value>شروع بروزرسانی {0}...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgStartUpdatingPAC" xml:space="preserve">
|
<data name="MsgStartUpdatingPAC" xml:space="preserve">
|
||||||
<value>Start updating PAC...</value>
|
<value>شروع بروزرسانی PAC...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgSubscriptionDecodingFailed" xml:space="preserve">
|
<data name="MsgSubscriptionDecodingFailed" xml:space="preserve">
|
||||||
<value>محتوای اشتراک نامعتبر است</value>
|
<value>محتوای اشتراک نامعتبر است</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUnpacking" xml:space="preserve">
|
<data name="MsgUnpacking" xml:space="preserve">
|
||||||
<value>is unpacking...</value>
|
<value>در حال باز کردن بسته می باشد ...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateSubscriptionEnd" xml:space="preserve">
|
<data name="MsgUpdateSubscriptionEnd" xml:space="preserve">
|
||||||
<value>Update subscription end</value>
|
<value>بروزرسانی اشتراک به پایان رسید</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateSubscriptionStart" xml:space="preserve">
|
<data name="MsgUpdateSubscriptionStart" xml:space="preserve">
|
||||||
<value>Update subscription starts</value>
|
<value>بروزرسانی اشتراک شروع شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve">
|
<data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve">
|
||||||
<value>Update Core successfully</value>
|
<value>هسته با موفقیت بروزرسانی شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateV2rayCoreSuccessfullyMore" xml:space="preserve">
|
<data name="MsgUpdateV2rayCoreSuccessfullyMore" xml:space="preserve">
|
||||||
<value>Update Core successfully! Restarting service...</value>
|
<value>هسته با موفقیت بروزرسانی شد! راه اندازی مجدد سرویس...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NeedHttpGlobalProxy" xml:space="preserve">
|
<data name="NeedHttpGlobalProxy" xml:space="preserve">
|
||||||
<value> This feature relies on the Http global proxy, please set it correctly first.</value>
|
<value> This feature relies on the Http global proxy, please set it correctly first.</value>
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
<value>Scan completed, no valid QR code found</value>
|
<value>Scan completed, no valid QR code found</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OperationFailed" xml:space="preserve">
|
<data name="OperationFailed" xml:space="preserve">
|
||||||
<value> operation failed, please check and retry</value>
|
<value> عملیات انجام نشد، لطفا بررسی کنید و دوباره امتحان کنید</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PleaseFillRemarks" xml:space="preserve">
|
<data name="PleaseFillRemarks" xml:space="preserve">
|
||||||
<value>Please Fill Remarks</value>
|
<value>Please Fill Remarks</value>
|
||||||
@@ -343,20 +343,20 @@
|
|||||||
<value>Start service ({0})...</value>
|
<value>Start service ({0})...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfulConfiguration" xml:space="preserve">
|
<data name="SuccessfulConfiguration" xml:space="preserve">
|
||||||
<value>Configuration successful
|
<value>پیکربندی با موفقیت انجام شد
|
||||||
{0}</value>
|
{0}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
|
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
|
||||||
<value>سرور پیکربندی سفارشی با موفقیت وارد شد.</value>
|
<value>سرور پیکربندی سفارشی با موفقیت وارد شد.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
|
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
|
||||||
<value>{0} servers have been imported from clipboard.</value>
|
<value>{0} سرورها از کلیپ بورد وارد شده اند.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedServerViaScan" xml:space="preserve">
|
<data name="SuccessfullyImportedServerViaScan" xml:space="preserve">
|
||||||
<value>Scan import URL successfully</value>
|
<value>اسکن URL وارد کردن با موفقیت</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TestMeOutput" xml:space="preserve">
|
<data name="TestMeOutput" xml:space="preserve">
|
||||||
<value>The ping of current service: {0} ms</value>
|
<value>پینگ سرویس فعلی: {0} ms</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OperationSuccess" xml:space="preserve">
|
<data name="OperationSuccess" xml:space="preserve">
|
||||||
<value>موفقیت عملیات</value>
|
<value>موفقیت عملیات</value>
|
||||||
@@ -368,7 +368,7 @@
|
|||||||
<value>آیا مطمئن هستید که قوانین را حذف می کنید؟</value>
|
<value>آیا مطمئن هستید که قوانین را حذف می کنید؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
|
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
|
||||||
<value>{0},One of the required.</value>
|
<value>{0},یکی از مورد نیاز.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvRemarks" xml:space="preserve">
|
<data name="LvRemarks" xml:space="preserve">
|
||||||
<value>Remarks</value>
|
<value>Remarks</value>
|
||||||
@@ -386,7 +386,7 @@
|
|||||||
<value>Do you want to append rules? Choose yes to append, choose otherwise to replace</value>
|
<value>Do you want to append rules? Choose yes to append, choose otherwise to replace</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
|
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
|
||||||
<value>Download GeoFile: {0} successfully</value>
|
<value>دانلود GeoFile: {0} با موفقیت</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgInformationTitle" xml:space="preserve">
|
<data name="MsgInformationTitle" xml:space="preserve">
|
||||||
<value>اطلاعات</value>
|
<value>اطلاعات</value>
|
||||||
@@ -536,7 +536,7 @@
|
|||||||
<value>پروکسی سیستم تغییر نکند</value>
|
<value>پروکسی سیستم تغییر نکند</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSystemProxyPac" xml:space="preserve">
|
<data name="menuSystemProxyPac" xml:space="preserve">
|
||||||
<value>Pac Mode</value>
|
<value>حالت Pac</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSystemProxySet" xml:space="preserve">
|
<data name="menuSystemProxySet" xml:space="preserve">
|
||||||
<value>تنظیم پراکسی سیستم</value>
|
<value>تنظیم پراکسی سیستم</value>
|
||||||
@@ -791,10 +791,10 @@
|
|||||||
<value>Outbound Freedom domainStrategy</value>
|
<value>Outbound Freedom domainStrategy</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsEnableAutoAdjustMainLvColWidth" xml:space="preserve">
|
<data name="TbSettingsEnableAutoAdjustMainLvColWidth" xml:space="preserve">
|
||||||
<value>Automatically adjust column width after updating subscription</value>
|
<value>پس از بهروزرسانی اشتراک، عرض ستون را به صورت خودکار تنظیم شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsEnableCheckPreReleaseUpdate" xml:space="preserve">
|
<data name="TbSettingsEnableCheckPreReleaseUpdate" xml:space="preserve">
|
||||||
<value>به روز رسانی های پیش از انتشار را بررسی کنید</value>
|
<value>به روز رسانی های پیش از انتشار را بررسی شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsException" xml:space="preserve">
|
<data name="TbSettingsException" xml:space="preserve">
|
||||||
<value>استثنا</value>
|
<value>استثنا</value>
|
||||||
@@ -827,13 +827,13 @@
|
|||||||
<value>تنظیمات v2rayN</value>
|
<value>تنظیمات v2rayN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsPacListenPort" xml:space="preserve">
|
<data name="TbSettingsPacListenPort" xml:space="preserve">
|
||||||
<value>Pac listen port</value>
|
<value>Pac پورت درحال شنود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsPass" xml:space="preserve">
|
<data name="TbSettingsPass" xml:space="preserve">
|
||||||
<value>Auth pass</value>
|
<value>Auth pass</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsRemoteDNS" xml:space="preserve">
|
<data name="TbSettingsRemoteDNS" xml:space="preserve">
|
||||||
<value>Custom DNS (multiple, separated by commas (,))</value>
|
<value>سفارشی DNS (multiple, separated by commas (,))</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSaveTip" xml:space="preserve">
|
<data name="TbSettingsSaveTip" xml:space="preserve">
|
||||||
<value>After modifying the following parameters, click Save to take effect</value>
|
<value>After modifying the following parameters, click Save to take effect</value>
|
||||||
@@ -845,16 +845,16 @@
|
|||||||
<value>Turn on Sniffing</value>
|
<value>Turn on Sniffing</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSocksPort" xml:space="preserve">
|
<data name="TbSettingsSocksPort" xml:space="preserve">
|
||||||
<value>Socks Port</value>
|
<value>ساکس Port</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStartBoot" xml:space="preserve">
|
<data name="TbSettingsStartBoot" xml:space="preserve">
|
||||||
<value>Start on boot</value>
|
<value>درهنگام راه ائدازی شروع شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>Enable Statistics (Require restart)</value>
|
<value>فعال کردن آمار (نیاز به راه اندازی مجدد)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
||||||
<value>Statistics freshrate (second)</value>
|
<value>نرخ تازه سازی آمار (ثانیه)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>Subscription conversion Url</value>
|
<value>Subscription conversion Url</value>
|
||||||
@@ -884,7 +884,7 @@
|
|||||||
<value>تنظیم کلید میانبر جهانی</value>
|
<value>تنظیم کلید میانبر جهانی</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
|
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
|
||||||
<value>Set directly by pressing the keyboard, Take effect after restart</value>
|
<value>مستقیماً با فشار دادن صفحه کلید تنظیم کنید، بعد از راه اندازی مجدد اعمال شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbNotChangeSystemProxy" xml:space="preserve">
|
<data name="TbNotChangeSystemProxy" xml:space="preserve">
|
||||||
<value>پروکسی سیستم را تغییر ندهید</value>
|
<value>پروکسی سیستم را تغییر ندهید</value>
|
||||||
@@ -929,7 +929,7 @@
|
|||||||
<value>{0} Website</value>
|
<value>{0} Website</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRoutingAdvanced" xml:space="preserve">
|
<data name="menuRoutingAdvanced" xml:space="preserve">
|
||||||
<value>Advanced Function</value>
|
<value>عملکرد پیشرفته</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRoutingAdvancedAdd" xml:space="preserve">
|
<data name="menuRoutingAdvancedAdd" xml:space="preserve">
|
||||||
<value>اضافه کردن</value>
|
<value>اضافه کردن</value>
|
||||||
@@ -1001,7 +1001,7 @@
|
|||||||
<value>تنظیم جزئیات قانون مسیریابی</value>
|
<value>تنظیم جزئیات قانون مسیریابی</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbAutoSort" xml:space="preserve">
|
<data name="TbAutoSort" xml:space="preserve">
|
||||||
<value>Domain and ip are auto sorted when saving</value>
|
<value>دامنه و آی پی در هنگام ذخیره به طور خودکار مرتب می شوند</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRuleobjectDoc" xml:space="preserve">
|
<data name="TbRuleobjectDoc" xml:space="preserve">
|
||||||
<value>Ruleobject Doc</value>
|
<value>Ruleobject Doc</value>
|
||||||
@@ -1060,4 +1060,10 @@
|
|||||||
<data name="TbSettingsTunModeShowWindow" xml:space="preserve">
|
<data name="TbSettingsTunModeShowWindow" xml:space="preserve">
|
||||||
<value>نمایش کنسول</value>
|
<value>نمایش کنسول</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>User-Agent</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>This parameter is valid only for tcp/http and ws</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -449,7 +449,7 @@
|
|||||||
<value>Ungrouped</value>
|
<value>Ungrouped</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllGroupServers" xml:space="preserve">
|
<data name="AllGroupServers" xml:space="preserve">
|
||||||
<value>All servers</value>
|
<value>All</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FillServerAddressCustom" xml:space="preserve">
|
<data name="FillServerAddressCustom" xml:space="preserve">
|
||||||
<value>Please browse to import server configuration</value>
|
<value>Please browse to import server configuration</value>
|
||||||
@@ -548,7 +548,7 @@
|
|||||||
<value>Dark Mode</value>
|
<value>Dark Mode</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsLanguage" xml:space="preserve">
|
<data name="TbSettingsLanguage" xml:space="preserve">
|
||||||
<value>Language</value>
|
<value>Language(Restart)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
||||||
<value>Import bulk URL from clipboard (Ctrl+V)</value>
|
<value>Import bulk URL from clipboard (Ctrl+V)</value>
|
||||||
@@ -1022,7 +1022,7 @@
|
|||||||
<value>RouteOnly</value>
|
<value>RouteOnly</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuMixedTestServer" xml:space="preserve">
|
<data name="menuMixedTestServer" xml:space="preserve">
|
||||||
<value>One-click test Latency and speed (Ctrl+E)</value>
|
<value>One-click multi test Latency and speed (Ctrl+E)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvTestDelay" xml:space="preserve">
|
<data name="LvTestDelay" xml:space="preserve">
|
||||||
<value>Delay(ms)</value>
|
<value>Delay(ms)</value>
|
||||||
@@ -1081,4 +1081,49 @@
|
|||||||
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
||||||
<value>Double-click server make active</value>
|
<value>Double-click server make active</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="SpeedtestingCompleted" xml:space="preserve">
|
||||||
|
<value>Test completed</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefFingerprint" xml:space="preserve">
|
||||||
|
<value>Default TLS fingerprint</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>User-Agent</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>This parameter is valid only for tcp/http and ws</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamily" xml:space="preserve">
|
||||||
|
<value>FontFamily(Require restart)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamilyTip" xml:space="preserve">
|
||||||
|
<value>Copy the font TTF file to the directory guiFonts, restart the settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||||
|
<value>http port=socks port+1</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||||
|
<value>Set this with admin privileges, get admin privileges after startup</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsFontSize" xml:space="preserve">
|
||||||
|
<value>FontSize</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeProxyIP" xml:space="preserve">
|
||||||
|
<value>Proxy IP CIDR, separated by commas (,)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeProxyProcess" xml:space="preserve">
|
||||||
|
<value>Proxy Process name, separated by commas (,)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeBypassMode" xml:space="preserve">
|
||||||
|
<value>Bypass Mode</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeBypassModeTip" xml:space="preserve">
|
||||||
|
<value>Enable: If no route matches, the final proxy</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestTimeout" xml:space="preserve">
|
||||||
|
<value>SpeedTest Single Timeout Value</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestUrl" xml:space="preserve">
|
||||||
|
<value>SpeedTest Url</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
1111
v2rayN/v2rayN/Resx/ResUI.ru.resx
Normal file
1111
v2rayN/v2rayN/Resx/ResUI.ru.resx
Normal file
File diff suppressed because it is too large
Load Diff
@@ -449,7 +449,7 @@
|
|||||||
<value>未分组服务器</value>
|
<value>未分组服务器</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllGroupServers" xml:space="preserve">
|
<data name="AllGroupServers" xml:space="preserve">
|
||||||
<value>所有服务器</value>
|
<value>所有</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FillServerAddressCustom" xml:space="preserve">
|
<data name="FillServerAddressCustom" xml:space="preserve">
|
||||||
<value>请浏览导入服务器配置</value>
|
<value>请浏览导入服务器配置</value>
|
||||||
@@ -548,7 +548,7 @@
|
|||||||
<value>暗黑模式</value>
|
<value>暗黑模式</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsLanguage" xml:space="preserve">
|
<data name="TbSettingsLanguage" xml:space="preserve">
|
||||||
<value>语言</value>
|
<value>语言(重启)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
||||||
<value>从剪贴板导入批量URL (Ctrl+V)</value>
|
<value>从剪贴板导入批量URL (Ctrl+V)</value>
|
||||||
@@ -1022,7 +1022,7 @@
|
|||||||
<value>RouteOnly</value>
|
<value>RouteOnly</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuMixedTestServer" xml:space="preserve">
|
<data name="menuMixedTestServer" xml:space="preserve">
|
||||||
<value>一键测试延迟和速度 (Ctrl+E)</value>
|
<value>一键多线程测试延迟和速度 (Ctrl+E)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvTestDelay" xml:space="preserve">
|
<data name="LvTestDelay" xml:space="preserve">
|
||||||
<value>延迟(ms)</value>
|
<value>延迟(ms)</value>
|
||||||
@@ -1081,4 +1081,49 @@
|
|||||||
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
||||||
<value>主界面双击设为活动服务器</value>
|
<value>主界面双击设为活动服务器</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="SpeedtestingCompleted" xml:space="preserve">
|
||||||
|
<value>测试完成</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefFingerprint" xml:space="preserve">
|
||||||
|
<value>默认TLS指纹(fingerprint)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>用户代理(User-Agent)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>仅对tcp/http、ws协议生效</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamily" xml:space="preserve">
|
||||||
|
<value>当前字体(需重启)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamilyTip" xml:space="preserve">
|
||||||
|
<value>拷贝字体TTF文件到目录guiFonts,重启设置</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||||
|
<value>http端口=socks端口+1</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||||
|
<value>以管理员权限设置此项,在启动后获得管理员权限</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsFontSize" xml:space="preserve">
|
||||||
|
<value>字体大小</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeProxyIP" xml:space="preserve">
|
||||||
|
<value>代理的IP CIDR,用逗号(,)分隔</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeProxyProcess" xml:space="preserve">
|
||||||
|
<value>代理的进程名,用逗号(,)分隔</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeBypassMode" xml:space="preserve">
|
||||||
|
<value>绕行模式</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsTunModeBypassModeTip" xml:space="preserve">
|
||||||
|
<value>启用:路由无匹配则最终代理</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestTimeout" xml:space="preserve">
|
||||||
|
<value>测速单个超时值</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestUrl" xml:space="preserve">
|
||||||
|
<value>测速文件地址</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1 +1 @@
|
|||||||
{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}}
|
{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":[$requestUserAgent$],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}}
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
{
|
{
|
||||||
|
"log": {
|
||||||
|
"disabled": false,
|
||||||
|
"level": "debug",
|
||||||
|
$log_output$
|
||||||
|
"timestamp": true
|
||||||
|
},
|
||||||
"dns": {
|
"dns": {
|
||||||
"servers": [
|
"servers": [
|
||||||
{
|
|
||||||
"tag": "google",
|
|
||||||
"address": "tls://8.8.8.8"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"tag": "local",
|
"tag": "local",
|
||||||
"address": "223.5.5.5",
|
"address": "223.5.5.5",
|
||||||
@@ -27,6 +29,7 @@
|
|||||||
"inbounds": [
|
"inbounds": [
|
||||||
{
|
{
|
||||||
"type": "tun",
|
"type": "tun",
|
||||||
|
"tag": "tun-in",
|
||||||
"interface_name": "singbox_tun",
|
"interface_name": "singbox_tun",
|
||||||
"inet4_address": "172.19.0.1/30",
|
"inet4_address": "172.19.0.1/30",
|
||||||
|
|
||||||
@@ -106,6 +109,9 @@
|
|||||||
}
|
}
|
||||||
$ruleDirectIPs$
|
$ruleDirectIPs$
|
||||||
$ruleDirectProcess$
|
$ruleDirectProcess$
|
||||||
|
$ruleProxyIPs$
|
||||||
|
$ruleProxyProcess$
|
||||||
|
$ruleFinally$
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -786,6 +786,10 @@ namespace v2rayN
|
|||||||
var task = taskService.NewTask();
|
var task = taskService.NewTask();
|
||||||
task.RegistrationInfo.Description = taskDescription;
|
task.RegistrationInfo.Description = taskDescription;
|
||||||
task.Settings.DisallowStartIfOnBatteries = false;
|
task.Settings.DisallowStartIfOnBatteries = false;
|
||||||
|
task.Settings.StopIfGoingOnBatteries = false;
|
||||||
|
task.Settings.RunOnlyIfIdle = false;
|
||||||
|
task.Settings.IdleSettings.StopOnIdleEnd = false;
|
||||||
|
task.Settings.ExecutionTimeLimit = TimeSpan.Zero;
|
||||||
task.Triggers.Add(new LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromMinutes(1) });
|
task.Triggers.Add(new LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromMinutes(1) });
|
||||||
task.Principal.RunLevel = TaskRunLevel.Highest;
|
task.Principal.RunLevel = TaskRunLevel.Highest;
|
||||||
task.Actions.Add(new ExecAction(deamonFileName));
|
task.Actions.Add(new ExecAction(deamonFileName));
|
||||||
@@ -1117,7 +1121,14 @@ namespace v2rayN
|
|||||||
Directory.CreateDirectory(_tempPath);
|
Directory.CreateDirectory(_tempPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Path.Combine(_tempPath, filename);
|
if (string.IsNullOrEmpty(filename))
|
||||||
|
{
|
||||||
|
return _tempPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Path.Combine(_tempPath, filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public static string GetLogPath(string filename = "")
|
public static string GetLogPath(string filename = "")
|
||||||
{
|
{
|
||||||
@@ -1135,6 +1146,22 @@ namespace v2rayN
|
|||||||
return Path.Combine(_tempPath, filename);
|
return Path.Combine(_tempPath, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static string GetFontsPath(string filename = "")
|
||||||
|
{
|
||||||
|
string _tempPath = Path.Combine(StartupPath(), "guiFonts");
|
||||||
|
if (!Directory.Exists(_tempPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(_tempPath);
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(filename))
|
||||||
|
{
|
||||||
|
return _tempPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Path.Combine(_tempPath, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,8 @@ namespace v2rayN.ViewModels
|
|||||||
public IObservableCollection<Swatch> Swatches => _swatches;
|
public IObservableCollection<Swatch> Swatches => _swatches;
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public Swatch SelectedSwatch { get; set; }
|
public Swatch SelectedSwatch { get; set; }
|
||||||
|
[Reactive]
|
||||||
|
public int CurrentFontSize { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public string CurrentLanguage { get; set; }
|
public string CurrentLanguage { get; set; }
|
||||||
@@ -212,6 +214,10 @@ namespace v2rayN.ViewModels
|
|||||||
SelectedMoveToGroup = new();
|
SelectedMoveToGroup = new();
|
||||||
SelectedRouting = new();
|
SelectedRouting = new();
|
||||||
SelectedServer = new();
|
SelectedServer = new();
|
||||||
|
if (_config.tunModeItem.enableTun && Utils.IsAdministrator())
|
||||||
|
{
|
||||||
|
EnableTun = true;
|
||||||
|
}
|
||||||
|
|
||||||
//RefreshServers();
|
//RefreshServers();
|
||||||
InitSubscriptionView();
|
InitSubscriptionView();
|
||||||
@@ -500,7 +506,7 @@ namespace v2rayN.ViewModels
|
|||||||
//MainFormHandler.Instance.BackupGuiNConfig(_config, true);
|
//MainFormHandler.Instance.BackupGuiNConfig(_config, true);
|
||||||
_coreHandler = new CoreHandler(UpdateHandler);
|
_coreHandler = new CoreHandler(UpdateHandler);
|
||||||
|
|
||||||
if (_config.enableStatistics)
|
if (_config.guiItem.enableStatistics)
|
||||||
{
|
{
|
||||||
_statistics = new StatisticsHandler(_config, UpdateStatisticsHandler);
|
_statistics = new StatisticsHandler(_config, UpdateStatisticsHandler);
|
||||||
}
|
}
|
||||||
@@ -531,7 +537,12 @@ namespace v2rayN.ViewModels
|
|||||||
_noticeHandler?.SendMessage(msg);
|
_noticeHandler?.SendMessage(msg);
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
|
RefreshServers();
|
||||||
Reload();
|
Reload();
|
||||||
|
if (_config.uiItem.enableAutoAdjustMainLvColWidth)
|
||||||
|
{
|
||||||
|
_updateView("AdjustMainLvColWidth");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void UpdateStatisticsHandler(ServerSpeedItem update)
|
private void UpdateStatisticsHandler(ServerSpeedItem update)
|
||||||
@@ -591,7 +602,8 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
if (Utils.IsNullOrEmpty(indexId))
|
if (Utils.IsNullOrEmpty(indexId))
|
||||||
{
|
{
|
||||||
_noticeHandler?.SendMessage(delay);
|
_noticeHandler?.SendMessage(delay, true);
|
||||||
|
_noticeHandler?.Enqueue(delay);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var item = _profileItems.Where(it => it.indexId == indexId).FirstOrDefault();
|
var item = _profileItems.Where(it => it.indexId == indexId).FirstOrDefault();
|
||||||
@@ -761,7 +773,7 @@ namespace v2rayN.ViewModels
|
|||||||
private void RefreshServersMenu()
|
private void RefreshServersMenu()
|
||||||
{
|
{
|
||||||
_servers.Clear();
|
_servers.Clear();
|
||||||
if (_lstProfile.Count > _config.trayMenuServersLimit)
|
if (_lstProfile.Count > _config.guiItem.trayMenuServersLimit)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -904,12 +916,16 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var exists = lstSelecteds.Exists(t => t.indexId == _config.indexId);
|
||||||
|
|
||||||
ConfigHandler.RemoveServer(_config, lstSelecteds);
|
ConfigHandler.RemoveServer(_config, lstSelecteds);
|
||||||
_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|
||||||
RefreshServers();
|
RefreshServers();
|
||||||
Reload();
|
if (exists)
|
||||||
|
{
|
||||||
|
Reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveDuplicateServer()
|
private void RemoveDuplicateServer()
|
||||||
@@ -1034,7 +1050,7 @@ namespace v2rayN.ViewModels
|
|||||||
}
|
}
|
||||||
(new UpdateHandle()).RunAvailabilityCheck((bool success, string msg) =>
|
(new UpdateHandle()).RunAvailabilityCheck((bool success, string msg) =>
|
||||||
{
|
{
|
||||||
_noticeHandler?.SendMessage(msg);
|
_noticeHandler?.SendMessage(msg, true);
|
||||||
Application.Current.Dispatcher.Invoke((Action)(() =>
|
Application.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
{
|
{
|
||||||
if (!Global.ShowInTaskbar)
|
if (!Global.ShowInTaskbar)
|
||||||
@@ -1210,20 +1226,7 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
private void UpdateSubscriptionProcess(string subId, bool blProxy)
|
private void UpdateSubscriptionProcess(string subId, bool blProxy)
|
||||||
{
|
{
|
||||||
void _updateUI(bool success, string msg)
|
(new UpdateHandle()).UpdateSubscriptionProcess(_config, subId, blProxy, UpdateTaskHandler);
|
||||||
{
|
|
||||||
_noticeHandler?.SendMessage(msg);
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
RefreshServers();
|
|
||||||
if (_config.uiItem.enableAutoAdjustMainLvColWidth)
|
|
||||||
{
|
|
||||||
_updateView("AdjustMainLvColWidth");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
(new UpdateHandle()).UpdateSubscriptionProcess(_config, subId, blProxy, _updateUI);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -1298,7 +1301,7 @@ namespace v2rayN.ViewModels
|
|||||||
MyAppExit(false);
|
MyAppExit(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(new UpdateHandle()).CheckUpdateGuiN(_config, _updateUI, _config.checkPreReleaseUpdate);
|
(new UpdateHandle()).CheckUpdateGuiN(_config, _updateUI, _config.guiItem.checkPreReleaseUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckUpdateCore(ECoreType type)
|
private void CheckUpdateCore(ECoreType type)
|
||||||
@@ -1313,7 +1316,7 @@ namespace v2rayN.ViewModels
|
|||||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(msg));
|
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(msg));
|
||||||
string toPath = Utils.GetBinPath("", type);
|
string toPath = Utils.GetBinPath("", type);
|
||||||
|
|
||||||
FileManager.ZipExtractToFile(fileName, toPath, _config.ignoreGeoUpdateCore ? "geo" : "");
|
FileManager.ZipExtractToFile(fileName, toPath, _config.guiItem.ignoreGeoUpdateCore ? "geo" : "");
|
||||||
|
|
||||||
_noticeHandler?.SendMessage(ResUI.MsgUpdateV2rayCoreSuccessfullyMore);
|
_noticeHandler?.SendMessage(ResUI.MsgUpdateV2rayCoreSuccessfullyMore);
|
||||||
|
|
||||||
@@ -1327,7 +1330,7 @@ namespace v2rayN.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(new UpdateHandle()).CheckUpdateCore(type, _config, _updateUI, _config.checkPreReleaseUpdate);
|
(new UpdateHandle()).CheckUpdateCore(type, _config, _updateUI, _config.guiItem.checkPreReleaseUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckUpdateGeo()
|
private void CheckUpdateGeo()
|
||||||
@@ -1431,7 +1434,7 @@ namespace v2rayN.ViewModels
|
|||||||
private void RefreshRoutingsMenu()
|
private void RefreshRoutingsMenu()
|
||||||
{
|
{
|
||||||
_routingItems.Clear();
|
_routingItems.Clear();
|
||||||
if (!_config.enableRoutingAdvanced)
|
if (!_config.routingBasicItem.enableRoutingAdvanced)
|
||||||
{
|
{
|
||||||
BlRouting = false;
|
BlRouting = false;
|
||||||
return;
|
return;
|
||||||
@@ -1442,7 +1445,7 @@ namespace v2rayN.ViewModels
|
|||||||
foreach (var item in routings)
|
foreach (var item in routings)
|
||||||
{
|
{
|
||||||
_routingItems.Add(item);
|
_routingItems.Add(item);
|
||||||
if (item.id.Equals(_config.routingIndexId))
|
if (item.id.Equals(_config.routingBasicItem.routingIndexId))
|
||||||
{
|
{
|
||||||
SelectedRouting = item;
|
SelectedRouting = item;
|
||||||
}
|
}
|
||||||
@@ -1466,7 +1469,7 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_config.routingIndexId == item.id)
|
if (_config.routingBasicItem.routingIndexId == item.id)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1567,6 +1570,7 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
SelectedSwatch = _swatches.FirstOrDefault(t => t.Name == _config.uiItem.colorPrimaryName);
|
SelectedSwatch = _swatches.FirstOrDefault(t => t.Name == _config.uiItem.colorPrimaryName);
|
||||||
}
|
}
|
||||||
|
CurrentFontSize = _config.uiItem.currentFontSize;
|
||||||
CurrentLanguage = _config.uiItem.currentLanguage;
|
CurrentLanguage = _config.uiItem.currentLanguage;
|
||||||
|
|
||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
@@ -1602,6 +1606,24 @@ namespace v2rayN.ViewModels
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.WhenAnyValue(
|
||||||
|
x => x.CurrentFontSize,
|
||||||
|
y => y > 0)
|
||||||
|
.Subscribe(c =>
|
||||||
|
{
|
||||||
|
if (CurrentFontSize >= Global.MinFontSize)
|
||||||
|
{
|
||||||
|
_config.uiItem.currentFontSize = CurrentFontSize;
|
||||||
|
double size = (long)CurrentFontSize;
|
||||||
|
Application.Current.Resources["StdFontSize"] = size;
|
||||||
|
Application.Current.Resources["StdFontSize1"] = size + 1;
|
||||||
|
Application.Current.Resources["StdFontSize2"] = size + 2;
|
||||||
|
Application.Current.Resources["StdFontSizeMsg"] = size - 1;
|
||||||
|
|
||||||
|
ConfigHandler.SaveConfig(ref _config);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.CurrentLanguage,
|
x => x.CurrentLanguage,
|
||||||
y => y != null && !y.IsNullOrEmpty())
|
y => y != null && !y.IsNullOrEmpty())
|
||||||
@@ -1674,7 +1696,7 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
private void AutoHideStartup()
|
private void AutoHideStartup()
|
||||||
{
|
{
|
||||||
if (_config.autoHideStartup)
|
if (_config.uiItem.autoHideStartup)
|
||||||
{
|
{
|
||||||
Observable.Range(1, 1)
|
Observable.Range(1, 1)
|
||||||
.Delay(TimeSpan.FromSeconds(1))
|
.Delay(TimeSpan.FromSeconds(1))
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive] public bool logEnabled { get; set; }
|
[Reactive] public bool logEnabled { get; set; }
|
||||||
[Reactive] public string loglevel { get; set; }
|
[Reactive] public string loglevel { get; set; }
|
||||||
[Reactive] public bool defAllowInsecure { get; set; }
|
[Reactive] public bool defAllowInsecure { get; set; }
|
||||||
|
[Reactive] public string defFingerprint { get; set; }
|
||||||
|
[Reactive] public string defUserAgent { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Core DNS
|
#region Core DNS
|
||||||
@@ -60,6 +62,10 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive] public int autoUpdateInterval { get; set; }
|
[Reactive] public int autoUpdateInterval { get; set; }
|
||||||
[Reactive] public int autoUpdateSubInterval { get; set; }
|
[Reactive] public int autoUpdateSubInterval { get; set; }
|
||||||
[Reactive] public int trayMenuServersLimit { get; set; }
|
[Reactive] public int trayMenuServersLimit { get; set; }
|
||||||
|
[Reactive] public string currentFontFamily { get; set; }
|
||||||
|
[Reactive] public int SpeedTestTimeout { get; set; }
|
||||||
|
[Reactive] public string SpeedTestUrl { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System proxy
|
#region System proxy
|
||||||
@@ -73,8 +79,12 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive] public string TunStack { get; set; }
|
[Reactive] public string TunStack { get; set; }
|
||||||
[Reactive] public int TunMtu { get; set; }
|
[Reactive] public int TunMtu { get; set; }
|
||||||
[Reactive] public string TunCustomTemplate { get; set; }
|
[Reactive] public string TunCustomTemplate { get; set; }
|
||||||
|
[Reactive] public bool TunBypassMode { get; set; }
|
||||||
|
[Reactive] public bool TunBypassMode2 { get; set; }
|
||||||
[Reactive] public string TunDirectIP { get; set; }
|
[Reactive] public string TunDirectIP { get; set; }
|
||||||
[Reactive] public string TunDirectProcess { get; set; }
|
[Reactive] public string TunDirectProcess { get; set; }
|
||||||
|
[Reactive] public string TunProxyIP { get; set; }
|
||||||
|
[Reactive] public string TunProxyProcess { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CoreType
|
#region CoreType
|
||||||
@@ -106,10 +116,12 @@ namespace v2rayN.ViewModels
|
|||||||
newPort4LAN = inbound.newPort4LAN;
|
newPort4LAN = inbound.newPort4LAN;
|
||||||
user = inbound.user;
|
user = inbound.user;
|
||||||
pass = inbound.pass;
|
pass = inbound.pass;
|
||||||
muxEnabled = _config.muxEnabled;
|
muxEnabled = _config.coreBasicItem.muxEnabled;
|
||||||
logEnabled = _config.logEnabled;
|
logEnabled = _config.coreBasicItem.logEnabled;
|
||||||
loglevel = _config.loglevel;
|
loglevel = _config.coreBasicItem.loglevel;
|
||||||
defAllowInsecure = _config.defAllowInsecure;
|
defAllowInsecure = _config.coreBasicItem.defAllowInsecure;
|
||||||
|
defFingerprint = _config.coreBasicItem.defFingerprint;
|
||||||
|
defUserAgent = _config.coreBasicItem.defUserAgent;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Core DNS
|
#region Core DNS
|
||||||
@@ -128,20 +140,24 @@ namespace v2rayN.ViewModels
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region UI
|
#region UI
|
||||||
AutoRun = _config.autoRun;
|
AutoRun = _config.guiItem.autoRun;
|
||||||
EnableStatistics = _config.enableStatistics;
|
EnableStatistics = _config.guiItem.enableStatistics;
|
||||||
StatisticsFreshRate = _config.statisticsFreshRate;
|
StatisticsFreshRate = _config.guiItem.statisticsFreshRate;
|
||||||
KeepOlderDedupl = _config.keepOlderDedupl;
|
KeepOlderDedupl = _config.guiItem.keepOlderDedupl;
|
||||||
IgnoreGeoUpdateCore = _config.ignoreGeoUpdateCore;
|
IgnoreGeoUpdateCore = _config.guiItem.ignoreGeoUpdateCore;
|
||||||
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
||||||
EnableSecurityProtocolTls13 = _config.enableSecurityProtocolTls13;
|
EnableSecurityProtocolTls13 = _config.guiItem.enableSecurityProtocolTls13;
|
||||||
AutoHideStartup = _config.autoHideStartup;
|
AutoHideStartup = _config.uiItem.autoHideStartup;
|
||||||
EnableCheckPreReleaseUpdate = _config.checkPreReleaseUpdate;
|
EnableCheckPreReleaseUpdate = _config.guiItem.checkPreReleaseUpdate;
|
||||||
EnableDragDropSort = _config.uiItem.enableDragDropSort;
|
EnableDragDropSort = _config.uiItem.enableDragDropSort;
|
||||||
DoubleClick2Activate = _config.uiItem.doubleClick2Activate;
|
DoubleClick2Activate = _config.uiItem.doubleClick2Activate;
|
||||||
autoUpdateInterval = _config.autoUpdateInterval;
|
autoUpdateInterval = _config.guiItem.autoUpdateInterval;
|
||||||
autoUpdateSubInterval = _config.autoUpdateSubInterval;
|
autoUpdateSubInterval = _config.guiItem.autoUpdateSubInterval;
|
||||||
trayMenuServersLimit = _config.trayMenuServersLimit;
|
trayMenuServersLimit = _config.guiItem.trayMenuServersLimit;
|
||||||
|
currentFontFamily = _config.uiItem.currentFontFamily;
|
||||||
|
SpeedTestTimeout = _config.speedTestItem.speedTestTimeout;
|
||||||
|
SpeedTestUrl = _config.speedTestItem.speedTestUrl;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System proxy
|
#region System proxy
|
||||||
@@ -156,8 +172,14 @@ namespace v2rayN.ViewModels
|
|||||||
TunStack = _config.tunModeItem.stack;
|
TunStack = _config.tunModeItem.stack;
|
||||||
TunMtu = _config.tunModeItem.mtu;
|
TunMtu = _config.tunModeItem.mtu;
|
||||||
TunCustomTemplate = _config.tunModeItem.customTemplate;
|
TunCustomTemplate = _config.tunModeItem.customTemplate;
|
||||||
|
TunBypassMode = _config.tunModeItem.bypassMode;
|
||||||
TunDirectIP = Utils.List2String(_config.tunModeItem.directIP, true);
|
TunDirectIP = Utils.List2String(_config.tunModeItem.directIP, true);
|
||||||
TunDirectProcess = Utils.List2String(_config.tunModeItem.directProcess, true);
|
TunDirectProcess = Utils.List2String(_config.tunModeItem.directProcess, true);
|
||||||
|
TunProxyIP = Utils.List2String(_config.tunModeItem.proxyIP, true);
|
||||||
|
TunProxyProcess = Utils.List2String(_config.tunModeItem.proxyProcess, true);
|
||||||
|
this.WhenAnyValue(
|
||||||
|
x => x.TunBypassMode)
|
||||||
|
.Subscribe(c => TunBypassMode2 = !TunBypassMode);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -265,10 +287,12 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
_config.inbound.RemoveAt(1);
|
_config.inbound.RemoveAt(1);
|
||||||
}
|
}
|
||||||
_config.logEnabled = logEnabled;
|
_config.coreBasicItem.logEnabled = logEnabled;
|
||||||
_config.loglevel = loglevel;
|
_config.coreBasicItem.loglevel = loglevel;
|
||||||
_config.muxEnabled = muxEnabled;
|
_config.coreBasicItem.muxEnabled = muxEnabled;
|
||||||
_config.defAllowInsecure = defAllowInsecure;
|
_config.coreBasicItem.defAllowInsecure = defAllowInsecure;
|
||||||
|
_config.coreBasicItem.defFingerprint = defFingerprint;
|
||||||
|
_config.coreBasicItem.defUserAgent = defUserAgent;
|
||||||
|
|
||||||
|
|
||||||
//DNS
|
//DNS
|
||||||
@@ -288,24 +312,27 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
//UI
|
//UI
|
||||||
Utils.SetAutoRun(AutoRun);
|
Utils.SetAutoRun(AutoRun);
|
||||||
_config.autoRun = AutoRun;
|
_config.guiItem.autoRun = AutoRun;
|
||||||
_config.enableStatistics = EnableStatistics;
|
_config.guiItem.enableStatistics = EnableStatistics;
|
||||||
_config.statisticsFreshRate = StatisticsFreshRate;
|
_config.guiItem.statisticsFreshRate = StatisticsFreshRate;
|
||||||
if (_config.statisticsFreshRate > 100 || _config.statisticsFreshRate < 1)
|
if (_config.guiItem.statisticsFreshRate > 100 || _config.guiItem.statisticsFreshRate < 1)
|
||||||
{
|
{
|
||||||
_config.statisticsFreshRate = 1;
|
_config.guiItem.statisticsFreshRate = 1;
|
||||||
}
|
}
|
||||||
_config.keepOlderDedupl = KeepOlderDedupl;
|
_config.guiItem.keepOlderDedupl = KeepOlderDedupl;
|
||||||
_config.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
_config.guiItem.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
||||||
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
||||||
_config.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
_config.guiItem.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
||||||
_config.autoHideStartup = AutoHideStartup;
|
_config.uiItem.autoHideStartup = AutoHideStartup;
|
||||||
_config.autoUpdateInterval = autoUpdateInterval;
|
_config.guiItem.autoUpdateInterval = autoUpdateInterval;
|
||||||
_config.autoUpdateSubInterval = autoUpdateSubInterval;
|
_config.guiItem.autoUpdateSubInterval = autoUpdateSubInterval;
|
||||||
_config.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
_config.guiItem.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
||||||
_config.uiItem.enableDragDropSort = EnableDragDropSort;
|
_config.uiItem.enableDragDropSort = EnableDragDropSort;
|
||||||
_config.uiItem.doubleClick2Activate = DoubleClick2Activate;
|
_config.uiItem.doubleClick2Activate = DoubleClick2Activate;
|
||||||
_config.trayMenuServersLimit = trayMenuServersLimit;
|
_config.guiItem.trayMenuServersLimit = trayMenuServersLimit;
|
||||||
|
_config.uiItem.currentFontFamily = currentFontFamily;
|
||||||
|
_config.speedTestItem.speedTestTimeout = SpeedTestTimeout;
|
||||||
|
_config.speedTestItem.speedTestUrl = SpeedTestUrl;
|
||||||
|
|
||||||
//systemProxy
|
//systemProxy
|
||||||
_config.systemProxyExceptions = systemProxyExceptions;
|
_config.systemProxyExceptions = systemProxyExceptions;
|
||||||
@@ -317,8 +344,11 @@ namespace v2rayN.ViewModels
|
|||||||
_config.tunModeItem.stack = TunStack;
|
_config.tunModeItem.stack = TunStack;
|
||||||
_config.tunModeItem.mtu = TunMtu;
|
_config.tunModeItem.mtu = TunMtu;
|
||||||
_config.tunModeItem.customTemplate = TunCustomTemplate;
|
_config.tunModeItem.customTemplate = TunCustomTemplate;
|
||||||
|
_config.tunModeItem.bypassMode = TunBypassMode;
|
||||||
_config.tunModeItem.directIP = Utils.String2List(TunDirectIP);
|
_config.tunModeItem.directIP = Utils.String2List(TunDirectIP);
|
||||||
_config.tunModeItem.directProcess = Utils.String2List(TunDirectProcess);
|
_config.tunModeItem.directProcess = Utils.String2List(TunDirectProcess);
|
||||||
|
_config.tunModeItem.proxyIP = Utils.String2List(TunProxyIP);
|
||||||
|
_config.tunModeItem.proxyProcess = Utils.String2List(TunProxyProcess);
|
||||||
|
|
||||||
//coreType
|
//coreType
|
||||||
SaveCoreType();
|
SaveCoreType();
|
||||||
|
|||||||
@@ -71,9 +71,9 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
ConfigHandler.InitBuiltinRouting(ref _config);
|
ConfigHandler.InitBuiltinRouting(ref _config);
|
||||||
|
|
||||||
enableRoutingAdvanced = _config.enableRoutingAdvanced;
|
enableRoutingAdvanced = _config.routingBasicItem.enableRoutingAdvanced;
|
||||||
domainStrategy = _config.domainStrategy;
|
domainStrategy = _config.routingBasicItem.domainStrategy;
|
||||||
domainMatcher = _config.domainMatcher;
|
domainMatcher = _config.routingBasicItem.domainMatcher;
|
||||||
|
|
||||||
RefreshRoutingItems();
|
RefreshRoutingItems();
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ namespace v2rayN.ViewModels
|
|||||||
foreach (var item in routings)
|
foreach (var item in routings)
|
||||||
{
|
{
|
||||||
bool def = false;
|
bool def = false;
|
||||||
if (item.id.Equals(_config.routingIndexId))
|
if (item.id.Equals(_config.routingBasicItem.routingIndexId))
|
||||||
{
|
{
|
||||||
def = true;
|
def = true;
|
||||||
}
|
}
|
||||||
@@ -176,15 +176,16 @@ namespace v2rayN.ViewModels
|
|||||||
remarks = item.remarks,
|
remarks = item.remarks,
|
||||||
url = item.url,
|
url = item.url,
|
||||||
customIcon = item.customIcon,
|
customIcon = item.customIcon,
|
||||||
|
sort = item.sort,
|
||||||
};
|
};
|
||||||
_routingItems.Add(it);
|
_routingItems.Add(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void SaveRouting()
|
private void SaveRouting()
|
||||||
{
|
{
|
||||||
_config.domainStrategy = domainStrategy;
|
_config.routingBasicItem.domainStrategy = domainStrategy;
|
||||||
_config.enableRoutingAdvanced = enableRoutingAdvanced;
|
_config.routingBasicItem.enableRoutingAdvanced = enableRoutingAdvanced;
|
||||||
_config.domainMatcher = domainMatcher;
|
_config.routingBasicItem.domainMatcher = domainMatcher;
|
||||||
|
|
||||||
EndBindingLockedData();
|
EndBindingLockedData();
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
@@ -125,6 +125,7 @@
|
|||||||
Width="200"
|
Width="200"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
MaxDropDownHeight="1000"
|
MaxDropDownHeight="1000"
|
||||||
Style="{StaticResource MaterialDesignOutlinedComboBox}" />
|
Style="{StaticResource MaterialDesignOutlinedComboBox}" />
|
||||||
|
|
||||||
@@ -157,7 +158,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
|
|||||||
@@ -83,7 +83,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -97,7 +98,8 @@
|
|||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
@@ -112,7 +114,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="100"
|
Width="100"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<Separator
|
<Separator
|
||||||
@@ -148,7 +151,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
<Button
|
<Button
|
||||||
x:Name="btnGUID"
|
x:Name="btnGUID"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
@@ -171,7 +175,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="100"
|
Width="100"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
@@ -216,7 +221,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -261,7 +267,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -275,7 +282,8 @@
|
|||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid
|
<Grid
|
||||||
@@ -306,7 +314,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
<Button
|
<Button
|
||||||
x:Name="btnGUID5"
|
x:Name="btnGUID5"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
@@ -344,7 +353,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid
|
<Grid
|
||||||
x:Name="gridTrojan"
|
x:Name="gridTrojan"
|
||||||
@@ -373,7 +383,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -478,7 +489,8 @@
|
|||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
x:Name="tipRequestHost"
|
x:Name="tipRequestHost"
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
@@ -500,7 +512,8 @@
|
|||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}" />
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
x:Name="tipPath"
|
x:Name="tipPath"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
@@ -572,7 +585,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -602,6 +616,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
IsEditable="True"
|
||||||
Style="{StaticResource DefComboBox}" />
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|||||||
@@ -261,37 +261,74 @@
|
|||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
|
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
|
||||||
<StackPanel Margin="8">
|
<StackPanel Margin="8">
|
||||||
<StackPanel Orientation="Horizontal">
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsColorMode}" />
|
Text="{x:Static resx:ResUI.TbSettingsColorMode}" />
|
||||||
<ToggleButton x:Name="togDarkMode" Margin="8" />
|
<ToggleButton
|
||||||
</StackPanel>
|
x:Name="togDarkMode"
|
||||||
<StackPanel Orientation="Horizontal">
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="8" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsColor}" />
|
Text="{x:Static resx:ResUI.TbSettingsColor}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbSwatches"
|
x:Name="cmbSwatches"
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
Width="100"
|
Width="100"
|
||||||
Margin="8"
|
Margin="8"
|
||||||
DisplayMemberPath="Name"
|
DisplayMemberPath="Name"
|
||||||
Style="{StaticResource DefComboBox}" />
|
Style="{StaticResource DefComboBox}" />
|
||||||
</StackPanel>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsFontSize}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCurrentFontSize"
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="100"
|
||||||
|
Margin="8"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLanguage}" />
|
Text="{x:Static resx:ResUI.TbSettingsLanguage}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbCurrentLanguage"
|
x:Name="cmbCurrentLanguage"
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="1"
|
||||||
Width="100"
|
Width="100"
|
||||||
Margin="8"
|
Margin="8"
|
||||||
materialDesign:HintAssist.Hint="Language"
|
materialDesign:HintAssist.Hint="Language"
|
||||||
Style="{StaticResource DefComboBox}" />
|
Style="{StaticResource DefComboBox}" />
|
||||||
</StackPanel>
|
|
||||||
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</materialDesign:PopupBox>
|
</materialDesign:PopupBox>
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
@@ -302,7 +339,11 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
ClipToBounds="True"
|
ClipToBounds="True"
|
||||||
Style="{StaticResource MaterialDesignToolBar}">
|
Style="{StaticResource MaterialDesignToolBar}">
|
||||||
<ListBox x:Name="lstGroup" Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
|
<ListBox
|
||||||
|
x:Name="lstGroup"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
|
ItemContainerStyle="{StaticResource MyChipListBoxItem}"
|
||||||
|
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
|
||||||
<ListBox.ItemTemplate>
|
<ListBox.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<TextBlock Text="{Binding remarks}" />
|
<TextBlock Text="{Binding remarks}" />
|
||||||
@@ -313,17 +354,18 @@
|
|||||||
x:Name="btnAddSub"
|
x:Name="btnAddSub"
|
||||||
Width="30"
|
Width="30"
|
||||||
Height="30"
|
Height="30"
|
||||||
Margin="8,0"
|
Margin="4,0"
|
||||||
Style="{StaticResource MaterialDesignFloatingActionMiniLightButton}">
|
Style="{StaticResource MaterialDesignFloatingActionMiniLightButton}">
|
||||||
<materialDesign:PackIcon Kind="Plus" />
|
<materialDesign:PackIcon Kind="Plus" />
|
||||||
</Button>
|
</Button>
|
||||||
<Separator />
|
<Separator />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtServerFilter"
|
x:Name="txtServerFilter"
|
||||||
Width="200"
|
Width="100"
|
||||||
Margin="8,0"
|
Margin="4,0"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}"
|
||||||
materialDesign:TextFieldAssist.HasClearButton="True" />
|
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
</ToolBarTray>
|
</ToolBarTray>
|
||||||
|
|
||||||
@@ -374,6 +416,7 @@
|
|||||||
Width="120"
|
Width="120"
|
||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSystemproxy}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSystemproxy}"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFloatingHintComboBox}">
|
Style="{StaticResource MaterialDesignFloatingHintComboBox}">
|
||||||
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxyClear}" />
|
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxyClear}" />
|
||||||
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxySet}" />
|
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxySet}" />
|
||||||
@@ -387,6 +430,7 @@
|
|||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
||||||
DisplayMemberPath="remarks"
|
DisplayMemberPath="remarks"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFloatingHintComboBox}" />
|
Style="{StaticResource MaterialDesignFloatingHintComboBox}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
@@ -495,6 +539,7 @@
|
|||||||
Width="200"
|
Width="200"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSubscription}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSubscription}"
|
||||||
DisplayMemberPath="remarks"
|
DisplayMemberPath="remarks"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</MenuItem.Header>
|
</MenuItem.Header>
|
||||||
@@ -703,6 +748,7 @@
|
|||||||
MaxWidth="300"
|
MaxWidth="300"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
||||||
DisplayMemberPath="remarks"
|
DisplayMemberPath="remarks"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</MenuItem.Header>
|
</MenuItem.Header>
|
||||||
@@ -715,6 +761,7 @@
|
|||||||
MaxWidth="300"
|
MaxWidth="300"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuServers}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuServers}"
|
||||||
DisplayMemberPath="Text"
|
DisplayMemberPath="Text"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</MenuItem.Header>
|
</MenuItem.Header>
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ namespace v2rayN.Views
|
|||||||
ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler);
|
ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler);
|
||||||
Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel));
|
Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel));
|
||||||
|
|
||||||
|
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 8; i++)
|
||||||
|
{
|
||||||
|
cmbCurrentFontSize.Items.Add(i.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
Global.Languages.ForEach(it =>
|
Global.Languages.ForEach(it =>
|
||||||
{
|
{
|
||||||
cmbCurrentLanguage.Items.Add(it);
|
cmbCurrentLanguage.Items.Add(it);
|
||||||
@@ -173,6 +178,7 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.ColorModeDark, v => v.togDarkMode.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.ColorModeDark, v => v.togDarkMode.IsChecked).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.Swatches, v => v.cmbSwatches.ItemsSource).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.Swatches, v => v.cmbSwatches.ItemsSource).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -254,11 +260,19 @@ namespace v2rayN.Views
|
|||||||
private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e)
|
private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var colHeader = sender as DataGridColumnHeader;
|
var colHeader = sender as DataGridColumnHeader;
|
||||||
if (colHeader == null || colHeader.TabIndex < 0)
|
if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (colHeader.TabIndex == 0)
|
|
||||||
|
//find index
|
||||||
|
var index = lstProfiles.Columns.IndexOf(colHeader.Column);
|
||||||
|
if (index < 0)
|
||||||
|
{
|
||||||
|
index = colHeader.TabIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == 0)
|
||||||
{
|
{
|
||||||
foreach (var it in lstProfiles.Columns)
|
foreach (var it in lstProfiles.Columns)
|
||||||
{
|
{
|
||||||
@@ -268,7 +282,7 @@ namespace v2rayN.Views
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewModel?.SortServer(colHeader.TabIndex);
|
ViewModel?.SortServer(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuSelectAll_Click(object sender, RoutedEventArgs e)
|
private void menuSelectAll_Click(object sender, RoutedEventArgs e)
|
||||||
@@ -420,7 +434,7 @@ namespace v2rayN.Views
|
|||||||
var width = ConfigHandler.GetformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].Width.Value));
|
var width = ConfigHandler.GetformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].Width.Value));
|
||||||
lstProfiles.Columns[k].Width = width;
|
lstProfiles.Columns[k].Width = width;
|
||||||
}
|
}
|
||||||
if (!_config.enableStatistics)
|
if (!_config.guiItem.enableStatistics)
|
||||||
{
|
{
|
||||||
colTodayUp.Visibility = Visibility.Hidden;
|
colTodayUp.Visibility = Visibility.Hidden;
|
||||||
colTodayDown.Visibility = Visibility.Hidden;
|
colTodayDown.Visibility = Visibility.Hidden;
|
||||||
|
|||||||
@@ -20,16 +20,21 @@
|
|||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Foreground="{DynamicResource PrimaryHueLightBrush}"
|
Foreground="{DynamicResource PrimaryHueLightBrush}"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.MsgInformationTitle}" />
|
Text="{x:Static resx:ResUI.MsgInformationTitle}" />
|
||||||
<TextBox
|
<ComboBox
|
||||||
x:Name="txtMsgFilter"
|
x:Name="cmbMsgFilter"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgFilterTitle}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgFilterTitle}"
|
||||||
materialDesign:TextFieldAssist.HasClearButton="True" />
|
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||||
|
IsEditable="True"
|
||||||
|
Style="{StaticResource DefComboBox}"
|
||||||
|
TextBoxBase.TextChanged="cmbMsgFilter_TextChanged" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbAutoRefresh}" />
|
Text="{x:Static resx:ResUI.TbAutoRefresh}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togAutoRefresh"
|
x:Name="togAutoRefresh"
|
||||||
@@ -40,9 +45,10 @@
|
|||||||
<TextBox
|
<TextBox
|
||||||
Name="txtMsg"
|
Name="txtMsg"
|
||||||
BorderThickness="0"
|
BorderThickness="0"
|
||||||
FontSize="11"
|
FontSize="{DynamicResource StdFontSizeMsg}"
|
||||||
HorizontalScrollBarVisibility="Auto"
|
HorizontalScrollBarVisibility="Auto"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
|
TextAlignment="Left"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Visible">
|
VerticalScrollBarVisibility="Visible">
|
||||||
<TextBox.ContextMenu>
|
<TextBox.ContextMenu>
|
||||||
|
|||||||
@@ -3,15 +3,27 @@ using System.Reactive.Linq;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using v2rayN.Base;
|
using v2rayN.Base;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
|
||||||
namespace v2rayN.Views
|
namespace v2rayN.Views
|
||||||
{
|
{
|
||||||
public partial class MsgView
|
public partial class MsgView
|
||||||
{
|
{
|
||||||
|
private static Config _config;
|
||||||
public MsgView()
|
public MsgView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
MessageBus.Current.Listen<string>("MsgView").Subscribe(x => DelegateAppendText(x));
|
MessageBus.Current.Listen<string>("MsgView").Subscribe(x => DelegateAppendText(x));
|
||||||
|
Global.PresetMsgFilters.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbMsgFilter.Items.Add(it);
|
||||||
|
});
|
||||||
|
if (!_config.uiItem.mainMsgFilter.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
cmbMsgFilter.Text = _config.uiItem.mainMsgFilter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DelegateAppendText(string msg)
|
void DelegateAppendText(string msg)
|
||||||
@@ -30,7 +42,7 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var MsgFilter = txtMsgFilter.Text.TrimEx();
|
var MsgFilter = cmbMsgFilter.Text.TrimEx();
|
||||||
if (!Utils.IsNullOrEmpty(MsgFilter))
|
if (!Utils.IsNullOrEmpty(MsgFilter))
|
||||||
{
|
{
|
||||||
if (!Regex.IsMatch(msg, MsgFilter))
|
if (!Regex.IsMatch(msg, MsgFilter))
|
||||||
@@ -83,6 +95,10 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
ClearMsg();
|
ClearMsg();
|
||||||
}
|
}
|
||||||
|
private void cmbMsgFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
|
||||||
|
{
|
||||||
|
_config.uiItem.mainMsgFilter = cmbMsgFilter.Text.TrimEx();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,194 +48,250 @@
|
|||||||
|
|
||||||
<TabControl>
|
<TabControl>
|
||||||
<TabItem Header="{x:Static resx:ResUI.TbSettingsCore}">
|
<TabItem Header="{x:Static resx:ResUI.TbSettingsCore}">
|
||||||
<Grid Margin="{StaticResource SettingItemMargin}">
|
<ScrollViewer VerticalScrollBarVisibility="Visible">
|
||||||
<Grid.RowDefinitions>
|
<Grid Margin="{StaticResource SettingItemMargin}">
|
||||||
<RowDefinition Height="Auto" />
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
<RowDefinition Height="Auto" />
|
||||||
<Grid.ColumnDefinitions>
|
<RowDefinition Height="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsSocksPort}" />
|
Text="{x:Static resx:ResUI.TbSettingsSocksPort}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtlocalPort"
|
x:Name="txtlocalPort"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsSocksPortTip}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsUdpEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsUdpEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togudpEnabled"
|
x:Name="togudpEnabled"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsSniffingEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsSniffingEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togsniffingEnabled"
|
x:Name="togsniffingEnabled"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsRouteOnly}" />
|
Text="{x:Static resx:ResUI.TbSettingsRouteOnly}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togrouteOnly"
|
x:Name="togrouteOnly"
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsAllowLAN}" />
|
Text="{x:Static resx:ResUI.TbSettingsAllowLAN}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togAllowLANConn"
|
x:Name="togAllowLANConn"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsNewPort4LAN}" />
|
Text="{x:Static resx:ResUI.TbSettingsNewPort4LAN}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togNewPort4LAN"
|
x:Name="togNewPort4LAN"
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsUser}" />
|
Text="{x:Static resx:ResUI.TbSettingsUser}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtuser"
|
x:Name="txtuser"
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsPass}" />
|
Text="{x:Static resx:ResUI.TbSettingsPass}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtpass"
|
x:Name="txtpass"
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsMuxEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsMuxEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togmuxEnabled"
|
x:Name="togmuxEnabled"
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="9"
|
Grid.Row="9"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLogEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsLogEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="toglogEnabled"
|
x:Name="toglogEnabled"
|
||||||
Grid.Row="9"
|
Grid.Row="9"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="10"
|
Grid.Row="10"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLogLevel}" />
|
Text="{x:Static resx:ResUI.TbSettingsLogLevel}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbloglevel"
|
x:Name="cmbloglevel"
|
||||||
Grid.Row="10"
|
Grid.Row="10"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Width="200"
|
||||||
materialDesign:HintAssist.Hint="Level" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
materialDesign:HintAssist.Hint="Level"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="11"
|
Grid.Row="11"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsDefAllowInsecure}" />
|
Text="{x:Static resx:ResUI.TbSettingsDefAllowInsecure}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togdefAllowInsecure"
|
x:Name="togdefAllowInsecure"
|
||||||
Grid.Row="11"
|
Grid.Row="11"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
</Grid>
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="12"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefFingerprint}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbdefFingerprint"
|
||||||
|
Grid.Row="12"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
IsEditable="True"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefUserAgent}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbdefUserAgent"
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
IsEditable="True"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="3"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefUserAgentTips}" />
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreDns}">
|
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreDns}">
|
||||||
@@ -249,7 +305,8 @@
|
|||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbdomainStrategy4Freedom"
|
x:Name="cmbdomainStrategy4Freedom"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
|
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
|
||||||
@@ -273,6 +330,7 @@
|
|||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
@@ -306,7 +364,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="mtu" />
|
Text="mtu" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcpmtu"
|
x:Name="txtKcpmtu"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -320,7 +378,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="tti" />
|
Text="tti" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcptti"
|
x:Name="txtKcptti"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -334,7 +392,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="uplinkCapacity" />
|
Text="uplinkCapacity" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcpuplinkCapacity"
|
x:Name="txtKcpuplinkCapacity"
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -348,7 +406,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="downlinkCapacity" />
|
Text="downlinkCapacity" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcpdownlinkCapacity"
|
x:Name="txtKcpdownlinkCapacity"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -362,7 +420,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="readBufferSize" />
|
Text="readBufferSize" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcpreadBufferSize"
|
x:Name="txtKcpreadBufferSize"
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -376,7 +434,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="writeBufferSize" />
|
Text="writeBufferSize" />
|
||||||
<TextBox
|
<TextBox Style="{StaticResource DefTextBox}"
|
||||||
x:Name="txtKcpwriteBufferSize"
|
x:Name="txtKcpwriteBufferSize"
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -420,10 +478,13 @@
|
|||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -439,6 +500,13 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsStartBootTip}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -466,7 +534,8 @@
|
|||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
@@ -592,7 +661,9 @@
|
|||||||
Grid.Row="12"
|
Grid.Row="12"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="13"
|
Grid.Row="13"
|
||||||
@@ -606,7 +677,9 @@
|
|||||||
Grid.Row="13"
|
Grid.Row="13"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="14"
|
Grid.Row="14"
|
||||||
@@ -620,7 +693,62 @@
|
|||||||
Grid.Row="14"
|
Grid.Row="14"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamily}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbcurrentFontFamily"
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
MaxDropDownHeight="1000"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamilyTip}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="16"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsSpeedTestTimeout}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbSpeedTestTimeout"
|
||||||
|
Grid.Row="16"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="17"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsSpeedTestUrl}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbSpeedTestUrl"
|
||||||
|
Grid.Row="17"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="300"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
@@ -637,8 +765,10 @@
|
|||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbsystemProxyAdvancedProtocol"
|
x:Name="cmbsystemProxyAdvancedProtocol"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
|
MinWidth="200"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
materialDesign:HintAssist.Hint="Protocol" />
|
materialDesign:HintAssist.Hint="Protocol"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
@@ -655,6 +785,7 @@
|
|||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
@@ -675,6 +806,7 @@
|
|||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
@@ -723,7 +855,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
@@ -738,7 +871,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
@@ -751,10 +885,11 @@
|
|||||||
x:Name="txtCustomTemplate"
|
x:Name="txtCustomTemplate"
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="600"
|
Width="400"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
<Button
|
<Button
|
||||||
x:Name="btnBrowse"
|
x:Name="btnBrowse"
|
||||||
@@ -765,9 +900,35 @@
|
|||||||
Click="btnBrowse_Click"
|
Click="btnBrowse_Click"
|
||||||
Content="{x:Static resx:ResUI.TbBrowse}"
|
Content="{x:Static resx:ResUI.TbBrowse}"
|
||||||
Style="{StaticResource DefButton}" />
|
Style="{StaticResource DefButton}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsTunModeBypassMode}" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togBypassMode"
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsTunModeBypassModeTip}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<Grid Margin="{StaticResource SettingItemMargin}">
|
|
||||||
|
<Grid
|
||||||
|
x:Name="gridTunModeDirect"
|
||||||
|
Width="600"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="1*" />
|
<ColumnDefinition Width="1*" />
|
||||||
<ColumnDefinition Width="10" />
|
<ColumnDefinition Width="10" />
|
||||||
@@ -776,10 +937,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectIP}"
|
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectIP}"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtDirectIP"
|
Name="txtDirectIP"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -787,14 +949,51 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectProcess}"
|
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectProcess}"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtDirectProcess"
|
Name="txtDirectProcess"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
x:Name="gridTunModeProxy"
|
||||||
|
Width="600"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="1*" />
|
||||||
|
<ColumnDefinition Width="10" />
|
||||||
|
<ColumnDefinition Width="1*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<GroupBox
|
||||||
|
Grid.Column="0"
|
||||||
|
Header="{x:Static resx:ResUI.TbSettingsTunModeProxyIP}"
|
||||||
|
Style="{StaticResource MyGroupBox}">
|
||||||
|
<TextBox
|
||||||
|
Name="txtProxyIP"
|
||||||
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
VerticalScrollBarVisibility="Auto" />
|
||||||
|
</GroupBox>
|
||||||
|
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
|
||||||
|
<GroupBox
|
||||||
|
Grid.Column="2"
|
||||||
|
Header="{x:Static resx:ResUI.TbSettingsTunModeProxyProcess}"
|
||||||
|
Style="{StaticResource MyGroupBox}">
|
||||||
|
<TextBox
|
||||||
|
Name="txtProxyProcess"
|
||||||
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
VerticalScrollBarVisibility="Auto" />
|
||||||
|
</GroupBox>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
@@ -825,7 +1024,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -839,7 +1039,8 @@
|
|||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
@@ -853,7 +1054,8 @@
|
|||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
@@ -867,7 +1069,8 @@
|
|||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
@@ -881,7 +1084,8 @@
|
|||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
@@ -895,7 +1099,8 @@
|
|||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
|
|||||||
@@ -1,15 +1,23 @@
|
|||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
using v2rayN.Mode;
|
||||||
using v2rayN.ViewModels;
|
using v2rayN.ViewModels;
|
||||||
|
|
||||||
namespace v2rayN.Views
|
namespace v2rayN.Views
|
||||||
{
|
{
|
||||||
public partial class OptionSettingWindow
|
public partial class OptionSettingWindow
|
||||||
{
|
{
|
||||||
|
private static Config _config;
|
||||||
|
|
||||||
public OptionSettingWindow()
|
public OptionSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
ViewModel = new OptionSettingViewModel(this);
|
ViewModel = new OptionSettingViewModel(this);
|
||||||
|
|
||||||
@@ -21,6 +29,14 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
cmbloglevel.Items.Add(it);
|
cmbloglevel.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
Global.fingerprints.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbdefFingerprint.Items.Add(it);
|
||||||
|
});
|
||||||
|
Global.userAgent.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbdefUserAgent.Items.Add(it);
|
||||||
|
});
|
||||||
Global.domainStrategy4Freedoms.ForEach(it =>
|
Global.domainStrategy4Freedoms.ForEach(it =>
|
||||||
{
|
{
|
||||||
cmbdomainStrategy4Freedom.Items.Add(it);
|
cmbdomainStrategy4Freedom.Items.Add(it);
|
||||||
@@ -47,6 +63,57 @@ namespace v2rayN.Views
|
|||||||
cmbCoreType6.Items.Add(it);
|
cmbCoreType6.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
for (int i = 2; i <= 6; i++)
|
||||||
|
{
|
||||||
|
cmbSpeedTestTimeout.Items.Add(i * 5);
|
||||||
|
}
|
||||||
|
Global.SpeedTestUrls.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbSpeedTestUrl.Items.Add(it);
|
||||||
|
});
|
||||||
|
|
||||||
|
//fill fonts
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var dir = new DirectoryInfo(Utils.GetFontsPath());
|
||||||
|
var files = dir.GetFiles("*.ttf");
|
||||||
|
var culture = _config.uiItem.currentLanguage.Equals(Global.Languages[0]) ? "zh-cn" : "en-us";
|
||||||
|
var culture2 = "en-us";
|
||||||
|
foreach (var it in files)
|
||||||
|
{
|
||||||
|
var families = Fonts.GetFontFamilies(Utils.GetFontsPath(it.Name));
|
||||||
|
foreach (FontFamily family in families)
|
||||||
|
{
|
||||||
|
var typefaces = family.GetTypefaces();
|
||||||
|
foreach (Typeface typeface in typefaces)
|
||||||
|
{
|
||||||
|
typeface.TryGetGlyphTypeface(out GlyphTypeface glyph);
|
||||||
|
//var fontFace = glyph.Win32FaceNames[new CultureInfo("en-us")];
|
||||||
|
//if (!fontFace.Equals("Regular") && !fontFace.Equals("Normal"))
|
||||||
|
//{
|
||||||
|
// continue;
|
||||||
|
//}
|
||||||
|
var fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture)];
|
||||||
|
if (Utils.IsNullOrEmpty(fontFamily))
|
||||||
|
{
|
||||||
|
fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture2)];
|
||||||
|
if (Utils.IsNullOrEmpty(fontFamily))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmbcurrentFontFamily.Items.Add(fontFamily);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("fill fonts error", ex);
|
||||||
|
}
|
||||||
|
cmbcurrentFontFamily.Items.Add(string.Empty);
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
this.Bind(ViewModel, vm => vm.localPort, v => v.txtlocalPort.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.localPort, v => v.txtlocalPort.Text).DisposeWith(disposables);
|
||||||
@@ -63,6 +130,8 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.logEnabled, v => v.toglogEnabled.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.logEnabled, v => v.toglogEnabled.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.loglevel, v => v.cmbloglevel.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.loglevel, v => v.cmbloglevel.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.defAllowInsecure, v => v.togdefAllowInsecure.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.defAllowInsecure, v => v.togdefAllowInsecure.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.defFingerprint, v => v.cmbdefFingerprint.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.defUserAgent, v => v.cmbdefUserAgent.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.domainStrategy4Freedom, v => v.cmbdomainStrategy4Freedom.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.domainStrategy4Freedom, v => v.cmbdomainStrategy4Freedom.Text).DisposeWith(disposables);
|
||||||
@@ -92,6 +161,9 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.autoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.autoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.autoUpdateSubInterval, v => v.txtautoUpdateSubInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.autoUpdateSubInterval, v => v.txtautoUpdateSubInterval.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.trayMenuServersLimit, v => v.txttrayMenuServersLimit.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.trayMenuServersLimit, v => v.txttrayMenuServersLimit.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.currentFontFamily, v => v.cmbcurrentFontFamily.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SpeedTestTimeout, v => v.cmbSpeedTestTimeout.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SpeedTestUrl, v => v.cmbSpeedTestUrl.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);
|
||||||
@@ -103,8 +175,13 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.TunStack, v => v.cmbStack.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.TunStack, v => v.cmbStack.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.TunMtu, v => v.cmbMtu.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.TunMtu, v => v.cmbMtu.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.TunCustomTemplate, v => v.txtCustomTemplate.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.TunCustomTemplate, v => v.txtCustomTemplate.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.TunBypassMode, v => v.togBypassMode.IsChecked).DisposeWith(disposables);
|
||||||
|
this.OneWayBind(ViewModel, vm => vm.TunBypassMode, v => v.gridTunModeDirect.Visibility, vmToViewConverterOverride: new BooleanToVisibilityTypeConverter()).DisposeWith(disposables);
|
||||||
|
this.OneWayBind(ViewModel, vm => vm.TunBypassMode2, v => v.gridTunModeProxy.Visibility, vmToViewConverterOverride: new BooleanToVisibilityTypeConverter()).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.TunDirectIP, v => v.txtDirectIP.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.TunDirectIP, v => v.txtDirectIP.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.TunDirectProcess, v => v.txtDirectProcess.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.TunDirectProcess, v => v.txtDirectProcess.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.TunProxyIP, v => v.txtProxyIP.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.TunProxyProcess, v => v.txtProxyProcess.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.CoreType1, v => v.cmbCoreType1.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CoreType1, v => v.cmbCoreType1.Text).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -65,7 +65,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -80,6 +81,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -94,6 +96,7 @@
|
|||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -143,7 +146,7 @@
|
|||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
VerticalAlignment="Center">
|
VerticalAlignment="Center">
|
||||||
<CheckBox x:Name="chkAutoSort">
|
<CheckBox x:Name="chkAutoSort">
|
||||||
<TextBlock Text="{x:Static resx:ResUI.TbAutoSort}" />
|
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.TbAutoSort}" />
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Button
|
<Button
|
||||||
@@ -172,10 +175,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Header="Domain"
|
Header="Domain"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtDomain"
|
Name="txtDomain"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -183,10 +187,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Header="IP"
|
Header="IP"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtIP"
|
Name="txtIP"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
@@ -114,6 +115,7 @@
|
|||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -146,6 +148,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -163,6 +166,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
<Button
|
<Button
|
||||||
x:Name="btnBrowse"
|
x:Name="btnBrowse"
|
||||||
@@ -174,6 +178,23 @@
|
|||||||
Content="{x:Static resx:ResUI.TbBrowse}"
|
Content="{x:Static resx:ResUI.TbBrowse}"
|
||||||
Style="{StaticResource DefButton}" />
|
Style="{StaticResource DefButton}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="4"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="4"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.LvSort}" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="txtSort"
|
||||||
|
Grid.Row="4"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="4"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TabControl x:Name="tabAdvanced">
|
<TabControl x:Name="tabAdvanced">
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.SelectedRouting.domainStrategy, v => v.cmbdomainStrategy.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedRouting.domainStrategy, v => v.cmbdomainStrategy.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SelectedRouting.url, v => v.txtUrl.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedRouting.url, v => v.txtUrl.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SelectedRouting.customIcon, v => v.txtCustomIcon.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedRouting.customIcon, v => v.txtCustomIcon.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SelectedRouting.sort, v => v.txtSort.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
this.BindCommand(ViewModel, vm => vm.RuleAddCmd, v => v.menuRuleAdd).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RuleAddCmd, v => v.menuRuleAdd).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.ImportRulesFromFileCmd, v => v.menuImportRulesFromFile).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ImportRulesFromFileCmd, v => v.menuImportRulesFromFile).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -197,15 +197,19 @@
|
|||||||
Binding="{Binding remarks}"
|
Binding="{Binding remarks}"
|
||||||
Header="{x:Static resx:ResUI.LvAlias}" />
|
Header="{x:Static resx:ResUI.LvAlias}" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="70"
|
Width="60"
|
||||||
Binding="{Binding ruleNum}"
|
Binding="{Binding ruleNum}"
|
||||||
Header="{x:Static resx:ResUI.LvCount}" />
|
Header="{x:Static resx:ResUI.LvCount}" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="280"
|
Width="60"
|
||||||
|
Binding="{Binding sort}"
|
||||||
|
Header="{x:Static resx:ResUI.LvSort}" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Width="260"
|
||||||
Binding="{Binding url}"
|
Binding="{Binding url}"
|
||||||
Header="{x:Static resx:ResUI.LvUrl}" />
|
Header="{x:Static resx:ResUI.LvUrl}" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="280"
|
Width="260"
|
||||||
Binding="{Binding customIcon}"
|
Binding="{Binding customIcon}"
|
||||||
Header="{x:Static resx:ResUI.LvCustomIcon}" />
|
Header="{x:Static resx:ResUI.LvCustomIcon}" />
|
||||||
</DataGrid.Columns>
|
</DataGrid.Columns>
|
||||||
@@ -224,10 +228,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Header="Domain"
|
Header="Domain"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtProxyDomain"
|
Name="txtProxyDomain"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -235,10 +240,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Header="IP"
|
Header="IP"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtProxyIP"
|
Name="txtProxyIP"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -255,10 +261,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Header="Domain"
|
Header="Domain"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtDirectDomain"
|
Name="txtDirectDomain"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -266,10 +273,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Header="IP"
|
Header="IP"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtDirectIP"
|
Name="txtDirectIP"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -286,10 +294,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Header="Domain"
|
Header="Domain"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtBlockDomain"
|
Name="txtBlockDomain"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@@ -297,10 +306,11 @@
|
|||||||
<GroupBox
|
<GroupBox
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Header="IP"
|
Header="IP"
|
||||||
Style="{StaticResource MaterialDesignGroupBox}">
|
Style="{StaticResource MyGroupBox}">
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtBlockIP"
|
Name="txtBlockIP"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
|
Style="{StaticResource DefTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
Style="{StaticResource MyOutlinedTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
Style="{StaticResource MyOutlinedTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
Style="{StaticResource MyOutlinedTextBox}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid
|
<Grid
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
||||||
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
||||||
<FileVersion>6.7</FileVersion>
|
<FileVersion>6.12</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MaterialDesignThemes" Version="4.6.1" />
|
<PackageReference Include="Downloader" Version="3.0.3" />
|
||||||
|
<PackageReference Include="MaterialDesignThemes" Version="4.7.1" />
|
||||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
<PackageReference Include="NHotkey" Version="2.1.0" />
|
<PackageReference Include="NHotkey" Version="2.1.0" />
|
||||||
@@ -25,7 +26,7 @@
|
|||||||
<PackageReference Include="ReactiveUI.Fody" Version="18.4.1" />
|
<PackageReference Include="ReactiveUI.Fody" Version="18.4.1" />
|
||||||
<PackageReference Include="ReactiveUI.Validation" Version="3.0.22" />
|
<PackageReference Include="ReactiveUI.Validation" Version="3.0.22" />
|
||||||
<PackageReference Include="ReactiveUI.WPF" Version="18.4.1" />
|
<PackageReference Include="ReactiveUI.WPF" Version="18.4.1" />
|
||||||
<PackageReference Include="Splat.NLog" Version="14.6.1" />
|
<PackageReference Include="Splat.NLog" Version="14.6.8" />
|
||||||
<PackageReference Include="System.Reactive" Version="5.0.0" />
|
<PackageReference Include="System.Reactive" Version="5.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
@@ -99,12 +100,9 @@
|
|||||||
<EmbeddedResource Update="Resx\ResUI.fa-Ir.resx">
|
<EmbeddedResource Update="Resx\ResUI.fa-Ir.resx">
|
||||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
<EmbeddedResource Update="Resx\ResUI.ru.resx">
|
||||||
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
<ItemGroup>
|
</EmbeddedResource>
|
||||||
<None Update="Resources\Fonts\SourceHanSansCN-Regular.ttf">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Reference in New Issue
Block a user