Promote IEmuClient to a full-fledged IExternalApi

also remove UnpauseEmulation() (duplicate of Unpause()) and rename
SetExtraPadding to SetClientExtraPadding (to match Lua)
This commit is contained in:
YoshiRulz 2020-06-17 05:56:37 +10:00
parent 9597be621a
commit a74d657a2a
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
6 changed files with 100 additions and 91 deletions

View File

@ -5,7 +5,7 @@ using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common namespace BizHawk.Client.Common
{ {
public interface IEmuClient public interface IEmuClientApi : IExternalApi
{ {
SystemInfo RunningSystem { get; } SystemInfo RunningSystem { get; }
@ -173,7 +173,7 @@ namespace BizHawk.Client.Common
/// <param name="top">Top padding</param> /// <param name="top">Top padding</param>
/// <param name="right">Right padding</param> /// <param name="right">Right padding</param>
/// <param name="bottom">Bottom padding</param> /// <param name="bottom">Bottom padding</param>
void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0); void SetClientExtraPadding(int left, int top = 0, int right = 0, int bottom = 0);
/// <summary> /// <summary>
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements /// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
@ -211,11 +211,6 @@ namespace BizHawk.Client.Common
void UnpauseAv(); void UnpauseAv();
/// <summary>
/// Resume the emulation
/// </summary>
void UnpauseEmulation();
void UpdateEmulatorAndVP(IEmulator emu = null); void UpdateEmulatorAndVP(IEmulator emu = null);
int Xpos(); int Xpos();

View File

@ -8,6 +8,7 @@ namespace BizHawk.Client.EmuHawk
public sealed class ApiContainer : ApiSubsetContainer public sealed class ApiContainer : ApiSubsetContainer
{ {
public ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)]; public ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)];
public IEmuClientApi EmuClient => (IEmuClientApi) Libraries[typeof(IEmuClientApi)];
public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)]; public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)];
public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)]; public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)];
public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)]; public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)];

View File

@ -16,6 +16,8 @@ namespace BizHawk.Client.EmuHawk
private static readonly Type[] CtorParamTypesB = { typeof(Action<string>) }; private static readonly Type[] CtorParamTypesB = { typeof(Action<string>) };
private static readonly Type[] CtorParamTypesEmuClientApi = { typeof(Action<string>), typeof(DisplayManager), typeof(InputManager), typeof(MainForm), typeof(Config), typeof(IEmulator), typeof(GameInfo) };
/// <remarks>TODO do we need to keep references to these because of GC weirdness? --yoshi</remarks> /// <remarks>TODO do we need to keep references to these because of GC weirdness? --yoshi</remarks>
private static ApiContainer? _container; private static ApiContainer? _container;
@ -33,9 +35,19 @@ namespace BizHawk.Client.EmuHawk
&& typeof(IExternalApi).IsAssignableFrom(t) && typeof(IExternalApi).IsAssignableFrom(t)
&& ServiceInjector.IsAvailable(serviceProvider, t))) && ServiceInjector.IsAvailable(serviceProvider, t)))
{ {
var instance = api.GetConstructor(CtorParamTypesA)?.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm }) //TODO if extra params are ignored, we can use the same array for every ConstructorInfo.Invoke call --yoshi
?? api.GetConstructor(CtorParamTypesB)?.Invoke(new object[] { logCallback }) object instance;
?? Activator.CreateInstance(api); if (typeof(IEmuClientApi).IsAssignableFrom(api))
{
instance = (api.GetConstructor(CtorParamTypesEmuClientApi) ?? throw new Exception("failed to call EmuClientApi's hack-filled ctor"))
.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm, GlobalWin.Config, GlobalWin.Emulator, GlobalWin.Game });
}
else
{
instance = api.GetConstructor(CtorParamTypesA)?.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm })
?? api.GetConstructor(CtorParamTypesB)?.Invoke(new object[] { logCallback })
?? Activator.CreateInstance(api);
}
ServiceInjector.UpdateServices(serviceProvider, instance); ServiceInjector.UpdateServices(serviceProvider, instance);
libDict.Add( libDict.Add(
api.GetInterfaces().First(intf => typeof(IExternalApi).IsAssignableFrom(intf) && intf != typeof(IExternalApi)), api.GetInterfaces().First(intf => typeof(IExternalApi).IsAssignableFrom(intf) && intf != typeof(IExternalApi)),
@ -46,7 +58,12 @@ namespace BizHawk.Client.EmuHawk
} }
public static IExternalApiProvider Restart(MainForm mainForm, IEmulatorServiceProvider newServiceProvider) public static IExternalApiProvider Restart(MainForm mainForm, IEmulatorServiceProvider newServiceProvider)
=> new BasicApiProvider(_container = Register(mainForm, newServiceProvider, Console.WriteLine)); {
GlobalWin.ClientApi = null;
_container = Register(mainForm, newServiceProvider, Console.WriteLine);
GlobalWin.ClientApi = _container.EmuClient as EmuClientApi;
return new BasicApiProvider(_container);
}
public static ApiContainer RestartLua(MainForm mainForm, IEmulatorServiceProvider newServiceProvider, Action<string> logCallback) public static ApiContainer RestartLua(MainForm mainForm, IEmulatorServiceProvider newServiceProvider, Action<string> logCallback)
=> _luaContainer = Register(mainForm, newServiceProvider, logCallback); => _luaContainer = Register(mainForm, newServiceProvider, logCallback);

