From 0420af6e7d00d0877f53b6ea4434050c44b8dd4f Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Fri, 12 Jun 2015 19:38:39 +0000 Subject: MirLua: added m_msg_buttonsbar module git-svn-id: http://svn.miranda-ng.org/main/trunk@14136 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirLua/docs/examples/msgbuttonsbar.lua | 39 ++++++ plugins/MirLua/src/m_msg_buttonsbar.cpp | 164 +++++++++++++++++++++++++ plugins/MirLua/src/mlua.cpp | 1 + plugins/MirLua/src/stdafx.h | 4 + 4 files changed, 208 insertions(+) create mode 100644 plugins/MirLua/docs/examples/msgbuttonsbar.lua create mode 100644 plugins/MirLua/src/m_msg_buttonsbar.cpp (limited to 'plugins') diff --git a/plugins/MirLua/docs/examples/msgbuttonsbar.lua b/plugins/MirLua/docs/examples/msgbuttonsbar.lua new file mode 100644 index 0000000000..9eea0e4b6d --- /dev/null +++ b/plugins/MirLua/docs/examples/msgbuttonsbar.lua @@ -0,0 +1,39 @@ +--- include m_msg_buttonsbar module +local mbb = require('m_msg_buttonsbar') +--- include m_icolib module +local icolib = require('m_icolib') + +local BBBF_ISLSIDEBUTTON = 64 + +m.OnModulesLoaded(function() + local bbButton = + { + -- required fields + Module = "MirLua", + ButtonID = 1, + + Flags = BBBF_ISLSIDEBUTTON, + Tooltip = "Msg button", + Icon = icolib.AddIcon('testBBBIcon', 'Lua icon for bbbButton') + } + + mbb.OnMsgToolBarLoaded(function() + --- Add button on msg buttons bar + mbb.AddButton(bbButton) + + --- Create the msg buttons bar button which will be deleted below + mbb.AddButton({ + Module = "MirLua", + ButtonID = 2, + Flags = BBBF_ISLSIDEBUTTON, + Tooltip = "Msg button for deletion" + }) + end) + + mbb.OnMsgToolBarButtonPressed(function(w, l) + if l.Module == "MirLua" and l.ButtonID == 1 then + --- Remove button from msg buttons bar + mbb.RemoveButton("MirLua", 2) + end + end) +end) diff --git a/plugins/MirLua/src/m_msg_buttonsbar.cpp b/plugins/MirLua/src/m_msg_buttonsbar.cpp new file mode 100644 index 0000000000..1e779714e2 --- /dev/null +++ b/plugins/MirLua/src/m_msg_buttonsbar.cpp @@ -0,0 +1,164 @@ +#include "stdafx.h" + +static BBButton* MakeBBButton(lua_State *L) +{ + BBButton *tbb = (BBButton*)mir_calloc(sizeof(BBButton)); + tbb->cbSize = sizeof(BBButton); + tbb->dwDefPos = 100; + + lua_pushstring(L, "Module"); + lua_gettable(L, -2); + tbb->pszModuleName = mir_utf8decode((char*)luaL_checkstring(L, -1), NULL); + lua_pop(L, 1); + + lua_pushstring(L, "ButtonID"); + lua_gettable(L, -2); + tbb->dwButtonID = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "Flags"); + lua_gettable(L, -2); + tbb->bbbFlags = BBBF_ISLSIDEBUTTON | lua_tointeger(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "Tooltip"); + lua_gettable(L, -2); + tbb->ptszTooltip = mir_utf8decodeT((char*)lua_tostring(L, -1)); + lua_pop(L, 1); + + lua_pushstring(L, "Icon"); + lua_gettable(L, -2); + tbb->hIcon = (HANDLE)lua_touserdata(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 bbb(MakeBBButton(L)); + + INT_PTR res = ::CallService(MS_BB_ADDBUTTON, 0, (LPARAM)bbb); + lua_pushinteger(L, res); + + return 1; +} + +static int lua_ModifyButton(lua_State *L) +{ + if (lua_type(L, 1) != LUA_TTABLE) + { + lua_pushlightuserdata(L, 0); + return 1; + } + + mir_ptr bbb(MakeBBButton(L)); + + INT_PTR res = ::CallService(MS_BB_MODIFYBUTTON, 0, (LPARAM)bbb); + lua_pushinteger(L, res); + + return 1; +} + +static int lua_RemoveButton(lua_State *L) +{ + BBButton bbb = { sizeof(BBButton) }; + bbb.pszModuleName = mir_utf8decode((char*)luaL_checkstring(L, 1), NULL); + bbb.dwButtonID = luaL_checkinteger(L, 2); + + INT_PTR res = ::CallService(MS_BB_REMOVEBUTTON, 0, (LPARAM)&bbb); + lua_pushinteger(L, res); + + return 1; +} + +static int lua_OnMsgToolBarLoaded(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_MSG_TOOLBARLOADED, CMLua::HookEventObjParam, L, ref); + lua_pushlightuserdata(L, res); + + return 1; +} + +int ButtonPressedHookEventObjParam(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); + + CustomButtonClickData *bcd = (CustomButtonClickData*)lParam; + + lua_newtable(L); + lua_pushstring(L, "Module"); + lua_pushstring(L, bcd->pszModule); + lua_settable(L, -3); + lua_pushstring(L, "ButtonID"); + lua_pushinteger(L, bcd->dwButtonId); + lua_settable(L, -3); + lua_pushstring(L, "Flags"); + lua_pushinteger(L, bcd->flags); + lua_settable(L, -3); + + 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_OnMsgToolBarButtonPressed(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_MSG_BUTTONPRESSED, ButtonPressedHookEventObjParam, L, ref); + lua_pushlightuserdata(L, res); + + return 1; +} + +static luaL_Reg msgbuttinsbarApi[] = +{ + { "AddButton", lua_AddButton }, + { "ModifyButtonButton", lua_ModifyButton }, + { "RemoveButton", lua_RemoveButton }, + + { "OnMsgToolBarLoaded", lua_OnMsgToolBarLoaded }, + { "OnMsgToolBarButtonPressed", lua_OnMsgToolBarButtonPressed }, + + { NULL, NULL } +}; + +LUAMOD_API int luaopen_m_msg_buttonsbar(lua_State *L) +{ + luaL_newlib(L, msgbuttinsbarApi); + + return 1; +} diff --git a/plugins/MirLua/src/mlua.cpp b/plugins/MirLua/src/mlua.cpp index e731c151a8..a389e155f1 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_MSGBUTTONSBAR, luaopen_m_msg_buttonsbar); Preload(MLUA_TOPTOOLBAR, luaopen_m_toptoolbar); } diff --git a/plugins/MirLua/src/stdafx.h b/plugins/MirLua/src/stdafx.h index eea0740b9b..b26ae3db4e 100644 --- a/plugins/MirLua/src/stdafx.h +++ b/plugins/MirLua/src/stdafx.h @@ -14,6 +14,7 @@ #include #include +#include extern "C" { @@ -50,6 +51,9 @@ 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_MSGBUTTONSBAR "m_msg_buttonsbar" +LUAMOD_API int (luaopen_m_msg_buttonsbar)(lua_State *L); + #define MLUA_TOPTOOLBAR "m_toptoolbar" LUAMOD_API int (luaopen_m_toptoolbar)(lua_State *L); -- cgit v1.2.3