Updates: Avoid Application.Exit usage, attempt to kill existing processes before upgrade
This commit is contained in:
parent
094cb1857b
commit
201020b6f9
18 changed files with 49 additions and 33 deletions
|
@ -14,7 +14,7 @@ namespace Mesen.GUI.Config
|
||||||
{
|
{
|
||||||
private bool _needToSave = false;
|
private bool _needToSave = false;
|
||||||
|
|
||||||
public string Version = "0.1.0";
|
public string Version = "0.2.0";
|
||||||
public VideoConfig Video;
|
public VideoConfig Video;
|
||||||
public AudioConfig Audio;
|
public AudioConfig Audio;
|
||||||
public InputConfig Input;
|
public InputConfig Input;
|
||||||
|
|
|
@ -138,7 +138,7 @@ namespace Mesen.GUI.Config
|
||||||
FileAssociationHelper.UpdateFileAssociation("mss", this.AssociateMssFiles);
|
FileAssociationHelper.UpdateFileAssociation("mss", this.AssociateMssFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application.OpenForms[0].TopMost = AlwaysOnTop;
|
frmMain.Instance.TopMost = AlwaysOnTop;
|
||||||
|
|
||||||
ShortcutKeyInfo[] shortcutKeys = new ShortcutKeyInfo[ShortcutKeys1.Count + ShortcutKeys2.Count];
|
ShortcutKeyInfo[] shortcutKeys = new ShortcutKeyInfo[ShortcutKeys1.Count + ShortcutKeys2.Count];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
|
@ -229,7 +229,7 @@ namespace Mesen.GUI.Controls
|
||||||
private void tmrInput_Tick(object sender, EventArgs e)
|
private void tmrInput_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
//Use player 1's controls to navigate the recent game selection screen
|
//Use player 1's controls to navigate the recent game selection screen
|
||||||
if(Application.OpenForms.Count > 0 && Application.OpenForms[0].ContainsFocus && !EmuRunner.IsRunning()) {
|
if(frmMain.Instance?.ContainsFocus == true && !EmuRunner.IsRunning()) {
|
||||||
List<uint> keyCodes = InputApi.GetPressedKeys();
|
List<uint> keyCodes = InputApi.GetPressedKeys();
|
||||||
uint keyCode = keyCodes.Count > 0 ? keyCodes[0] : 0;
|
uint keyCode = keyCodes.Count > 0 ? keyCodes[0] : 0;
|
||||||
if(keyCode > 0) {
|
if(keyCode > 0) {
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace Mesen.GUI.Emulation
|
||||||
if(_mouseCaptured && AllowMouseCapture) {
|
if(_mouseCaptured && AllowMouseCapture) {
|
||||||
HideMouse();
|
HideMouse();
|
||||||
_tmrHideMouse.Stop();
|
_tmrHideMouse.Stop();
|
||||||
Form frm = Application.OpenForms[0];
|
Form frm = frmMain.Instance;
|
||||||
Point centerPos = frm.PointToScreen(new Point(frm.Width / 2, frm.Height / 2));
|
Point centerPos = frm.PointToScreen(new Point(frm.Width / 2, frm.Height / 2));
|
||||||
Point diff = new Point(Cursor.Position.X - centerPos.X, Cursor.Position.Y - centerPos.Y);
|
Point diff = new Point(Cursor.Position.X - centerPos.X, Cursor.Position.Y - centerPos.Y);
|
||||||
if(diff.X != 0 || diff.Y != 0) {
|
if(diff.X != 0 || diff.Y != 0) {
|
||||||
|
@ -185,7 +185,7 @@ namespace Mesen.GUI.Emulation
|
||||||
}
|
}
|
||||||
_mouseCaptured = true;
|
_mouseCaptured = true;
|
||||||
HideMouse();
|
HideMouse();
|
||||||
Form frm = Application.OpenForms[0];
|
Form frm = frmMain.Instance;
|
||||||
Point centerPos = frm.PointToScreen(new Point(frm.Width / 2, frm.Height / 2));
|
Point centerPos = frm.PointToScreen(new Point(frm.Width / 2, frm.Height / 2));
|
||||||
Cursor.Position = centerPos;
|
Cursor.Position = centerPos;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace Mesen.GUI.Emulation
|
||||||
ofd.InitialDirectory = ConfigManager.Config.RecentFiles.Items[0].RomFile.Folder;
|
ofd.InitialDirectory = ConfigManager.Config.RecentFiles.Items[0].RomFile.Folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ofd.ShowDialog(Application.OpenForms[0]) == DialogResult.OK) {
|
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
||||||
LoadRom(ofd.FileName, patchFile);
|
LoadRom(ofd.FileName, patchFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace Mesen.GUI.Emulation
|
||||||
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
||||||
ofd.InitialDirectory = ConfigManager.SaveStateFolder;
|
ofd.InitialDirectory = ConfigManager.SaveStateFolder;
|
||||||
ofd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
ofd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
||||||
if(ofd.ShowDialog(Application.OpenForms[0]) == DialogResult.OK) {
|
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
||||||
EmuApi.LoadStateFile(ofd.FileName);
|
EmuApi.LoadStateFile(ofd.FileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ namespace Mesen.GUI.Emulation
|
||||||
sfd.InitialDirectory = ConfigManager.SaveStateFolder;
|
sfd.InitialDirectory = ConfigManager.SaveStateFolder;
|
||||||
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".mss";
|
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".mss";
|
||||||
sfd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
sfd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
||||||
if(sfd.ShowDialog(Application.OpenForms[0]) == DialogResult.OK) {
|
if(sfd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
||||||
EmuApi.SaveStateFile(sfd.FileName);
|
EmuApi.SaveStateFile(sfd.FileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ namespace Mesen.GUI.Emulation
|
||||||
case EmulatorShortcut.Reset: EmuApi.Reset(); break;
|
case EmulatorShortcut.Reset: EmuApi.Reset(); break;
|
||||||
case EmulatorShortcut.PowerCycle: EmuApi.PowerCycle(); break;
|
case EmulatorShortcut.PowerCycle: EmuApi.PowerCycle(); break;
|
||||||
case EmulatorShortcut.PowerOff: Task.Run(() => EmuApi.Stop()); restoreFullscreen = false; break;
|
case EmulatorShortcut.PowerOff: Task.Run(() => EmuApi.Stop()); restoreFullscreen = false; break;
|
||||||
case EmulatorShortcut.Exit: Application.OpenForms[0].Close(); restoreFullscreen = false; break;
|
case EmulatorShortcut.Exit: frmMain.Instance.Close(); restoreFullscreen = false; break;
|
||||||
|
|
||||||
case EmulatorShortcut.ToggleAudio: ToggleAudio(); break;
|
case EmulatorShortcut.ToggleAudio: ToggleAudio(); break;
|
||||||
case EmulatorShortcut.ToggleFps: ToggleFps(); break;
|
case EmulatorShortcut.ToggleFps: ToggleFps(); break;
|
||||||
|
@ -152,7 +152,7 @@ namespace Mesen.GUI.Emulation
|
||||||
ofd.InitialDirectory = ConfigManager.Config.RecentFiles.Items[0].RomFile.Folder;
|
ofd.InitialDirectory = ConfigManager.Config.RecentFiles.Items[0].RomFile.Folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ofd.ShowDialog(Application.OpenForms[0]) == DialogResult.OK) {
|
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
||||||
EmuRunner.LoadFile(ofd.FileName);
|
EmuRunner.LoadFile(ofd.FileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace Mesen.GUI.Forms
|
||||||
return MessageBox.Show(string.Format("Critical error (" + text + ")"), "Mesen-S", buttons, icon);
|
return MessageBox.Show(string.Format("Critical error (" + text + ")"), "Mesen-S", buttons, icon);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Form mainForm = Application.OpenForms.Count > 0 ? Application.OpenForms[0] : null;
|
Form mainForm = frmMain.Instance;
|
||||||
if(mainForm?.InvokeRequired == true) {
|
if(mainForm?.InvokeRequired == true) {
|
||||||
DialogResult result = DialogResult.Cancel;
|
DialogResult result = DialogResult.Cancel;
|
||||||
mainForm.Invoke((Action)(() => {
|
mainForm.Invoke((Action)(() => {
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace Mesen.GUI.Forms
|
||||||
frmCheatList frm = new frmCheatList();
|
frmCheatList frm = new frmCheatList();
|
||||||
_instance = frm;
|
_instance = frm;
|
||||||
frm.Closed += (s, e) => { _instance = null; };
|
frm.Closed += (s, e) => { _instance = null; };
|
||||||
frm.Show(null, Application.OpenForms[0]);
|
frm.Show(null, frmMain.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnLoad(EventArgs e)
|
protected override void OnLoad(EventArgs e)
|
||||||
|
|
|
@ -145,7 +145,7 @@ namespace Mesen.GUI.Forms
|
||||||
|
|
||||||
private void lblCancel_Click(object sender, EventArgs e)
|
private void lblCancel_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Application.Exit();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radStoragePortable_CheckedChanged(object sender, EventArgs e)
|
private void radStoragePortable_CheckedChanged(object sender, EventArgs e)
|
||||||
|
|
|
@ -29,8 +29,12 @@ namespace Mesen.GUI.Forms
|
||||||
private DisplayManager _displayManager;
|
private DisplayManager _displayManager;
|
||||||
private CommandLineHelper _commandLine;
|
private CommandLineHelper _commandLine;
|
||||||
|
|
||||||
|
public static frmMain Instance { get; private set; }
|
||||||
|
|
||||||
public frmMain(string[] args)
|
public frmMain(string[] args)
|
||||||
{
|
{
|
||||||
|
frmMain.Instance = this;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
if(DesignMode) {
|
if(DesignMode) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace Mesen.GUI.Forms
|
||||||
|
|
||||||
if(archiveRomList.Count > 1) {
|
if(archiveRomList.Count > 1) {
|
||||||
using(frmSelectRom frm = new frmSelectRom(archiveRomList)) {
|
using(frmSelectRom frm = new frmSelectRom(archiveRomList)) {
|
||||||
if(frm.ShowDialog(null, Application.OpenForms[0]) == DialogResult.OK) {
|
if(frm.ShowDialog(null, frmMain.Instance) == DialogResult.OK) {
|
||||||
ArchiveRomEntry entry = frm.lstRoms.SelectedItem as ArchiveRomEntry;
|
ArchiveRomEntry entry = frm.lstRoms.SelectedItem as ArchiveRomEntry;
|
||||||
resource.InnerFile = entry.Filename;
|
resource.InnerFile = entry.Filename;
|
||||||
if(!entry.IsUtf8) {
|
if(!entry.IsUtf8) {
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace Mesen.GUI
|
||||||
UInt32 revision = version & 0xFF;
|
UInt32 revision = version & 0xFF;
|
||||||
UInt32 minor = (version >> 8) & 0xFF;
|
UInt32 minor = (version >> 8) & 0xFF;
|
||||||
UInt32 major = (version >> 16) & 0xFFFF;
|
UInt32 major = (version >> 16) & 0xFFFF;
|
||||||
return new Version((int)major, (int)minor, (int)revision, 0);
|
return new Version((int)major, (int)minor, (int)revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport(DllPath)] public static extern IntPtr RegisterNotificationCallback(NotificationListener.NotificationCallback callback);
|
[DllImport(DllPath)] public static extern IntPtr RegisterNotificationCallback(NotificationListener.NotificationCallback callback);
|
||||||
|
|
|
@ -75,7 +75,6 @@ namespace Mesen.GUI
|
||||||
Application.Run(new frmConfigWizard());
|
Application.Run(new frmConfigWizard());
|
||||||
|
|
||||||
if(ConfigManager.GetConfigFile() == null) {
|
if(ConfigManager.GetConfigFile() == null) {
|
||||||
Application.Exit();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,10 +47,10 @@ namespace Mesen.GUI.Updates
|
||||||
string donateText = xmlDoc.SelectSingleNode("VersionInfo/DonateText")?.InnerText;
|
string donateText = xmlDoc.SelectSingleNode("VersionInfo/DonateText")?.InnerText;
|
||||||
|
|
||||||
if(latestVersion > currentVersion) {
|
if(latestVersion > currentVersion) {
|
||||||
Application.OpenForms[0].BeginInvoke((MethodInvoker)(() => {
|
frmMain.Instance.BeginInvoke((MethodInvoker)(() => {
|
||||||
using(frmUpdatePrompt frmUpdate = new frmUpdatePrompt(currentVersion, latestVersion, changeLog, fileHash, donateText)) {
|
using(frmUpdatePrompt frmUpdate = new frmUpdatePrompt(currentVersion, latestVersion, changeLog, fileHash, donateText)) {
|
||||||
if(frmUpdate.ShowDialog(null, Application.OpenForms[0]) == DialogResult.OK) {
|
if(frmUpdate.ShowDialog(null, frmMain.Instance) == DialogResult.OK) {
|
||||||
Application.Exit();
|
frmMain.Instance.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -62,27 +62,28 @@ namespace Mesen.GUI.Updates
|
||||||
this.Close();
|
this.Close();
|
||||||
#else
|
#else
|
||||||
string destFilePath = System.Reflection.Assembly.GetEntryAssembly().Location;
|
string destFilePath = System.Reflection.Assembly.GetEntryAssembly().Location;
|
||||||
string srcFilePath = Path.Combine(ConfigManager.DownloadFolder, "Mesen." + lblLatestVersionString.Text + ".exe");
|
string srcFilePath = Path.Combine(ConfigManager.DownloadFolder, "Mesen-S." + lblLatestVersionString.Text + ".exe");
|
||||||
string backupFilePath = Path.Combine(ConfigManager.BackupFolder, "Mesen." + lblCurrentVersionString.Text + ".exe");
|
string backupFilePath = Path.Combine(ConfigManager.BackupFolder, "Mesen-S." + lblCurrentVersionString.Text + ".exe");
|
||||||
string updateHelper = Path.Combine(ConfigManager.HomeFolder, "Resources", "MesenUpdater.exe");
|
string updateHelper = Path.Combine(ConfigManager.HomeFolder, "Resources", "MesenUpdater.exe");
|
||||||
|
|
||||||
if(!File.Exists(updateHelper)) {
|
if(!File.Exists(updateHelper)) {
|
||||||
MesenMsgBox.Show("UpdaterNotFound", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MesenMsgBox.Show("UpdaterNotFound", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
} else if(!string.IsNullOrWhiteSpace(srcFilePath)) {
|
} else if(!string.IsNullOrWhiteSpace(srcFilePath)) {
|
||||||
frmDownloadProgress frmDownload = new frmDownloadProgress("https://www.mesen.ca/snes/Services/GetLatestVersion.php?a=download&p=win&v=" + EmuApi.GetMesenVersion().ToString(3), srcFilePath);
|
using(frmDownloadProgress frmDownload = new frmDownloadProgress("https://www.mesen.ca/snes/Services/GetLatestVersion.php?a=download&p=win&v=" + EmuApi.GetMesenVersion().ToString(3), srcFilePath)) {
|
||||||
if(frmDownload.ShowDialog() == DialogResult.OK) {
|
if(frmDownload.ShowDialog() == DialogResult.OK) {
|
||||||
FileInfo fileInfo = new FileInfo(srcFilePath);
|
FileInfo fileInfo = new FileInfo(srcFilePath);
|
||||||
if(fileInfo.Length > 0 && ResourceExtractor.GetSha1Hash(File.ReadAllBytes(srcFilePath)) == _fileHash) {
|
if(fileInfo.Length > 0 && ResourceExtractor.GetSha1Hash(File.ReadAllBytes(srcFilePath)) == _fileHash) {
|
||||||
if(Program.IsMono) {
|
if(Program.IsMono) {
|
||||||
Process.Start("mono", string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", updateHelper, srcFilePath, destFilePath, backupFilePath));
|
Process.Start("mono", string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", updateHelper, srcFilePath, destFilePath, backupFilePath));
|
||||||
|
} else {
|
||||||
|
Process.Start(updateHelper, string.Format("\"{0}\" \"{1}\" \"{2}\"", srcFilePath, destFilePath, backupFilePath));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Process.Start(updateHelper, string.Format("\"{0}\" \"{1}\" \"{2}\"", srcFilePath, destFilePath, backupFilePath));
|
//Download failed, mismatching hashes
|
||||||
|
MesenMsgBox.Show("UpdateDownloadFailed", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
//Download failed, mismatching hashes
|
|
||||||
MesenMsgBox.Show("UpdateDownloadFailed", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Mesen.GUI.Utilities
|
||||||
if(MesenMsgBox.Show("FirmwareNotFound", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, msg.FirmwareType.ToString(), filename, msg.Size.ToString()) == DialogResult.OK) {
|
if(MesenMsgBox.Show("FirmwareNotFound", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, msg.FirmwareType.ToString(), filename, msg.Size.ToString()) == DialogResult.OK) {
|
||||||
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
||||||
ofd.SetFilter(ResourceHelper.GetMessage("FilterAll"));
|
ofd.SetFilter(ResourceHelper.GetMessage("FilterAll"));
|
||||||
if(ofd.ShowDialog(Application.OpenForms[0]) == DialogResult.OK) {
|
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
||||||
if(GetFileHash(ofd.FileName) != GetExpectedHash(msg.FirmwareType)) {
|
if(GetFileHash(ofd.FileName) != GetExpectedHash(msg.FirmwareType)) {
|
||||||
if(MesenMsgBox.Show("FirmwareMismatch", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, msg.FirmwareType.ToString(), GetFileHash(ofd.FileName), GetExpectedHash(msg.FirmwareType)) != DialogResult.OK) {
|
if(MesenMsgBox.Show("FirmwareMismatch", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, msg.FirmwareType.ToString(), GetFileHash(ofd.FileName), GetExpectedHash(msg.FirmwareType)) != DialogResult.OK) {
|
||||||
//Files don't match and user cancelled the action
|
//Files don't match and user cancelled the action
|
||||||
|
|
|
@ -19,6 +19,18 @@ namespace MesenUpdater
|
||||||
string backupDestFile = args[2];
|
string backupDestFile = args[2];
|
||||||
bool isAdmin = args.Length > 3 && args[3] == "admin";
|
bool isAdmin = args.Length > 3 && args[3] == "admin";
|
||||||
|
|
||||||
|
//Wait a bit for the application to shut down before trying to kill it
|
||||||
|
System.Threading.Thread.Sleep(1000);
|
||||||
|
try {
|
||||||
|
foreach(Process process in Process.GetProcessesByName("Mesen-S")) {
|
||||||
|
try {
|
||||||
|
if(process.MainModule.FileName == destFile) {
|
||||||
|
process.Kill();
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
|
|
||||||
int retryCount = 0;
|
int retryCount = 0;
|
||||||
while(retryCount < 10) {
|
while(retryCount < 10) {
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Add table
Reference in a new issue