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; } ///