Merge pull request #527 from adamharrison/native-interop

Native Plugins
This commit is contained in:
Adam 2021-09-23 15:11:08 -04:00 committed by GitHub
commit 8c32950f4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 450 additions and 3 deletions

View File

@ -5,7 +5,7 @@ keymap.modkeys = {}
keymap.map = {}
keymap.reverse_map = {}
local macos = rawget(_G, "MACOS")
local macos = PLATFORM == "Mac OS X"
-- Thanks to mathewmariani, taken from his lite-macos github repository.
local modkeys_os = require("core.modkeys-" .. (macos and "macos" or "generic"))

View File

@ -19,3 +19,12 @@ package.path = DATADIR .. '/?.lua;' .. package.path
package.path = DATADIR .. '/?/init.lua;' .. package.path
package.path = USERDIR .. '/?.lua;' .. package.path
package.path = USERDIR .. '/?/init.lua;' .. package.path
local dynamic_suffix = PLATFORM == "Mac OS X" and 'lib' or (PLATFORM == "Windows" and 'dll' or 'so')
package.cpath = DATADIR .. '/?.' .. dynamic_suffix .. ";" .. USERDIR .. '/?.' .. dynamic_suffix
package.native_plugins = {}
package.searchers = { package.searchers[1], package.searchers[2], function(modname)
local path = package.searchpath(modname, package.cpath)
if not path then return nil end
return system.load_native_plugin, path
end }

View File

