diff --git a/v2rayN/PacLib/PacHandler.cs b/v2rayN/PacLib/PacHandler.cs index 1481b94d..6801c69b 100644 --- a/v2rayN/PacLib/PacHandler.cs +++ b/v2rayN/PacLib/PacHandler.cs @@ -11,11 +11,11 @@ public class PacHandler private static int _httpPort; private static int _pacPort; private static TcpListener? _tcpListener; - private static string _pacText; + private static byte[] _writeContent; private static bool _isRunning; private static bool _needRestart = true; - public static void Start(string configPath, int httpPort, int pacPort) + public static async Task Start(string configPath, int httpPort, int pacPort) { _needRestart = (configPath != _configPath || httpPort != _httpPort || pacPort != _pacPort || !_isRunning); @@ -23,7 +23,7 @@ public class PacHandler _httpPort = httpPort; _pacPort = pacPort; - InitText(); + await InitText(); if (_needRestart) { @@ -32,15 +32,24 @@ public class PacHandler } } - private static void InitText() + private static async Task InitText() { var path = Path.Combine(_configPath, "pac.txt"); if (!File.Exists(path)) { - File.AppendAllText(path, Resources.ResourceManager.GetString("pac")); + await File.AppendAllTextAsync(path, Resources.ResourceManager.GetString("pac")); } - _pacText = File.ReadAllText(path).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;"); + var pacText = (await File.ReadAllTextAsync(path)).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;"); + + var sb = new StringBuilder(); + sb.AppendLine("HTTP/1.0 200 OK"); + sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig"); + sb.AppendLine("Connection:close"); + sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(pacText)); + sb.AppendLine(); + sb.Append(pacText); + _writeContent = Encoding.UTF8.GetBytes(sb.ToString()); } private static void RunListener() @@ -60,21 +69,8 @@ public class PacHandler continue; } - var client = _tcpListener.AcceptTcpClient(); - await Task.Run(() => - { - var stream = client.GetStream(); - var sb = new StringBuilder(); - sb.AppendLine("HTTP/1.0 200 OK"); - sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig"); - sb.AppendLine("Connection:close"); - sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(_pacText)); - sb.AppendLine(); - sb.Append(_pacText); - var content = Encoding.UTF8.GetBytes(sb.ToString()); - stream.Write(content, 0, content.Length); - stream.Flush(); - }); + var client = await _tcpListener.AcceptTcpClientAsync(); + await Task.Run(() => { WriteContent(client); }); } catch { @@ -84,6 +80,13 @@ public class PacHandler }, TaskCreationOptions.LongRunning); } + private static void WriteContent(TcpClient client) + { + var stream = client.GetStream(); + stream.Write(_writeContent, 0, _writeContent.Length); + stream.Flush(); + } + public static void Stop() { if (_tcpListener == null) return; diff --git a/v2rayN/ServiceLib/Common/DesUtils.cs b/v2rayN/ServiceLib/Common/DesUtils.cs new file mode 100644 index 00000000..132fff65 --- /dev/null +++ b/v2rayN/ServiceLib/Common/DesUtils.cs @@ -0,0 +1,75 @@ +using System.Security.Cryptography; +using System.Text; + +namespace ServiceLib.Common +{ + public class DesUtils + { + /// + /// Encrypt + /// + /// + /// /// + /// + public static string Encrypt(string? text, string? key = null) + { + if (text.IsNullOrEmpty()) + { + return string.Empty; + } + GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); + var dsp = DES.Create(); + using var memStream = new MemoryStream(); + using var cryStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIv), CryptoStreamMode.Write); + using var sWriter = new StreamWriter(cryStream); + sWriter.Write(text); + sWriter.Flush(); + cryStream.FlushFinalBlock(); + memStream.Flush(); + return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); + } + + /// + /// Decrypt + /// + /// + /// + /// + public static string Decrypt(string? encryptText, string? key = null) + { + if (encryptText.IsNullOrEmpty()) + { + return string.Empty; + } + GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); + var dsp = DES.Create(); + var buffer = Convert.FromBase64String(encryptText); + + using var memStream = new MemoryStream(); + using var cryStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIv), CryptoStreamMode.Write); + cryStream.Write(buffer, 0, buffer.Length); + cryStream.FlushFinalBlock(); + return Encoding.UTF8.GetString(memStream.ToArray()); + } + + private static void GetKeyIv(string key, out byte[] rgbKey, out byte[] rgbIv) + { + if (key.IsNullOrEmpty()) + { + throw new ArgumentNullException("The key cannot be null"); + } + if (key.Length <= 8) + { + throw new ArgumentNullException("The key length cannot be less than 8 characters."); + } + + rgbKey = Encoding.ASCII.GetBytes(key.Substring(0, 8)); + rgbIv = Encoding.ASCII.GetBytes(key.Insert(0, "w").Substring(0, 8)); + } + + private static string GetDefaultKey() + { + return Utils.GetMd5(Utils.GetHomePath() + "DesUtils"); + } + } +} \ No newline at end of file diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 9ebb928d..84e6b6b4 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -959,7 +959,6 @@ namespace ServiceLib.Handler && o.Address == n.Address && o.Port == n.Port && o.Id == n.Id - && o.AlterId == n.AlterId && o.Security == n.Security && o.Network == n.Network && o.HeaderType == n.HeaderType @@ -968,6 +967,10 @@ namespace ServiceLib.Handler && (o.ConfigType == EConfigType.Trojan || o.StreamSecurity == n.StreamSecurity) && o.Flow == n.Flow && o.Sni == n.Sni + && o.Alpn == n.Alpn + && o.Fingerprint == n.Fingerprint + && o.PublicKey == n.PublicKey + && o.ShortId == n.ShortId && (!remarks || o.Remarks == n.Remarks); } diff --git a/v2rayN/ServiceLib/Handler/CoreHandler.cs b/v2rayN/ServiceLib/Handler/CoreHandler.cs index cd8cdf51..6ebb80e8 100644 --- a/v2rayN/ServiceLib/Handler/CoreHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreHandler.cs @@ -261,7 +261,7 @@ namespace ServiceLib.Handler return _config.TunModeItem.EnableTun && eCoreType == ECoreType.sing_box && Utils.IsLinux() - && _config.TunModeItem.LinuxSudoPassword.IsNotEmpty() + && _config.TunModeItem.LinuxSudoPwd.IsNotEmpty() ; } @@ -299,7 +299,8 @@ namespace ServiceLib.Handler if (isNeedSudo) { proc.StartInfo.FileName = $"/bin/sudo"; - proc.StartInfo.Arguments = $"-S {fileName} {string.Format(coreInfo.Arguments, configPath)}"; + proc.StartInfo.Arguments = $"-S {fileName} {string.Format(coreInfo.Arguments, Utils.GetConfigPath(configPath))}"; + proc.StartInfo.WorkingDirectory = null; proc.StartInfo.StandardInputEncoding = Encoding.UTF8; proc.StartInfo.RedirectStandardInput = true; } @@ -328,10 +329,11 @@ namespace ServiceLib.Handler if (isNeedSudo) { + var pwd = DesUtils.Decrypt(_config.TunModeItem.LinuxSudoPwd); await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(_config.TunModeItem.LinuxSudoPassword); + await proc.StandardInput.WriteLineAsync(pwd); await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(_config.TunModeItem.LinuxSudoPassword); + await proc.StandardInput.WriteLineAsync(pwd); } if (displayLog) diff --git a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs index d6735e4b..de2ac9db 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs @@ -33,15 +33,10 @@ namespace ServiceLib.Handler.SysProxy await ProxySettingLinux.SetProxy(Global.Loopback, port); break; - case ESysProxyType.ForcedChange: - { - if (Utils.IsOSX()) - { - await ProxySettingOSX.SetProxy(Global.Loopback, port); - } + case ESysProxyType.ForcedChange when Utils.IsOSX(): + await ProxySettingOSX.SetProxy(Global.Loopback, port); + break; - break; - } case ESysProxyType.ForcedClear when Utils.IsWindows(): ProxySettingWindows.UnsetProxy(); break; @@ -50,23 +45,13 @@ namespace ServiceLib.Handler.SysProxy await ProxySettingLinux.UnsetProxy(); break; - case ESysProxyType.ForcedClear: - { - if (Utils.IsOSX()) - { - await ProxySettingOSX.UnsetProxy(); - } + case ESysProxyType.ForcedClear when Utils.IsOSX(): + await ProxySettingOSX.UnsetProxy(); + break; - break; - } case ESysProxyType.Pac when Utils.IsWindows(): - { - var portPac = AppHandler.Instance.GetLocalPort(EInboundProtocol.pac); - PacHandler.Start(Utils.GetConfigPath(), port, portPac); - var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; - ProxySettingWindows.SetProxy(strProxy, "", 4); - break; - } + await SetWindowsProxyPac(port); + break; } if (type != ESysProxyType.Pac && Utils.IsWindows()) @@ -102,5 +87,13 @@ namespace ServiceLib.Handler.SysProxy .Replace("{socks_port}", portSocks.ToString()); } } + + private static async Task SetWindowsProxyPac(int port) + { + var portPac = AppHandler.Instance.GetLocalPort(EInboundProtocol.pac); + await PacHandler.Start(Utils.GetConfigPath(), port, portPac); + var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; + ProxySettingWindows.SetProxy(strProxy, "", 4); + } } } \ No newline at end of file diff --git a/v2rayN/ServiceLib/Models/ConfigItems.cs b/v2rayN/ServiceLib/Models/ConfigItems.cs index 8ec47b88..7de1794c 100644 --- a/v2rayN/ServiceLib/Models/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/ConfigItems.cs @@ -80,7 +80,7 @@ public bool IgnoreGeoUpdateCore { get; set; } = true; public int AutoUpdateInterval { get; set; } - + public bool EnableSecurityProtocolTls13 { get; set; } public int TrayMenuServersLimit { get; set; } = 20; @@ -116,6 +116,7 @@ public bool EnableDragDropSort { get; set; } public bool DoubleClick2Activate { get; set; } public bool AutoHideStartup { get; set; } + public bool Hide2TrayWhenClose { get; set; } public List MainColumnItem { get; set; } public bool ShowInTaskbar { get; set; } } @@ -161,7 +162,7 @@ public int Mtu { get; set; } public bool EnableExInbound { get; set; } public bool EnableIPv6Address { get; set; } - public string? LinuxSudoPassword { get; set; } + public string? LinuxSudoPwd { get; set; } } [Serializable] diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 30568641..a439d7c0 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -3103,6 +3103,15 @@ namespace ServiceLib.Resx { } } + /// + /// 查找类似 Hide to tray when closing the window 的本地化字符串。 + /// + public static string TbSettingsHide2TrayWhenClose { + get { + return ResourceManager.GetString("TbSettingsHide2TrayWhenClose", resourceCulture); + } + } + /// /// 查找类似 HTTP Port 的本地化字符串。 /// @@ -3176,7 +3185,7 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 The password will only be stored in the local file. 的本地化字符串。 + /// 查找类似 The password is encrypted and stored only in local files. 的本地化字符串。 /// public static string TbSettingsLinuxSudoPasswordTip { get { diff --git a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx index 991c9fe2..937d107f 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx @@ -1373,7 +1373,7 @@ Linux system sudo password - The password will only be stored in the local file. + The password is encrypted and stored only in local files. Please set the sudo password in Tun mode settings first @@ -1387,4 +1387,7 @@ XHTTP Extra raw JSON, format: { XHTTPObject } + + Hide to tray when closing the window + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx index 9c69dc95..af6a2c9e 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1373,7 +1373,7 @@ Linux system sudo password - The password will only be stored in the local file. + The password is encrypted and stored only in local files. Please set the sudo password in Tun mode settings first @@ -1387,4 +1387,7 @@ XHTTP Extra raw JSON, format: { XHTTPObject } + + Hide to tray when closing the window + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.ru.resx b/v2rayN/ServiceLib/Resx/ResUI.ru.resx index 20395013..8758825c 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.ru.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.ru.resx @@ -1373,7 +1373,7 @@ Linux system sudo password - The password will only be stored in the local file. + The password is encrypted and stored only in local files. Please set the sudo password in Tun mode settings first @@ -1387,4 +1387,7 @@ XHTTP Extra raw JSON, format: { XHTTPObject } + + Hide to tray when closing the window + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index 18631825..9fd66a6e 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1370,7 +1370,7 @@ Linux系统的sudo密码 - 密码只会存储在本地文件中,没有密码无法开启Tun + 密码已加密且只存储在本地文件中,无密码无法开启Tun 请先在Tun模式设置中设置sudo密码 @@ -1384,4 +1384,7 @@ XHTTP Extra 原始 JSON,格式: { XHTTPObject } + + 关闭窗口时隐藏至托盘 + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index c68e0da6..0243c1f3 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -127,7 +127,7 @@ 設定格式不正確 - 注意,自訂設定完全依賴您自己的設定,不能使用所有設定功能。如需使用系統代理請手動修改監聽埠。 + 注意,自訂設定完全依賴您自己的設定,不能使用所有設定功能。如需使用系統代理請手動修改偵聽埠。 下載開始... @@ -157,7 +157,7 @@ 請填寫正確格式伺服器埠 - 請填寫本機監聽埠 + 請填寫本機偵聽埠 請填寫密碼 @@ -722,7 +722,7 @@ 例外. 對於下列字元開頭的位址不使用代理設定檔:使用分號(;)分隔 - 本機HTTP監聽埠 + 本機HTTP偵聽埠 更新Core時忽略Geo檔案 @@ -755,7 +755,7 @@ 開啟流量探測 - 本機SOCKS監聽埠 + 本機SOCKS偵聽埠 開機啟動(可能會不成功) @@ -998,7 +998,7 @@ 複製字型TTF/TTC檔案到目錄guiFonts,重啟設定 - http端口= +1;Pac端口= +4;*ray API端口= +5;mihomo API端口= +6; + http連接埠= +1;Pac連接埠= +4;*ray API連接埠= +5;mihomo API連接埠= +6; 以管理員權限設定此項,在啟動後獲得管理員權限 @@ -1094,7 +1094,7 @@ 請確保別名存在並且唯一 - 啟用額外監聽端口 + 啟用額外偵聽連接埠 啟用IPv6 @@ -1154,7 +1154,7 @@ 您目前運行的是獨立包,請手動下載 SelfContained.7z檔案解壓縮覆蓋! - 自訂設定的Socks端口 + 自訂設定的Socks連接埠 備份和還原 @@ -1370,7 +1370,7 @@ Linux系統的sudo密碼 - 密碼只會儲存在本機檔案中,沒有密碼無法開啟Tun + 密碼已加密且只儲存在本機檔案中,無密碼無法開啟Tun 請先在Tun模式設定中設定sudo密碼 @@ -1384,4 +1384,7 @@ XHTTP Extra 原始 JSON,格式: { XHTTPObject } + + 關閉視窗時隱藏至托盤 + \ No newline at end of file diff --git a/v2rayN/ServiceLib/ServiceLib.csproj b/v2rayN/ServiceLib/ServiceLib.csproj index 83d73e70..ecd130e6 100644 --- a/v2rayN/ServiceLib/ServiceLib.csproj +++ b/v2rayN/ServiceLib/ServiceLib.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - 7.1.0 + 7.1.1 diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index a62c3f2a..5890d614 100644 --- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -267,7 +267,7 @@ namespace ServiceLib.ViewModels var filesList = (new DirectoryInfo(toPath)).GetFiles().Select(u => u.FullName).ToList(); foreach (var file in filesList) { - await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType)); + await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType.ToLower())); } } diff --git a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs index 40aadaca..53fe1df6 100644 --- a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs @@ -53,6 +53,7 @@ namespace ServiceLib.ViewModels [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } [Reactive] public bool EnableSecurityProtocolTls13 { get; set; } [Reactive] public bool AutoHideStartup { get; set; } + [Reactive] public bool Hide2TrayWhenClose { get; set; } [Reactive] public bool EnableDragDropSort { get; set; } [Reactive] public bool DoubleClick2Activate { get; set; } [Reactive] public int AutoUpdateInterval { get; set; } @@ -166,6 +167,7 @@ namespace ServiceLib.ViewModels EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; EnableSecurityProtocolTls13 = _config.GuiItem.EnableSecurityProtocolTls13; AutoHideStartup = _config.UiItem.AutoHideStartup; + Hide2TrayWhenClose = _config.UiItem.Hide2TrayWhenClose; EnableDragDropSort = _config.UiItem.EnableDragDropSort; DoubleClick2Activate = _config.UiItem.DoubleClick2Activate; AutoUpdateInterval = _config.GuiItem.AutoUpdateInterval; @@ -198,7 +200,7 @@ namespace ServiceLib.ViewModels TunMtu = _config.TunModeItem.Mtu; TunEnableExInbound = _config.TunModeItem.EnableExInbound; TunEnableIPv6Address = _config.TunModeItem.EnableIPv6Address; - TunLinuxSudoPassword = _config.TunModeItem.LinuxSudoPassword; + TunLinuxSudoPassword = _config.TunModeItem.LinuxSudoPwd; #endregion Tun mode @@ -316,6 +318,7 @@ namespace ServiceLib.ViewModels _config.UiItem.EnableUpdateSubOnlyRemarksExist = EnableUpdateSubOnlyRemarksExist; _config.GuiItem.EnableSecurityProtocolTls13 = EnableSecurityProtocolTls13; _config.UiItem.AutoHideStartup = AutoHideStartup; + _config.UiItem.Hide2TrayWhenClose = Hide2TrayWhenClose; _config.GuiItem.AutoUpdateInterval = AutoUpdateInterval; _config.UiItem.EnableDragDropSort = EnableDragDropSort; _config.UiItem.DoubleClick2Activate = DoubleClick2Activate; @@ -342,7 +345,10 @@ namespace ServiceLib.ViewModels _config.TunModeItem.Mtu = TunMtu; _config.TunModeItem.EnableExInbound = TunEnableExInbound; _config.TunModeItem.EnableIPv6Address = TunEnableIPv6Address; - _config.TunModeItem.LinuxSudoPassword = TunLinuxSudoPassword; + if (TunLinuxSudoPassword != _config.TunModeItem.LinuxSudoPwd) + { + _config.TunModeItem.LinuxSudoPwd = DesUtils.Encrypt(TunLinuxSudoPassword); + } //coreType await SaveCoreType(); diff --git a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs index 47c7312a..3298f636 100644 --- a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs @@ -440,7 +440,7 @@ namespace ServiceLib.ViewModels } else if (Utils.IsLinux()) { - return _config.TunModeItem.LinuxSudoPassword.IsNotEmpty(); + return _config.TunModeItem.LinuxSudoPwd.IsNotEmpty(); } return false; } diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs index 377e4689..a0ac88f8 100644 --- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs @@ -382,7 +382,7 @@ namespace v2rayN.Desktop.Views #endregion Event #region UI - + public void ShowHideWindow(bool? blShow) { var bl = blShow ?? !_config.UiItem.ShowInTaskbar; @@ -398,7 +398,7 @@ namespace v2rayN.Desktop.Views } else { - if (Utils.IsWindows()) + if (_config.UiItem.Hide2TrayWhenClose) { this.Hide(); } diff --git a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml index 6176dfe3..7f340867 100644 --- a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -489,6 +489,18 @@ HorizontalAlignment="Left" Classes="Margin8" /> + + + Classes="Margin8" /> vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableSecurityProtocolTls13, v => v.togEnableSecurityProtocolTls13.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.Hide2TrayWhenClose, v => v.togHide2TrayWhenClose.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.CurrentFontFamily, v => v.cmbcurrentFontFamily.SelectedValue).DisposeWith(disposables);