aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2006-02-05 04:02:52 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2006-02-05 04:02:52 +0000
commit174291f7f7be1d1588e2da98a1c3a62c2833c534 (patch)
treeab0ff469159b04254659ddc2363fbab339d5bebc /plugins
parent2e36cb403a39f7cc26bdc9e2f05082133aeff118 (diff)
Allow lua to register menu items
svn path=/trunk/; revision=17162
Diffstat (limited to 'plugins')
-rw-r--r--plugins/lua/lua_gui.c64
-rw-r--r--plugins/lua/packet-lua.c4
-rw-r--r--plugins/lua/packet-lua.h2
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);