diff --git a/src/BizHawk.Client.Common/lua/LuaFileList.cs b/src/BizHawk.Client.Common/lua/LuaFileList.cs
index f39ff73303..98077973bd 100644
--- a/src/BizHawk.Client.Common/lua/LuaFileList.cs
+++ b/src/BizHawk.Client.Common/lua/LuaFileList.cs
@@ -9,7 +9,8 @@ namespace BizHawk.Client.Common
{
private bool _changes;
- public Action ChangedCallback { get; set; }
+ private readonly Action ChangedCallback;
+
public bool Changes
{
get => _changes;
@@ -25,6 +26,13 @@ namespace BizHawk.Client.Common
public string Filename { get; set; } = "";
+ /// will not be called when initialising from given , only on subsequent mutations
+ public LuaFileList(IReadOnlyCollection collection, Action onChanged)
+ {
+ ChangedCallback = onChanged;
+ if (collection != null) AddRange(collection); // doesn't actually trigger callback as the superclass' Add is called; if this class is rewritten without `new` methods, something clever will need to be done, like a bool field _initialised
+ }
+
public void StopAllScripts()
{
ForEach(lf => lf.State = LuaFile.RunState.Disabled);
diff --git a/src/BizHawk.Client.Common/lua/LuaFunctionList.cs b/src/BizHawk.Client.Common/lua/LuaFunctionList.cs
index 6a232d103c..e294182b31 100644
--- a/src/BizHawk.Client.Common/lua/LuaFunctionList.cs
+++ b/src/BizHawk.Client.Common/lua/LuaFunctionList.cs
@@ -10,10 +10,12 @@ namespace BizHawk.Client.Common
public class LuaFunctionList : IEnumerable
{
private readonly List _functions = new List();
-
- public Action ChangedCallback { get; set; }
- public NamedLuaFunction this[string guid] =>
+ private readonly Action Changed;
+
+ public LuaFunctionList(Action onChanged) => Changed = onChanged;
+
+ public NamedLuaFunction this[string guid] =>
_functions.FirstOrDefault(nlf => nlf.Guid.ToString() == guid);
public void Add(NamedLuaFunction nlf)
@@ -77,7 +79,5 @@ namespace BizHawk.Client.Common
public IEnumerator GetEnumerator() => _functions.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => _functions.GetEnumerator();
-
- private void Changed() => ChangedCallback?.Invoke();
}
}
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
index c67801fb28..08da0e8276 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
@@ -224,13 +224,22 @@ namespace BizHawk.Client.EmuHawk
}
}
- var currentScripts = LuaImp?.ScriptList; // Temp fix for now
+ LuaFileList newScripts = new(LuaImp?.ScriptList, onChanged: SessionChangedCallback);
+ LuaFunctionList registeredFuncList = new(onChanged: UpdateRegisteredFunctionsDialog);
LuaImp = OSTailoredCode.IsUnixHost
- ? new UnixLuaLibraries()
- : new Win32LuaLibraries(Emulator.ServiceProvider, (MainForm) MainForm, DisplayManager, InputManager, Config, Emulator, Game);
- LuaImp.ScriptList.AddRange(currentScripts ?? Enumerable.Empty());
- LuaImp.ScriptList.ChangedCallback = SessionChangedCallback;
- LuaImp.RegisteredFunctions.ChangedCallback = UpdateRegisteredFunctionsDialog;
+ ? new UnixLuaLibraries(
+ newScripts,
+ registeredFuncList)
+ : new Win32LuaLibraries(
+ newScripts,
+ registeredFuncList,
+ Emulator.ServiceProvider,
+ (MainForm) MainForm, //HACK
+ DisplayManager,
+ InputManager,
+ Config,
+ Emulator,
+ Game);
InputBox.AutoCompleteCustomSource.AddRange(LuaImp.Docs.Select(a => $"{a.Library}.{a.Name}").ToArray());
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs
index 91b2af748c..ec6aeb7cce 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/UnixLuaLibraries.cs
@@ -11,8 +11,6 @@ namespace BizHawk.Client.EmuHawk
///
public sealed class UnixLuaLibraries : IPlatformLuaLibEnv
{
- private static readonly LuaFunctionList EmptyLuaFunList = new LuaFunctionList();
-
public LuaDocumentation Docs { get; } = new LuaDocumentation();
public string EngineName => null;
@@ -21,9 +19,15 @@ namespace BizHawk.Client.EmuHawk
public bool IsUpdateSupressed { get; set; }
- public LuaFunctionList RegisteredFunctions => EmptyLuaFunList;
+ public LuaFunctionList RegisteredFunctions { get; }
- public LuaFileList ScriptList { get; } = new LuaFileList();
+ public LuaFileList ScriptList { get; }
+
+ public UnixLuaLibraries(LuaFileList scriptList, LuaFunctionList registeredFuncList)
+ {
+ RegisteredFunctions = registeredFuncList;
+ ScriptList = scriptList;
+ }
public void CallLoadStateEvent(string name) {}
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
index f1335a4a2e..52e6890e16 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
@@ -16,6 +16,8 @@ namespace BizHawk.Client.EmuHawk
public class Win32LuaLibraries : IPlatformLuaLibEnv
{
public Win32LuaLibraries(
+ LuaFileList scriptList,
+ LuaFunctionList registeredFuncList,
IEmulatorServiceProvider serviceProvider,
MainForm mainForm,
IDisplayManagerForApi displayManager,
@@ -47,6 +49,8 @@ namespace BizHawk.Client.EmuHawk
_inputManager = inputManager;
_mainForm = mainForm;
LuaWait = new AutoResetEvent(false);
+ RegisteredFunctions = registeredFuncList;
+ ScriptList = scriptList;
Docs.Clear();
_apiContainer = ApiManager.RestartLua(serviceProvider, LogToLuaConsole, _mainForm, _displayManager, _inputManager, _mainForm.MovieSession, _mainForm.Tools, config, emulator, game);
@@ -137,7 +141,7 @@ namespace BizHawk.Client.EmuHawk
private EventWaitHandle LuaWait;
- public LuaFileList ScriptList { get; } = new LuaFileList();
+ public LuaFileList ScriptList { get; }
private static void LogToLuaConsole(object outputs) => _logToLuaConsoleCallback(new[] { outputs });
@@ -159,7 +163,7 @@ namespace BizHawk.Client.EmuHawk
public bool FrameAdvanceRequested { get; private set; }
- public LuaFunctionList RegisteredFunctions { get; } = new LuaFunctionList();
+ public LuaFunctionList RegisteredFunctions { get; }
public void CallSaveStateEvent(string name)
{