diff --git a/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs b/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs index 153e1c482e..ba8a81bf72 100644 --- a/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs +++ b/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs @@ -12,7 +12,9 @@ namespace BizHawk.Client.EmuHawk { public static class ApiManager { - private static readonly Type[] CtorParamTypes = { typeof(Action) }; + private static readonly Type[] CtorParamTypesA = { typeof(Action), typeof(DisplayManager), typeof(InputManager), typeof(MainForm) }; + + private static readonly Type[] CtorParamTypesB = { typeof(Action) }; /// TODO do we need to keep references to these because of GC weirdness? --yoshi private static ApiContainer? _container; @@ -21,7 +23,6 @@ namespace BizHawk.Client.EmuHawk private static ApiContainer Register(IEmulatorServiceProvider serviceProvider, Action logCallback) { - var ctorParamTypes = CtorParamTypes; var libDict = new Dictionary(); foreach (var api in Assembly.GetAssembly(typeof(ApiSubsetContainer)).GetTypes() .Concat(Assembly.GetAssembly(typeof(ApiContainer)).GetTypes()) @@ -29,7 +30,8 @@ namespace BizHawk.Client.EmuHawk && typeof(IExternalApi).IsAssignableFrom(t) && ServiceInjector.IsAvailable(serviceProvider, t))) { - var instance = api.GetConstructor(ctorParamTypes)?.Invoke(new object[] { logCallback }) + var instance = api.GetConstructor(CtorParamTypesA)?.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, GlobalWin.MainForm }) + ?? api.GetConstructor(CtorParamTypesB)?.Invoke(new object[] { logCallback }) ?? Activator.CreateInstance(api); ServiceInjector.UpdateServices(serviceProvider, instance); libDict.Add( diff --git a/src/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs b/src/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs index ace1be94bb..c8d9bdb796 100644 --- a/src/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs +++ b/src/BizHawk.Client.EmuHawk/Api/Libraries/InputApi.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Windows.Forms; @@ -8,10 +9,23 @@ namespace BizHawk.Client.EmuHawk { public sealed class InputApi : IInput { + private readonly DisplayManager _displayManager; + + private readonly InputManager _inputManager; + + private readonly MainForm _mainForm; + + public InputApi(Action logCallback, DisplayManager displayManager, InputManager inputManager, MainForm mainForm) + { + _displayManager = displayManager; + _inputManager = inputManager; + _mainForm = mainForm; + } + public Dictionary Get() { var buttons = new Dictionary(); - foreach (var kvp in GlobalWin.InputManager.ControllerInputCoalescer.BoolButtons().Where(kvp => kvp.Value)) buttons[kvp.Key] = true; + foreach (var kvp in _inputManager.ControllerInputCoalescer.BoolButtons().Where(kvp => kvp.Value)) buttons[kvp.Key] = true; return buttons; } @@ -19,7 +33,7 @@ namespace BizHawk.Client.EmuHawk { var buttons = new Dictionary(); // TODO - need to specify whether in "emu" or "native" coordinate space. - var p = GlobalWin.DisplayManager.UntransformPoint(Control.MousePosition); + var p = _displayManager.UntransformPoint(Control.MousePosition); buttons["X"] = p.X; buttons["Y"] = p.Y; buttons[MouseButtons.Left.ToString()] = (Control.MouseButtons & MouseButtons.Left) != 0; @@ -27,7 +41,7 @@ namespace BizHawk.Client.EmuHawk buttons[MouseButtons.Right.ToString()] = (Control.MouseButtons & MouseButtons.Right) != 0; buttons[MouseButtons.XButton1.ToString()] = (Control.MouseButtons & MouseButtons.XButton1) != 0; buttons[MouseButtons.XButton2.ToString()] = (Control.MouseButtons & MouseButtons.XButton2) != 0; - buttons["Wheel"] = GlobalWin.MainForm.MouseWheelTracker; + buttons["Wheel"] = _mainForm.MouseWheelTracker; return buttons; } } diff --git a/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs b/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs index 14aff2821d..20d1740557 100644 --- a/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs +++ b/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs @@ -8,15 +8,16 @@ namespace BizHawk.Client.EmuHawk { public sealed class SaveStateApi : ISaveState { - public SaveStateApi(Action logCallback) - { - LogCallback = logCallback; - } - - public SaveStateApi() : this(Console.WriteLine) {} + private readonly MainForm _mainForm; private readonly Action LogCallback; + public SaveStateApi(Action logCallback, DisplayManager displayManager, InputManager inputManager, MainForm mainForm) + { + LogCallback = logCallback; + _mainForm = mainForm; + } + public void Load(string path, bool suppressOSD) { if (!File.Exists(path)) @@ -25,19 +26,19 @@ namespace BizHawk.Client.EmuHawk return; } - GlobalWin.MainForm.LoadState(path, Path.GetFileName(path), suppressOSD); + _mainForm.LoadState(path, Path.GetFileName(path), suppressOSD); } public void LoadSlot(int slotNum, bool suppressOSD) { - if (0.RangeTo(9).Contains(slotNum)) GlobalWin.MainForm.LoadQuickSave($"QuickSave{slotNum}", suppressOSD); + if (0.RangeTo(9).Contains(slotNum)) _mainForm.LoadQuickSave($"QuickSave{slotNum}", suppressOSD); } - public void Save(string path, bool suppressOSD) => GlobalWin.MainForm.SaveState(path, path, true, suppressOSD); + public void Save(string path, bool suppressOSD) => _mainForm.SaveState(path, path, true, suppressOSD); public void SaveSlot(int slotNum, bool suppressOSD) { - if (0.RangeTo(9).Contains(slotNum)) GlobalWin.MainForm.SaveQuickSave($"QuickSave{slotNum}", true, suppressOSD); + if (0.RangeTo(9).Contains(slotNum)) _mainForm.SaveQuickSave($"QuickSave{slotNum}", true, suppressOSD); } } }