From 96a116d7034e19071dd33dffd5155eae632ff02d Mon Sep 17 00:00:00 2001 From: Maik Macho Date: Fri, 27 Oct 2017 00:20:12 +0200 Subject: [PATCH] Runtime env settings: XNATOFNA_DISPLAY_SIZE=WxH & XNATOFNA_DISPLAY_FULLSCREEN=1 / 0 --- src/Helper/XnaToFnaHelper.cs | 25 +++++++++++++++++++++++++ src/XnaToFnaUtil.Processor.cs | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/src/Helper/XnaToFnaHelper.cs b/src/Helper/XnaToFnaHelper.cs index 8dbcc1c..0ef8079 100644 --- a/src/Helper/XnaToFnaHelper.cs +++ b/src/Helper/XnaToFnaHelper.cs @@ -63,6 +63,31 @@ public static IntPtr GetProxyFormHandle(this GameWindow window) { // Only used when --hook-istrialmode / --arr is provided when patching. public static bool get_IsTrialMode() => Environment.GetEnvironmentVariable("XNATOFNA_ISTRIALMODE") != "0"; + + // This needs to be hooked to check for the env vars at runtime. + public static void ApplyChanges(GraphicsDeviceManager self) { + string forceFullscreen = Environment.GetEnvironmentVariable("XNATOFNA_DISPLAY_FULLSCREEN"); + if (forceFullscreen == "0") + self.IsFullScreen = false; + else if (forceFullscreen == "1") + self.IsFullScreen = true; + + int forceWidth; + if (int.TryParse(Environment.GetEnvironmentVariable("XNATOFNA_DISPLAY_WIDTH"), out forceWidth)) + self.PreferredBackBufferWidth = forceWidth; + int forceHeight; + if (int.TryParse(Environment.GetEnvironmentVariable("XNATOFNA_DISPLAY_HEIGHT"), out forceHeight)) + self.PreferredBackBufferHeight = forceHeight; + string[] forceSize = Environment.GetEnvironmentVariable("XNATOFNA_DISPLAY_SIZE").Split('x'); + if (forceSize.Length == 2) { + if (int.TryParse(forceSize[0], out forceWidth)) + self.PreferredBackBufferWidth = forceWidth; + if (int.TryParse(forceSize[1], out forceHeight)) + self.PreferredBackBufferHeight = forceHeight; + } + + self.ApplyChanges(); + } public static void PreUpdate(GameTime time) { // Don't ask me why some games use Win32 calls instead of Keyboard.GetState()... diff --git a/src/XnaToFnaUtil.Processor.cs b/src/XnaToFnaUtil.Processor.cs index b703685..4adc4df 100644 --- a/src/XnaToFnaUtil.Processor.cs +++ b/src/XnaToFnaUtil.Processor.cs @@ -34,6 +34,10 @@ public void SetupHelperRelinker() { Modder.RelinkMap["System.IntPtr Microsoft.Xna.Framework.GameWindow::get_Handle()"] = Tuple.Create("XnaToFna.XnaToFnaHelper", "System.IntPtr GetProxyFormHandle(Microsoft.Xna.Framework.GameWindow)"); + // X360 games can be larger than the screen. Allow the user to "fix" this by forcing a display resolution via env vars. + Modder.RelinkMap["System.Void Microsoft.Xna.Framework.GraphicsDeviceManager::ApplyChanges()"] = + Tuple.Create("XnaToFna.XnaToFnaHelper", "System.Void ApplyChanges(Microsoft.Xna.Framework.GraphicsDeviceManager)"); + // Let's just completely wreck everything. foreach (Type type in typeof(Form).Assembly.GetTypes()) { string name = type.FullName;