summaryrefslogtreecommitdiff
path: root/plugins/MirLua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/MirLua')
-rw-r--r--plugins/MirLua/docs/examples/msgbuttonsbar.lua39
-rw-r--r--plugins/MirLua/src/m_msg_buttonsbar.cpp164
-rw-r--r--plugins/MirLua/src/mlua.cpp1
-rw-r--r--plugins/MirLua/src/stdafx.h4
4 files changed, 208 insertions, 0 deletions
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<BBButton> 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<BBButton> 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 <m_folders.h>
#include <m_toptoolbar.h>
+#include <m_msg_buttonsbar.h>
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);