From 26f2a1435a91fcd957606581b4f19de6f2f4d2de Mon Sep 17 00:00:00 2001 From: walterlv Date: Mon, 8 Apr 2024 19:37:13 +0800 Subject: [PATCH] feature: Open in selected default terminal. --- src/Native/Windows.cs | 2 +- src/ViewModels/Repository.cs | 12 +++++++++++- src/Views/Preference.axaml.cs | 24 +++--------------------- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index ba7aa7ff..6333374c 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -117,8 +117,8 @@ namespace SourceGit.Native public IReadOnlyList FindExternalTerminals() { var finder = new Models.ExternalTerminalFinder(); - finder.WindowsTerminal(() => FindExternalTerminal("wt")); finder.WindowsGitBash(() => FindExternalTerminal("bash")); + finder.WindowsTerminal(() => FindExternalTerminal("wt")); finder.PowerShell(() => FindExternalTerminal("pwsh")); return finder.Terminals; } diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 3a9f7e5d..dab15f62 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.IO; +using System.Linq; using System.Text.Json.Serialization; using System.Threading.Tasks; using System.Windows.Input; @@ -296,7 +297,16 @@ namespace SourceGit.ViewModels public void OpenInTerminal() { - Native.OS.OpenTerminal(_fullpath); + var terminal = Native.OS.ExternalTerminals.FirstOrDefault(x => x.Name == Preference.Instance.DefaultTerminal) + ?? Native.OS.ExternalTerminals.FirstOrDefault(); + + if (terminal is not null) + { + terminal.Open(_fullpath); + return; + } + + App.RaiseException(_fullpath, "No available external terminals found!"); } public void OpenWithExternalTool() diff --git a/src/Views/Preference.axaml.cs b/src/Views/Preference.axaml.cs index b72d3baa..bebdfb11 100644 --- a/src/Views/Preference.axaml.cs +++ b/src/Views/Preference.axaml.cs @@ -263,7 +263,9 @@ namespace SourceGit.Views { var iconKey = value is string terminalName && !string.IsNullOrWhiteSpace(terminalName) ? terminalName : - GetSystemDefaultTerminalIconKey(); + OS.ExternalTerminals.FirstOrDefault()?.Name + // Impossible to be null, just a fallback. + ?? "git-bash"; var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalTerminalIcons/{iconKey}.png", UriKind.RelativeOrAbsolute)); return new Bitmap(icon); @@ -273,26 +275,6 @@ namespace SourceGit.Views { throw new NotSupportedException(); } - - private string GetSystemDefaultTerminalIconKey() - { - if (OperatingSystem.IsWindows()) - { - return "git-bash"; - } - else if (OperatingSystem.IsMacOS()) - { - return "osascript"; - } - else if (OperatingSystem.IsLinux()) - { - return "gnome-terminal"; - } - else - { - throw new PlatformNotSupportedException(); - } - } } public sealed class TerminalOrShellNameToLocalizedNameConverter : IValueConverter