lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Milan Obuch once stated:
> Hi,

  Hello.

> When plugin is being loaded, a function is registered with Claws Mail
> hook mechanism which is to be called on creating mail compose window.
> When I try to create new message or reply to existing one, compose
> window is being created and my function is being called with an
> argument - C pointer to structure describing the window. In my C
> function I use luaL_dofile() to load a script from file and execute it.
> 
> And here comes the question - how can I use this C pointer as an
> argument for my script? I know I can do
> 
> lua_pushlightuserdata(L,(void *)compose_window_argument);
> luaL_dofile(L,"my_script_file");
> lua_pop(L,1);
> 
> but I found no way to access this argument from my_script_file. 

  There is a way, but you can't use luaL_dofile().  First off, change the C
code to:

	int rc;

	rc = luaL_loadfile(L,"my_script_file");
	if (rc != LUA_OKAY) error(); 
	lua_pushlightuserdata(L,(void *)compose_window_argument);
	rc = lua_pcall(L,1,LUA_MULTRET,0);
	if (rc != LUA_OKAY) error();

(minimal error checking added---handle as appropriate).  Then in your
script:

	local window = ...

or

	local window = select(1,...)

  When Lua loads any code, it is compiled and returned as a function, which
when run, will do the action of the script.  As long as there are parameters
on the stack, the script can reference them via '...' (or select()).

  -spc