summaryrefslogtreecommitdiff
path: root/plugins/MirLua/src/plugin.cpp
diff options
context:
space:
mode:
authoraunsane <aunsane@gmail.com>2018-07-13 23:57:25 +0300
committeraunsane <aunsane@gmail.com>2018-07-15 15:03:47 +0300
commitce719a1725988bded5566a5d7f596b1ba42cfa91 (patch)
treeee5a96fa51444ed509edb111a0ed49eabda834f2 /plugins/MirLua/src/plugin.cpp
parent40198c29b0f5e7f14f73a3e0a62541ac918612a8 (diff)
MirLua: add Evaluate option page to test scripts
Diffstat (limited to 'plugins/MirLua/src/plugin.cpp')
-rw-r--r--plugins/MirLua/src/plugin.cpp123
1 files changed, 72 insertions, 51 deletions
diff --git a/plugins/MirLua/src/plugin.cpp b/plugins/MirLua/src/plugin.cpp
index d8f1864c94..a5451d173b 100644
--- a/plugins/MirLua/src/plugin.cpp
+++ b/plugins/MirLua/src/plugin.cpp
@@ -24,8 +24,8 @@ static int ScriptsCompare(const CMLuaScript* p1, const CMLuaScript* p2)
CMPlugin::CMPlugin()
: PLUGIN(MODULENAME, pluginInfoEx),
- lua(nullptr),
- Scripts(1, ScriptsCompare)
+ L(nullptr),
+ m_scripts(1, ScriptsCompare)
{
MUUID muidLast = MIID_LAST;
g_hMLuaLangpack = GetPluginLangId(muidLast, 0);
@@ -37,47 +37,85 @@ CMPlugin::CMPlugin()
CreatePluginService(MS_LUA_EVAL, &CMPlugin::Eval);
}
+void CMPlugin::LoadLuaScripts()
+{
+ CMLuaScriptLoader::Load(L, m_scripts);
+}
+
+void CMPlugin::UnloadLuaScripts()
+{
+ for (auto &script : m_scripts.rev_iter()) {
+ script->Unload();
+ delete m_scripts.removeItem(&script);
+ }
+}
+
void CMPlugin::LoadLua()
{
- lua = new CMLua();
- lua->Load();
- CMLuaFunctionLoader::Load(lua->L);
- CMLuaModuleLoader::Load(lua->L);
- CMLuaScriptLoader::Load(lua->L);
+ Log("Loading lua engine");
+ L = luaL_newstate();
+ Log("Loading standard modules");
+ luaL_openlibs(L);
+
+ lua_atpanic(L, luaM_atpanic);
+
+ CMLuaFunctionLoader::Load(L);
+ CMLuaModuleLoader::Load(L);
+ LoadLuaScripts();
}
void CMPlugin::UnloadLua()
{
- Scripts.destroy();
+ UnloadLuaScripts();
+
+ if (L != nullptr) {
+ KillObjectEventHooks(L);
+ KillObjectServices(L);
+
+ Log("Unloading lua engine");
+
+ lua_close(L);
+ }
KillModuleIcons(this);
KillModuleSounds(this);
KillModuleMenus(this);
KillModuleHotkeys(this);
-
- KillObjectEventHooks(lua->L);
- KillObjectServices(lua->L);
-
- if (lua != nullptr) {
- delete lua;
- lua = nullptr;
- }
}
-void CMPlugin::Reload()
+void CMPlugin::ReloadLuaScripts()
{
- Unload();
- Load();
+ UnloadLuaScripts();
+ LoadLuaScripts();
}
/***********************************************/
-static int OnModulesLoaded(WPARAM, LPARAM)
+int CMPlugin::OnOptionsInit(WPARAM wParam, LPARAM)
+{
+ OPTIONSDIALOGPAGE odp = {};
+ odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE | ODPF_DONTTRANSLATE;
+ odp.szGroup.w = LPGENW("Services");
+ odp.szTitle.w = L"Lua";
+
+ odp.szTab.w = LPGENW("Scripts");
+ odp.pDialog = new CMLuaOptionsMain(*this);
+ g_plugin.addOptions(wParam, &odp);
+
+ odp.szTab.w = LPGENW("Evaluate");
+ odp.pDialog = new CMLuaEvaluateOptions(*this);
+ g_plugin.addOptions(wParam, &odp);
+
+ return 0;
+}
+
+int CMPlugin::OnModulesLoaded(WPARAM, LPARAM)
{
g_hCLibsFolder = FoldersRegisterCustomPathT(MODULENAME, "CLibsFolder", MIRLUA_PATHT, TranslateT("C libs folder"));
g_hScriptsFolder = FoldersRegisterCustomPathT(MODULENAME, "ScriptsFolder", MIRLUA_PATHT, TranslateT("Scripts folder"));
- HookEvent(ME_OPT_INITIALISE, OnOptionsInit);
+ HookPluginEvent(ME_OPT_INITIALISE, &CMPlugin::OnOptionsInit);
+
return 0;
}
@@ -87,7 +125,7 @@ int CMPlugin::Load()
LoadNetlib();
LoadLua();
- HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
+ HookPluginEvent(ME_SYSTEM_MODULESLOADED, &CMPlugin::OnModulesLoaded);
return 0;
}
@@ -127,17 +165,14 @@ INT_PTR CMPlugin::Call(WPARAM wParam, LPARAM lParam)
const wchar_t *module = (const wchar_t*)wParam;
const wchar_t *function = (const wchar_t*)lParam;
- lua_pushstring(lua->L, ptrA(mir_utf8encodeW(module)));
- lua_pushstring(lua->L, ptrA(mir_utf8encodeW(function)));
+ lua_pushstring(L, T2Utf(module));
+ lua_pushstring(L, T2Utf(function));
- lua_newtable(lua->L);
- lua_pushcclosure(lua->L, mlua_call, 1);
+ lua_pushcfunction(L, mlua_call);
- CMLuaEnvironment env(lua->L);
- env.Load();
-
- wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1));
- lua_pop(lua->L, 1);
+ CMLuaEnvironment env(L);
+ wchar_t *result = env.Call();
+ env.Unload();
return (INT_PTR)result;
}
@@ -146,16 +181,9 @@ INT_PTR CMPlugin::Eval(WPARAM, LPARAM lParam)
{
const wchar_t *script = (const wchar_t*)lParam;
- if (luaL_loadstring(lua->L, ptrA(mir_utf8encodeW(script)))) {
- ReportError(lua->L);
- return NULL;
- }
-
- CMLuaEnvironment env(lua->L);
- env.Load();
-
- wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1));
- lua_pop(lua->L, 1);
+ CMLuaEnvironment env(L);
+ wchar_t *result = env.Eval(script);
+ env.Unload();
return (INT_PTR)result;
}
@@ -164,16 +192,9 @@ INT_PTR CMPlugin::Exec(WPARAM, LPARAM lParam)
{
const wchar_t *path = (const wchar_t*)lParam;
- if (luaL_loadfile(lua->L, ptrA(mir_utf8encodeW(path)))) {
- ReportError(lua->L);
- return NULL;
- }
-
- CMLuaEnvironment env(lua->L);
- env.Load();
-
- wchar_t *result = mir_utf8decodeW(lua_tostring(lua->L, -1));
- lua_pop(lua->L, 1);
+ CMLuaEnvironment env(L);
+ wchar_t *result = env.Exec(path);
+ env.Unload();
return (INT_PTR)result;
}