From a674fbe45df718f194948a7fa399c58fd9672519 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sun, 7 Jun 2015 20:55:38 +0000 Subject: MirLua: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@14061 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirLua/src/mlua_core.cpp | 155 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 plugins/MirLua/src/mlua_core.cpp (limited to 'plugins/MirLua/src/mlua_core.cpp') 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 } +}; -- cgit v1.2.3