mirror of
https://github.com/ppy/osu.git
synced 2025-01-19 00:02:55 +08:00
cae3607caf
Earlier I changed the restarting logic to not wait until the program exits and instead try to facilitate restarting alone. This did not work, and it became clear we'd need Velopack to do the restarting. This reverts back and supposedly brings restarting logic in line with how Velopack does it
157 lines
5.1 KiB
C#
157 lines
5.1 KiB
C#
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
// See the LICENCE file in the repository root for full licence text.
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Runtime.Versioning;
|
|
using Microsoft.Win32;
|
|
using osu.Desktop.Performance;
|
|
using osu.Desktop.Security;
|
|
using osu.Framework.Platform;
|
|
using osu.Game;
|
|
using osu.Desktop.Updater;
|
|
using osu.Framework;
|
|
using osu.Framework.Logging;
|
|
using osu.Game.Updater;
|
|
using osu.Desktop.Windows;
|
|
using osu.Framework.Allocation;
|
|
using osu.Game.IO;
|
|
using osu.Game.IPC;
|
|
using osu.Game.Performance;
|
|
using osu.Game.Utils;
|
|
|
|
namespace osu.Desktop
|
|
{
|
|
internal partial class OsuGameDesktop : OsuGame
|
|
{
|
|
private OsuSchemeLinkIPCChannel? osuSchemeLinkIPCChannel;
|
|
private ArchiveImportIPCChannel? archiveImportIPCChannel;
|
|
|
|
[Cached(typeof(IHighPerformanceSessionManager))]
|
|
private readonly HighPerformanceSessionManager highPerformanceSessionManager = new HighPerformanceSessionManager();
|
|
|
|
public OsuGameDesktop(string[]? args = null)
|
|
: base(args)
|
|
{
|
|
}
|
|
|
|
public override StableStorage? GetStorageForStableInstall()
|
|
{
|
|
try
|
|
{
|
|
if (Host is DesktopGameHost desktopHost)
|
|
{
|
|
string? stablePath = getStableInstallPath();
|
|
if (!string.IsNullOrEmpty(stablePath))
|
|
return new StableStorage(stablePath, desktopHost);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Logger.Log("Could not find a stable install", LoggingTarget.Runtime, LogLevel.Important);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private string? getStableInstallPath()
|
|
{
|
|
static bool checkExists(string p) => Directory.Exists(Path.Combine(p, "Songs")) || File.Exists(Path.Combine(p, "osu!.cfg"));
|
|
|
|
string? stableInstallPath;
|
|
|
|
if (OperatingSystem.IsWindows())
|
|
{
|
|
try
|
|
{
|
|
stableInstallPath = getStableInstallPathFromRegistry();
|
|
|
|
if (!string.IsNullOrEmpty(stableInstallPath) && checkExists(stableInstallPath))
|
|
return stableInstallPath;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"osu!");
|
|
if (checkExists(stableInstallPath))
|
|
return stableInstallPath;
|
|
|
|
stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".osu");
|
|
if (checkExists(stableInstallPath))
|
|
return stableInstallPath;
|
|
|
|
return null;
|
|
}
|
|
|
|
[SupportedOSPlatform("windows")]
|
|
private string? getStableInstallPathFromRegistry()
|
|
{
|
|
using (RegistryKey? key = Registry.ClassesRoot.OpenSubKey("osu!"))
|
|
return key?.OpenSubKey(WindowsAssociationManager.SHELL_OPEN_COMMAND)?.GetValue(string.Empty)?.ToString()?.Split('"')[1].Replace("osu!.exe", "");
|
|
}
|
|
|
|
protected override UpdateManager CreateUpdateManager()
|
|
{
|
|
string? packageManaged = Environment.GetEnvironmentVariable("OSU_EXTERNAL_UPDATE_PROVIDER");
|
|
|
|
if (!string.IsNullOrEmpty(packageManaged))
|
|
return new NoActionUpdateManager();
|
|
|
|
return new VeloUpdateManager();
|
|
}
|
|
|
|
public override bool RestartAppWhenExited()
|
|
{
|
|
try
|
|
{
|
|
Velopack.UpdateExe.Start(null, true);
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Error(e, "Failed to restart application");
|
|
return base.RestartAppWhenExited();
|
|
}
|
|
}
|
|
|
|
protected override void LoadComplete()
|
|
{
|
|
base.LoadComplete();
|
|
|
|
LoadComponentAsync(new DiscordRichPresence(), Add);
|
|
|
|
if (RuntimeInfo.OS == RuntimeInfo.Platform.Windows)
|
|
LoadComponentAsync(new GameplayWinKeyBlocker(), Add);
|
|
|
|
LoadComponentAsync(new ElevatedPrivilegesChecker(), Add);
|
|
|
|
osuSchemeLinkIPCChannel = new OsuSchemeLinkIPCChannel(Host, this);
|
|
archiveImportIPCChannel = new ArchiveImportIPCChannel(Host, this);
|
|
}
|
|
|
|
public override void SetHost(GameHost host)
|
|
{
|
|
base.SetHost(host);
|
|
|
|
var iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType(), "lazer.ico");
|
|
if (iconStream != null)
|
|
host.Window.SetIconFromStream(iconStream);
|
|
|
|
host.Window.CursorState |= CursorState.Hidden;
|
|
host.Window.Title = Name;
|
|
}
|
|
|
|
protected override BatteryInfo CreateBatteryInfo() => FrameworkEnvironment.UseSDL3 ? new SDL3BatteryInfo() : new SDL2BatteryInfo();
|
|
|
|
protected override void Dispose(bool isDisposing)
|
|
{
|
|
base.Dispose(isDisposing);
|
|
osuSchemeLinkIPCChannel?.Dispose();
|
|
archiveImportIPCChannel?.Dispose();
|
|
}
|
|
}
|
|
}
|