summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2017-07-31 23:48:53 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2017-07-31 23:48:53 -0400
commit9b22f3e004b35f66d9be6af211f20fe126fae209 (patch)
tree2c352fb84a16cb9a754c25278dde02aa0354ae6f /src/StardewModdingAPI
parent7992b52f035be5c6229ff0912bfd91084d41d5dc (diff)
downloadSMAPI-9b22f3e004b35f66d9be6af211f20fe126fae209.tar.gz
SMAPI-9b22f3e004b35f66d9be6af211f20fe126fae209.tar.bz2
SMAPI-9b22f3e004b35f66d9be6af211f20fe126fae209.zip
fix GraphicsEvents.Resize being raised before the game updates its window data (#328)
Diffstat (limited to 'src/StardewModdingAPI')
-rw-r--r--src/StardewModdingAPI/Events/GraphicsEvents.cs6
-rw-r--r--src/StardewModdingAPI/Framework/SGame.cs23
-rw-r--r--src/StardewModdingAPI/Program.cs1
3 files changed, 20 insertions, 10 deletions
diff --git a/src/StardewModdingAPI/Events/GraphicsEvents.cs b/src/StardewModdingAPI/Events/GraphicsEvents.cs
index 25b976f1..fff51bed 100644
--- a/src/StardewModdingAPI/Events/GraphicsEvents.cs
+++ b/src/StardewModdingAPI/Events/GraphicsEvents.cs
@@ -51,11 +51,9 @@ namespace StardewModdingAPI.Events
****/
/// <summary>Raise a <see cref="Resize"/> event.</summary>
/// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="sender">The object which raised the event.</param>
- /// <param name="e">The event arguments.</param>
- internal static void InvokeResize(IMonitor monitor, object sender, EventArgs e)
+ internal static void InvokeResize(IMonitor monitor)
{
- monitor.SafelyRaisePlainEvent($"{nameof(GraphicsEvents)}.{nameof(GraphicsEvents.Resize)}", GraphicsEvents.Resize?.GetInvocationList(), sender, e);
+ monitor.SafelyRaisePlainEvent($"{nameof(GraphicsEvents)}.{nameof(GraphicsEvents.Resize)}", GraphicsEvents.Resize?.GetInvocationList());
}
/****
diff --git a/src/StardewModdingAPI/Framework/SGame.cs b/src/StardewModdingAPI/Framework/SGame.cs
index bec6538b..65191931 100644
--- a/src/StardewModdingAPI/Framework/SGame.cs
+++ b/src/StardewModdingAPI/Framework/SGame.cs
@@ -53,10 +53,6 @@ namespace StardewModdingAPI.Framework
/// <summary>Whether the game is saving and SMAPI has already raised <see cref="SaveEvents.BeforeSave"/>.</summary>
private bool IsBetweenSaveEvents;
- /// <summary>Whether the game's zoom level is at 100% (i.e. nothing should be scaled).</summary>
- public bool ZoomLevelIsOne => Game1.options.zoomLevel.Equals(1.0f);
-
-
/****
** Game state
****/
@@ -75,7 +71,10 @@ namespace StardewModdingAPI.Framework
/// <summary>The previous mouse position on the screen adjusted for the zoom level.</summary>
private Point PreviousMousePosition;
- /// <summary>The previous save ID at last check.</summary>
+ /// <summary>The window size value at last check.</summary>
+ private Point PreviousWindowSize;
+
+ /// <summary>The save ID at last check.</summary>
private ulong PreviousSaveID;
/// <summary>A hash of <see cref="Game1.locations"/> at last check.</summary>
@@ -353,6 +352,20 @@ namespace StardewModdingAPI.Framework
}
/*********
+ ** Window events
+ *********/
+ // Here we depend on the game's viewport instead of listening to the Window.Resize
+ // event because we need to notify mods after the game handles the resize, so the
+ // game's metadata (like Game1.viewport) are updated. That's a bit complicated
+ // since the game adds & removes its own handler on the fly.
+ if (Game1.viewport.Width != this.PreviousWindowSize.X || Game1.viewport.Height != this.PreviousWindowSize.Y)
+ {
+ Point size = new Point(Game1.viewport.Width, Game1.viewport.Height);
+ GraphicsEvents.InvokeResize(this.Monitor);
+ this.PreviousWindowSize = size;
+ }
+
+ /*********
** Input events (if window has focus)
*********/
if (Game1.game1.IsActive)
diff --git a/src/StardewModdingAPI/Program.cs b/src/StardewModdingAPI/Program.cs
index b51917d9..0e1930ac 100644
--- a/src/StardewModdingAPI/Program.cs
+++ b/src/StardewModdingAPI/Program.cs
@@ -185,7 +185,6 @@ namespace StardewModdingAPI
((Form)Control.FromHandle(this.GameInstance.Window.Handle)).FormClosing += (sender, args) => this.Dispose();
#endif
this.GameInstance.Exiting += (sender, e) => this.Dispose();
- this.GameInstance.Window.ClientSizeChanged += (sender, e) => GraphicsEvents.InvokeResize(this.Monitor, sender, e);
GameEvents.InitializeInternal += (sender, e) => this.InitialiseAfterGameStart();
GameEvents.GameLoadedInternal += (sender, e) => this.CheckForUpdateAsync();
ContentEvents.AfterLocaleChanged += (sender, e) => this.OnLocaleChanged();