From 297a4ecf64fd16ac6b6616e6938ca86554f46c42 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Fri, 12 Jun 2015 10:42:43 +0000 Subject: MirLua: added toptoolbar module git-svn-id: http://svn.miranda-ng.org/main/trunk@14132 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirLua/src/m_core.cpp | 117 ++------------------------------- plugins/MirLua/src/m_toptoolbar.cpp | 125 ++++++++++++++++++++++++++++++++++++ plugins/MirLua/src/mlua.cpp | 62 ++++++++++++++++++ plugins/MirLua/src/mlua.h | 5 ++ plugins/MirLua/src/stdafx.h | 7 +- 5 files changed, 205 insertions(+), 111 deletions(-) create mode 100644 plugins/MirLua/src/m_toptoolbar.cpp (limited to 'plugins/MirLua/src') diff --git a/plugins/MirLua/src/m_core.cpp b/plugins/MirLua/src/m_core.cpp index 24ce45f13b..df0f502fac 100644 --- a/plugins/MirLua/src/m_core.cpp +++ b/plugins/MirLua/src/m_core.cpp @@ -23,50 +23,8 @@ static int lua_DestroyHookableEvent(lua_State *L) static int lua_NotifyEventHooks(lua_State *L) { HANDLE hEvent = (HANDLE)lua_touserdata(L, 1); - - WPARAM wParam = NULL; - int type = lua_type(L, 2); - switch (type) - { - case LUA_TBOOLEAN: - wParam = lua_toboolean(L, 2); - break; - case LUA_TNUMBER: - wParam = lua_tonumber(L, 2); - break; - case LUA_TSTRING: - wParam = (WPARAM)lua_tostring(L, 2); - break; - case LUA_TUSERDATA: - wParam = (WPARAM)lua_touserdata(L, 2); - break; - - default: - lua_pushinteger(L, 1); - return 1; - } - - LPARAM lParam = NULL; - type = lua_type(L, 3); - switch (type) - { - case LUA_TBOOLEAN: - lParam = lua_toboolean(L, 3); - break; - case LUA_TNUMBER: - lParam = lua_tonumber(L, 3); - break; - case LUA_TSTRING: - lParam = (LPARAM)lua_tostring(L, 3); - break; - case LUA_TUSERDATA: - lParam = (LPARAM)lua_touserdata(L, 3); - break; - - default: - lua_pushinteger(L, 1); - return 1; - } + WPARAM wParam = CMLua::GetWParam(L, 2); + LPARAM lParam = CMLua::GetLParam(L, 3); int res = ::NotifyEventHooks(hEvent, wParam, lParam); lua_pushinteger(L, res); @@ -74,25 +32,6 @@ static int lua_NotifyEventHooks(lua_State *L) return 1; } -static int HookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param) -{ - lua_State *L = (lua_State*)obj; - - int ref = param; - lua_rawgeti(L, LUA_REGISTRYINDEX, ref); - - lua_pushnumber(L, wParam); - lua_pushnumber(L, lParam); - if(lua_pcall(L, 2, 1, 0)) - printf("%s\n", lua_tostring(L, -1)); - - int res = (int)lua_tointeger(L, 1); - - //luaL_unref(L, LUA_REGISTRYINDEX, ref); - - return res; -} - static int lua_HookEvent(lua_State *L) { const char *name = luaL_checkstring(L, 1); @@ -106,7 +45,7 @@ static int lua_HookEvent(lua_State *L) lua_pushvalue(L, 2); int ref = luaL_ref(L, LUA_REGISTRYINDEX); - HANDLE res = ::HookEventObjParam(name, HookEventObjParam, L, ref); + HANDLE res = ::HookEventObjParam(name, CMLua::HookEventObjParam, L, ref); lua_pushlightuserdata(L, res); return 1; @@ -133,7 +72,7 @@ static int lua_OnModulesLoaded(lua_State *L) lua_pushvalue(L, 1); int ref = luaL_ref(L, LUA_REGISTRYINDEX); - HANDLE res = ::HookEventObjParam(ME_SYSTEM_MODULESLOADED, HookEventObjParam, L, ref); + HANDLE res = ::HookEventObjParam(ME_SYSTEM_MODULESLOADED, CMLua::HookEventObjParam, L, ref); lua_pushlightuserdata(L, res); return 1; @@ -150,7 +89,7 @@ static int lua_OnPreShutdown(lua_State *L) lua_pushvalue(L, 1); int ref = luaL_ref(L, LUA_REGISTRYINDEX); - HANDLE res = ::HookEventObjParam(ME_SYSTEM_PRESHUTDOWN, HookEventObjParam, L, ref); + HANDLE res = ::HookEventObjParam(ME_SYSTEM_PRESHUTDOWN, CMLua::HookEventObjParam, L, ref); lua_pushlightuserdata(L, res); return 1; @@ -217,50 +156,8 @@ static int lua_ServiceExists(lua_State *L) static int lua_CallService(lua_State *L) { const char *name = luaL_checkstring(L, 1); - - WPARAM wParam = NULL; - int type = lua_type(L, 2); - switch (type) - { - case LUA_TBOOLEAN: - wParam = lua_toboolean(L, 2); - break; - case LUA_TNUMBER: - wParam = lua_tonumber(L, 2); - break; - case LUA_TSTRING: - wParam = (WPARAM)lua_tostring(L, 2); - break; - case LUA_TUSERDATA: - wParam = (WPARAM)lua_touserdata(L, 2); - break; - - default: - lua_pushinteger(L, 1); - return 1; - } - - LPARAM lParam = NULL; - type = lua_type(L, 3); - switch (type) - { - case LUA_TBOOLEAN: - lParam = lua_toboolean(L, 3); - break; - case LUA_TNUMBER: - lParam = lua_tonumber(L, 3); - break; - case LUA_TSTRING: - lParam = (LPARAM)lua_tostring(L, 3); - break; - case LUA_TUSERDATA: - lParam = (LPARAM)lua_touserdata(L, 3); - break; - - default: - lua_pushinteger(L, 1); - return 1; - } + WPARAM wParam = CMLua::GetWParam(L, 2); + LPARAM lParam = CMLua::GetLParam(L, 3); INT_PTR res = ::CallService(name, wParam, lParam); lua_pushinteger(L, res); diff --git a/plugins/MirLua/src/m_toptoolbar.cpp b/plugins/MirLua/src/m_toptoolbar.cpp new file mode 100644 index 0000000000..7b0efcbc7c --- /dev/null +++ b/plugins/MirLua/src/m_toptoolbar.cpp @@ -0,0 +1,125 @@ +#include "stdafx.h" + +static TTBButton* MakeTBButton(lua_State *L) +{ + TTBButton *tbb = (TTBButton*)mir_calloc(sizeof(TTBButton)); + tbb->cbSize = sizeof(TTBButton); + + lua_pushstring(L, "Name"); + lua_gettable(L, -2); + tbb->name = mir_utf8decode((char*)luaL_checkstring(L, -1), NULL); + lua_pop(L, 1); + + lua_pushstring(L, "Service"); + lua_gettable(L, -2); + tbb->pszService = (char*)lua_tostring(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "Flags"); + lua_gettable(L, -2); + tbb->dwFlags = lua_tointeger(L, -1); + lua_pop(L, 1); + + // up state + lua_pushstring(L, "IconUp"); + lua_gettable(L, -2); + tbb->hIconHandleUp = (HANDLE)lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "TooltipUp"); + lua_gettable(L, -2); + tbb->pszTooltipUp = mir_utf8decode((char*)lua_tostring(L, -1), NULL); + lua_pop(L, 1); + + lua_pushstring(L, "wParamUp"); + lua_gettable(L, -2); + tbb->wParamUp = CMLua::GetWParam(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "lParamUp"); + lua_gettable(L, -2); + tbb->lParamUp = CMLua::GetLParam(L, -1); + lua_pop(L, 1); + + // dn state + lua_pushstring(L, "IconDown"); + lua_gettable(L, -2); + tbb->hIconHandleDn = (HANDLE)lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "TooltipDown"); + lua_gettable(L, -2); + tbb->pszTooltipDn = mir_utf8decode((char*)lua_tostring(L, -1), NULL); + lua_pop(L, 1); + + lua_pushstring(L, "wParamDown"); + lua_gettable(L, -2); + tbb->wParamDown = CMLua::GetWParam(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "lParamDown"); + lua_gettable(L, -2); + tbb->lParamDown = CMLua::GetLParam(L, -1); + lua_pop(L, 1); + + return tbb; +} + +static int lua_AddButton(lua_State *L) +{ + if (lua_type(L, 1) != LUA_TTABLE) + { + lua_pushlightuserdata(L, 0); + return 1; + } + + mir_ptr tbb(MakeTBButton(L)); + + HANDLE res = ::TopToolbar_AddButton(tbb); + lua_pushlightuserdata(L, res); + + return 1; +} + +static int lua_RemoveButton(lua_State *L) +{ + HANDLE hTTButton = (HANDLE)lua_touserdata(L, 1); + + INT_PTR res = ::CallService(MS_TTB_REMOVEBUTTON, (WPARAM)hTTButton, 0); + lua_pushinteger(L, res); + + return 1; +} + +static int lua_OnTopToolBarLoaded(lua_State *L) +{ + if (!lua_isfunction(L, 1)) + { + lua_pushlightuserdata(L, NULL); + return 1; + } + + lua_pushvalue(L, 1); + int ref = luaL_ref(L, LUA_REGISTRYINDEX); + + HANDLE res = ::HookEventObjParam(ME_TTB_MODULELOADED, CMLua::HookEventObjParam, L, ref); + lua_pushlightuserdata(L, res); + + return 1; +} + +static luaL_Reg toptoolbarApi[] = +{ + { "AddButton", lua_AddButton }, + { "RemoveButton", lua_RemoveButton }, + { "OnTopToolBarLoaded", lua_OnTopToolBarLoaded }, + + { NULL, NULL } +}; + +LUAMOD_API int luaopen_m_toptoolbar(lua_State *L) +{ + luaL_newlib(L, toptoolbarApi); + + return 1; +} diff --git a/plugins/MirLua/src/mlua.cpp b/plugins/MirLua/src/mlua.cpp index 2b9ea1fd92..e731c151a8 100644 --- a/plugins/MirLua/src/mlua.cpp +++ b/plugins/MirLua/src/mlua.cpp @@ -18,6 +18,7 @@ CMLua::CMLua() Preload(MLUA_DATABASE, luaopen_m_database); Preload(MLUA_ICOLIB, luaopen_m_icolib); Preload(MLUA_GENMENU, luaopen_m_genmenu); + Preload(MLUA_TOPTOOLBAR, luaopen_m_toptoolbar); } CMLua::~CMLua() @@ -48,4 +49,65 @@ void CMLua::Preload(const char *name, lua_CFunction loader) lua_pushcfunction(L, loader); lua_setfield(L, -2, name); lua_pop(L, 1); +} + +WPARAM CMLua::GetWParam(lua_State *L, int idx) +{ + WPARAM wParam = NULL; + switch (lua_type(L, idx)) + { + case LUA_TBOOLEAN: + wParam = lua_toboolean(L, idx); + break; + case LUA_TNUMBER: + wParam = lua_tonumber(L, idx); + break; + case LUA_TSTRING: + wParam = (WPARAM)lua_tostring(L, idx); + break; + case LUA_TUSERDATA: + wParam = (WPARAM)lua_touserdata(L, idx); + break; + } + return wParam; +} + +LPARAM CMLua::GetLParam(lua_State *L, int idx) +{ + LPARAM lParam = NULL; + switch (lua_type(L, idx)) + { + case LUA_TBOOLEAN: + lParam = lua_toboolean(L, idx); + break; + case LUA_TNUMBER: + lParam = lua_tonumber(L, idx); + break; + case LUA_TSTRING: + lParam = (LPARAM)lua_tostring(L, idx); + break; + case LUA_TUSERDATA: + lParam = (LPARAM)lua_touserdata(L, idx); + break; + } + return lParam; +} + +int CMLua::HookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param) +{ + lua_State *L = (lua_State*)obj; + + int ref = param; + lua_rawgeti(L, LUA_REGISTRYINDEX, ref); + + lua_pushnumber(L, wParam); + lua_pushnumber(L, lParam); + if (lua_pcall(L, 2, 1, 0)) + printf("%s\n", lua_tostring(L, -1)); + + int res = (int)lua_tointeger(L, 1); + + //luaL_unref(L, LUA_REGISTRYINDEX, ref); + + return res; } \ No newline at end of file diff --git a/plugins/MirLua/src/mlua.h b/plugins/MirLua/src/mlua.h index 5f061702ae..d5a2f0c891 100644 --- a/plugins/MirLua/src/mlua.h +++ b/plugins/MirLua/src/mlua.h @@ -16,6 +16,11 @@ public: void AddPath(const char *path); void Load(const char *name); + + static WPARAM GetWParam(lua_State *L, int idx); + static LPARAM GetLParam(lua_State *L, int idx); + + static int HookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param); }; #endif //_LUA_CORE_H_ diff --git a/plugins/MirLua/src/stdafx.h b/plugins/MirLua/src/stdafx.h index f334968fb3..eea0740b9b 100644 --- a/plugins/MirLua/src/stdafx.h +++ b/plugins/MirLua/src/stdafx.h @@ -7,12 +7,14 @@ #include #include #include -#include #include #include #include #include +#include +#include + extern "C" { #include "lua\lua.h" @@ -48,4 +50,7 @@ LUAMOD_API int (luaopen_m_icolib)(lua_State *L); #define MLUA_GENMENU "m_genmenu" LUAMOD_API int (luaopen_m_genmenu)(lua_State *L); +#define MLUA_TOPTOOLBAR "m_toptoolbar" +LUAMOD_API int (luaopen_m_toptoolbar)(lua_State *L); + #endif //_COMMON_H_ -- cgit v1.2.3