diff --git a/v2rayN/ServiceLib/Models/CmdItem.cs b/v2rayN/ServiceLib/Models/CmdItem.cs
new file mode 100644
index 00000000..545c9685
--- /dev/null
+++ b/v2rayN/ServiceLib/Models/CmdItem.cs
@@ -0,0 +1,8 @@
+namespace ServiceLib.Models
+{
+ public class CmdItem
+ {
+ public string? Cmd { get; set; }
+ public string? Arguments { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/ServiceLib.csproj b/v2rayN/ServiceLib/ServiceLib.csproj
index ca4e2c75..28d58e22 100644
--- a/v2rayN/ServiceLib/ServiceLib.csproj
+++ b/v2rayN/ServiceLib/ServiceLib.csproj
@@ -16,6 +16,7 @@
+
diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs
index b0966221..45b1218d 100644
--- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs
+++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs
@@ -67,12 +67,15 @@ namespace ServiceLib.ViewModels
coreType = ECoreType.mihomo.ToString(),
remarks = ResUI.menuCheckUpdate,
});
- _checkUpdateItem.Add(new CheckUpdateItem()
+ if (Utils.IsWindows())
{
- isSelected = true,
- coreType = ECoreType.sing_box.ToString(),
- remarks = ResUI.menuCheckUpdate,
- });
+ _checkUpdateItem.Add(new CheckUpdateItem()
+ {
+ isSelected = true,
+ coreType = ECoreType.sing_box.ToString(),
+ remarks = ResUI.menuCheckUpdate,
+ });
+ }
_checkUpdateItem.Add(new CheckUpdateItem()
{
isSelected = true,
diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
index 07a08f29..8beebd43 100644
--- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
+++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs
@@ -295,7 +295,14 @@ namespace ServiceLib.ViewModels
});
OpenTheFileLocationCmd = ReactiveCommand.Create(() =>
{
- Utils.ProcessStart("Explorer", $"/select,{Utils.GetConfigPath()}");
+ if (Utils.IsWindows())
+ {
+ Utils.ProcessStart("Explorer", $"/select,{Utils.GetConfigPath()}");
+ }
+ else if (Utils.IsLinux())
+ {
+ Utils.ProcessStart("nautilus", Utils.GetConfigPath());
+ }
});
ReloadCmd = ReactiveCommand.Create(() =>
diff --git a/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs b/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs
new file mode 100644
index 00000000..5abc9636
--- /dev/null
+++ b/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs
@@ -0,0 +1,94 @@
+using CliWrap;
+using CliWrap.Buffered;
+
+namespace v2rayN.Desktop.Common
+{
+ public class ProxySettingLinux
+ {
+ public static async Task SetProxy(string host, int port)
+ {
+ var lstCmd = GetSetCmds(host, port);
+
+ await ExecCmd(lstCmd);
+ }
+
+ public static async Task UnsetProxy()
+ {
+ var lstCmd = GetUnsetCmds();
+
+ await ExecCmd(lstCmd);
+ }
+
+ private static async Task ExecCmd(List lstCmd)
+ {
+ foreach (var cmd in lstCmd)
+ {
+ if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments.IsNullOrEmpty())
+ { continue; }
+
+ await Task.Delay(10);
+ var result = await Cli.Wrap(cmd.Cmd)
+ .WithArguments(cmd.Arguments)
+ .ExecuteBufferedAsync();
+
+ if (result.ExitCode != 0)
+ {
+ //Logging.SaveLog($"Command failed {cmd.Cmd},{cmd.Arguments}");
+ Logging.SaveLog(result.ToString() ?? "");
+ }
+ }
+ }
+
+ private static List GetSetCmds(string host, int port)
+ {
+ //TODO KDE //XDG_CURRENT_DESKTOP
+ List lstType = ["http", "https", "socks", "ftp"];
+ List lstCmd = [];
+
+ lstCmd.Add(new CmdItem()
+ {
+ Cmd = "gsettings",
+ Arguments = "set org.gnome.system.proxy mode manual"
+ });
+
+ foreach (string type in lstType)
+ {
+ lstCmd.AddRange(GetSetCmdByType(type, host, port));
+ }
+
+ return lstCmd;
+ }
+
+ private static List GetSetCmdByType(string type, string host, int port)
+ {
+ List lstCmd = [];
+ lstCmd.Add(new()
+ {
+ Cmd = "gsettings",
+ Arguments = $"set org.gnome.system.proxy.{type} host {host}",
+ });
+
+ lstCmd.Add(new()
+ {
+ Cmd = "gsettings",
+ Arguments = $"set org.gnome.system.proxy.{type} port {port}",
+ });
+
+ return lstCmd;
+ }
+
+ private static List GetUnsetCmds()
+ {
+ //TODO KDE
+ List lstCmd = [];
+
+ lstCmd.Add(new CmdItem()
+ {
+ Cmd = "gsettings",
+ Arguments = "set org.gnome.system.proxy mode none"
+ });
+
+ return lstCmd;
+ }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs b/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs
new file mode 100644
index 00000000..fbe05894
--- /dev/null
+++ b/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs
@@ -0,0 +1,13 @@
+namespace v2rayN.Desktop.Common
+{
+ public class ProxySettingOSX
+ {
+ public static async Task SetProxy(string host, int port)
+ {
+ }
+
+ public static async Task UnsetProxy()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs
index 55e2082d..8dc30d19 100644
--- a/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs
+++ b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs
@@ -1,4 +1,6 @@
-namespace v2rayN.Desktop.Handler
+using v2rayN.Desktop.Common;
+
+namespace v2rayN.Desktop.Handler
{
public static class SysProxyHandler
{
@@ -14,22 +16,50 @@
try
{
int port = LazyConfig.Instance.GetLocalPort(EInboundProtocol.http);
+ int portSocks = LazyConfig.Instance.GetLocalPort(EInboundProtocol.socks);
+ int portPac = LazyConfig.Instance.GetLocalPort(EInboundProtocol.pac);
if (port <= 0)
{
return false;
}
if (type == ESysProxyType.ForcedChange)
{
- var strProxy = $"{Global.Loopback}:{port}";
- await SetProxy(strProxy);
+ if (Utils.IsWindows())
+ {
+ //TODO
+ }
+ else if (Utils.IsLinux())
+ {
+ await ProxySettingLinux.SetProxy(Global.Loopback, port);
+ }
+ else if (Utils.IsOSX())
+ {
+ await ProxySettingOSX.SetProxy(Global.Loopback, port);
+ }
}
else if (type == ESysProxyType.ForcedClear)
{
- await UnsetProxy();
+ if (Utils.IsWindows())
+ {
+ //TODO
+ }
+ else if (Utils.IsLinux())
+ {
+ await ProxySettingLinux.UnsetProxy();
+ }
+ else if (Utils.IsOSX())
+ {
+ await ProxySettingOSX.UnsetProxy();
+ }
}
- else if (type == ESysProxyType.Unchanged)
+ else if (type == ESysProxyType.Pac)
{
}
+
+ //if (type != ESysProxyType.Pac)
+ //{
+ // PacHandler.Stop();
+ //}
}
catch (Exception ex)
{
@@ -37,25 +67,5 @@
}
return true;
}
-
- private static async Task SetProxy(string? strProxy)
- {
- await Task.Run(() =>
- {
- var httpProxy = strProxy is null ? null : $"{Global.HttpProtocol}{strProxy}";
- var socksProxy = strProxy is null ? null : $"{Global.SocksProtocol}{strProxy}";
- var noProxy = $"localhost,127.0.0.0/8,::1";
-
- Environment.SetEnvironmentVariable("http_proxy", httpProxy, EnvironmentVariableTarget.User);
- Environment.SetEnvironmentVariable("https_proxy", httpProxy, EnvironmentVariableTarget.User);
- Environment.SetEnvironmentVariable("all_proxy", socksProxy, EnvironmentVariableTarget.User);
- Environment.SetEnvironmentVariable("no_proxy", noProxy, EnvironmentVariableTarget.User);
- });
- }
-
- private static async Task UnsetProxy()
- {
- await SetProxy(null);
- }
}
}
\ No newline at end of file
diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml
index 0f7b40cf..c1d0770e 100644
--- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml
+++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml
@@ -165,7 +165,6 @@
-