@ -0,0 +1,360 @@
#ifndef LITE_XL_PLUGIN_API
#define LITE_XL_PLUGIN_API
/*
The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long
as it has an entrypoint that looks like the following, where xxxxx is the plugin name:
#include "lite_xl_plugin_api.h"
int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {
lite_xl_plugin_init(XL);
...
return 1;
}
In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!
Due to the way the API is structured, you *should not* link or include lua libraries.
This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY.
#!/bin/sh
echo "#ifndef LITE_XL_PLUGIN_API"
echo "#define LITE_XL_PLUGIN_API"
echo "/* "
echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long"
echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:"
echo
echo '#include "lite_xl_plugin_api.h"'
echo
echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {"
echo " lite_xl_plugin_init(XL);"
echo " ..."
echo " return 1;"
echo "}"
echo
echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!"
echo "Due to the way the API is structured, you *should not* link or include lua libraries."
echo
echo "This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY."
echo
echo
cat $0
echo "*""/"
echo "#include <stddef.h>"
echo "typedef struct lua_State lua_State; typedef double lua_Number; typedef int (*lua_CFunction)(lua_State*); typedef ptrdiff_t lua_Integer;"
echo "typedef unsigned long lua_Unsigned; typedef struct luaL_Buffer luaL_Buffer; typedef struct luaL_Reg luaL_Reg; typedef struct lua_Debug lua_Debug;"
echo "typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);"
echo "typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);"
echo "typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);"
LUA_HEADERS=`pkg-config --cflags lua5.2 | sed 's/^-I//' | sed 's/$/\/*.h/'`
grep -h "^LUA\(LIB\)*_API" $LUA_HEADERS | sed "s/LUA\(LIB\)*_API //" | sed "s/(lua/(*lua/" | grep -v ",\s*$" | sed "s/^/static /"
grep -h "#define luaL*_" $LUA_HEADERS | grep -v "\\\s*$" | grep -v "\(assert\|lock\)" | grep -v "\(asm\|int32\)" | grep -v "#define lua_number2integer(i,n)\s*lua_number2int(i, n)"
echo "#define lua_pushliteral(L, s) lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)"
echo "#define lua_pushglobaltable(L) lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)"
echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*)(__VA_ARGS__))symbol(#name)"
echo "static void lite_xl_plugin_init(void* XL) {"
echo "\tvoid* (*symbol)(const char*) = (void* (*)(const char*))XL;"
grep -h "^LUA\(LIB\)*_API" $LUA_HEADERS | sed "s/LUA\(LIB\)*_API //" | sed "s/(lua/(*lua/" | grep -v ",\s*$" | sed "s/^\([^)]*\)(\*\(lua\w*\))\s*(/\tIMPORT_SYMBOL(\2, \1,/"
echo "}"
echo "#endif"
*/
#include <stddef.h>
typedef struct lua_State lua_State; typedef double lua_Number; typedef int (*lua_CFunction)(lua_State*); typedef ptrdiff_t lua_Integer;
typedef unsigned long lua_Unsigned; typedef struct luaL_Buffer luaL_Buffer; typedef struct luaL_Reg luaL_Reg; typedef struct lua_Debug lua_Debug;
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);
static void (*luaL_checkversion_) (lua_State *L, lua_Number ver);
static int (*luaL_getmetafield) (lua_State *L, int obj, const char *e);
static int (*luaL_callmeta) (lua_State *L, int obj, const char *e);
static const char *(*luaL_tolstring) (lua_State *L, int idx, size_t *len);
static int (*luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
static lua_Number (*luaL_checknumber) (lua_State *L, int numArg);
static lua_Number (*luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
static lua_Integer (*luaL_checkinteger) (lua_State *L, int numArg);
static lua_Unsigned (*luaL_checkunsigned) (lua_State *L, int numArg);
static void (*luaL_checkstack) (lua_State *L, int sz, const char *msg);
static void (*luaL_checktype) (lua_State *L, int narg, int t);
static void (*luaL_checkany) (lua_State *L, int narg);
static int (*luaL_newmetatable) (lua_State *L, const char *tname);
static void (*luaL_setmetatable) (lua_State *L, const char *tname);
static void *(*luaL_testudata) (lua_State *L, int ud, const char *tname);
static void *(*luaL_checkudata) (lua_State *L, int ud, const char *tname);
static void (*luaL_where) (lua_State *L, int lvl);
static int (*luaL_error) (lua_State *L, const char *fmt, ...);
static int (*luaL_fileresult) (lua_State *L, int stat, const char *fname);
static int (*luaL_execresult) (lua_State *L, int stat);
static int (*luaL_ref) (lua_State *L, int t);
static void (*luaL_unref) (lua_State *L, int t, int ref);
static int (*luaL_loadstring) (lua_State *L, const char *s);
static lua_State *(*luaL_newstate) (void);
static int (*luaL_len) (lua_State *L, int idx);
static void (*luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
static int (*luaL_getsubtable) (lua_State *L, int idx, const char *fname);
static void (*luaL_buffinit) (lua_State *L, luaL_Buffer *B);
static char *(*luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
static void (*luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
static void (*luaL_addstring) (luaL_Buffer *B, const char *s);
static void (*luaL_addvalue) (luaL_Buffer *B);
static void (*luaL_pushresult) (luaL_Buffer *B);
static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
static lua_State *(*lua_newstate) (lua_Alloc f, void *ud);
static void (*lua_close) (lua_State *L);
static lua_State *(*lua_newthread) (lua_State *L);
static lua_CFunction (*lua_atpanic) (lua_State *L, lua_CFunction panicf);
static const lua_Number *(*lua_version) (lua_State *L);
static int (*lua_absindex) (lua_State *L, int idx);
static int (*lua_gettop) (lua_State *L);
static void (*lua_settop) (lua_State *L, int idx);
static void (*lua_pushvalue) (lua_State *L, int idx);
static void (*lua_remove) (lua_State *L, int idx);
static void (*lua_insert) (lua_State *L, int idx);
static void (*lua_replace) (lua_State *L, int idx);
static void (*lua_copy) (lua_State *L, int fromidx, int toidx);
static int (*lua_checkstack) (lua_State *L, int sz);
static void (*lua_xmove) (lua_State *from, lua_State *to, int n);
static int (*lua_isnumber) (lua_State *L, int idx);
static int (*lua_isstring) (lua_State *L, int idx);
static int (*lua_iscfunction) (lua_State *L, int idx);
static int (*lua_isuserdata) (lua_State *L, int idx);
static int (*lua_type) (lua_State *L, int idx);
static const char *(*lua_typename) (lua_State *L, int tp);
static lua_Number (*lua_tonumberx) (lua_State *L, int idx, int *isnum);
static lua_Integer (*lua_tointegerx) (lua_State *L, int idx, int *isnum);
static lua_Unsigned (*lua_tounsignedx) (lua_State *L, int idx, int *isnum);
static int (*lua_toboolean) (lua_State *L, int idx);
static const char *(*lua_tolstring) (lua_State *L, int idx, size_t *len);
static size_t (*lua_rawlen) (lua_State *L, int idx);
static lua_CFunction (*lua_tocfunction) (lua_State *L, int idx);
static void *(*lua_touserdata) (lua_State *L, int idx);
static lua_State *(*lua_tothread) (lua_State *L, int idx);
static const void *(*lua_topointer) (lua_State *L, int idx);
static void (*lua_arith) (lua_State *L, int op);
static int (*lua_rawequal) (lua_State *L, int idx1, int idx2);
static int (*lua_compare) (lua_State *L, int idx1, int idx2, int op);
static void (*lua_pushnil) (lua_State *L);
static void (*lua_pushnumber) (lua_State *L, lua_Number n);
static void (*lua_pushinteger) (lua_State *L, lua_Integer n);
static void (*lua_pushunsigned) (lua_State *L, lua_Unsigned n);
static const char *(*lua_pushlstring) (lua_State *L, const char *s, size_t l);
static const char *(*lua_pushstring) (lua_State *L, const char *s);
static const char *(*lua_pushfstring) (lua_State *L, const char *fmt, ...);
static void (*lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
static void (*lua_pushboolean) (lua_State *L, int b);
static void (*lua_pushlightuserdata) (lua_State *L, void *p);
static int (*lua_pushthread) (lua_State *L);
static void (*lua_getglobal) (lua_State *L, const char *var);
static void (*lua_gettable) (lua_State *L, int idx);
static void (*lua_getfield) (lua_State *L, int idx, const char *k);
static void (*lua_rawget) (lua_State *L, int idx);
static void (*lua_rawgeti) (lua_State *L, int idx, int n);
static void (*lua_rawgetp) (lua_State *L, int idx, const void *p);
static void (*lua_createtable) (lua_State *L, int narr, int nrec);
static void *(*lua_newuserdata) (lua_State *L, size_t sz);
static int (*lua_getmetatable) (lua_State *L, int objindex);
static void (*lua_getuservalue) (lua_State *L, int idx);
static void (*lua_setglobal) (lua_State *L, const char *var);
static void (*lua_settable) (lua_State *L, int idx);
static void (*lua_setfield) (lua_State *L, int idx, const char *k);
static void (*lua_rawset) (lua_State *L, int idx);
static void (*lua_rawseti) (lua_State *L, int idx, int n);
static void (*lua_rawsetp) (lua_State *L, int idx, const void *p);
static int (*lua_setmetatable) (lua_State *L, int objindex);
static void (*lua_setuservalue) (lua_State *L, int idx);
static int (*lua_getctx) (lua_State *L, int *ctx);
static int (*lua_dump) (lua_State *L, lua_Writer writer, void *data);
static int (*lua_resume) (lua_State *L, lua_State *from, int narg);
static int (*lua_status) (lua_State *L);
static int (*lua_gc) (lua_State *L, int what, int data);
static int (*lua_error) (lua_State *L);
static int (*lua_next) (lua_State *L, int idx);
static void (*lua_concat) (lua_State *L, int n);
static void (*lua_len) (lua_State *L, int idx);
static lua_Alloc (*lua_getallocf) (lua_State *L, void **ud);
static void (*lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
static int (*lua_getstack) (lua_State *L, int level, lua_Debug *ar);
static int (*lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
static const char *(*lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
static const char *(*lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
static const char *(*lua_getupvalue) (lua_State *L, int funcindex, int n);
static const char *(*lua_setupvalue) (lua_State *L, int funcindex, int n);
static void *(*lua_upvalueid) (lua_State *L, int fidx, int n);
static int (*lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);
static lua_Hook (*lua_gethook) (lua_State *L);
static int (*lua_gethookmask) (lua_State *L);
static int (*lua_gethookcount) (lua_State *L);
static void (*luaL_openlibs) (lua_State *L);
#define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM)
#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL)
#define luaL_newlib(L,l) (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL)
#define luaL_addsize(B,s) ((B)->n += (s))
#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0))
#define lua_h
#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i))
#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL)
#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL)
#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)
#define lua_tonumber(L,i) lua_tonumberx(L,i,NULL)
#define lua_tointeger(L,i) lua_tointegerx(L,i,NULL)
#define lua_tounsigned(L,i) lua_tounsignedx(L,i,NULL)
#define lua_pop(L,n) lua_settop(L, -(n)-1)
#define lua_newtable(L) lua_createtable(L, 0, 0)
#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
#define lua_strlen(L,i) lua_rawlen(L, (i))
#define lua_objlen(L,i) lua_rawlen(L, (i))
#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ)
#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT)
#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
#define lua_str2number(s,p) strtod((s), (p))
#define lua_strx2number(s,p) strtod((s), (p))
#define lua_pushliteral(L, s) lua_pushlstring(L, s, (sizeof(s)/sizeof(char))-1)
#define lua_pushglobaltable(L) lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)
#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*)(__VA_ARGS__))symbol(#name)
static void lite_xl_plugin_init(void* XL) {
void* (*symbol)(const char*) = (void* (*)(const char*))XL;
IMPORT_SYMBOL(luaL_checkversion_, void ,lua_State *L, lua_Number ver);
IMPORT_SYMBOL(luaL_getmetafield, int ,lua_State *L, int obj, const char *e);
IMPORT_SYMBOL(luaL_callmeta, int ,lua_State *L, int obj, const char *e);
IMPORT_SYMBOL(luaL_tolstring, const char *,lua_State *L, int idx, size_t *len);
IMPORT_SYMBOL(luaL_argerror, int ,lua_State *L, int numarg, const char *extramsg);
IMPORT_SYMBOL(luaL_checknumber, lua_Number ,lua_State *L, int numArg);
IMPORT_SYMBOL(luaL_optnumber, lua_Number ,lua_State *L, int nArg, lua_Number def);
IMPORT_SYMBOL(luaL_checkinteger, lua_Integer ,lua_State *L, int numArg);
IMPORT_SYMBOL(luaL_checkunsigned, lua_Unsigned ,lua_State *L, int numArg);
IMPORT_SYMBOL(luaL_checkstack, void ,lua_State *L, int sz, const char *msg);
IMPORT_SYMBOL(luaL_checktype, void ,lua_State *L, int narg, int t);
IMPORT_SYMBOL(luaL_checkany, void ,lua_State *L, int narg);
IMPORT_SYMBOL(luaL_newmetatable, int ,lua_State *L, const char *tname);
IMPORT_SYMBOL(luaL_setmetatable, void ,lua_State *L, const char *tname);
IMPORT_SYMBOL(luaL_testudata, void *,lua_State *L, int ud, const char *tname);
IMPORT_SYMBOL(luaL_checkudata, void *,lua_State *L, int ud, const char *tname);
IMPORT_SYMBOL(luaL_where, void ,lua_State *L, int lvl);
IMPORT_SYMBOL(luaL_error, int ,lua_State *L, const char *fmt, ...);
IMPORT_SYMBOL(luaL_fileresult, int ,lua_State *L, int stat, const char *fname);
IMPORT_SYMBOL(luaL_execresult, int ,lua_State *L, int stat);
IMPORT_SYMBOL(luaL_ref, int ,lua_State *L, int t);
IMPORT_SYMBOL(luaL_unref, void ,lua_State *L, int t, int ref);
IMPORT_SYMBOL(luaL_loadstring, int ,lua_State *L, const char *s);
IMPORT_SYMBOL(luaL_newstate, lua_State *,void);
IMPORT_SYMBOL(luaL_len, int ,lua_State *L, int idx);
IMPORT_SYMBOL(luaL_setfuncs, void ,lua_State *L, const luaL_Reg *l, int nup);
IMPORT_SYMBOL(luaL_getsubtable, int ,lua_State *L, int idx, const char *fname);
IMPORT_SYMBOL(luaL_buffinit, void ,lua_State *L, luaL_Buffer *B);
IMPORT_SYMBOL(luaL_prepbuffsize, char *,luaL_Buffer *B, size_t sz);
IMPORT_SYMBOL(luaL_addlstring, void ,luaL_Buffer *B, const char *s, size_t l);
IMPORT_SYMBOL(luaL_addstring, void ,luaL_Buffer *B, const char *s);
IMPORT_SYMBOL(luaL_addvalue, void ,luaL_Buffer *B);
IMPORT_SYMBOL(luaL_pushresult, void ,luaL_Buffer *B);
IMPORT_SYMBOL(luaL_pushresultsize, void ,luaL_Buffer *B, size_t sz);
IMPORT_SYMBOL(luaL_buffinitsize, char *,lua_State *L, luaL_Buffer *B, size_t sz);
IMPORT_SYMBOL(lua_newstate, lua_State *,lua_Alloc f, void *ud);
IMPORT_SYMBOL(lua_close, void ,lua_State *L);
IMPORT_SYMBOL(lua_newthread, lua_State *,lua_State *L);
IMPORT_SYMBOL(lua_atpanic, lua_CFunction ,lua_State *L, lua_CFunction panicf);
IMPORT_SYMBOL(lua_version, const lua_Number *,lua_State *L);
IMPORT_SYMBOL(lua_absindex, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_gettop, int ,lua_State *L);
IMPORT_SYMBOL(lua_settop, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_pushvalue, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_remove, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_insert, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_replace, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_copy, void ,lua_State *L, int fromidx, int toidx);
IMPORT_SYMBOL(lua_checkstack, int ,lua_State *L, int sz);
IMPORT_SYMBOL(lua_xmove, void ,lua_State *from, lua_State *to, int n);
IMPORT_SYMBOL(lua_isnumber, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_isstring, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_iscfunction, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_isuserdata, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_type, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_typename, const char *,lua_State *L, int tp);
IMPORT_SYMBOL(lua_tonumberx, lua_Number ,lua_State *L, int idx, int *isnum);
IMPORT_SYMBOL(lua_tointegerx, lua_Integer ,lua_State *L, int idx, int *isnum);
IMPORT_SYMBOL(lua_tounsignedx, lua_Unsigned ,lua_State *L, int idx, int *isnum);
IMPORT_SYMBOL(lua_toboolean, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_tolstring, const char *,lua_State *L, int idx, size_t *len);
IMPORT_SYMBOL(lua_rawlen, size_t ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_tocfunction, lua_CFunction ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_touserdata, void *,lua_State *L, int idx);
IMPORT_SYMBOL(lua_tothread, lua_State *,lua_State *L, int idx);
IMPORT_SYMBOL(lua_topointer, const void *,lua_State *L, int idx);
IMPORT_SYMBOL(lua_arith, void ,lua_State *L, int op);
IMPORT_SYMBOL(lua_rawequal, int ,lua_State *L, int idx1, int idx2);
IMPORT_SYMBOL(lua_compare, int ,lua_State *L, int idx1, int idx2, int op);
IMPORT_SYMBOL(lua_pushnil, void ,lua_State *L);
IMPORT_SYMBOL(lua_pushnumber, void ,lua_State *L, lua_Number n);
IMPORT_SYMBOL(lua_pushinteger, void ,lua_State *L, lua_Integer n);
IMPORT_SYMBOL(lua_pushunsigned, void ,lua_State *L, lua_Unsigned n);
IMPORT_SYMBOL(lua_pushlstring, const char *,lua_State *L, const char *s, size_t l);
IMPORT_SYMBOL(lua_pushstring, const char *,lua_State *L, const char *s);
IMPORT_SYMBOL(lua_pushfstring, const char *,lua_State *L, const char *fmt, ...);
IMPORT_SYMBOL(lua_pushcclosure, void ,lua_State *L, lua_CFunction fn, int n);
IMPORT_SYMBOL(lua_pushboolean, void ,lua_State *L, int b);
IMPORT_SYMBOL(lua_pushlightuserdata, void ,lua_State *L, void *p);
IMPORT_SYMBOL(lua_pushthread, int ,lua_State *L);
IMPORT_SYMBOL(lua_getglobal, void ,lua_State *L, const char *var);
IMPORT_SYMBOL(lua_gettable, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_getfield, void ,lua_State *L, int idx, const char *k);
IMPORT_SYMBOL(lua_rawget, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_rawgeti, void ,lua_State *L, int idx, int n);
IMPORT_SYMBOL(lua_rawgetp, void ,lua_State *L, int idx, const void *p);
IMPORT_SYMBOL(lua_createtable, void ,lua_State *L, int narr, int nrec);
IMPORT_SYMBOL(lua_newuserdata, void *,lua_State *L, size_t sz);
IMPORT_SYMBOL(lua_getmetatable, int ,lua_State *L, int objindex);
IMPORT_SYMBOL(lua_getuservalue, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_setglobal, void ,lua_State *L, const char *var);
IMPORT_SYMBOL(lua_settable, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_setfield, void ,lua_State *L, int idx, const char *k);
IMPORT_SYMBOL(lua_rawset, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_rawseti, void ,lua_State *L, int idx, int n);
IMPORT_SYMBOL(lua_rawsetp, void ,lua_State *L, int idx, const void *p);
IMPORT_SYMBOL(lua_setmetatable, int ,lua_State *L, int objindex);
IMPORT_SYMBOL(lua_setuservalue, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_getctx, int ,lua_State *L, int *ctx);
IMPORT_SYMBOL(lua_dump, int ,lua_State *L, lua_Writer writer, void *data);
IMPORT_SYMBOL(lua_resume, int ,lua_State *L, lua_State *from, int narg);
IMPORT_SYMBOL(lua_status, int ,lua_State *L);
IMPORT_SYMBOL(lua_gc, int ,lua_State *L, int what, int data);
IMPORT_SYMBOL(lua_error, int ,lua_State *L);
IMPORT_SYMBOL(lua_next, int ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_concat, void ,lua_State *L, int n);
IMPORT_SYMBOL(lua_len, void ,lua_State *L, int idx);
IMPORT_SYMBOL(lua_getallocf, lua_Alloc ,lua_State *L, void **ud);
IMPORT_SYMBOL(lua_setallocf, void ,lua_State *L, lua_Alloc f, void *ud);
IMPORT_SYMBOL(lua_getstack, int ,lua_State *L, int level, lua_Debug *ar);
IMPORT_SYMBOL(lua_getinfo, int ,lua_State *L, const char *what, lua_Debug *ar);
IMPORT_SYMBOL(lua_getlocal, const char *,lua_State *L, const lua_Debug *ar, int n);
IMPORT_SYMBOL(lua_setlocal, const char *,lua_State *L, const lua_Debug *ar, int n);
IMPORT_SYMBOL(lua_getupvalue, const char *,lua_State *L, int funcindex, int n);
IMPORT_SYMBOL(lua_setupvalue, const char *,lua_State *L, int funcindex, int n);
IMPORT_SYMBOL(lua_upvalueid, void *,lua_State *L, int fidx, int n);
IMPORT_SYMBOL(lua_sethook, int ,lua_State *L, lua_Hook func, int mask, int count);
IMPORT_SYMBOL(lua_gethook, lua_Hook ,lua_State *L);
IMPORT_SYMBOL(lua_gethookmask, int ,lua_State *L);
IMPORT_SYMBOL(lua_gethookcount, int ,lua_State *L);
IMPORT_SYMBOL(luaL_openlibs, void ,lua_State *L);
}
#endif

View File

@ -651,6 +651,85 @@ static int f_set_window_opacity(lua_State *L) {
return 1;
}
// Symbol table for native plugin loading. Allows for a statically
// bound lua library to be used by native plugins.
typedef struct {
const char* symbol;
void* address;
} lua_function_node;
#define P(FUNC) { "lua_" #FUNC, (void*)(lua_##FUNC) }
#define U(FUNC) { "luaL_" #FUNC, (void*)(luaL_##FUNC) }
static void* api_require(const char* symbol) {
static lua_function_node nodes[] = {
P(absindex), P(arith), P(atpanic), P(callk), P(checkstack),
P(close), P(compare), P(concat), P(copy), P(createtable), P(dump),
P(error), P(gc), P(getallocf), P(getctx), P(getfield), P(getglobal),
P(gethook), P(gethookcount), P(gethookmask), P(getinfo), P(getlocal),
P(getmetatable), P(getstack), P(gettable), P(gettop), P(getupvalue),
P(getuservalue), P(insert), P(isnumber), P(isstring), P(isuserdata),
P(len), P(load), P(newstate), P(newthread), P(newuserdata), P(next),
P(pcallk), P(pushboolean), P(pushcclosure), P(pushfstring), P(pushinteger),
P(pushlightuserdata), P(pushlstring), P(pushnil), P(pushnumber),
P(pushstring), P(pushthread), P(pushunsigned), P(pushvalue),
P(pushvfstring), P(rawequal), P(rawget), P(rawgeti), P(rawgetp), P(rawlen),
P(rawset), P(rawseti), P(rawsetp), P(remove), P(replace), P(resume),
P(setallocf), P(setfield), P(setglobal), P(sethook), P(setlocal),
P(setmetatable), P(settable), P(settop), P(setupvalue), P(setuservalue),
P(status), P(tocfunction), P(tointegerx), P(tolstring), P(toboolean),
P(tonumberx), P(topointer), P(tothread), P(tounsignedx), P(touserdata),
P(type), P(typename), P(upvalueid), P(upvaluejoin), P(version), P(xmove),
P(yieldk), U(checkversion_), U(getmetafield), U(callmeta), U(tolstring),
U(argerror), U(checknumber), U(optnumber), U(checkinteger),
U(checkunsigned), U(checkstack), U(checktype), U(checkany),
U(newmetatable), U(setmetatable), U(testudata), U(checkudata), U(where),
U(error), U(fileresult), U(execresult), U(ref), U(unref), U(loadstring),
U(newstate), U(len), U(setfuncs), U(getsubtable), U(buffinit),
U(prepbuffsize), U(addlstring), U(addstring), U(addvalue), U(pushresult),
U(pushresultsize), U(buffinitsize)
};
for (int i = 0; i < sizeof(nodes) / sizeof(lua_function_node); ++i) {
if (strcmp(nodes[i].symbol, symbol) == 0)
return nodes[i].address;
}
return NULL;
}
static int f_load_native_plugin(lua_State* L) {
size_t sname, namelen, pathlen;
int results;
char olib[512]; olib[sizeof(olib)-1] = 0;
const char* name = luaL_checklstring(L, -2, &namelen);
const char* path = luaL_checklstring(L, -1, &pathlen);
void* library = SDL_LoadObject(path);
if (name == 0 || !library)
return luaL_error(L, "Unable to load %s: %s", name, SDL_GetError());
lua_getglobal(L, "package");
lua_getfield(L, -1, "native_plugins");
lua_pushlightuserdata(L, library);
lua_setfield(L, -2, name);
lua_pop(L, 1);
for (sname = namelen - 1; sname > 0 && name[sname] != '.'; --sname);
snprintf(olib, sizeof(olib), "lua_open_lite_xl_%s", &name[sname+1]);
int (*ext_entrypoint)(lua_State* L, void*) = SDL_LoadFunction(library, olib);
if (!ext_entrypoint) {
snprintf(olib, sizeof(olib), "lua_open_%s", &name[sname+1]);
int (*entrypoint)(lua_State* L) = SDL_LoadFunction(library, olib);
if (!entrypoint) {
return luaL_error(L, "Unable to load %s: Can't find entrypoint. Requires a "
"function defined as int lua_open_lite_xl_%s(lua_State* L, void* XL)",
name, &name[sname+1]);
}
results = entrypoint(L);
} else {
results = ext_entrypoint(L, api_require);
}
if (!results)
return luaL_error(L, "Unable to load %s: Your entrypoint must return at "
" least one value.", name);
return results;
}
static const luaL_Reg lib[] = {
{ "poll_event", f_poll_event },
@ -678,6 +757,7 @@ static const luaL_Reg lib[] = {
{ "exec", f_exec },
{ "fuzzy_match", f_fuzzy_match },
{ "set_window_opacity", f_set_window_opacity },
{ "load_native_plugin", f_load_native_plugin },
{ NULL, NULL }
};

View File

@ -140,8 +140,6 @@ init_lua:
lua_setglobal(L, "EXEFILE");
#ifdef __APPLE__
lua_pushboolean(L, true);
lua_setglobal(L, "MACOS");
enable_momentum_scroll();
#ifdef MACOS_USE_BUNDLE
set_macos_bundle_resources(L);