diff --git a/src/BizHawk.Client.Common/IMainFormForApi.cs b/src/BizHawk.Client.Common/IMainFormForApi.cs
index 3306b601e87..32007c61fd8 100644
--- a/src/BizHawk.Client.Common/IMainFormForApi.cs
+++ b/src/BizHawk.Client.Common/IMainFormForApi.cs
@@ -22,7 +22,7 @@ public interface IMainFormForApi
/// only referenced from
bool IsSeeking { get; }
- /// referenced from and LuaConsole
+ /// only referenced from
bool IsTurboing { get; }
/// only referenced from
@@ -59,7 +59,7 @@ public interface IMainFormForApi
void FrameAdvance(bool discardApiHawkSurfaces = true);
/// Override
- /// referenced from and LuaConsole
+ /// only referenced from
void FrameBufferResized(bool forceWindowResize = false);
/// only referenced from
diff --git a/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs b/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs
index 86a127080a2..77e38d440d6 100644
--- a/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs
+++ b/src/BizHawk.Client.EmuHawk/Api/ApiManager.cs
@@ -34,20 +34,21 @@ static ApiManager()
private static ApiContainer Register(
IEmulatorServiceProvider serviceProvider,
Action logCallback,
- IMainFormForApiInit mainForm,
+ IMainFormForApi mainForm,
DisplayManagerBase displayManager,
InputManager inputManager,
IMovieSession movieSession,
ToolManager toolManager,
Config config,
IEmulator emulator,
- IGameInfo game)
+ IGameInfo game,
+ IDialogController dialogController)
{
var avail = new Dictionary
{
[typeof(Action)] = logCallback,
[typeof(IMainFormForApi)] = mainForm,
- [typeof(IDialogController)] = mainForm.DialogController,
+ [typeof(IDialogController)] = dialogController,
[typeof(DisplayManagerBase)] = displayManager,
[typeof(InputManager)] = inputManager,
[typeof(IMovieSession)] = movieSession,
@@ -69,34 +70,36 @@ private static ApiContainer Register(
public static IExternalApiProvider Restart(
IEmulatorServiceProvider serviceProvider,
- IMainFormForApiInit mainForm,
+ IMainFormForApi mainForm,
DisplayManagerBase displayManager,
InputManager inputManager,
IMovieSession movieSession,
ToolManager toolManager,
Config config,
IEmulator emulator,
- IGameInfo game)
+ IGameInfo game,
+ IDialogController dialogController)
{
_container?.Dispose();
- _container = Register(serviceProvider, Console.WriteLine, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game);
+ _container = Register(serviceProvider, Console.WriteLine, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game, dialogController);
return new BasicApiProvider(_container);
}
public static ApiContainer RestartLua(
IEmulatorServiceProvider serviceProvider,
Action logCallback,
- IMainFormForApiInit mainForm,
+ IMainFormForApi mainForm,
DisplayManagerBase displayManager,
InputManager inputManager,
IMovieSession movieSession,
ToolManager toolManager,
Config config,
IEmulator emulator,
- IGameInfo game)
+ IGameInfo game,
+ IDialogController dialogController)
{
_luaContainer?.Dispose();
- _luaContainer = Register(serviceProvider, logCallback, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game);
+ _luaContainer = Register(serviceProvider, logCallback, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game, dialogController);
return _luaContainer;
}
}
diff --git a/src/BizHawk.Client.EmuHawk/Api/IMainFormForApiInit.cs b/src/BizHawk.Client.EmuHawk/Api/IMainFormForApiInit.cs
deleted file mode 100644
index 7b62cb52dfd..00000000000
--- a/src/BizHawk.Client.EmuHawk/Api/IMainFormForApiInit.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using BizHawk.Client.Common;
-
-namespace BizHawk.Client.EmuHawk
-{
- public interface IMainFormForApiInit : IMainFormForApi, IDialogParent
- {
- IMovieSession MovieSession { get; }
-
- ToolManager Tools { get; }
- }
-}
diff --git a/src/BizHawk.Client.EmuHawk/IMainFormForTools.cs b/src/BizHawk.Client.EmuHawk/IMainFormForTools.cs
index 88f31370942..417fabaccac 100644
--- a/src/BizHawk.Client.EmuHawk/IMainFormForTools.cs
+++ b/src/BizHawk.Client.EmuHawk/IMainFormForTools.cs
@@ -27,6 +27,9 @@ public interface IMainFormForTools : IDialogController
/// only referenced from
bool InvisibleEmulation { get; set; }
+ /// only referenced from
+ bool IsTurboing { get; }
+
/// only referenced from
bool IsFastForwarding { get; }
@@ -51,6 +54,10 @@ public interface IMainFormForTools : IDialogController
/// only referenced from
void FrameAdvance(bool discardApiHawkSurfaces = true);
+ /// only referenced from
+ /// Override
+ void FrameBufferResized(bool forceWindowResize = false);
+
/// only referenced from
bool LoadQuickSave(int slot, bool suppressOSD = false);
diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs
index b2461fff8cf..a4bcfb9d3fe 100644
--- a/src/BizHawk.Client.EmuHawk/MainForm.cs
+++ b/src/BizHawk.Client.EmuHawk/MainForm.cs
@@ -45,7 +45,7 @@
namespace BizHawk.Client.EmuHawk
{
public partial class MainForm : FormBase, IDialogParent,
- IMainFormForApiInit, IMainFormForRetroAchievements, IMainFormForTools
+ IMainFormForApi, IMainFormForRetroAchievements, IMainFormForTools
{
private const string FMT_STR_DUMP_STATUS_MENUITEM_LABEL = "Dump Status Report{0}...";
@@ -1227,7 +1227,7 @@ private set
internal readonly ExternalToolManager ExtToolManager;
- public ToolManager Tools { get; }
+ private readonly ToolManager Tools;
private IControlMainform ToolControllingSavestates => Tools.FirstOrNull(tool => tool.WantsToControlSavestates);
private IControlMainform ToolControllingRewind => Tools.FirstOrNull(tool => tool.WantsToControlRewind);
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/FormsLuaLibrary.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/FormsLuaLibrary.cs
index 9ddaf820869..fe9505ad53e 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/FormsLuaLibrary.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/FormsLuaLibrary.cs
@@ -27,7 +27,7 @@ public sealed class FormsLuaLibrary : LuaLibraryBase
public FormsLuaLibrary(ILuaLibraries luaLibsImpl, ApiContainer apiContainer, Action logOutputCallback)
: base(luaLibsImpl, apiContainer, logOutputCallback) {}
- public IDialogParent MainForm { get; set; }
+ public IDialogParent OwnerForm { get; set; }
public override string Name => "forms";
@@ -284,6 +284,9 @@ public long NewForm(
string title = null,
LuaFunction onClose = null)
{
+ if (OwnerForm is not IWin32Window ownerForm)
+ throw new Exception("IDialogParent must implement IWin32Window");
+
var form = new LuaWinform(CurrentFile, WindowClosed);
_luaForms.Add(form);
if (width.HasValue && height.HasValue)
@@ -295,8 +298,7 @@ public long NewForm(
form.MaximizeBox = false;
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.Icon = SystemIcons.Application;
- form.Owner = (Form) MainForm;
- form.Show();
+ form.Show(ownerForm);
form.FormClosed += (o, e) =>
{
@@ -325,7 +327,7 @@ public string OpenFile(
string filter = null)
{
if (initialDirectory is null && fileName is not null) initialDirectory = Path.GetDirectoryName(fileName);
- var result = MainForm.ShowFileOpenDialog(
+ var result = OwnerForm.ShowFileOpenDialog(
filterStr: filter ?? FilesystemFilter.AllFilesEntry,
initDir: initialDirectory ?? PathEntries.LuaAbsolutePath(),
initFileName: fileName);
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
index bde5643914a..36c39eeba9c 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
@@ -50,7 +50,7 @@ public static Icon ToolIcon
public ToolDialogSettings.ColumnList Columns { get; set; }
- internal new IMainFormForApiInit MainForm { get; set; }
+ internal IMainFormForApi MainFormForApi { get; set; }
public class LuaConsoleSettings
{
@@ -190,13 +190,26 @@ public override void Restart()
{
List runningScripts = new();
+ ApiContainer apiContainer = ApiManager.RestartLua(
+ Emulator.ServiceProvider,
+ WriteToOutputWindow,
+ MainFormForApi,
+ DisplayManager,
+ InputManager,
+ MovieSession,
+ Tools,
+ Config,
+ Emulator,
+ Game,
+ DialogController);
+
// Things we need to do with the existing LuaImp before we can make a new one
if (LuaImp is not null)
{
if (LuaImp.IsRebootingCore)
{
// Even if the lua console is self-rebooting from client.reboot_core() we still want to re-inject dependencies
- LuaImp.Restart(Emulator.ServiceProvider, Config, Emulator, Game);
+ LuaImp.Restart(Emulator.ServiceProvider, Config, apiContainer);
return;
}
@@ -216,12 +229,11 @@ public override void Restart()
newScripts,
registeredFuncList,
Emulator.ServiceProvider,
- MainForm,
- DisplayManager,
- InputManager,
+ MainFormForApi,
Config,
- Emulator,
- Game);
+ Tools,
+ this,
+ apiContainer);
InputBox.AutoCompleteCustomSource.Clear();
InputBox.AutoCompleteCustomSource.AddRange(LuaImp.Docs.Where(static f => f.SuggestInREPL)
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
index 57c2d91383a..93e4ea1af05 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
@@ -23,12 +23,11 @@ public LuaLibraries(
LuaFileList scriptList,
LuaFunctionList registeredFuncList,
IEmulatorServiceProvider serviceProvider,
- IMainFormForApiInit mainForm,
- DisplayManagerBase displayManager,
- InputManager inputManager,
+ IMainFormForApi mainForm,
Config config,
- IEmulator emulator,
- IGameInfo game)
+ ToolManager toolManager,
+ IDialogParent dialogParent,
+ ApiContainer apiContainer)
{
if (!IsAvailable)
{
@@ -57,15 +56,13 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
}
_th = new NLuaTableHelper(_lua, LogToLuaConsole);
- _displayManager = displayManager;
- _inputManager = inputManager;
_mainForm = mainForm;
LuaWait = new AutoResetEvent(false);
PathEntries = config.PathEntries;
RegisteredFunctions = registeredFuncList;
ScriptList = scriptList;
Docs.Clear();
- _apiContainer = ApiManager.RestartLua(serviceProvider, LogToLuaConsole, _mainForm, _displayManager, _inputManager, _mainForm.MovieSession, _mainForm.Tools, config, emulator, game);
+ _apiContainer = apiContainer;
// Register lua libraries
foreach (var lib in ReflectionCache_Biz_Cli_Com.Types.Concat(ReflectionCache.Types)
@@ -94,7 +91,7 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
else if (instance is ConsoleLuaLibrary consoleLib)
{
consoleLib.AllAPINames = new(() => string.Join("\n", Docs.Select(static lf => lf.Name)) + "\n"); // Docs may not be fully populated now, depending on order of ReflectionCache.Types, but definitely will be when this is read
- consoleLib.Tools = _mainForm.Tools;
+ consoleLib.Tools = toolManager;
_logToLuaConsoleCallback = consoleLib.Log;
}
else if (instance is DoomLuaLibrary doomLib)
@@ -108,7 +105,8 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
}
else if (instance is FormsLuaLibrary formsLib)
{
- formsLib.MainForm = _mainForm;
+
+ formsLib.OwnerForm = dialogParent;
}
else if (instance is GuiLuaLibrary guiLib)
{
@@ -122,7 +120,7 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
}
else if (instance is TAStudioLuaLibrary tastudioLib)
{
- tastudioLib.Tools = _mainForm.Tools;
+ tastudioLib.Tools = toolManager;
}
EnumerateLuaFunctions(instance.Name, lib, instance);
@@ -159,13 +157,9 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
private ApiContainer _apiContainer;
- private readonly DisplayManagerBase _displayManager;
-
private GuiApi GuiAPI => (GuiApi)_apiContainer.Gui;
- private readonly InputManager _inputManager;
-
- private readonly IMainFormForApiInit _mainForm;
+ private readonly IMainFormForApi _mainForm;
private Lua _lua = new();
private LuaThread _currThread;
@@ -201,10 +195,9 @@ void EnumerateLuaFunctions(string name, Type type, LuaLibraryBase instance)
public void Restart(
IEmulatorServiceProvider newServiceProvider,
Config config,
- IEmulator emulator,
- IGameInfo game)
+ ApiContainer apiContainer)
{
- _apiContainer = ApiManager.RestartLua(newServiceProvider, LogToLuaConsole, _mainForm, _displayManager, _inputManager, _mainForm.MovieSession, _mainForm.Tools, config, emulator, game);
+ _apiContainer = apiContainer;
PathEntries = config.PathEntries;
foreach (var lib in Libraries.Values)
{
diff --git a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
index e07b3913372..07951d6c0da 100644
--- a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
@@ -68,7 +68,8 @@ private IExternalApiProvider GetOrInitApiProvider()
this,
_config,
_emulator,
- _game);
+ _game,
+ _owner.DialogController);
///
/// Loads the tool dialog T (T must implements ) , if it does not exist it will be created, if it is already open, it will be focused
@@ -96,7 +97,9 @@ private void SetBaseProperties(IToolForm form)
f.Config = _config;
if (form is not ToolFormBase tool) return;
tool.SetToolFormBaseProps(_displayManager, _inputManager, _owner, _movieSession, this, _game);
- if (form is LuaConsole luaConsole) luaConsole.MainForm = _owner; // could go via ServiceProvider but nah
+
+ // Lua is a special case, being the only tool that currently uses this.
+ if (form is LuaConsole luaConsole) luaConsole.MainFormForApi = _owner;
}
///