diff options
author | Alexander Lantsev <aunsane@gmail.com> | 2015-06-07 20:55:38 +0000 |
---|---|---|
committer | Alexander Lantsev <aunsane@gmail.com> | 2015-06-07 20:55:38 +0000 |
commit | a674fbe45df718f194948a7fa399c58fd9672519 (patch) | |
tree | fe59698871070fed40af646e5e83c22d47e69b7c /plugins/MirLua/src/mlua_core.cpp | |
parent | ba275795eba1936a3c395527cc55936a4dc02f9d (diff) |
MirLua: initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@14061 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/MirLua/src/mlua_core.cpp')
-rw-r--r-- | plugins/MirLua/src/mlua_core.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/plugins/MirLua/src/mlua_core.cpp b/plugins/MirLua/src/mlua_core.cpp new file mode 100644 index 0000000000..1c38ee0e4a --- /dev/null +++ b/plugins/MirLua/src/mlua_core.cpp @@ -0,0 +1,155 @@ +#include "stdafx.h" + +static int lua_CreateHookableEvent(lua_State *L) +{ + const char *name = luaL_checkstring(L, 1);
+
+ HANDLE res = ::CreateHookableEvent(name);
+ lua_pushlightuserdata(L, res);
+
+ return 1; +} + +static int lua_DestroyHookableEvent(lua_State *L) +{ + HANDLE hEvent = (HANDLE)lua_touserdata(L, 1);
+
+ int res = ::DestroyHookableEvent(hEvent);
+ lua_pushinteger(L, res);
+
+ return 1; +} + +static int lua_NotifyEventHooks(lua_State *L) +{ + HANDLE hEvent = (HANDLE)lua_touserdata(L, 1);
+ WPARAM wParam = (WPARAM)luaL_checkinteger(L, 2);
+ LPARAM lParam = (LPARAM)luaL_checkinteger(L, 3); + + int res = ::NotifyEventHooks(hEvent, wParam, lParam);
+ lua_pushinteger(L, res);
+
+ 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);
+ lua_call(L, 2, 1);
+ int res = (int)luaL_checkinteger(L, 1);
+
+ luaL_unref(L, LUA_REGISTRYINDEX, ref);
+
+ return res;
+} + +static int lua_HookEvent(lua_State *L)
+{
+ const char *name = luaL_checkstring(L, 1);
+
+ lua_pushvalue(L, 2);
+ int ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ HANDLE res = ::HookEventObjParam(name, HookEventObjParam, L, ref);
+ lua_pushlightuserdata(L, res);
+
+ return 1; +} + +static int lua_UnhookEvent(lua_State *L) +{ + HANDLE hEvent = (HANDLE)lua_touserdata(L, 1);
+
+ int res = ::UnhookEvent(hEvent);
+ lua_pushinteger(L, res);
+
+ return 1; +} + +static INT_PTR ServiceFunctionObjParam(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);
+ lua_call(L, 2, 1);
+ INT_PTR res = (INT_PTR)luaL_checkinteger(L, 1);
+
+ luaL_unref(L, LUA_REGISTRYINDEX, ref);
+
+ return res;
+} + +static int lua_CreateServiceFunction(lua_State *L)
+{
+ const char *name = luaL_checkstring(L, 1);
+
+ lua_pushvalue(L, 2);
+ int ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ HANDLE res = ::CreateServiceFunctionObjParam(name, ServiceFunctionObjParam, L, ref);
+ lua_pushlightuserdata(L, res);
+
+ return 1;
+}
+
+static int lua_DestroyServiceFunction(lua_State *L)
+{
+ HANDLE hService = (HANDLE)lua_touserdata(L, 1);
+
+ int res = ::DestroyServiceFunction(hService);
+ lua_pushinteger(L, res);
+
+ return 1;
+}
+
+static int lua_ServiceExists(lua_State *L)
+{
+ const char *name = luaL_checkstring(L, 1);
+
+ int res = ::ServiceExists(name);
+ lua_pushboolean(L, res);
+
+ return 1;
+}
+
+static int lua_CallService(lua_State *L)
+{
+ const char *name = luaL_checkstring(L, 1);
+
+ WPARAM wParam = (WPARAM)luaL_checkinteger(L, 2);
+ LPARAM lParam = (LPARAM)luaL_checkinteger(L, 3);
+
+ INT_PTR res = ::CallService(name, wParam, lParam);
+ lua_pushinteger(L, res);
+
+ return 1;
+}
+
+luaL_Reg CMLua::CoreFunctions[10] =
+{
+ { "CreateHookableEvent", lua_CreateHookableEvent },
+ { "DestroyHookableEvent", lua_DestroyHookableEvent },
+
+ { "NotifyEventHooks", lua_NotifyEventHooks },
+
+ { "HookEvent", lua_HookEvent },
+ { "UnhookEvent", lua_UnhookEvent },
+
+ { "CreateServiceFunction", lua_CreateServiceFunction },
+ { "DestroyServiceFunction", lua_DestroyServiceFunction },
+
+ { "ServiceExists", lua_ServiceExists },
+ { "CallService", lua_CallService },
+
+ { 0, 0 }
+}; |