diff options
author | Luis Ontanon <luis.ontanon@gmail.com> | 2006-02-05 04:02:52 +0000 |
---|---|---|
committer | Luis Ontanon <luis.ontanon@gmail.com> | 2006-02-05 04:02:52 +0000 |
commit | 174291f7f7be1d1588e2da98a1c3a62c2833c534 (patch) | |
tree | ab0ff469159b04254659ddc2363fbab339d5bebc /plugins | |
parent | 2e36cb403a39f7cc26bdc9e2f05082133aeff118 (diff) |
Allow lua to register menu items
svn path=/trunk/; revision=17162
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/lua/lua_gui.c | 64 | ||||
-rw-r--r-- | plugins/lua/packet-lua.c | 4 | ||||
-rw-r--r-- | plugins/lua/packet-lua.h | 2 |
3 files changed, 70 insertions, 0 deletions
diff --git a/plugins/lua/lua_gui.c b/plugins/lua/lua_gui.c index 4039deee44..55c4a48937 100644 --- a/plugins/lua/lua_gui.c +++ b/plugins/lua/lua_gui.c @@ -30,6 +30,69 @@ LUA_CLASS_DEFINE(TextWindow,TEXT_WINDOW,NOP) static const funnel_ops_t* ops = NULL; +struct _lua_menu_data { + lua_State* L; + int cb_ref; + int data_ref; +}; + +static int menu_cb_error_handler(lua_State* L) { + const gchar* error = lua_tostring(L,1); + report_failure("Lua: Error During execution of Menu Callback:\n %s",error); + return 0; +} + +void lua_menu_callback(gpointer data) { + struct _lua_menu_data* md = data; + int i; + + lua_pushcfunction(md->L,menu_cb_error_handler); + lua_rawgeti(md->L, LUA_REGISTRYINDEX, md->cb_ref); + lua_rawgeti(md->L, LUA_REGISTRYINDEX, md->data_ref); + + lua_pcall(md->L,1,0,1); + + return; +} + +extern int lua_register_menu(lua_State* L) { + const gchar* name = luaL_checkstring(L,1); + struct _lua_menu_data* md; + + if (ops) { + luaL_error(L,"to late to register_menu"); + return 0; + } + + if (!lua_isfunction(L,2)) { + luaL_error(L,"register_menu takes a string, a function and another optional datum"); + return 0; + } + + md = g_malloc(sizeof(struct _lua_menu_data)); + md->L = L; + + lua_pushvalue(L, 2); + md->cb_ref = luaL_ref(L, LUA_REGISTRYINDEX); + + if ( lua_gettop(L) > 2) { + lua_pushvalue(L, 3); + md->data_ref = luaL_ref(L, LUA_REGISTRYINDEX); + } else { + md->data_ref = LUA_NOREF; + } + + funnel_register_menu(name, + REGISTER_STAT_GROUP_GENERIC, + lua_menu_callback, + md); +} + + +/* + * TextWindow + */ + static int TextWindow_new(lua_State* L) { const gchar* title; TextWindow tw; @@ -140,3 +203,4 @@ int TextWindow_register(lua_State* L) { return 1; } + diff --git a/plugins/lua/packet-lua.c b/plugins/lua/packet-lua.c index bf84124a2d..1d37c97ca2 100644 --- a/plugins/lua/packet-lua.c +++ b/plugins/lua/packet-lua.c @@ -416,6 +416,10 @@ void proto_register_lua(void) lua_pushcfunction(L, lua_report_failure); lua_settable(L, LUA_GLOBALSINDEX); + lua_pushstring(L, "register_menu"); + lua_pushcfunction(L, lua_register_menu); + lua_settable(L, LUA_GLOBALSINDEX); + lua_pushstring(L, LUA_HANDOFF_ROUTINES); lua_newtable (L); lua_settable(L, LUA_REGISTRYINDEX); diff --git a/plugins/lua/packet-lua.h b/plugins/lua/packet-lua.h index ce071f1dd0..9b9338aa85 100644 --- a/plugins/lua/packet-lua.h +++ b/plugins/lua/packet-lua.h @@ -255,6 +255,8 @@ extern void lua_tap_draw(void *tapdata); extern const gchar* lua_shiftstring(lua_State* L,int idx); +extern int lua_register_menu(lua_State* L); + extern GString* lua_register_all_taps(void); extern void lua_prime_all_fields(proto_tree* tree); |