View File

@ -8,204 +8,204 @@ namespace BizHawk.Client.EmuHawk
{ {
public static class ClientApi public static class ClientApi
{ {
/// <inheritdoc cref="IEmuClient.DoFrameAdvance"/> /// <inheritdoc cref="IEmuClientApi.DoFrameAdvance"/>
public static SystemInfo RunningSystem => GlobalWin.ClientApi.RunningSystem; public static SystemInfo RunningSystem => GlobalWin.ClientApi.RunningSystem;
/// <inheritdoc cref="IEmuClient.BeforeQuickLoad"/> /// <inheritdoc cref="IEmuClientApi.BeforeQuickLoad"/>
public static event BeforeQuickLoadEventHandler BeforeQuickLoad public static event BeforeQuickLoadEventHandler BeforeQuickLoad
{ {
add => GlobalWin.ClientApi.BeforeQuickLoad += value; add => GlobalWin.ClientApi.BeforeQuickLoad += value;
remove => GlobalWin.ClientApi.BeforeQuickLoad -= value; remove => GlobalWin.ClientApi.BeforeQuickLoad -= value;
} }
/// <inheritdoc cref="IEmuClient.BeforeQuickSave"/> /// <inheritdoc cref="IEmuClientApi.BeforeQuickSave"/>
public static event BeforeQuickSaveEventHandler BeforeQuickSave public static event BeforeQuickSaveEventHandler BeforeQuickSave
{ {
add => GlobalWin.ClientApi.BeforeQuickSave += value; add => GlobalWin.ClientApi.BeforeQuickSave += value;
remove => GlobalWin.ClientApi.BeforeQuickSave -= value; remove => GlobalWin.ClientApi.BeforeQuickSave -= value;
} }
/// <inheritdoc cref="IEmuClient.RomLoaded"/> /// <inheritdoc cref="IEmuClientApi.RomLoaded"/>
public static event EventHandler RomLoaded public static event EventHandler RomLoaded
{ {
add => GlobalWin.ClientApi.RomLoaded += value; add => GlobalWin.ClientApi.RomLoaded += value;
remove => GlobalWin.ClientApi.RomLoaded -= value; remove => GlobalWin.ClientApi.RomLoaded -= value;
} }
/// <inheritdoc cref="IEmuClient.StateLoaded"/> /// <inheritdoc cref="IEmuClientApi.StateLoaded"/>
public static event StateLoadedEventHandler StateLoaded public static event StateLoadedEventHandler StateLoaded
{ {
add => GlobalWin.ClientApi.StateLoaded += value; add => GlobalWin.ClientApi.StateLoaded += value;
remove => GlobalWin.ClientApi.StateLoaded -= value; remove => GlobalWin.ClientApi.StateLoaded -= value;
} }
/// <inheritdoc cref="IEmuClient.StateSaved"/> /// <inheritdoc cref="IEmuClientApi.StateSaved"/>
public static event StateSavedEventHandler StateSaved public static event StateSavedEventHandler StateSaved
{ {
add => GlobalWin.ClientApi.StateSaved += value; add => GlobalWin.ClientApi.StateSaved += value;
remove => GlobalWin.ClientApi.StateSaved -= value; remove => GlobalWin.ClientApi.StateSaved -= value;
} }
/// <inheritdoc cref="IEmuClient.BorderHeight"/> /// <inheritdoc cref="IEmuClientApi.BorderHeight"/>
public static int BorderHeight() => GlobalWin.ClientApi.BorderHeight(); public static int BorderHeight() => GlobalWin.ClientApi.BorderHeight();
/// <inheritdoc cref="IEmuClient.BorderWidth"/> /// <inheritdoc cref="IEmuClientApi.BorderWidth"/>
public static int BorderWidth() => GlobalWin.ClientApi.BorderWidth(); public static int BorderWidth() => GlobalWin.ClientApi.BorderWidth();
/// <inheritdoc cref="IEmuClient.BufferHeight"/> /// <inheritdoc cref="IEmuClientApi.BufferHeight"/>
public static int BufferHeight() => GlobalWin.ClientApi.BufferHeight(); public static int BufferHeight() => GlobalWin.ClientApi.BufferHeight();
/// <inheritdoc cref="IEmuClient.BufferWidth"/> /// <inheritdoc cref="IEmuClientApi.BufferWidth"/>
public static int BufferWidth() => GlobalWin.ClientApi.BufferWidth(); public static int BufferWidth() => GlobalWin.ClientApi.BufferWidth();
/// <inheritdoc cref="IEmuClient.ClearAutohold"/> /// <inheritdoc cref="IEmuClientApi.ClearAutohold"/>
public static void ClearAutohold() => GlobalWin.ClientApi.ClearAutohold(); public static void ClearAutohold() => GlobalWin.ClientApi.ClearAutohold();
/// <inheritdoc cref="IEmuClient.CloseEmulator"/> /// <inheritdoc cref="IEmuClientApi.CloseEmulator"/>
public static void CloseEmulator() => GlobalWin.ClientApi.CloseEmulator(); public static void CloseEmulator() => GlobalWin.ClientApi.CloseEmulator();
/// <inheritdoc cref="IEmuClient.CloseEmulatorWithCode"/> /// <inheritdoc cref="IEmuClientApi.CloseEmulatorWithCode"/>
public static void CloseEmulatorWithCode(int exitCode) => GlobalWin.ClientApi.CloseEmulatorWithCode(exitCode); public static void CloseEmulatorWithCode(int exitCode) => GlobalWin.ClientApi.CloseEmulatorWithCode(exitCode);
/// <inheritdoc cref="IEmuClient.CloseRom"/> /// <inheritdoc cref="IEmuClientApi.CloseRom"/>
public static void CloseRom() => GlobalWin.ClientApi.CloseRom(); public static void CloseRom() => GlobalWin.ClientApi.CloseRom();
/// <inheritdoc cref="IEmuClient.DisplayMessages"/> /// <inheritdoc cref="IEmuClientApi.DisplayMessages"/>
public static void DisplayMessages(bool value) => GlobalWin.ClientApi.DisplayMessages(value); public static void DisplayMessages(bool value) => GlobalWin.ClientApi.DisplayMessages(value);
/// <inheritdoc cref="IEmuClient.DoFrameAdvance"/> /// <inheritdoc cref="IEmuClientApi.DoFrameAdvance"/>
public static void DoFrameAdvance() => GlobalWin.ClientApi.DoFrameAdvance(); public static void DoFrameAdvance() => GlobalWin.ClientApi.DoFrameAdvance();
/// <inheritdoc cref="IEmuClient.DoFrameAdvanceAndUnpause"/> /// <inheritdoc cref="IEmuClientApi.DoFrameAdvanceAndUnpause"/>
public static void DoFrameAdvanceAndUnpause() => GlobalWin.ClientApi.DoFrameAdvanceAndUnpause(); public static void DoFrameAdvanceAndUnpause() => GlobalWin.ClientApi.DoFrameAdvanceAndUnpause();
/// <inheritdoc cref="IEmuClient.EnableRewind"/> /// <inheritdoc cref="IEmuClientApi.EnableRewind"/>
public static void EnableRewind(bool enabled) => GlobalWin.ClientApi.EnableRewind(enabled); public static void EnableRewind(bool enabled) => GlobalWin.ClientApi.EnableRewind(enabled);
/// <inheritdoc cref="IEmuClient.FrameSkip"/> /// <inheritdoc cref="IEmuClientApi.FrameSkip"/>
public static void FrameSkip(int numFrames) => GlobalWin.ClientApi.FrameSkip(numFrames); public static void FrameSkip(int numFrames) => GlobalWin.ClientApi.FrameSkip(numFrames);
/// <inheritdoc cref="IEmuClient.GetInput"/> /// <inheritdoc cref="IEmuClientApi.GetInput"/>
public static Joypad GetInput(int player) => GlobalWin.ClientApi.GetInput(player); public static Joypad GetInput(int player) => GlobalWin.ClientApi.GetInput(player);
/// <inheritdoc cref="IEmuClient.GetSoundOn"/> /// <inheritdoc cref="IEmuClientApi.GetSoundOn"/>
public static bool GetSoundOn() => GlobalWin.ClientApi.GetSoundOn(); public static bool GetSoundOn() => GlobalWin.ClientApi.GetSoundOn();
/// <inheritdoc cref="IEmuClient.GetTargetScanlineIntensity"/> /// <inheritdoc cref="IEmuClientApi.GetTargetScanlineIntensity"/>
public static int GetTargetScanlineIntensity() => GlobalWin.ClientApi.GetTargetScanlineIntensity(); public static int GetTargetScanlineIntensity() => GlobalWin.ClientApi.GetTargetScanlineIntensity();
/// <inheritdoc cref="IEmuClient.GetWindowSize"/> /// <inheritdoc cref="IEmuClientApi.GetWindowSize"/>
public static int GetWindowSize() => GlobalWin.ClientApi.GetWindowSize(); public static int GetWindowSize() => GlobalWin.ClientApi.GetWindowSize();
/// <inheritdoc cref="IEmuClient.InvisibleEmulation"/> /// <inheritdoc cref="IEmuClientApi.InvisibleEmulation"/>
public static void InvisibleEmulation(bool invisible) => GlobalWin.ClientApi.InvisibleEmulation(invisible); public static void InvisibleEmulation(bool invisible) => GlobalWin.ClientApi.InvisibleEmulation(invisible);
/// <inheritdoc cref="IEmuClient.IsPaused"/> /// <inheritdoc cref="IEmuClientApi.IsPaused"/>
public static bool IsPaused() => GlobalWin.ClientApi.IsPaused(); public static bool IsPaused() => GlobalWin.ClientApi.IsPaused();
/// <inheritdoc cref="IEmuClient.IsSeeking"/> /// <inheritdoc cref="IEmuClientApi.IsSeeking"/>
public static bool IsSeeking() => GlobalWin.ClientApi.IsSeeking(); public static bool IsSeeking() => GlobalWin.ClientApi.IsSeeking();
/// <inheritdoc cref="IEmuClient.IsTurbo"/> /// <inheritdoc cref="IEmuClientApi.IsTurbo"/>
public static bool IsTurbo() => GlobalWin.ClientApi.IsTurbo(); public static bool IsTurbo() => GlobalWin.ClientApi.IsTurbo();
/// <inheritdoc cref="IEmuClient.LoadState"/> /// <inheritdoc cref="IEmuClientApi.LoadState"/>
public static void LoadState(string name) => GlobalWin.ClientApi.LoadState(name); public static void LoadState(string name) => GlobalWin.ClientApi.LoadState(name);
/// <inheritdoc cref="IEmuClient.OnBeforeQuickLoad"/> /// <inheritdoc cref="IEmuClientApi.OnBeforeQuickLoad"/>
public static void OnBeforeQuickLoad(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickLoad(sender, quickSaveSlotName, out eventHandled); public static void OnBeforeQuickLoad(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickLoad(sender, quickSaveSlotName, out eventHandled);
/// <inheritdoc cref="IEmuClient.OnBeforeQuickSave"/> /// <inheritdoc cref="IEmuClientApi.OnBeforeQuickSave"/>
public static void OnBeforeQuickSave(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickSave(sender, quickSaveSlotName, out eventHandled); public static void OnBeforeQuickSave(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickSave(sender, quickSaveSlotName, out eventHandled);
/// <inheritdoc cref="IEmuClient.OnRomLoaded"/> /// <inheritdoc cref="IEmuClientApi.OnRomLoaded"/>
public static void OnRomLoaded(IEmulator emu) => GlobalWin.ClientApi.OnRomLoaded(emu); public static void OnRomLoaded(IEmulator emu) => GlobalWin.ClientApi.OnRomLoaded(emu);
/// <inheritdoc cref="IEmuClient.OnStateLoaded"/> /// <inheritdoc cref="IEmuClientApi.OnStateLoaded"/>
public static void OnStateLoaded(object sender, string stateName) => GlobalWin.ClientApi.OnStateLoaded(sender, stateName); public static void OnStateLoaded(object sender, string stateName) => GlobalWin.ClientApi.OnStateLoaded(sender, stateName);
/// <inheritdoc cref="IEmuClient.OnStateSaved"/> /// <inheritdoc cref="IEmuClientApi.OnStateSaved"/>
public static void OnStateSaved(object sender, string stateName) => GlobalWin.ClientApi.OnStateSaved(sender, stateName); public static void OnStateSaved(object sender, string stateName) => GlobalWin.ClientApi.OnStateSaved(sender, stateName);
/// <inheritdoc cref="IEmuClient.OpenRom"/> /// <inheritdoc cref="IEmuClientApi.OpenRom"/>
public static void OpenRom(string path) => GlobalWin.ClientApi.OpenRom(path); public static void OpenRom(string path) => GlobalWin.ClientApi.OpenRom(path);
/// <inheritdoc cref="IEmuClient.Pause"/> /// <inheritdoc cref="IEmuClientApi.Pause"/>
public static void Pause() => GlobalWin.ClientApi.Pause(); public static void Pause() => GlobalWin.ClientApi.Pause();
/// <inheritdoc cref="IEmuClient.PauseAv"/> /// <inheritdoc cref="IEmuClientApi.PauseAv"/>
public static void PauseAv() => GlobalWin.ClientApi.PauseAv(); public static void PauseAv() => GlobalWin.ClientApi.PauseAv();
/// <inheritdoc cref="IEmuClient.RebootCore"/> /// <inheritdoc cref="IEmuClientApi.RebootCore"/>
public static void RebootCore() => GlobalWin.ClientApi.RebootCore(); public static void RebootCore() => GlobalWin.ClientApi.RebootCore();
/// <inheritdoc cref="IEmuClient.SaveRam"/> /// <inheritdoc cref="IEmuClientApi.SaveRam"/>
public static void SaveRam() => GlobalWin.ClientApi.SaveRam(); public static void SaveRam() => GlobalWin.ClientApi.SaveRam();
/// <inheritdoc cref="IEmuClient.SaveState"/> /// <inheritdoc cref="IEmuClientApi.SaveState"/>
public static void SaveState(string name) => GlobalWin.ClientApi.SaveState(name); public static void SaveState(string name) => GlobalWin.ClientApi.SaveState(name);
/// <inheritdoc cref="IEmuClient.ScreenHeight"/> /// <inheritdoc cref="IEmuClientApi.ScreenHeight"/>
public static int ScreenHeight() => GlobalWin.ClientApi.ScreenHeight(); public static int ScreenHeight() => GlobalWin.ClientApi.ScreenHeight();
/// <inheritdoc cref="IEmuClient.Screenshot"/> /// <inheritdoc cref="IEmuClientApi.Screenshot"/>
public static void Screenshot(string path = null) => GlobalWin.ClientApi.Screenshot(path); public static void Screenshot(string path = null) => GlobalWin.ClientApi.Screenshot(path);
/// <inheritdoc cref="IEmuClient.ScreenshotToClipboard"/> /// <inheritdoc cref="IEmuClientApi.ScreenshotToClipboard"/>
public static void ScreenshotToClipboard() => GlobalWin.ClientApi.ScreenshotToClipboard(); public static void ScreenshotToClipboard() => GlobalWin.ClientApi.ScreenshotToClipboard();
/// <inheritdoc cref="IEmuClient.ScreenWidth"/> /// <inheritdoc cref="IEmuClientApi.ScreenWidth"/>
public static int ScreenWidth() => GlobalWin.ClientApi.ScreenWidth(); public static int ScreenWidth() => GlobalWin.ClientApi.ScreenWidth();
/// <inheritdoc cref="IEmuClient.SeekFrame"/> /// <inheritdoc cref="IEmuClientApi.SeekFrame"/>
public static void SeekFrame(int frame) => GlobalWin.ClientApi.SeekFrame(frame); public static void SeekFrame(int frame) => GlobalWin.ClientApi.SeekFrame(frame);
/// <inheritdoc cref="IEmuClient.SetExtraPadding"/> /// <inheritdoc cref="IEmuClientApi.SetClientExtraPadding"/>
public static void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetExtraPadding(left, top, right, bottom); public static void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetClientExtraPadding(left, top, right, bottom);
/// <inheritdoc cref="IEmuClient.SetGameExtraPadding"/> /// <inheritdoc cref="IEmuClientApi.SetGameExtraPadding"/>
public static void SetGameExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetGameExtraPadding(left, top, right, bottom); public static void SetGameExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetGameExtraPadding(left, top, right, bottom);
/// <inheritdoc cref="IEmuClient.SetInput"/> /// <inheritdoc cref="IEmuClientApi.SetInput"/>
public static void SetInput(int player, Joypad joypad) => GlobalWin.ClientApi.SetInput(player, joypad); public static void SetInput(int player, Joypad joypad) => GlobalWin.ClientApi.SetInput(player, joypad);
/// <inheritdoc cref="IEmuClient.SetScreenshotOSD"/> /// <inheritdoc cref="IEmuClientApi.SetScreenshotOSD"/>
public static void SetScreenshotOSD(bool value) => GlobalWin.ClientApi.SetScreenshotOSD(value); public static void SetScreenshotOSD(bool value) => GlobalWin.ClientApi.SetScreenshotOSD(value);
/// <inheritdoc cref="IEmuClient.SetSoundOn"/> /// <inheritdoc cref="IEmuClientApi.SetSoundOn"/>
public static void SetSoundOn(bool enable) => GlobalWin.ClientApi.SetSoundOn(enable); public static void SetSoundOn(bool enable) => GlobalWin.ClientApi.SetSoundOn(enable);
/// <inheritdoc cref="IEmuClient.SetTargetScanlineIntensity"/> /// <inheritdoc cref="IEmuClientApi.SetTargetScanlineIntensity"/>
public static void SetTargetScanlineIntensity(int val) => GlobalWin.ClientApi.SetTargetScanlineIntensity(val); public static void SetTargetScanlineIntensity(int val) => GlobalWin.ClientApi.SetTargetScanlineIntensity(val);
/// <inheritdoc cref="IEmuClient.SetWindowSize"/> /// <inheritdoc cref="IEmuClientApi.SetWindowSize"/>
public static void SetWindowSize(int size) => GlobalWin.ClientApi.SetWindowSize(size); public static void SetWindowSize(int size) => GlobalWin.ClientApi.SetWindowSize(size);
/// <inheritdoc cref="IEmuClient.SpeedMode"/> /// <inheritdoc cref="IEmuClientApi.SpeedMode"/>
public static void SpeedMode(int percent) => GlobalWin.ClientApi.SpeedMode(percent); public static void SpeedMode(int percent) => GlobalWin.ClientApi.SpeedMode(percent);
/// <inheritdoc cref="IEmuClient.TogglePause"/> /// <inheritdoc cref="IEmuClientApi.TogglePause"/>
public static void TogglePause() => GlobalWin.ClientApi.TogglePause(); public static void TogglePause() => GlobalWin.ClientApi.TogglePause();
/// <inheritdoc cref="IEmuClient.TransformPoint"/> /// <inheritdoc cref="IEmuClientApi.TransformPoint"/>
public static Point TransformPoint(Point point) => GlobalWin.ClientApi.TransformPoint(point); public static Point TransformPoint(Point point) => GlobalWin.ClientApi.TransformPoint(point);
/// <inheritdoc cref="IEmuClient.Unpause"/> /// <inheritdoc cref="IEmuClientApi.Unpause"/>
public static void Unpause() => GlobalWin.ClientApi.Unpause(); public static void Unpause() => GlobalWin.ClientApi.Unpause();
/// <inheritdoc cref="IEmuClient.UnpauseAv"/> /// <inheritdoc cref="IEmuClientApi.UnpauseAv"/>
public static void UnpauseAv() => GlobalWin.ClientApi.UnpauseAv(); public static void UnpauseAv() => GlobalWin.ClientApi.UnpauseAv();
/// <inheritdoc cref="IEmuClient.UnpauseEmulation"/> /// <inheritdoc cref="Unpause"/>
public static void UnpauseEmulation() => GlobalWin.ClientApi.UnpauseEmulation(); public static void UnpauseEmulation() => Unpause();
/// <inheritdoc cref="IEmuClient.UpdateEmulatorAndVP"/> /// <inheritdoc cref="IEmuClientApi.UpdateEmulatorAndVP"/>
public static void UpdateEmulatorAndVP(IEmulator emu = null) => GlobalWin.ClientApi.UpdateEmulatorAndVP(emu); public static void UpdateEmulatorAndVP(IEmulator emu = null) => GlobalWin.ClientApi.UpdateEmulatorAndVP(emu);
/// <inheritdoc cref="IEmuClient.Xpos"/> /// <inheritdoc cref="IEmuClientApi.Xpos"/>
public static int Xpos() => GlobalWin.ClientApi.Xpos(); public static int Xpos() => GlobalWin.ClientApi.Xpos();
/// <inheritdoc cref="IEmuClient.Ypos"/> /// <inheritdoc cref="IEmuClientApi.Ypos"/>
public static int Ypos() => GlobalWin.ClientApi.Ypos(); public static int Ypos() => GlobalWin.ClientApi.Ypos();
} }
} }

View File

@ -15,7 +15,7 @@ using BizHawk.Emulation.Cores.Sega.MasterSystem;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
public class EmuClientApi : IEmuClient public class EmuClientApi : IEmuClientApi
{ {
private List<Joypad> _allJoyPads; private List<Joypad> _allJoyPads;
@ -27,6 +27,8 @@ namespace BizHawk.Client.EmuHawk
private readonly MainForm _mainForm; private readonly MainForm _mainForm;
private readonly Action<string> _logCallback;
private IEmulator _maybeEmulator; private IEmulator _maybeEmulator;
public IEmulator Emulator; public IEmulator Emulator;
@ -83,13 +85,14 @@ namespace BizHawk.Client.EmuHawk
public event StateSavedEventHandler StateSaved; public event StateSavedEventHandler StateSaved;
public EmuClientApi(Config config, DisplayManager displayManager, IEmulator emulator, GameInfo game, InputManager inputManager, MainForm mainForm) public EmuClientApi(Action<string> logCallback, DisplayManager displayManager, InputManager inputManager, MainForm mainForm, Config config, IEmulator emulator, GameInfo game)
{ {
_config = config; _config = config;
_displayManager = displayManager; _displayManager = displayManager;
Emulator = emulator; Emulator = emulator;
Game = game; Game = game;
_inputManager = inputManager; _inputManager = inputManager;
_logCallback = logCallback;
_mainForm = mainForm; _mainForm = mainForm;
} }
@ -121,7 +124,7 @@ namespace BizHawk.Client.EmuHawk
public void DoFrameAdvanceAndUnpause() public void DoFrameAdvanceAndUnpause()
{ {
DoFrameAdvance(); DoFrameAdvance();
UnpauseEmulation(); Unpause();
} }
public void EnableRewind(bool enabled) => _mainForm.EnableRewind(enabled); public void EnableRewind(bool enabled) => _mainForm.EnableRewind(enabled);
@ -135,7 +138,7 @@ namespace BizHawk.Client.EmuHawk
} }
else else
{ {
Console.WriteLine("Invalid frame skip value"); _logCallback("Invalid frame skip value");
} }
} }
@ -265,7 +268,7 @@ namespace BizHawk.Client.EmuHawk
if (!wasPaused) _mainForm.UnpauseEmulator(); if (!wasPaused) _mainForm.UnpauseEmulator();
} }
public void SetExtraPadding(int left, int top, int right, int bottom) public void SetClientExtraPadding(int left, int top, int right, int bottom)
{ {
_displayManager.ClientExtraPadding = new Padding(left, top, right, bottom); _displayManager.ClientExtraPadding = new Padding(left, top, right, bottom);
_mainForm.FrameBufferResized(); _mainForm.FrameBufferResized();
@ -329,14 +332,14 @@ namespace BizHawk.Client.EmuHawk
} }
else else
{ {
Console.WriteLine("Invalid window size"); _logCallback("Invalid window size");
} }
} }
public void SpeedMode(int percent) public void SpeedMode(int percent)
{ {
if (percent.StrictlyBoundedBy(0.RangeTo(6400))) _mainForm.ClickSpeedItem(percent); if (percent.StrictlyBoundedBy(0.RangeTo(6400))) _mainForm.ClickSpeedItem(percent);
else Console.WriteLine("Invalid speed value"); else _logCallback("Invalid speed value");
} }
public void TogglePause() => _mainForm.TogglePause(); public void TogglePause() => _mainForm.TogglePause();
@ -347,8 +350,6 @@ namespace BizHawk.Client.EmuHawk
public void UnpauseAv() => _mainForm.PauseAvi = false; public void UnpauseAv() => _mainForm.PauseAvi = false;
public void UnpauseEmulation() => _mainForm.UnpauseEmulator();
public void UpdateEmulatorAndVP(IEmulator emu) public void UpdateEmulatorAndVP(IEmulator emu)
{ {
_maybeEmulator = emu; _maybeEmulator = emu;

View File

@ -276,8 +276,6 @@ namespace BizHawk.Client.EmuHawk
public MainForm(string[] args) public MainForm(string[] args)
{ {
GlobalWin.ClientApi = new EmuClientApi(Config, DisplayManager, Emulator, Game, InputManager, this);
//do this threaded stuff early so it has plenty of time to run in background //do this threaded stuff early so it has plenty of time to run in background
Database.InitializeDatabase(Path.Combine(PathUtils.ExeDirectoryPath, "gamedb", "gamedb.txt")); Database.InitializeDatabase(Path.Combine(PathUtils.ExeDirectoryPath, "gamedb", "gamedb.txt"));
BootGodDb.Initialize(Path.Combine(PathUtils.ExeDirectoryPath, "gamedb")); BootGodDb.Initialize(Path.Combine(PathUtils.ExeDirectoryPath, "gamedb"));
@ -295,7 +293,7 @@ namespace BizHawk.Client.EmuHawk
Icon = Properties.Resources.logo; Icon = Properties.Resources.logo;
InitializeComponent(); InitializeComponent();
SetImages(); SetImages();
Game = GameInfo.NullInstance; GlobalWin.Game = GameInfo.NullInstance;
_throttle = new Throttle(); _throttle = new Throttle();
@ -829,7 +827,8 @@ namespace BizHawk.Client.EmuHawk
private set private set
{ {
GlobalWin.ClientApi.Emulator = GlobalWin.Emulator = value; GlobalWin.Emulator = value;
if (GlobalWin.ClientApi != null) GlobalWin.ClientApi.Emulator = value; // first call to this setter is in the ctor, before the APIs have been registered by the ToolManager ctor
_currentVideoProvider = GlobalWin.Emulator.AsVideoProviderOrDefault(); _currentVideoProvider = GlobalWin.Emulator.AsVideoProviderOrDefault();
_currentSoundProvider = GlobalWin.Emulator.AsSoundProviderOrDefault(); _currentSoundProvider = GlobalWin.Emulator.AsSoundProviderOrDefault();
} }
@ -856,11 +855,7 @@ namespace BizHawk.Client.EmuHawk
private set => GlobalWin.MovieSession = value; private set => GlobalWin.MovieSession = value;
} }
private GameInfo Game private GameInfo Game => GlobalWin.Game;
{
get => GlobalWin.Game;
set => GlobalWin.ClientApi.Game = GlobalWin.Game = value;
}
private Sound Sound => GlobalWin.Sound; private Sound Sound => GlobalWin.Sound;
public CheatCollection CheatList { get; } public CheatCollection CheatList { get; }