diff options
Diffstat (limited to 'plugins/MirLua/src/Modules/m_srmm.cpp')
-rw-r--r-- | plugins/MirLua/src/Modules/m_srmm.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/plugins/MirLua/src/Modules/m_srmm.cpp b/plugins/MirLua/src/Modules/m_srmm.cpp new file mode 100644 index 0000000000..f7296d1d70 --- /dev/null +++ b/plugins/MirLua/src/Modules/m_srmm.cpp @@ -0,0 +1,138 @@ +#include "../stdafx.h" + +#define MT_BBBUTTON "BBButton" + +static void MakeBBButton(lua_State *L, BBButton &bbb) +{ + bbb.dwDefPos = 100; + + lua_getfield(L, -1, "Module"); + bbb.pszModuleName = mir_utf8decodeA(luaL_checkstring(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "ButtonId"); + bbb.dwButtonID = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "Flags"); + bbb.bbbFlags = luaL_optinteger(L, -1, BBBF_ISIMBUTTON); + lua_pop(L, 1); + + lua_getfield(L, -1, "Text"); + bbb.pwszText = mir_utf8decodeW(lua_tostring(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "Tooltip"); + bbb.pwszTooltip = mir_utf8decodeW(lua_tostring(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "Icon"); + bbb.hIcon = (HANDLE)lua_touserdata(L, -1); + lua_pop(L, 1); +} + +static void CleanBBButton(BBButton &bbb) +{ + mir_free((void*)bbb.pszModuleName); + mir_free((void*)bbb.pwszText); + mir_free((void*)bbb.pwszTooltip); +} + +/***********************************************/ + +static int lua_AddButton(lua_State *L) +{ + luaL_checktype(L, 1, LUA_TTABLE); + + BBButton bbb = {}; + MakeBBButton(L, bbb); + + int hScriptLangpack = CMLuaEnvironment::GetEnvironmentId(L); + HANDLE res = Srmm_AddButton(&bbb, hScriptLangpack); + CleanBBButton(bbb); + + if (!res) + { + lua_pushnil(L); + return 1; + } + + lua_pushvalue(L, 1); + luaL_setmetatable(L, MT_BBBUTTON); + + return 1; +} + +static int lua_ModifyButton(lua_State *L) +{ + luaL_checktype(L, 1, LUA_TTABLE); + + lua_pushvalue(L, 1); + + BBButton bbb = {}; + MakeBBButton(L, bbb); + INT_PTR res = Srmm_ModifyButton(&bbb); + CleanBBButton(bbb); + lua_pushboolean(L, !res); + + return 2; +} + +static int lua_RemoveButton(lua_State *L) +{ + BBButton bbb = {}; + + switch (lua_type(L, 1)) + { + case LUA_TSTRING: + bbb.pszModuleName = mir_utf8decodeA(lua_tostring(L, 1)); + bbb.dwButtonID = luaL_checkinteger(L, 2); + break; + case LUA_TTABLE: + MakeBBButton(L, bbb); + break; + default: + luaL_argerror(L, 1, luaL_typename(L, 1)); + } + + INT_PTR res = Srmm_RemoveButton(&bbb); + CleanBBButton(bbb); + lua_pushboolean(L, !res); + + return 1; +} + +static luaL_Reg srmmApi[] = +{ + { "AddButton", lua_AddButton }, + { "ModifyButton", lua_ModifyButton }, + { "RemoveButton", lua_RemoveButton }, + + { nullptr, nullptr } +}; + +/***********************************************/ + +LUAMOD_API int luaopen_m_srmm(lua_State *L) +{ + luaL_newlib(L, srmmApi); + + luaL_newmetatable(L, MT_BBBUTTON); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + lua_pushliteral(L, MT_BBBUTTON); + lua_setfield(L, -2, "__metatable"); + lua_pushcfunction(L, lua_ModifyButton); + lua_setfield(L, -2, "Modify"); + lua_pushcfunction(L, lua_RemoveButton); + lua_setfield(L, -2, "Remove"); + lua_pop(L, 1); + + MT<CustomButtonClickData>(L, "CustomButtonClickData") + .Field(&CustomButtonClickData::pszModule, "Module", LUA_TSTRINGA) + .Field(&CustomButtonClickData::dwButtonId, "ButtonId", LUA_TINTEGER) + .Field(&CustomButtonClickData::hContact, "hContact", LUA_TINTEGER) + .Field(&CustomButtonClickData::flags, "Flags", LUA_TINTEGER); + + return 1; +} |