From 8c41af53d157fa63a653c0e720181279a7e6530b Mon Sep 17 00:00:00 2001 From: jdpurcell Date: Sun, 4 Jan 2015 15:04:44 +0000 Subject: [PATCH] Option to automatically check for and notify of new versions. --- BizHawk.Client.Common/config/Config.cs | 4 + .../BizHawk.Client.EmuHawk.csproj | 3 + BizHawk.Client.EmuHawk/MainForm.Designer.cs | 16 +- BizHawk.Client.EmuHawk/MainForm.Events.cs | 19 +++ BizHawk.Client.EmuHawk/MainForm.cs | 13 ++ BizHawk.Client.EmuHawk/UpdateChecker.cs | 143 ++++++++++++++++++ .../config/GuiOptions.Designer.cs | 55 ++++--- BizHawk.Client.EmuHawk/config/GuiOptions.cs | 18 ++- Version/VersionInfo.cs | 7 +- 9 files changed, 248 insertions(+), 30 deletions(-) create mode 100644 BizHawk.Client.EmuHawk/UpdateChecker.cs diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs index 54a36446c1..13a64d24cd 100644 --- a/BizHawk.Client.Common/config/Config.cs +++ b/BizHawk.Client.Common/config/Config.cs @@ -92,6 +92,10 @@ namespace BizHawk.Client.Common public bool AVI_CaptureOSD = false; public bool Screenshot_CaptureOSD = false; public bool FirstBoot = true; + public bool Update_AutoCheckEnabled = false; + public DateTime? Update_LastCheckTimeUTC = null; + public string Update_LatestVersion = ""; + public string Update_IgnoreVersion = ""; //public bool TurboSeek = true; // When PauseOnFrame is set, this will decide whether the client goes into turbo mode or not diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index b0d1805c42..a93480ff18 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -1057,6 +1057,9 @@ Component + + Code + FFmpegWriterForm.cs diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index 12a4537db8..7cb10c13ab 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -332,6 +332,7 @@ this.CoreNameStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); this.ProfileFirstBootLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.LinkConnectStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.UpdateNotification = new System.Windows.Forms.ToolStripStatusLabel(); this.MainFormContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.OpenRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.LoadLastRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -2751,7 +2752,8 @@ this.KeyPriorityStatusLabel, this.CoreNameStatusBarButton, this.ProfileFirstBootLabel, - this.LinkConnectStatusBarButton}); + this.LinkConnectStatusBarButton, + this.UpdateNotification}); this.MainStatusBar.Location = new System.Drawing.Point(0, 386); this.MainStatusBar.Name = "MainStatusBar"; this.MainStatusBar.ShowItemToolTips = true; @@ -2957,6 +2959,17 @@ this.LinkConnectStatusBarButton.ToolTipText = "Link connection is currently enabled"; this.LinkConnectStatusBarButton.Click += new System.EventHandler(this.LinkConnectStatusBarButton_Click); // + // UpdateNotification + // + this.UpdateNotification.IsLink = true; + this.UpdateNotification.LinkColor = System.Drawing.Color.Red; + this.UpdateNotification.Name = "UpdateNotification"; + this.UpdateNotification.Size = new System.Drawing.Size(46, 17); + this.UpdateNotification.Spring = true; + this.UpdateNotification.Text = "New version available!"; + this.UpdateNotification.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.UpdateNotification.Click += new System.EventHandler(this.UpdateNotification_Click); + // // MainFormContextMenu // this.MainFormContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -3737,6 +3750,7 @@ private System.Windows.Forms.ToolStripMenuItem FlushSaveRAMMenuItem; private System.Windows.Forms.ToolStripMenuItem PSXDiscControlsMenuItem; private System.Windows.Forms.ToolStripMenuItem GenesisGameGenieECDC; + private System.Windows.Forms.ToolStripStatusLabel UpdateNotification; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index c194d90fb4..2f738e9470 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -2252,6 +2252,25 @@ namespace BizHawk.Client.EmuHawk ProfileFirstBootLabel.Visible = false; } + private void UpdateNotification_Click(object sender, EventArgs e) + { + GlobalWin.Sound.StopSound(); + DialogResult result = MessageBox.Show(this, + "Version " + Global.Config.Update_LatestVersion + " is now available. Would you like to open the BizHawk homepage?\r\n\r\nClick \"No\" to hide the update notification for this version.", + "New Version Available", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + GlobalWin.Sound.StartSound(); + + if (result == DialogResult.Yes) + { + System.Threading.ThreadPool.QueueUserWorkItem((s) => System.Diagnostics.Process.Start(VersionInfo.HomePage).Dispose()); + } + else if (result == DialogResult.No) + { + UpdateChecker.IgnoreNewVersion(); + UpdateChecker.BeginCheck(skipCheck: true); // Trigger event to hide new version notification + } + } + #endregion #region Form Events diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 0142073b21..20d36acfbe 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -47,11 +47,13 @@ namespace BizHawk.Client.EmuHawk Global.CheatList.Changed += ToolHelpers.UpdateCheatRelatedTools; // Hide Status bar icons and general statusbar prep + MainStatusBar.Padding = new Padding(MainStatusBar.Padding.Left, MainStatusBar.Padding.Top, MainStatusBar.Padding.Left, MainStatusBar.Padding.Bottom); // Workaround to remove extra padding on right PlayRecordStatusButton.Visible = false; AVIStatusLabel.Visible = false; SetPauseStatusbarIcon(); ToolHelpers.UpdateCheatRelatedTools(null, null); RebootStatusBarIcon.Visible = false; + UpdateNotification.Visible = false; StatusBarDiskLightOnImage = Properties.Resources.LightOn; StatusBarDiskLightOffImage = Properties.Resources.LightOff; LinkCableOn = Properties.Resources.connect_16x16; @@ -63,6 +65,17 @@ namespace BizHawk.Client.EmuHawk } HandleToggleLightAndLink(); + + // New version notification + UpdateChecker.CheckComplete += (s2, e2) => + { + if (IsDisposed) return; + BeginInvoke((MethodInvoker)(() => + { + UpdateNotification.Visible = UpdateChecker.IsNewVersionAvailable; + })); + }; + UpdateChecker.BeginCheck(); // Won't actually check unless enabled by user } static MainForm() diff --git a/BizHawk.Client.EmuHawk/UpdateChecker.cs b/BizHawk.Client.EmuHawk/UpdateChecker.cs new file mode 100644 index 0000000000..9184a140da --- /dev/null +++ b/BizHawk.Client.EmuHawk/UpdateChecker.cs @@ -0,0 +1,143 @@ +using System; +using System.IO; +using System.Net; +using System.Threading; + +using BizHawk.Client.Common; + +namespace BizHawk.Client.EmuHawk +{ + public static class UpdateChecker + { + // TODO: Fill in actual URL... for now it will just grab it from right here: [LatestVersion]1.9.2[/LatestVersion] + private static readonly string _latestVersionInfoURL = "http://bizhawk.googlecode.com/svn/trunk/BizHawk.Client.EmuHawk/UpdateChecker.cs"; + private static readonly TimeSpan _minimumCheckDuration = TimeSpan.FromHours(8); + + private static bool AutoCheckEnabled + { + get { return Global.Config.Update_AutoCheckEnabled; } + set { Global.Config.Update_AutoCheckEnabled = value; } + } + + private static DateTime? LastCheckTimeUTC + { + get { return Global.Config.Update_LastCheckTimeUTC; } + set { Global.Config.Update_LastCheckTimeUTC = value; } + } + + private static string LatestVersion + { + get { return Global.Config.Update_LatestVersion; } + set { Global.Config.Update_LatestVersion = value; } + } + + private static string IgnoreVersion + { + get { return Global.Config.Update_IgnoreVersion; } + set { Global.Config.Update_IgnoreVersion = value; } + } + + public static void BeginCheck(bool skipCheck = false) + { + if (skipCheck || String.IsNullOrEmpty(_latestVersionInfoURL) || !AutoCheckEnabled || LastCheckTimeUTC > DateTime.UtcNow - _minimumCheckDuration) + { + OnCheckComplete(); + return; + } + + ThreadPool.QueueUserWorkItem((s) => CheckInternal()); + } + + public static bool IsNewVersionAvailable + { + get + { + return AutoCheckEnabled && + LatestVersion != IgnoreVersion && + ParseVersion(VersionInfo.MAINVERSION) != 0 && // Avoid notifying if current version string is invalid + ParseVersion(LatestVersion) > ParseVersion(VersionInfo.MAINVERSION); + } + } + + public static void IgnoreNewVersion() + { + IgnoreVersion = LatestVersion; + } + + public static void ResetHistory() + { + LastCheckTimeUTC = null; + LatestVersion = ""; + IgnoreVersion = ""; + } + + private static void CheckInternal() + { + try + { + string latestVersionInfo = DownloadURLAsString(_latestVersionInfoURL); + + LatestVersion = GetVersionNumberFromVersionInfo(latestVersionInfo); + } + catch + { + // Ignore errors, and fall through to set the last check time to avoid requesting too frequently from the web server + } + + LastCheckTimeUTC = DateTime.UtcNow; + + OnCheckComplete(); + } + + private static string DownloadURLAsString(string url) + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.KeepAlive = false; + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + using (StreamReader responseStream = new StreamReader(response.GetResponseStream())) + { + return responseStream.ReadToEnd(); + } + } + + private static string GetVersionNumberFromVersionInfo(string info) + { + string versionNumber = GetTextFromTag(info, "VersionNumber"); + return (versionNumber != null && ParseVersion(versionNumber) != 0) ? versionNumber : ""; + } + + private static string GetTextFromTag(string info, string tagName) + { + string openTag = "[" + tagName + "]"; + string closeTag = "[/" + tagName + "]"; + int start = info.IndexOf(openTag, StringComparison.OrdinalIgnoreCase); + if (start == -1) return null; + start += openTag.Length; + int end = info.IndexOf(closeTag, start, StringComparison.OrdinalIgnoreCase); + if (end == -1) return null; + return info.Substring(start, end - start).Trim(); + } + + // Major version goes in the first 16 bits, and so on, up to 4 parts + private static ulong ParseVersion(string str) + { + string[] split = str.Split('.'); + if (split.Length > 4) return 0; + ulong version = 0; + for (int i = 0; i < split.Length; i++) + { + ushort versionPart; + if (!UInt16.TryParse(split[i], out versionPart)) return 0; + version |= (ulong)versionPart << (48 - (i * 16)); + } + return version; + } + + private static void OnCheckComplete() + { + CheckComplete(null, EventArgs.Empty); + } + + public static event EventHandler CheckComplete = delegate { }; + } +} diff --git a/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs b/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs index ae4291f64d..bb4a4211f1 100644 --- a/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/GuiOptions.Designer.cs @@ -56,6 +56,7 @@ this.label4 = new System.Windows.Forms.Label(); this.LogWindowAsConsoleCheckbox = new System.Windows.Forms.CheckBox(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.AutoCheckForUpdates = new System.Windows.Forms.CheckBox(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.tabPage3.SuspendLayout(); @@ -99,6 +100,7 @@ // // tabPage1 // + this.tabPage1.Controls.Add(this.AutoCheckForUpdates); this.tabPage1.Controls.Add(this.StartFullScreenCheckbox); this.tabPage1.Controls.Add(this.label14); this.tabPage1.Controls.Add(this.label3); @@ -123,17 +125,17 @@ // StartFullScreenCheckbox // this.StartFullScreenCheckbox.AutoSize = true; - this.StartFullScreenCheckbox.Location = new System.Drawing.Point(104, 100); + this.StartFullScreenCheckbox.Location = new System.Drawing.Point(98, 63); this.StartFullScreenCheckbox.Name = "StartFullScreenCheckbox"; this.StartFullScreenCheckbox.Size = new System.Drawing.Size(110, 17); - this.StartFullScreenCheckbox.TabIndex = 13; + this.StartFullScreenCheckbox.TabIndex = 3; this.StartFullScreenCheckbox.Text = "Start in Fullscreen"; this.StartFullScreenCheckbox.UseVisualStyleBackColor = true; // // label14 // this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(26, 299); + this.label14.Location = new System.Drawing.Point(26, 246); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(303, 13); this.label14.TabIndex = 12; @@ -142,7 +144,7 @@ // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(26, 285); + this.label3.Location = new System.Drawing.Point(26, 232); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(272, 13); this.label3.TabIndex = 11; @@ -151,7 +153,7 @@ // SingleInstanceModeCheckbox // this.SingleInstanceModeCheckbox.AutoSize = true; - this.SingleInstanceModeCheckbox.Location = new System.Drawing.Point(6, 265); + this.SingleInstanceModeCheckbox.Location = new System.Drawing.Point(6, 212); this.SingleInstanceModeCheckbox.Name = "SingleInstanceModeCheckbox"; this.SingleInstanceModeCheckbox.Size = new System.Drawing.Size(127, 17); this.SingleInstanceModeCheckbox.TabIndex = 10; @@ -161,26 +163,26 @@ // NeverAskSaveCheckbox // this.NeverAskSaveCheckbox.AutoSize = true; - this.NeverAskSaveCheckbox.Location = new System.Drawing.Point(6, 146); + this.NeverAskSaveCheckbox.Location = new System.Drawing.Point(6, 109); this.NeverAskSaveCheckbox.Name = "NeverAskSaveCheckbox"; this.NeverAskSaveCheckbox.Size = new System.Drawing.Size(184, 17); - this.NeverAskSaveCheckbox.TabIndex = 6; + this.NeverAskSaveCheckbox.TabIndex = 5; this.NeverAskSaveCheckbox.Text = "Never be asked to save changes"; this.NeverAskSaveCheckbox.UseVisualStyleBackColor = true; // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(26, 245); + this.label2.Location = new System.Drawing.Point(26, 192); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(349, 13); - this.label2.TabIndex = 8; + this.label2.TabIndex = 9; this.label2.Text = "When this is set, the client will receive user input even when focus is lost"; // // AcceptBackgroundInputCheckbox // this.AcceptBackgroundInputCheckbox.AutoSize = true; - this.AcceptBackgroundInputCheckbox.Location = new System.Drawing.Point(6, 225); + this.AcceptBackgroundInputCheckbox.Location = new System.Drawing.Point(6, 172); this.AcceptBackgroundInputCheckbox.Name = "AcceptBackgroundInputCheckbox"; this.AcceptBackgroundInputCheckbox.Size = new System.Drawing.Size(146, 17); this.AcceptBackgroundInputCheckbox.TabIndex = 8; @@ -190,49 +192,49 @@ // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(26, 201); + this.label1.Location = new System.Drawing.Point(26, 152); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(315, 13); - this.label1.TabIndex = 6; + this.label1.TabIndex = 7; this.label1.Text = "When this is set, the client will continue to run when it loses focus"; // // RunInBackgroundCheckbox // this.RunInBackgroundCheckbox.AutoSize = true; - this.RunInBackgroundCheckbox.Location = new System.Drawing.Point(6, 181); + this.RunInBackgroundCheckbox.Location = new System.Drawing.Point(6, 132); this.RunInBackgroundCheckbox.Name = "RunInBackgroundCheckbox"; this.RunInBackgroundCheckbox.Size = new System.Drawing.Size(117, 17); - this.RunInBackgroundCheckbox.TabIndex = 7; + this.RunInBackgroundCheckbox.TabIndex = 6; this.RunInBackgroundCheckbox.Text = "Run in background"; this.RunInBackgroundCheckbox.UseVisualStyleBackColor = true; // // SaveWindowPositionCheckbox // this.SaveWindowPositionCheckbox.AutoSize = true; - this.SaveWindowPositionCheckbox.Location = new System.Drawing.Point(6, 123); + this.SaveWindowPositionCheckbox.Location = new System.Drawing.Point(6, 86); this.SaveWindowPositionCheckbox.Name = "SaveWindowPositionCheckbox"; this.SaveWindowPositionCheckbox.Size = new System.Drawing.Size(133, 17); - this.SaveWindowPositionCheckbox.TabIndex = 5; + this.SaveWindowPositionCheckbox.TabIndex = 4; this.SaveWindowPositionCheckbox.Text = "Save Window Position"; this.SaveWindowPositionCheckbox.UseVisualStyleBackColor = true; // // EnableContextMenuCheckbox // this.EnableContextMenuCheckbox.AutoSize = true; - this.EnableContextMenuCheckbox.Location = new System.Drawing.Point(6, 63); + this.EnableContextMenuCheckbox.Location = new System.Drawing.Point(6, 40); this.EnableContextMenuCheckbox.Name = "EnableContextMenuCheckbox"; this.EnableContextMenuCheckbox.Size = new System.Drawing.Size(128, 17); - this.EnableContextMenuCheckbox.TabIndex = 2; + this.EnableContextMenuCheckbox.TabIndex = 1; this.EnableContextMenuCheckbox.Text = "Enable Context Menu"; this.EnableContextMenuCheckbox.UseVisualStyleBackColor = true; // // StartPausedCheckbox // this.StartPausedCheckbox.AutoSize = true; - this.StartPausedCheckbox.Location = new System.Drawing.Point(6, 100); + this.StartPausedCheckbox.Location = new System.Drawing.Point(6, 63); this.StartPausedCheckbox.Name = "StartPausedCheckbox"; this.StartPausedCheckbox.Size = new System.Drawing.Size(86, 17); - this.StartPausedCheckbox.TabIndex = 4; + this.StartPausedCheckbox.TabIndex = 2; this.StartPausedCheckbox.Text = "Start paused"; this.StartPausedCheckbox.UseVisualStyleBackColor = true; // @@ -312,7 +314,7 @@ // BackupSRamCheckbox // this.BackupSRamCheckbox.AutoSize = true; - this.BackupSRamCheckbox.Location = new System.Drawing.Point(4, 61); + this.BackupSRamCheckbox.Location = new System.Drawing.Point(6, 61); this.BackupSRamCheckbox.Name = "BackupSRamCheckbox"; this.BackupSRamCheckbox.Size = new System.Drawing.Size(108, 17); this.BackupSRamCheckbox.TabIndex = 9; @@ -338,6 +340,16 @@ this.LogWindowAsConsoleCheckbox.Text = "Create the log window as a console window"; this.LogWindowAsConsoleCheckbox.UseVisualStyleBackColor = true; // + // AutoCheckForUpdates + // + this.AutoCheckForUpdates.AutoSize = true; + this.AutoCheckForUpdates.Location = new System.Drawing.Point(6, 266); + this.AutoCheckForUpdates.Name = "AutoCheckForUpdates"; + this.AutoCheckForUpdates.Size = new System.Drawing.Size(288, 17); + this.AutoCheckForUpdates.TabIndex = 13; + this.AutoCheckForUpdates.Text = "Automatically check for and notify me of newer versions"; + this.AutoCheckForUpdates.UseVisualStyleBackColor = true; + // // EmuHawkOptions // this.AcceptButton = this.OkBtn; @@ -391,5 +403,6 @@ private System.Windows.Forms.Label label13; private System.Windows.Forms.Label label14; private System.Windows.Forms.CheckBox StartFullScreenCheckbox; + private System.Windows.Forms.CheckBox AutoCheckForUpdates; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/GuiOptions.cs b/BizHawk.Client.EmuHawk/config/GuiOptions.cs index a0658e7cf4..ae0fa3509c 100644 --- a/BizHawk.Client.EmuHawk/config/GuiOptions.cs +++ b/BizHawk.Client.EmuHawk/config/GuiOptions.cs @@ -29,11 +29,12 @@ namespace BizHawk.Client.EmuHawk AcceptBackgroundInputCheckbox.Checked = Global.Config.AcceptBackgroundInput; NeverAskSaveCheckbox.Checked = Global.Config.SupressAskSave; SingleInstanceModeCheckbox.Checked = Global.Config.SingleInstanceMode; - LogWindowAsConsoleCheckbox.Checked = Global.Config.WIN32_CONSOLE; - + AutoCheckForUpdates.Visible = VersionInfo.DeveloperBuild; + AutoCheckForUpdates.Checked = Global.Config.Update_AutoCheckEnabled; BackupSRamCheckbox.Checked = Global.Config.BackupSaveram; FrameAdvSkipLagCheckbox.Checked = Global.Config.SkipLagFrame; + LogWindowAsConsoleCheckbox.Checked = Global.Config.WIN32_CONSOLE; if (LogConsole.ConsoleVisible) { @@ -46,6 +47,8 @@ namespace BizHawk.Client.EmuHawk private void OkBtn_Click(object sender, EventArgs e) { + bool oldUpdateAutoCheckEnabled = Global.Config.Update_AutoCheckEnabled; + Global.Config.StartFullscreen = StartFullScreenCheckbox.Checked; Global.Config.StartPaused = StartPausedCheckbox.Checked; Global.Config.PauseWhenMenuActivated = PauseWhenMenuActivatedCheckbox.Checked; @@ -55,12 +58,17 @@ namespace BizHawk.Client.EmuHawk Global.Config.AcceptBackgroundInput = AcceptBackgroundInputCheckbox.Checked; Global.Config.SupressAskSave = NeverAskSaveCheckbox.Checked; Global.Config.SingleInstanceMode = SingleInstanceModeCheckbox.Checked; - Global.Config.WIN32_CONSOLE = LogWindowAsConsoleCheckbox.Checked; - - + Global.Config.Update_AutoCheckEnabled = AutoCheckForUpdates.Checked; Global.Config.BackupSaveram = BackupSRamCheckbox.Checked; Global.Config.SkipLagFrame = FrameAdvSkipLagCheckbox.Checked; + Global.Config.WIN32_CONSOLE = LogWindowAsConsoleCheckbox.Checked; + + if (Global.Config.Update_AutoCheckEnabled != oldUpdateAutoCheckEnabled) + { + if (!Global.Config.Update_AutoCheckEnabled) UpdateChecker.ResetHistory(); + UpdateChecker.BeginCheck(); // Call even if auto checking is disabled to trigger event (it won't actually check) + } Close(); DialogResult = DialogResult.OK; diff --git a/Version/VersionInfo.cs b/Version/VersionInfo.cs index d3d6637a0f..9f4020b840 100644 --- a/Version/VersionInfo.cs +++ b/Version/VersionInfo.cs @@ -1,8 +1,9 @@ static class VersionInfo { - public const string MAINVERSION = "1.9.0"; - public static string RELEASEDATE = "November 23, 2014"; - public static bool DeveloperBuild = true; + public const string MAINVERSION = "1.9.0"; // Use numbers only or the new version notification won't work + public static readonly string RELEASEDATE = "November 23, 2014"; + public static readonly bool DeveloperBuild = true; + public static readonly string HomePage = "http://tasvideos.org/BizHawk.html"; public static string GetEmuVersion() {