diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs index 56468fcd35..c449a14bd0 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs @@ -37,13 +37,13 @@ namespace BizHawk.Client.Common #region Events Library Helpers - private readonly LuaFunctionList lua_functions = new LuaFunctionList(); + private readonly LuaFunctionList _luaFunctions = new LuaFunctionList(); - public LuaFunctionList RegisteredFunctions { get { return lua_functions; } } + public LuaFunctionList RegisteredFunctions { get { return _luaFunctions; } } public void CallSaveStateEvent(string name) { - List lfs = lua_functions.Where(x => x.Event == "OnSavestateSave").ToList(); + List lfs = _luaFunctions.Where(x => x.Event == "OnSavestateSave").ToList(); if (lfs.Any()) { try @@ -65,7 +65,7 @@ namespace BizHawk.Client.Common public void CallLoadStateEvent(string name) { - List lfs = lua_functions.Where(x => x.Event == "OnSavestateLoad").ToList(); + List lfs = _luaFunctions.Where(x => x.Event == "OnSavestateLoad").ToList(); if (lfs.Any()) { try @@ -87,7 +87,7 @@ namespace BizHawk.Client.Common public void CallFrameBeforeEvent() { - List lfs = lua_functions.Where(x => x.Event == "OnFrameStart").ToList(); + List lfs = _luaFunctions.Where(x => x.Event == "OnFrameStart").ToList(); if (lfs.Any()) { try @@ -109,7 +109,7 @@ namespace BizHawk.Client.Common public void CallFrameAfterEvent() { - List lfs = lua_functions.Where(x => x.Event == "OnFrameEnd").ToList(); + List lfs = _luaFunctions.Where(x => x.Event == "OnFrameEnd").ToList(); if (lfs.Any()) { try @@ -133,47 +133,29 @@ namespace BizHawk.Client.Common public string event_onframeend(LuaFunction luaf, string name = null) { - NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnFrameEnd", name); - lua_functions.Add(nlf); + NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnFrameEnd", LogOutputCallback, name); + _luaFunctions.Add(nlf); return nlf.GUID.ToString(); } public string event_onframestart(LuaFunction luaf, string name = null) { - NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnFrameStart", name); - lua_functions.Add(nlf); + NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnFrameStart", LogOutputCallback, name); + _luaFunctions.Add(nlf); return nlf.GUID.ToString(); } - public void event_oninputpoll(LuaFunction luaf) + public void event_oninputpoll(LuaFunction luaf, string name = null) { - if (luaf != null) - { - Global.Emulator.CoreComm.InputCallback.Add(delegate - { - try - { - luaf.Call(); - } - catch (SystemException e) - { - LogOutputCallback( - "error running function attached by lua function event.oninputpoll" + - "\nError message: " - + e.Message); - } - }); - } - else - { - Global.Emulator.CoreComm.InputCallback = null; - } + NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnInputPoll", LogOutputCallback, name); + _luaFunctions.Add(nlf); + Global.Emulator.CoreComm.InputCallback.Add(nlf.Callback); } - public string event_onloadstate(LuaFunction luaf, object name = null) + public string event_onloadstate(LuaFunction luaf, string name = null) { - NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnSavestateLoad", name != null ? name.ToString() : null); - lua_functions.Add(nlf); + NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnSavestateLoad", LogOutputCallback, name); + _luaFunctions.Add(nlf); return nlf.GUID.ToString(); } @@ -251,20 +233,20 @@ namespace BizHawk.Client.Common } } - public string event_onsavestate(LuaFunction luaf, object name = null) + public string event_onsavestate(LuaFunction luaf, string name = null) { - NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnSavestateSave", name != null ? name.ToString() : null); - lua_functions.Add(nlf); + NamedLuaFunction nlf = new NamedLuaFunction(luaf, "OnSavestateSave", LogOutputCallback, name); + _luaFunctions.Add(nlf); return nlf.GUID.ToString(); } public bool event_unregisterbyid(object guid) { - foreach (NamedLuaFunction nlf in lua_functions) + foreach (NamedLuaFunction nlf in _luaFunctions) { if (nlf.GUID.ToString() == guid.ToString()) { - lua_functions.Remove(nlf); + _luaFunctions.RemoveFunction(nlf); return true; } } @@ -274,11 +256,11 @@ namespace BizHawk.Client.Common public bool event_unregisterbyname(object name) { - foreach (NamedLuaFunction nlf in lua_functions) + foreach (NamedLuaFunction nlf in _luaFunctions) { if (nlf.Name == name.ToString()) { - lua_functions.Remove(nlf); + _luaFunctions.RemoveFunction(nlf); return true; } } diff --git a/BizHawk.Client.Common/lua/LuaFunctionList.cs b/BizHawk.Client.Common/lua/LuaFunctionList.cs index cafeaf66e6..cbaf9b1386 100644 --- a/BizHawk.Client.Common/lua/LuaFunctionList.cs +++ b/BizHawk.Client.Common/lua/LuaFunctionList.cs @@ -12,5 +12,11 @@ namespace BizHawk.Client.Common return this.FirstOrDefault(x => x.GUID.ToString() == guid) ?? null; } } + + public void RemoveFunction(NamedLuaFunction function) + { + Global.Emulator.CoreComm.InputCallback.Remove(function.Callback); + Remove(function); + } } } diff --git a/BizHawk.Client.Common/lua/NamedLuaFunction.cs b/BizHawk.Client.Common/lua/NamedLuaFunction.cs index a111901a57..f177509f20 100644 --- a/BizHawk.Client.Common/lua/NamedLuaFunction.cs +++ b/BizHawk.Client.Common/lua/NamedLuaFunction.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using LuaInterface; namespace BizHawk.Client.Common @@ -8,13 +9,31 @@ namespace BizHawk.Client.Common private readonly LuaFunction _function; private readonly string _name; private readonly string _event; - - public NamedLuaFunction(LuaFunction function, string theevent, string name = null) + private readonly Action _action; + public NamedLuaFunction(LuaFunction function, string theevent, Action logCallback, string name = null) { _function = function; _name = name ?? "Anonymous"; _event = theevent; GUID = Guid.NewGuid(); + + _action = new Action(delegate + { + try + { + _function.Call(); + } + catch (SystemException ex) + { + logCallback( + "error running function attached by the event " + + _event + + "\nError message: " + + ex.Message + ); + } + + }); } public Guid GUID { get; private set; } @@ -33,5 +52,10 @@ namespace BizHawk.Client.Common { get { return _event; } } + + public Action Callback + { + get { return _action; } + } } } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.cs b/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.cs index 688827ea1b..12dfd08d99 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.cs @@ -67,7 +67,7 @@ namespace BizHawk.Client.EmuHawk if (indexes.Count > 0) { NamedLuaFunction nlf = GlobalWin.Tools.LuaConsole.LuaImp.RegisteredFunctions[indexes[0]]; - GlobalWin.Tools.LuaConsole.LuaImp.RegisteredFunctions.Remove(nlf); + GlobalWin.Tools.LuaConsole.LuaImp.RegisteredFunctions.RemoveFunction(nlf); PopulateListView(); } } diff --git a/BizHawk.Emulation.Common/Interfaces/CoreComms.cs b/BizHawk.Emulation.Common/Interfaces/CoreComms.cs index eb85a3cddb..ebad19fb10 100644 --- a/BizHawk.Emulation.Common/Interfaces/CoreComms.cs +++ b/BizHawk.Emulation.Common/Interfaces/CoreComms.cs @@ -138,7 +138,7 @@ namespace BizHawk.Emulation.Common public void Remove(Action action) { - throw new NotImplementedException(); + _list.Remove(action); } public void Clear()