From d1fd6c30b98665b4ca9f53d0e763c444fed73f08 Mon Sep 17 00:00:00 2001 From: Morilli <35152647+Morilli@users.noreply.github.com> Date: Sat, 28 Jun 2025 20:34:33 +0200 Subject: [PATCH] workaround mono url open bug - closes #4379 --- src/BizHawk.Client.DiscoHawk/About.cs | 4 ++- .../AVOut/FFmpegDownloaderForm.cs | 2 +- src/BizHawk.Client.EmuHawk/BizBox.cs | 7 ++--- .../BizBoxInfoControl.cs | 4 ++- src/BizHawk.Client.EmuHawk/MainForm.Events.cs | 11 ++----- .../RAIntegrationDownloaderForm.cs | 2 +- .../RetroAchievements/RCheevosLoginForm.cs | 5 ++-- .../config/DisplayConfig.cs | 2 +- .../tools/BasicBot/BasicBot.cs | 3 +- .../tools/Lua/LuaConsole.cs | 3 +- .../tools/TAStudio/TAStudio.MenuItems.cs | 4 +-- src/BizHawk.Common/Util.cs | 29 +++++++++++++++++++ 12 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/BizHawk.Client.DiscoHawk/About.cs b/src/BizHawk.Client.DiscoHawk/About.cs index ab9829a4b4..16fcf8d3b3 100644 --- a/src/BizHawk.Client.DiscoHawk/About.cs +++ b/src/BizHawk.Client.DiscoHawk/About.cs @@ -1,5 +1,7 @@ using System.Windows.Forms; +using BizHawk.Common; + namespace BizHawk.Client.DiscoHawk { public partial class About : Form @@ -12,7 +14,7 @@ namespace BizHawk.Client.DiscoHawk private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e) { - System.Diagnostics.Process.Start(e.LinkText); + Util.OpenUrlExternal(e.LinkText); } private void button1_Click(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/AVOut/FFmpegDownloaderForm.cs b/src/BizHawk.Client.EmuHawk/AVOut/FFmpegDownloaderForm.cs index a3b3d88f9b..f908be7354 100644 --- a/src/BizHawk.Client.EmuHawk/AVOut/FFmpegDownloaderForm.cs +++ b/src/BizHawk.Client.EmuHawk/AVOut/FFmpegDownloaderForm.cs @@ -155,7 +155,7 @@ namespace BizHawk.Client.EmuHawk private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start(FFmpegService.Url); + Util.OpenUrlExternal(FFmpegService.Url); } } } diff --git a/src/BizHawk.Client.EmuHawk/BizBox.cs b/src/BizHawk.Client.EmuHawk/BizBox.cs index b5ca1e428a..f8bfac627e 100644 --- a/src/BizHawk.Client.EmuHawk/BizBox.cs +++ b/src/BizHawk.Client.EmuHawk/BizBox.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using System.Linq; using System.Windows.Forms; @@ -22,7 +21,7 @@ namespace BizHawk.Client.EmuHawk private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { linkLabel1.LinkVisited = true; - Process.Start(VersionInfo.HomePage); + Util.OpenUrlExternal(VersionInfo.HomePage); } private void OK_Click(object sender, EventArgs e) @@ -51,12 +50,12 @@ namespace BizHawk.Client.EmuHawk } private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - => Process.Start((string) ((Control) sender).Tag); + => Util.OpenUrlExternal((string) ((Control) sender).Tag); private void btnCopyHash_Click(object sender, EventArgs e) => Clipboard.SetText(VersionInfo.GIT_HASH); private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - => Process.Start(VersionInfo.BizHawkContributorsListURI); + => Util.OpenUrlExternal(VersionInfo.BizHawkContributorsListURI); } } diff --git a/src/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs b/src/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs index b58d1d5a0a..b437e67a38 100644 --- a/src/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs +++ b/src/BizHawk.Client.EmuHawk/BizBoxInfoControl.cs @@ -1,4 +1,6 @@ using System.Windows.Forms; + +using BizHawk.Common; using BizHawk.Emulation.Common; namespace BizHawk.Client.EmuHawk @@ -33,7 +35,7 @@ namespace BizHawk.Client.EmuHawk private void CoreUrlLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { CoreUrlLink.LinkVisited = true; - System.Diagnostics.Process.Start(_url); + Util.OpenUrlExternal(_url); } } } diff --git a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs index e997ab0a85..7bd5747220 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1174,12 +1174,12 @@ namespace BizHawk.Client.EmuHawk private void OnlineHelpMenuItem_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("https://tasvideos.org/BizHawk"); + Util.OpenUrlExternal("https://tasvideos.org/BizHawk"); } private void ForumsMenuItem_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("https://tasvideos.org/Forum/Subforum/64"); + Util.OpenUrlExternal("https://tasvideos.org/Forum/Subforum/64"); } private void FeaturesMenuItem_Click(object sender, EventArgs e) @@ -1502,12 +1502,7 @@ namespace BizHawk.Client.EmuHawk if (result == true) { - System.Threading.ThreadPool.QueueUserWorkItem(s => - { - using (System.Diagnostics.Process.Start(VersionInfo.HomePage)) - { - } - }); + Util.OpenUrlExternal(VersionInfo.HomePage); } else if (result == false) { diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegrationDownloaderForm.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegrationDownloaderForm.cs index db1a5485e8..cea938757e 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegrationDownloaderForm.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegrationDownloaderForm.cs @@ -159,7 +159,7 @@ namespace BizHawk.Client.EmuHawk private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start(_url); + Util.OpenUrlExternal(_url); } } } diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLoginForm.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLoginForm.cs index bb3c486523..498e1f6855 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLoginForm.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLoginForm.cs @@ -1,6 +1,7 @@ -using System.Diagnostics; using System.Windows.Forms; +using BizHawk.Common; + namespace BizHawk.Client.EmuHawk { /// @@ -32,7 +33,7 @@ namespace BizHawk.Client.EmuHawk private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - Process.Start("https://retroachievements.org/createaccount.php"); + Util.OpenUrlExternal("https://retroachievements.org/createaccount.php"); } } } diff --git a/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs b/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs index ba34127f4d..1de872d9f5 100755 --- a/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs @@ -368,7 +368,7 @@ namespace BizHawk.Client.EmuHawk private void LinkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start("https://tasvideos.org/Bizhawk/DisplayConfig"); + Util.OpenUrlExternal("https://tasvideos.org/Bizhawk/DisplayConfig"); } private void Label13_Click(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs b/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs index af4418ba92..70f14bd083 100644 --- a/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs +++ b/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; @@ -1302,7 +1301,7 @@ namespace BizHawk.Client.EmuHawk private void HelpToolStripMenuItem_Click(object sender, EventArgs e) { - Process.Start("https://tasvideos.org/Bizhawk/BasicBot"); + Util.OpenUrlExternal("https://tasvideos.org/Bizhawk/BasicBot"); } private void InvisibleEmulationCheckBox_CheckedChanged(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index f7e9447e87..7fdd0e5cd0 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using BizHawk.Client.Common; using BizHawk.Client.EmuHawk.Properties; using BizHawk.Client.EmuHawk.ToolExtensions; +using BizHawk.Common; using BizHawk.Common.CollectionExtensions; using BizHawk.Common.PathExtensions; using BizHawk.Common.StringExtensions; @@ -1185,7 +1186,7 @@ namespace BizHawk.Client.EmuHawk private void OnlineDocsMenuItem_Click(object sender, EventArgs e) { - Process.Start("https://tasvideos.org/BizHawk/LuaFunctions"); + Util.OpenUrlExternal("https://tasvideos.org/BizHawk/LuaFunctions"); } private void ScriptListContextMenu_Opening(object sender, CancelEventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 8fe80742f0..18c35ea33f 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -1337,12 +1337,12 @@ namespace BizHawk.Client.EmuHawk private void TASEditorManualOnlineMenuItem_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://www.fceux.com/web/help/taseditor/"); + Util.OpenUrlExternal("http://www.fceux.com/web/help/taseditor/"); } private void ForumThreadMenuItem_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("https://tasvideos.org/Forum/Topics/13505"); + Util.OpenUrlExternal("https://tasvideos.org/Forum/Topics/13505"); } } } diff --git a/src/BizHawk.Common/Util.cs b/src/BizHawk.Common/Util.cs index c65f1b8b16..53f729c975 100644 --- a/src/BizHawk.Common/Util.cs +++ b/src/BizHawk.Common/Util.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.IO.Compression; @@ -303,5 +304,33 @@ namespace BizHawk.Common bw.Write(data); } } + + // Process.Start does not correctly handle urls in mono version pre-6.12.0.122, + // so we use an explicit function handling it instead + public static void OpenUrlExternal(string url) + { + if (OSTailoredCode.IsUnixHost) + { + string[] apps = OSTailoredCode.CurrentOS is OSTailoredCode.DistinctOS.macOS + ? [ "open" ] + : [ "xdg-open", "gnome-open", "kfmclient" ]; + + foreach (string app in apps) + { + try + { + Process.Start(app, url); + } + catch (Win32Exception) + { + continue; + } + } + } + else + { + Process.Start(url); + } + } } }