From a955d18f62f335f84e0926f351eb85d78224cba6 Mon Sep 17 00:00:00 2001 From: aunsane Date: Sun, 20 May 2018 21:10:10 +0300 Subject: MirLua: project reordering --- plugins/MirLua/src/Modules/m_icolib.cpp | 150 ++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 plugins/MirLua/src/Modules/m_icolib.cpp (limited to 'plugins/MirLua/src/Modules/m_icolib.cpp') diff --git a/plugins/MirLua/src/Modules/m_icolib.cpp b/plugins/MirLua/src/Modules/m_icolib.cpp new file mode 100644 index 0000000000..86b5163290 --- /dev/null +++ b/plugins/MirLua/src/Modules/m_icolib.cpp @@ -0,0 +1,150 @@ +#include "../stdafx.h" + +static void MakeSKINICONDESC(lua_State *L, SKINICONDESC &sid) +{ + lua_getfield(L, -1, "Flags"); + sid.flags = lua_tointeger(L, -1); + lua_pop(L, 1); + + if (!(sid.flags & SIDF_ALL_UNICODE)) + sid.flags |= SIDF_ALL_UNICODE; + + lua_getfield(L, -1, "Name"); + sid.pszName = mir_utf8decodeA(luaL_checkstring(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "Description"); + sid.description.w = mir_utf8decodeW(luaL_checkstring(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "Section"); + sid.section.w = mir_utf8decodeW(luaL_optstring(L, 3, MODULENAME)); + lua_pop(L, 1); + + lua_getfield(L, -1, "DefaultFile"); + sid.defaultFile.w = mir_utf8decodeW(lua_tostring(L, -1)); + lua_pop(L, 1); + + if (sid.defaultFile.w == nullptr) { + sid.defaultFile.w = (wchar_t*)mir_calloc(MAX_PATH + 1); + GetModuleFileName(g_plugin.getInst(), sid.defaultFile.w, MAX_PATH); + } + + lua_getfield(L, -1, "DefaultIndex"); + sid.iDefaultIndex = lua_tointeger(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "DefaultIcon"); + sid.hDefaultIcon = (HICON)lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "SizeX"); + sid.iDefaultIndex = lua_tointeger(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "SizeY"); + sid.iDefaultIndex = lua_tointeger(L, -1); + lua_pop(L, 1); +} + +static int lua_AddIcon(lua_State *L) +{ + SKINICONDESC sid = { }; + + if (lua_type(L, 1) == LUA_TSTRING) { + sid.flags = SIDF_ALL_UNICODE; + sid.pszName = mir_utf8decodeA(luaL_checkstring(L, 1)); + sid.description.w = mir_utf8decodeW(luaL_checkstring(L, 2)); + sid.section.w = mir_utf8decodeW(luaL_optstring(L, 3, MODULENAME)); + sid.defaultFile.w = mir_utf8decodeW(lua_tostring(L, 4)); + sid.hDefaultIcon = GetIcon(IDI_SCRIPT); + + if (sid.defaultFile.w == nullptr) { + sid.defaultFile.w = (wchar_t*)mir_calloc(MAX_PATH + 1); + GetModuleFileName(g_plugin.getInst(), sid.defaultFile.w, MAX_PATH); + } + } + else if (lua_type(L, 1) == LUA_TTABLE) + MakeSKINICONDESC(L, sid); + else + luaL_argerror(L, 1, luaL_typename(L, 1)); + + int hScriptLangpack = CMLuaEnvironment::GetEnvironmentId(L); + HANDLE res = IcoLib_AddIcon(&sid, hScriptLangpack); + lua_pushlightuserdata(L, res); + + mir_free((void*)sid.pszName); + mir_free((void*)sid.description.w); + mir_free((void*)sid.section.w); + mir_free((void*)sid.defaultFile.w); + + return 1; +} + +static int lua_GetIcon(lua_State *L) +{ + bool big = luaM_toboolean(L, 2); + + HICON hIcon = nullptr; + switch (lua_type(L, 1)) { + case LUA_TLIGHTUSERDATA: + hIcon = IcoLib_GetIconByHandle(lua_touserdata(L, 1), big); + break; + case LUA_TSTRING: + hIcon = IcoLib_GetIcon(lua_tostring(L, 1), big); + break; + default: + luaL_argerror(L, 1, luaL_typename(L, 1)); + } + + if (hIcon) + lua_pushlightuserdata(L, hIcon); + else + lua_pushnil(L); + + return 1; +} + +static int lua_GetIconHandle(lua_State *L) +{ + const char *name = luaL_checkstring(L, 1); + + HANDLE res = IcoLib_GetIconHandle(name); + lua_pushlightuserdata(L, res); + + return 1; +} + +static int lua_RemoveIcon(lua_State *L) +{ + switch (lua_type(L, 1)) { + case LUA_TLIGHTUSERDATA: + IcoLib_RemoveIconByHandle(lua_touserdata(L, 1)); + break; + case LUA_TSTRING: + IcoLib_RemoveIcon(luaL_checkstring(L, 1)); + break; + default: + luaL_argerror(L, 1, luaL_typename(L, 1)); + } + + return 0; +} + +static luaL_Reg icolibApi[] = +{ + { "AddIcon", lua_AddIcon }, + { "GetIcon", lua_GetIcon }, + { "GetHandle", lua_GetIconHandle }, + { "GetIconHandle", lua_GetIconHandle }, + { "RemoveIcon", lua_RemoveIcon }, + + { nullptr, nullptr } +}; + +LUAMOD_API int luaopen_m_icolib(lua_State *L) +{ + luaL_newlib(L, icolibApi); + + return 1; +} -- cgit v1.2.3