diff options
author | Alexander Lantsev <aunsane@gmail.com> | 2015-06-12 10:42:43 +0000 |
---|---|---|
committer | Alexander Lantsev <aunsane@gmail.com> | 2015-06-12 10:42:43 +0000 |
commit | 297a4ecf64fd16ac6b6616e6938ca86554f46c42 (patch) | |
tree | cb5a12e4901ff6aba2077a05862ff61c51ff4fe8 | |
parent | 6d73d5c2980507e6823bb629aa2ce8d410989b8a (diff) |
MirLua: added toptoolbar module
git-svn-id: http://svn.miranda-ng.org/main/trunk@14132 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r-- | plugins/MirLua/docs/examples/toptoolbar.lua | 47 | ||||
-rw-r--r-- | plugins/MirLua/src/m_core.cpp | 117 | ||||
-rw-r--r-- | plugins/MirLua/src/m_toptoolbar.cpp | 125 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua.cpp | 62 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua.h | 5 | ||||
-rw-r--r-- | plugins/MirLua/src/stdafx.h | 7 |
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_
|