From c3bc5bd52879a85a7a6bfd4e2baefbe7cf37bc01 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Tue, 13 Apr 2010 15:55:07 +0800 Subject: ime register command in progress. --- lua/lua-plugin-init.c | 19 +++++++++++++++++++ lua/lua-plugin.c | 2 ++ lua/lua-plugin.h | 7 +++++-- lua/test-lua-plugin.c | 2 ++ 4 files changed, 28 insertions(+), 2 deletions(-) (limited to 'lua') diff --git a/lua/lua-plugin-init.c b/lua/lua-plugin-init.c index 42c6f5c..996b314 100644 --- a/lua/lua-plugin-init.c +++ b/lua/lua-plugin-init.c @@ -29,6 +29,25 @@ void lua_plugin_openlibs (lua_State *L) { } } +void lua_plugin_store_plugin(lua_State * L, IBusEnginePlugin * plugin){ + luaL_newmetatable(L, LUA_IMELIBNAME); + lua_pushliteral(L, LUA_IMELIB_CONTEXT); + lua_pushlightuserdata(L, plugin); + lua_rawset(L, -3); + lua_pop(L, 1); +} + +IBusEnginePlugin * lua_plugin_retrieve_plugin(lua_State * L) { + luaL_newmetatable(L, LUA_IMELIBNAME); + lua_pushliteral(L, LUA_IMELIB_CONTEXT); + lua_rawget(L, -2); + luaL_checktype(L, -1, LUA_TLIGHTUSERDATA); + IBusEnginePlugin * plugin = lua_touserdata(L, -1); + g_assert(IBUS_IS_ENGINE_PLUGIN(plugin)); + lua_pop(L, 2); + return plugin; +} + static int ime_get_last_commit(lua_State* L){ /*TODO: not implemented. */ fprintf(stderr, "TODO: ime_get_last_commit unimplemented.\n"); diff --git a/lua/lua-plugin.c b/lua/lua-plugin.c index 7eb99d6..ac03e15 100644 --- a/lua/lua-plugin.c +++ b/lua/lua-plugin.c @@ -83,6 +83,8 @@ ibus_engine_plugin_init (IBusEnginePlugin *self) memset(priv, 0, sizeof(IBusEnginePluginPrivate)); lua_plugin_init(priv); + + lua_plugin_store_plugin(priv->L, self); } IBusEnginePlugin * ibus_engine_plugin_new(){ diff --git a/lua/lua-plugin.h b/lua/lua-plugin.h index 2d50329..084fe15 100644 --- a/lua/lua-plugin.h +++ b/lua/lua-plugin.h @@ -5,8 +5,7 @@ #define LUA_IMELIBNAME "ime" LUALIB_API int (luaopen_ime) (lua_State * L); - -void lua_plugin_openlibs (lua_State *L); +#define LUA_IMELIB_CONTEXT "__context" typedef struct{ const char * command_name; @@ -31,6 +30,10 @@ typedef struct _IBusEnginePlugin IBusEnginePlugin; typedef struct _IBusEnginePluginClass IBusEnginePluginClass; typedef struct _IBusEnginePluginPrivate IBusEnginePluginPrivate; +void lua_plugin_openlibs (lua_State *L); +void lua_plugin_store_plugin(lua_State * L, IBusEnginePlugin * plugin); +IBusEnginePlugin * lua_plugin_retrieve_plugin(lua_State * L); + struct _IBusEnginePlugin { GObject parent_instance; diff --git a/lua/test-lua-plugin.c b/lua/test-lua-plugin.c index 44e5586..72ec552 100644 --- a/lua/test-lua-plugin.c +++ b/lua/test-lua-plugin.c @@ -44,6 +44,8 @@ int main(int argc, char * argv[]){ lua_State * L = ibus_engine_plugin_get_lua_State(plugin); run_test(L, "test.lua"); + g_assert(lua_plugin_retrieve_plugin(L) == plugin); + g_object_unref(plugin); return 0; -- cgit