/
vasiukoff
/
sg
Обзор
Документация
Войти
/
vasiukoff
/
sg
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/Native/Linux.cs
145 строк
5 KB
leo
refactor: allows to specify startup options for external shell/terminal (#1856)
12 дек 2025, 06:37
12 дек 2025, 06:37
7111ffb
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.Versioning; using Avalonia; using Avalonia.Controls; using Avalonia.Platform; namespace SourceGit.Native { [SupportedOSPlatform("linux")] internal class Linux : OS.IBackend { public void SetupApp(AppBuilder builder) { builder.With(new X11PlatformOptions() { EnableIme = true }); } public void SetupWindow(Window window) { if (OS.UseSystemWindowFrame) { window.ExtendClientAreaChromeHints = ExtendClientAreaChromeHints.Default; window.ExtendClientAreaToDecorationsHint = false; } else { window.ExtendClientAreaChromeHints = ExtendClientAreaChromeHints.NoChrome; window.ExtendClientAreaToDecorationsHint = true; window.Classes.Add("custom_window_frame"); } } public string FindGitExecutable() { return FindExecutable("git"); } public string FindTerminal(Models.ShellOrTerminal shell) { if (shell.Type.Equals("custom", StringComparison.Ordinal)) return string.Empty; return FindExecutable(shell.Exec); } public List<Models.ExternalTool> FindExternalTools() { var localAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var finder = new Models.ExternalToolsFinder(); finder.VSCode(() => FindExecutable("code")); finder.VSCodeInsiders(() => FindExecutable("code-insiders")); finder.VSCodium(() => FindExecutable("codium")); finder.Cursor(() => FindExecutable("cursor")); finder.Fleet(() => FindJetBrainsFleet(localAppDataDir)); finder.FindJetBrainsFromToolbox(() => Path.Combine(localAppDataDir, "JetBrains/Toolbox")); finder.SublimeText(() => FindExecutable("subl")); finder.Zed(() => { var exec = FindExecutable("zeditor"); return string.IsNullOrEmpty(exec) ? FindExecutable("zed") : exec; }); return finder.Tools; } public void OpenBrowser(string url) { var browser = Environment.GetEnvironmentVariable("BROWSER"); if (string.IsNullOrEmpty(browser)) browser = "xdg-open"; Process.Start(browser, url.Quoted()); } public void OpenInFileManager(string path, bool select) { if (Directory.Exists(path)) { Process.Start("xdg-open", path.Quoted()); } else { var dir = Path.GetDirectoryName(path); if (Directory.Exists(dir)) Process.Start("xdg-open", dir.Quoted()); } } public void OpenTerminal(string workdir, string args) { var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); var cwd = string.IsNullOrEmpty(workdir) ? home : workdir; var startInfo = new ProcessStartInfo(); startInfo.WorkingDirectory = cwd; startInfo.FileName = OS.ShellOrTerminal; startInfo.Arguments = args; try { Process.Start(startInfo); } catch (Exception e) { App.RaiseException(workdir, $"Failed to start '{OS.ShellOrTerminal}'. Reason: {e.Message}"); } } public void OpenWithDefaultEditor(string file) { var proc = Process.Start("xdg-open", file.Quoted()); if (proc != null) { proc.WaitForExit(); if (proc.ExitCode != 0) App.RaiseException("", $"Failed to open: {file}"); proc.Close(); } } private string FindExecutable(string filename) { var pathVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; var paths = pathVariable.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries); foreach (var path in paths) { var test = Path.Combine(path, filename); if (File.Exists(test)) return test; } var local = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "bin", filename); return File.Exists(local) ? local : string.Empty; } private string FindJetBrainsFleet(string localAppDataDir) { var path = Path.Combine(localAppDataDir, "JetBrains/Toolbox/apps/fleet/bin/Fleet"); return File.Exists(path) ? path : FindExecutable("fleet"); } } }