CeruleanSky b5a760bde9
Preserve command line arguments when updater restarts Ryujinx ()
Command line arguements are not preserved by the updater, and this causes an issue when the updater restarts Ryujinx in portable mode as it will create/use/modify its default directory instead.

This simple pull addresses the first part of  

As far as the second part of the issue, where the updater perhaps overzealously deletes everything but log files and folders, which causes problems in portable installs with a user subfolder or something else inside the Ryujinx folder. 

Perhaps an UpdateList.txt containing a list of files that the updater deletes is included in the ryujinx.zip/tar.gz/etc and placed in the upacked directory for the updater to use upon the next upgrade.

The build system can run something like `forfiles /s /m *.txt /c "cmd /c echo @relpath"` or the correct command for the OS and include it in the distribution, or it could be generated by the updater itself.
2020-10-29 23:07:10 +01:00

88 lines
3.0 KiB
C#

using Gdk;
using Gtk;
using Mono.Unix;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Ryujinx.Ui
{
public class UpdateDialog : Gtk.Window
{
#pragma warning disable CS0649, IDE0044
[Builder.Object] public Label MainText;
[Builder.Object] public Label SecondaryText;
[Builder.Object] public LevelBar ProgressBar;
[Builder.Object] public Button YesButton;
[Builder.Object] public Button NoButton;
#pragma warning restore CS0649, IDE0044
private readonly MainWindow _mainWindow;
private readonly string _buildUrl;
private bool _restartQuery;
public UpdateDialog(MainWindow mainWindow, Version newVersion, string buildUrl) : this(new Builder("Ryujinx.Updater.UpdateDialog.glade"), mainWindow, newVersion, buildUrl) { }
private UpdateDialog(Builder builder, MainWindow mainWindow, Version newVersion, string buildUrl) : base(builder.GetObject("UpdateDialog").Handle)
{
builder.Autoconnect(this);
_mainWindow = mainWindow;
_buildUrl = buildUrl;
MainText.Text = "Do you want to update Ryujinx to the latest version?";
SecondaryText.Text = $"{Program.Version} -> {newVersion}";
ProgressBar.Hide();
YesButton.Pressed += YesButton_Pressed;
NoButton.Pressed += NoButton_Pressed;
}
private void YesButton_Pressed(object sender, EventArgs args)
{
if (_restartQuery)
{
string ryuName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "Ryujinx.exe" : "Ryujinx";
string ryuExe = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ryuName);
string ryuArg = String.Join(" ", Environment.GetCommandLineArgs());
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
UnixFileInfo unixFileInfo = new UnixFileInfo(ryuExe);
unixFileInfo.FileAccessPermissions |= FileAccessPermissions.UserExecute;
}
Process.Start(ryuExe, ryuArg);
Environment.Exit(0);
}
else
{
this.Window.Functions = _mainWindow.Window.Functions = WMFunction.All & WMFunction.Close;
_mainWindow.ExitMenuItem.Sensitive = false;
YesButton.Hide();
NoButton.Hide();
ProgressBar.Show();
SecondaryText.Text = "";
_restartQuery = true;
Updater.UpdateRyujinx(this, _buildUrl);
}
}
private void NoButton_Pressed(object sender, EventArgs args)
{
Updater.Running = false;
_mainWindow.Window.Functions = WMFunction.All;
_mainWindow.ExitMenuItem.Sensitive = true;
_mainWindow.UpdateMenuItem.Sensitive = true;
this.Dispose();
}
}
}