Skip to content

Commit a74d657

Browse files
committed
Promote IEmuClient to a full-fledged IExternalApi
also remove UnpauseEmulation() (duplicate of Unpause()) and rename SetExtraPadding to SetClientExtraPadding (to match Lua)
1 parent 9597be6 commit a74d657

File tree

6 files changed

+100
-91
lines changed

6 files changed

+100
-91
lines changed

src/BizHawk.Client.Common/Api/Interfaces/IEmuClient.cs renamed to src/BizHawk.Client.Common/Api/Interfaces/IEmuClientApi.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace BizHawk.Client.Common
77
{
8-
public interface IEmuClient
8+
public interface IEmuClientApi : IExternalApi
99
{
1010
SystemInfo RunningSystem { get; }
1111

@@ -173,7 +173,7 @@ public interface IEmuClient
173173
/// <param name="top">Top padding</param>
174174
/// <param name="right">Right padding</param>
175175
/// <param name="bottom">Bottom padding</param>
176-
void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0);
176+
void SetClientExtraPadding(int left, int top = 0, int right = 0, int bottom = 0);
177177

178178
/// <summary>
179179
/// Sets the extra padding added to the 'native' surface so that you can draw HUD elements in predictable placements
@@ -211,11 +211,6 @@ public interface IEmuClient
211211

212212
void UnpauseAv();
213213

214-
/// <summary>
215-
/// Resume the emulation
216-
/// </summary>
217-
void UnpauseEmulation();
218-
219214
void UpdateEmulatorAndVP(IEmulator emu = null);
220215

221216
int Xpos();

src/BizHawk.Client.EmuHawk/Api/ApiContainer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace BizHawk.Client.EmuHawk
88
public sealed class ApiContainer : ApiSubsetContainer
99
{
1010
public ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)];
11+
public IEmuClientApi EmuClient => (IEmuClientApi) Libraries[typeof(IEmuClientApi)];
1112
public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)];
1213
public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)];
1314
public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)];

src/BizHawk.Client.EmuHawk/Api/ApiManager.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public static class ApiManager
1616

1717
private static readonly Type[] CtorParamTypesB = { typeof(Action<string>) };
1818

19+
private static readonly Type[] CtorParamTypesEmuClientApi = { typeof(Action<string>), typeof(DisplayManager), typeof(InputManager), typeof(MainForm), typeof(Config), typeof(IEmulator), typeof(GameInfo) };
20+
1921
/// <remarks>TODO do we need to keep references to these because of GC weirdness? --yoshi</remarks>
2022
private static ApiContainer? _container;
2123

