summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/MirLua/docs/examples/toptoolbar.lua47
-rw-r--r--plugins/MirLua/src/m_core.cpp117
-rw-r--r--plugins/MirLua/src/m_toptoolbar.cpp125
-rw-r--r--plugins/MirLua/src/mlua.cpp62
-rw-r--r--plugins/MirLua/src/mlua.h5
-rw-r--r--plugins/MirLua/src/stdafx.h7
6 files changed, 252 insertions, 111 deletions
diff --git a/plugins/MirLua/docs/examples/toptoolbar.lua b/plugins/MirLua/docs/examples/toptoolbar.lua
new file mode 100644
index 0000000000..ea24ec31e1
--- /dev/null
+++ b/plugins/MirLua/docs/examples/toptoolbar.lua
@@ -0,0 +1,47 @@
+--- include m_toptoolbar module
+local ttb = require('m_toptoolbar')
+--- include m_icolib module
+local icolib = require('m_icolib')
+
+local TTBBF_VISIBLE = tonumber("0x0002", 16)
+
+m.OnModulesLoaded(function()
+ ttb.OnTopToolBarLoaded(function()
+ local ttbButton =
+ {
+ -- required field
+ Name = "MirLua",
+
+ Service = nil,
+ Flags = TTBBF_VISIBLE,
+
+ IconUp = nil,
+ TooltipUp = "Up state",
+ wParamUp = nil,
+ lParamUp = nil,
+
+ IconDown = nil,
+ TooltipDown = "Down state",
+ wParamDown = nil,
+ lParamDown = nil
+ }
+
+ --- Add icons for top toolbar
+ ttbButton.IconUp = icolib.AddIcon('testTTBIconUp', 'Lua icon for ttbButtonUp')
+ ttbButton.IconDown = icolib.AddIcon('testTTBIconDn', 'Lua icon for ttbButtonUp')
+
+ --- Add button on top toolbar
+ ttb.Service = "Srv/TTB"
+ ttb.AddButton(ttbButton)
+
+ --- Create the top toolbar button which will be deleted below
+ local hTTButton = ttb.AddButton({
+ Name = "MirLua",
+ TooltipUp = "Up state to delete",
+ TooltipDown = "Down state to delete"
+ })
+
+ --- Remove button from top toolbar
+ ttb.RemoveButton(hTTButton)
+ end)
+end)
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<TTBButton> 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 <m_core.h>
#include <m_utils.h>
#include <m_langpack.h>
-#include <m_folders.h>
#include <m_database.h>
#include <m_clist.h>
#include <m_genmenu.h>
#include <m_icolib.h>
+#include <m_folders.h>
+#include <m_toptoolbar.h>
+
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_