You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							150 lines
						
					
					
						
							3.3 KiB
						
					
					
				#include "luavgl.h"
 | 
						|
#include "private.h"
 | 
						|
 | 
						|
#include "anim.c"
 | 
						|
#include "constants.c"
 | 
						|
#include "disp.c"
 | 
						|
#include "font.c"
 | 
						|
#include "fs.c"
 | 
						|
#include "group.c"
 | 
						|
#include "indev.c"
 | 
						|
#include "obj.c"
 | 
						|
#include "timer.c"
 | 
						|
#include "util.c"
 | 
						|
 | 
						|
static const struct luaL_Reg luavgl_methods[] = {
 | 
						|
    {"Timer", luavgl_timer_create}, /* timer.c */
 | 
						|
    {"Font",  luavgl_font_create }, /* font.c */
 | 
						|
    {"Style", luavgl_style_create}, /* style.c */
 | 
						|
    {"Anim",  luavgl_anim_create }, /* anim.c */
 | 
						|
 | 
						|
    {NULL,    NULL               },
 | 
						|
};
 | 
						|
 | 
						|
LUALIB_API luavgl_ctx_t *luavgl_context(lua_State *L)
 | 
						|
{
 | 
						|
  static const char *luavglgl_key = "luavgl_key";
 | 
						|
 | 
						|
  luavgl_ctx_t *ctx;
 | 
						|
  lua_pushstring(L, luavglgl_key);
 | 
						|
  lua_rawget(L, LUA_REGISTRYINDEX);
 | 
						|
 | 
						|
  /**
 | 
						|
   * ctx = registry[luavgl_key]
 | 
						|
   * if ctx == nil then
 | 
						|
   *    ctx = new ctx
 | 
						|
   * else
 | 
						|
   *    return ctx
 | 
						|
   * end
 | 
						|
   */
 | 
						|
 | 
						|
  if (lua_isnil(L, -1)) {
 | 
						|
    /* create it if not exist in registry */
 | 
						|
    lua_pushstring(L, luavglgl_key);
 | 
						|
    ctx = (luavgl_ctx_t *)lua_newuserdata(L, sizeof(*ctx));
 | 
						|
    memset(ctx, 0, sizeof(*ctx));
 | 
						|
    lua_rawset(L, LUA_REGISTRYINDEX);
 | 
						|
  } else {
 | 
						|
    ctx = (luavgl_ctx_t *)lua_touserdata(L, -1);
 | 
						|
  }
 | 
						|
 | 
						|
  lua_pop(L, 1);
 | 
						|
  return ctx;
 | 
						|
}
 | 
						|
 | 
						|
LUALIB_API void luavgl_set_pcall(lua_State *L, luavgl_pcall_t pcall)
 | 
						|
{
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
  ctx->pcall = pcall;
 | 
						|
}
 | 
						|
 | 
						|
LUALIB_API void luavgl_set_root(lua_State *L, lv_obj_t *root)
 | 
						|
{
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
  ctx->root = root;
 | 
						|
}
 | 
						|
 | 
						|
LUALIB_API void luavgl_set_font_extension(lua_State *L, make_font_cb make,
 | 
						|
                                          delete_font_cb d)
 | 
						|
{
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
  ctx->make_font = make;
 | 
						|
  ctx->delete_font = d;
 | 
						|
}
 | 
						|
 | 
						|
static int root_gc(lua_State *L)
 | 
						|
{
 | 
						|
  debug("enter.\n");
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
  lv_obj_del(ctx->root);
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int root_clean(lua_State *L)
 | 
						|
{
 | 
						|
  debug("enter.\n");
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
  lv_obj_clean(ctx->root);
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
LUALIB_API int luaopen_lvgl(lua_State *L)
 | 
						|
{
 | 
						|
  luavgl_ctx_t *ctx = luavgl_context(L);
 | 
						|
 | 
						|
  luaL_newlib(L, luavgl_methods);
 | 
						|
 | 
						|
  luaL_newmetatable(L, "root.meta");
 | 
						|
  lua_pushstring(L, "__gc");
 | 
						|
  lua_pushcfunction(L, ctx->root ? root_clean : root_gc);
 | 
						|
  lua_settable(L, -3);
 | 
						|
  lua_pop(L, 1);
 | 
						|
 | 
						|
  lv_obj_t *root = ctx->root;
 | 
						|
  if (root == NULL) {
 | 
						|
    debug("create root obj for lua.\n");
 | 
						|
    root = lv_obj_create(lv_scr_act());
 | 
						|
    ctx->root = root;
 | 
						|
  }
 | 
						|
 | 
						|
  if (ctx->pcall == NULL)
 | 
						|
    ctx->pcall = luavgl_pcall;
 | 
						|
 | 
						|
  lua_pushstring(L, "_root");
 | 
						|
  *(void **)lua_newuserdata(L, sizeof(void *)) = root;
 | 
						|
  luaL_getmetatable(L, "root.meta");
 | 
						|
  lua_setmetatable(L, -2);
 | 
						|
 | 
						|
  /*
 | 
						|
   * create a ref to root, avoid __gc early
 | 
						|
   * this puts the root userdata into the _root key
 | 
						|
   * in the returned luv table
 | 
						|
   * */
 | 
						|
  lua_rawset(L, -3);
 | 
						|
 | 
						|
  lv_obj_remove_style_all(root);
 | 
						|
  lv_obj_set_size(root, LV_HOR_RES, LV_VER_RES);
 | 
						|
  lv_obj_clear_flag(root, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE);
 | 
						|
 | 
						|
  luavgl_obj_init(L);
 | 
						|
  luavgl_widgets_init(L);
 | 
						|
  luavgl_anim_init(L);
 | 
						|
  luavgl_timer_init(L);
 | 
						|
  luavgl_style_init(L);
 | 
						|
  luavgl_fs_init(L);
 | 
						|
  luavgl_indev_init(L);
 | 
						|
  luavgl_group_init(L);
 | 
						|
  luavgl_disp_init(L);
 | 
						|
 | 
						|
  luavgl_constants_init(L);
 | 
						|
 | 
						|
  /* Methods to create widget locate in widgets table, check `luavgl_obj_init`
 | 
						|
   */
 | 
						|
  luaL_getmetatable(L, "widgets");
 | 
						|
  lua_setmetatable(L, -2);
 | 
						|
 | 
						|
  (void)dumpstack;
 | 
						|
  (void)dumptable;
 | 
						|
  (void)dumpvalue;
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 |