@@ -33,9 +35,19 @@ private static ApiContainer Register(
3335
&& typeof(IExternalApi).IsAssignableFrom(t)
3436
&& ServiceInjector.IsAvailable(serviceProvider, t)))
3537
{
36-
var instance = api.GetConstructor(CtorParamTypesA)?.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm })
37-
?? api.GetConstructor(CtorParamTypesB)?.Invoke(new object[] { logCallback })
38-
?? Activator.CreateInstance(api);
38+
//TODO if extra params are ignored, we can use the same array for every ConstructorInfo.Invoke call --yoshi
39+
object instance;
40+
if (typeof(IEmuClientApi).IsAssignableFrom(api))
41+
{
42+
instance = (api.GetConstructor(CtorParamTypesEmuClientApi) ?? throw new Exception("failed to call EmuClientApi's hack-filled ctor"))
43+
.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm, GlobalWin.Config, GlobalWin.Emulator, GlobalWin.Game });
44+
}
45+
else
46+
{
47+
instance = api.GetConstructor(CtorParamTypesA)?.Invoke(new object[] { logCallback, GlobalWin.DisplayManager, GlobalWin.InputManager, mainForm })
48+
?? api.GetConstructor(CtorParamTypesB)?.Invoke(new object[] { logCallback })
49+
?? Activator.CreateInstance(api);
50+
}
3951
ServiceInjector.UpdateServices(serviceProvider, instance);
4052
libDict.Add(
4153
api.GetInterfaces().First(intf => typeof(IExternalApi).IsAssignableFrom(intf) && intf != typeof(IExternalApi)),
@@ -46,7 +58,12 @@ private static ApiContainer Register(
4658
}
4759

4860
public static IExternalApiProvider Restart(MainForm mainForm, IEmulatorServiceProvider newServiceProvider)
49-
=> new BasicApiProvider(_container = Register(mainForm, newServiceProvider, Console.WriteLine));
61+
{
62+
GlobalWin.ClientApi = null;
63+
_container = Register(mainForm, newServiceProvider, Console.WriteLine);
64+
GlobalWin.ClientApi = _container.EmuClient as EmuClientApi;
65+
return new BasicApiProvider(_container);
66+
}
5067

5168
public static ApiContainer RestartLua(MainForm mainForm, IEmulatorServiceProvider newServiceProvider, Action<string> logCallback)
5269
=> _luaContainer = Register(mainForm, newServiceProvider, logCallback);

src/BizHawk.Client.EmuHawk/Api/ClientApi.cs

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -8,204 +8,204 @@ namespace BizHawk.Client.EmuHawk
88
{
99
public static class ClientApi
1010
{
11-
/// <inheritdoc cref="IEmuClient.DoFrameAdvance"/>
11+
/// <inheritdoc cref="IEmuClientApi.DoFrameAdvance"/>
1212
public static SystemInfo RunningSystem => GlobalWin.ClientApi.RunningSystem;
1313

14-
/// <inheritdoc cref="IEmuClient.BeforeQuickLoad"/>
14+
/// <inheritdoc cref="IEmuClientApi.BeforeQuickLoad"/>
1515
public static event BeforeQuickLoadEventHandler BeforeQuickLoad
1616
{
1717
add => GlobalWin.ClientApi.BeforeQuickLoad += value;
1818
remove => GlobalWin.ClientApi.BeforeQuickLoad -= value;
1919
}
2020

21-
/// <inheritdoc cref="IEmuClient.BeforeQuickSave"/>
21+
/// <inheritdoc cref="IEmuClientApi.BeforeQuickSave"/>
2222
public static event BeforeQuickSaveEventHandler BeforeQuickSave
2323
{
2424
add => GlobalWin.ClientApi.BeforeQuickSave += value;
2525
remove => GlobalWin.ClientApi.BeforeQuickSave -= value;
2626
}
2727

28-
/// <inheritdoc cref="IEmuClient.RomLoaded"/>
28+
/// <inheritdoc cref="IEmuClientApi.RomLoaded"/>
2929
public static event EventHandler RomLoaded
3030
{
3131
add => GlobalWin.ClientApi.RomLoaded += value;
3232
remove => GlobalWin.ClientApi.RomLoaded -= value;
3333
}
3434

35-
/// <inheritdoc cref="IEmuClient.StateLoaded"/>
35+
/// <inheritdoc cref="IEmuClientApi.StateLoaded"/>
3636
public static event StateLoadedEventHandler StateLoaded
3737
{
3838
add => GlobalWin.ClientApi.StateLoaded += value;
3939
remove => GlobalWin.ClientApi.StateLoaded -= value;
4040
}
4141

42-
/// <inheritdoc cref="IEmuClient.StateSaved"/>
42+
/// <inheritdoc cref="IEmuClientApi.StateSaved"/>
4343
public static event StateSavedEventHandler StateSaved
4444
{
4545
add => GlobalWin.ClientApi.StateSaved += value;
4646
remove => GlobalWin.ClientApi.StateSaved -= value;
4747
}
4848

49-
/// <inheritdoc cref="IEmuClient.BorderHeight"/>
49+
/// <inheritdoc cref="IEmuClientApi.BorderHeight"/>
5050
public static int BorderHeight() => GlobalWin.ClientApi.BorderHeight();
5151

52-
/// <inheritdoc cref="IEmuClient.BorderWidth"/>
52+
/// <inheritdoc cref="IEmuClientApi.BorderWidth"/>
5353
public static int BorderWidth() => GlobalWin.ClientApi.BorderWidth();
5454

55-
/// <inheritdoc cref="IEmuClient.BufferHeight"/>
55+
/// <inheritdoc cref="IEmuClientApi.BufferHeight"/>
5656
public static int BufferHeight() => GlobalWin.ClientApi.BufferHeight();
5757

58-
/// <inheritdoc cref="IEmuClient.BufferWidth"/>
58+
/// <inheritdoc cref="IEmuClientApi.BufferWidth"/>
5959
public static int BufferWidth() => GlobalWin.ClientApi.BufferWidth();
6060

61-
/// <inheritdoc cref="IEmuClient.ClearAutohold"/>
61+
/// <inheritdoc cref="IEmuClientApi.ClearAutohold"/>
6262
public static void ClearAutohold() => GlobalWin.ClientApi.ClearAutohold();
6363

64-
/// <inheritdoc cref="IEmuClient.CloseEmulator"/>
64+
/// <inheritdoc cref="IEmuClientApi.CloseEmulator"/>
6565
public static void CloseEmulator() => GlobalWin.ClientApi.CloseEmulator();
6666

67-
/// <inheritdoc cref="IEmuClient.CloseEmulatorWithCode"/>
67+
/// <inheritdoc cref="IEmuClientApi.CloseEmulatorWithCode"/>
6868
public static void CloseEmulatorWithCode(int exitCode) => GlobalWin.ClientApi.CloseEmulatorWithCode(exitCode);
6969

70-
/// <inheritdoc cref="IEmuClient.CloseRom"/>
70+
/// <inheritdoc cref="IEmuClientApi.CloseRom"/>
7171
public static void CloseRom() => GlobalWin.ClientApi.CloseRom();
7272

73-
/// <inheritdoc cref="IEmuClient.DisplayMessages"/>
73+
/// <inheritdoc cref="IEmuClientApi.DisplayMessages"/>
7474
public static void DisplayMessages(bool value) => GlobalWin.ClientApi.DisplayMessages(value);
7575

76-
/// <inheritdoc cref="IEmuClient.DoFrameAdvance"/>
76+
/// <inheritdoc cref="IEmuClientApi.DoFrameAdvance"/>
7777
public static void DoFrameAdvance() => GlobalWin.ClientApi.DoFrameAdvance();
7878

79-
/// <inheritdoc cref="IEmuClient.DoFrameAdvanceAndUnpause"/>
79+
/// <inheritdoc cref="IEmuClientApi.DoFrameAdvanceAndUnpause"/>
8080
public static void DoFrameAdvanceAndUnpause() => GlobalWin.ClientApi.DoFrameAdvanceAndUnpause();
8181

82-
/// <inheritdoc cref="IEmuClient.EnableRewind"/>
82+
/// <inheritdoc cref="IEmuClientApi.EnableRewind"/>
8383
public static void EnableRewind(bool enabled) => GlobalWin.ClientApi.EnableRewind(enabled);
8484

85-
/// <inheritdoc cref="IEmuClient.FrameSkip"/>
85+
/// <inheritdoc cref="IEmuClientApi.FrameSkip"/>
8686
public static void FrameSkip(int numFrames) => GlobalWin.ClientApi.FrameSkip(numFrames);
8787

88-
/// <inheritdoc cref="IEmuClient.GetInput"/>
88+
/// <inheritdoc cref="IEmuClientApi.GetInput"/>
8989
public static Joypad GetInput(int player) => GlobalWin.ClientApi.GetInput(player);
9090

91-
/// <inheritdoc cref="IEmuClient.GetSoundOn"/>
91+
/// <inheritdoc cref="IEmuClientApi.GetSoundOn"/>
9292
public static bool GetSoundOn() => GlobalWin.ClientApi.GetSoundOn();
9393

94-
/// <inheritdoc cref="IEmuClient.GetTargetScanlineIntensity"/>
94+
/// <inheritdoc cref="IEmuClientApi.GetTargetScanlineIntensity"/>
9595
public static int GetTargetScanlineIntensity() => GlobalWin.ClientApi.GetTargetScanlineIntensity();
9696

97-
/// <inheritdoc cref="IEmuClient.GetWindowSize"/>
97+
/// <inheritdoc cref="IEmuClientApi.GetWindowSize"/>
9898
public static int GetWindowSize() => GlobalWin.ClientApi.GetWindowSize();
9999

100-
/// <inheritdoc cref="IEmuClient.InvisibleEmulation"/>
100+
/// <inheritdoc cref="IEmuClientApi.InvisibleEmulation"/>
101101
public static void InvisibleEmulation(bool invisible) => GlobalWin.ClientApi.InvisibleEmulation(invisible);
102102

103-
/// <inheritdoc cref="IEmuClient.IsPaused"/>
103+
/// <inheritdoc cref="IEmuClientApi.IsPaused"/>
104104
public static bool IsPaused() => GlobalWin.ClientApi.IsPaused();
105105

106-
/// <inheritdoc cref="IEmuClient.IsSeeking"/>
106+
/// <inheritdoc cref="IEmuClientApi.IsSeeking"/>
107107
public static bool IsSeeking() => GlobalWin.ClientApi.IsSeeking();
108108

109-
/// <inheritdoc cref="IEmuClient.IsTurbo"/>
109+
/// <inheritdoc cref="IEmuClientApi.IsTurbo"/>
110110
public static bool IsTurbo() => GlobalWin.ClientApi.IsTurbo();
111111

112-
/// <inheritdoc cref="IEmuClient.LoadState"/>
112+
/// <inheritdoc cref="IEmuClientApi.LoadState"/>
113113
public static void LoadState(string name) => GlobalWin.ClientApi.LoadState(name);
114114

115-
/// <inheritdoc cref="IEmuClient.OnBeforeQuickLoad"/>
115+
/// <inheritdoc cref="IEmuClientApi.OnBeforeQuickLoad"/>
116116
public static void OnBeforeQuickLoad(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickLoad(sender, quickSaveSlotName, out eventHandled);
117117

118-
/// <inheritdoc cref="IEmuClient.OnBeforeQuickSave"/>
118+
/// <inheritdoc cref="IEmuClientApi.OnBeforeQuickSave"/>
119119
public static void OnBeforeQuickSave(object sender, string quickSaveSlotName, out bool eventHandled) => GlobalWin.ClientApi.OnBeforeQuickSave(sender, quickSaveSlotName, out eventHandled);
120120

121-
/// <inheritdoc cref="IEmuClient.OnRomLoaded"/>
121+
/// <inheritdoc cref="IEmuClientApi.OnRomLoaded"/>
122122
public static void OnRomLoaded(IEmulator emu) => GlobalWin.ClientApi.OnRomLoaded(emu);
123123

124-
/// <inheritdoc cref="IEmuClient.OnStateLoaded"/>
124+
/// <inheritdoc cref="IEmuClientApi.OnStateLoaded"/>
125125
public static void OnStateLoaded(object sender, string stateName) => GlobalWin.ClientApi.OnStateLoaded(sender, stateName);
126126

127-
/// <inheritdoc cref="IEmuClient.OnStateSaved"/>
127+
/// <inheritdoc cref="IEmuClientApi.OnStateSaved"/>
128128
public static void OnStateSaved(object sender, string stateName) => GlobalWin.ClientApi.OnStateSaved(sender, stateName);
129129

130-
/// <inheritdoc cref="IEmuClient.OpenRom"/>
130+
/// <inheritdoc cref="IEmuClientApi.OpenRom"/>
131131
public static void OpenRom(string path) => GlobalWin.ClientApi.OpenRom(path);
132132

133-
/// <inheritdoc cref="IEmuClient.Pause"/>
133+
/// <inheritdoc cref="IEmuClientApi.Pause"/>
134134
public static void Pause() => GlobalWin.ClientApi.Pause();
135135

136-
/// <inheritdoc cref="IEmuClient.PauseAv"/>
136+
/// <inheritdoc cref="IEmuClientApi.PauseAv"/>
137137
public static void PauseAv() => GlobalWin.ClientApi.PauseAv();
138138

139-
/// <inheritdoc cref="IEmuClient.RebootCore"/>
139+
/// <inheritdoc cref="IEmuClientApi.RebootCore"/>
140140
public static void RebootCore() => GlobalWin.ClientApi.RebootCore();
141141

142-
/// <inheritdoc cref="IEmuClient.SaveRam"/>
142+
/// <inheritdoc cref="IEmuClientApi.SaveRam"/>
143143
public static void SaveRam() => GlobalWin.ClientApi.SaveRam();
144144

145-
/// <inheritdoc cref="IEmuClient.SaveState"/>
145+
/// <inheritdoc cref="IEmuClientApi.SaveState"/>
146146
public static void SaveState(string name) => GlobalWin.ClientApi.SaveState(name);
147147

148-
/// <inheritdoc cref="IEmuClient.ScreenHeight"/>
148+
/// <inheritdoc cref="IEmuClientApi.ScreenHeight"/>
149149
public static int ScreenHeight() => GlobalWin.ClientApi.ScreenHeight();
150150

151-
/// <inheritdoc cref="IEmuClient.Screenshot"/>
151+
/// <inheritdoc cref="IEmuClientApi.Screenshot"/>
152152
public static void Screenshot(string path = null) => GlobalWin.ClientApi.Screenshot(path);
153153

154-
/// <inheritdoc cref="IEmuClient.ScreenshotToClipboard"/>
154+
/// <inheritdoc cref="IEmuClientApi.ScreenshotToClipboard"/>
155155
public static void ScreenshotToClipboard() => GlobalWin.ClientApi.ScreenshotToClipboard();
156156

157-
/// <inheritdoc cref="IEmuClient.ScreenWidth"/>
157+
/// <inheritdoc cref="IEmuClientApi.ScreenWidth"/>
158158
public static int ScreenWidth() => GlobalWin.ClientApi.ScreenWidth();
159159

160-
/// <inheritdoc cref="IEmuClient.SeekFrame"/>
160+
/// <inheritdoc cref="IEmuClientApi.SeekFrame"/>
161161
public static void SeekFrame(int frame) => GlobalWin.ClientApi.SeekFrame(frame);
162162

163-
/// <inheritdoc cref="IEmuClient.SetExtraPadding"/>
164-
public static void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetExtraPadding(left, top, right, bottom);
163+
/// <inheritdoc cref="IEmuClientApi.SetClientExtraPadding"/>
164+
public static void SetExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetClientExtraPadding(left, top, right, bottom);
165165

166-
/// <inheritdoc cref="IEmuClient.SetGameExtraPadding"/>
166+
/// <inheritdoc cref="IEmuClientApi.SetGameExtraPadding"/>
167167
public static void SetGameExtraPadding(int left, int top = 0, int right = 0, int bottom = 0) => GlobalWin.ClientApi.SetGameExtraPadding(left, top, right, bottom);
168168

169-
/// <inheritdoc cref="IEmuClient.SetInput"/>
169+
/// <inheritdoc cref="IEmuClientApi.SetInput"/>
170170
public static void SetInput(int player, Joypad joypad) => GlobalWin.ClientApi.SetInput(player, joypad);
171171

172-
/// <inheritdoc cref="IEmuClient.SetScreenshotOSD"/>
172+
/// <inheritdoc cref="IEmuClientApi.SetScreenshotOSD"/>
173173
public static void SetScreenshotOSD(bool value) => GlobalWin.ClientApi.SetScreenshotOSD(value);
174174

175-
/// <inheritdoc cref="IEmuClient.SetSoundOn"/>
175+
/// <inheritdoc cref="IEmuClientApi.SetSoundOn"/>
176176
public static void SetSoundOn(bool enable) => GlobalWin.ClientApi.SetSoundOn(enable);
177177

178-
/// <inheritdoc cref="IEmuClient.SetTargetScanlineIntensity"/>
178+
/// <inheritdoc cref="IEmuClientApi.SetTargetScanlineIntensity"/>
179179
public static void SetTargetScanlineIntensity(int val) => GlobalWin.ClientApi.SetTargetScanlineIntensity(val);
180180

181-
/// <inheritdoc cref="IEmuClient.SetWindowSize"/>
181+
/// <inheritdoc cref="IEmuClientApi.SetWindowSize"/>
182182
public static void SetWindowSize(int size) => GlobalWin.ClientApi.SetWindowSize(size);
183183

184-
/// <inheritdoc cref="IEmuClient.SpeedMode"/>
184+
/// <inheritdoc cref="IEmuClientApi.SpeedMode"/>
185185
public static void SpeedMode(int percent) => GlobalWin.ClientApi.SpeedMode(percent);
186186

187-
/// <inheritdoc cref="IEmuClient.TogglePause"/>
187+
/// <inheritdoc cref="IEmuClientApi.TogglePause"/>
188188
public static void TogglePause() => GlobalWin.ClientApi.TogglePause();
189189

190-
/// <inheritdoc cref="IEmuClient.TransformPoint"/>
190+
/// <inheritdoc cref="IEmuClientApi.TransformPoint"/>
191191
public static Point TransformPoint(Point point) => GlobalWin.ClientApi.TransformPoint(point);
192192

193-
/// <inheritdoc cref="IEmuClient.Unpause"/>
193+
/// <inheritdoc cref="IEmuClientApi.Unpause"/>
194194
public static void Unpause() => GlobalWin.ClientApi.Unpause();
195195

196-
/// <inheritdoc cref="IEmuClient.UnpauseAv"/>
196+
/// <inheritdoc cref="IEmuClientApi.UnpauseAv"/>
197197
public static void UnpauseAv() => GlobalWin.ClientApi.UnpauseAv();
198198

199-
/// <inheritdoc cref="IEmuClient.UnpauseEmulation"/>
200-
public static void UnpauseEmulation() => GlobalWin.ClientApi.UnpauseEmulation();
199+
/// <inheritdoc cref="Unpause"/>
200+
public static void UnpauseEmulation() => Unpause();
201201

202-
/// <inheritdoc cref="IEmuClient.UpdateEmulatorAndVP"/>
202+
/// <inheritdoc cref="IEmuClientApi.UpdateEmulatorAndVP"/>
203203
public static void UpdateEmulatorAndVP(IEmulator emu = null) => GlobalWin.ClientApi.UpdateEmulatorAndVP(emu);
204204

205-
/// <inheritdoc cref="IEmuClient.Xpos"/>
205+
/// <inheritdoc cref="IEmuClientApi.Xpos"/>
206206
public static int Xpos() => GlobalWin.ClientApi.Xpos();
207207

208-
/// <inheritdoc cref="IEmuClient.Ypos"/>
208+
/// <inheritdoc cref="IEmuClientApi.Ypos"/>
209209
public static int Ypos() => GlobalWin.ClientApi.Ypos();
210210
}
211211
}

0 commit comments

Comments
 (0)