#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(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; }