animator works.

SVN revision: 50088
This commit is contained in:
Carsten Haitzler 2010-07-07 00:19:39 +00:00
parent 62391791bf
commit d26b1c46fd
1 changed files with 81 additions and 32 deletions

View File

@ -29,10 +29,10 @@ extern "C"
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------//
typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc; typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc;
typedef struct _Edje_Lua_Obj Edje_Lua_Obj; typedef struct _Edje_Lua_Obj Edje_Lua_Obj;
typedef struct _Edje_Lua_Timer Edje_Lua_Timer; typedef struct _Edje_Lua_Timer Edje_Lua_Timer;
typedef struct _Edje_Lua_Anim Edje_Lua_Anim; typedef struct _Edje_Lua_Animator Edje_Lua_Animator;
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------//
struct _Edje_Lua_Alloc struct _Edje_Lua_Alloc
@ -55,10 +55,10 @@ struct _Edje_Lua_Timer
int fn_ref; int fn_ref;
}; };
struct _Edje_Lua_Anim struct _Edje_Lua_Animator
{ {
Edje_Lua_Obj obj; Edje_Lua_Obj obj;
Ecore_Animator *anim; Ecore_Animator *animator;
int fn_ref; int fn_ref;
}; };
@ -70,7 +70,7 @@ static int _elua_obj_del(lua_State *L);
static int _elua_echo(lua_State *L); static int _elua_echo(lua_State *L);
static int _elua_timer(lua_State *L); static int _elua_timer(lua_State *L);
static int _elua_anim(lua_State *L); static int _elua_animator(lua_State *L);
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------//
@ -83,7 +83,7 @@ static const struct luaL_reg _elua_edje_api [] =
{"del", _elua_obj_del}, // generic del any object created for edje {"del", _elua_obj_del}, // generic del any object created for edje
{"timer", _elua_timer}, // add timer {"timer", _elua_timer}, // add timer
{"anim", _elua_anim}, // add animator (not done yet) {"animator", _elua_animator}, // add animator
{NULL, NULL} // end {NULL, NULL} // end
}; };
@ -108,7 +108,6 @@ static const luaL_Reg _elua_libs[] =
}; };
static const char *_elua_key = "key"; static const char *_elua_key = "key";
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------//
static void * static void *
_elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize)
@ -282,6 +281,11 @@ _elua_obj_del(lua_State *L)
return _elua_obj_gc(L); return _elua_obj_gc(L);
} }
//----------------------------------------------------------------------------
//-------------------------------------------
//---------------------------
//-------------------
//---------------
//------------- //-------------
static int static int
_elua_echo(lua_State *L) _elua_echo(lua_State *L)
@ -291,7 +295,6 @@ _elua_echo(lua_State *L)
return 1; return 1;
} }
//------------- //-------------
static Eina_Bool static Eina_Bool
_elua_timer_cb(void *data) _elua_timer_cb(void *data)
@ -304,18 +307,19 @@ _elua_timer_cb(void *data)
if (!elt->obj.ed) return 0; if (!elt->obj.ed) return 0;
L = elt->obj.ed->L; L = elt->obj.ed->L;
if (!L) return 0; if (!L) return 0;
lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); //+1 lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref);
if ((err = lua_pcall(L, 0, 1, 0))) //+1 if ((err = lua_pcall(L, 0, 1, 0)))
{ {
_edje_lua2_error(L, err); //0 _edje_lua2_error(L, err);
_elua_obj_free(L, (Edje_Lua_Obj *)elt); _elua_obj_free(L, (Edje_Lua_Obj *)elt);
_elua_gc(L); _elua_gc(L);
return 0; return 0;
} }
ret = luaL_checkint(L, -1); //0 ret = lua_toboolean(L, -1);
// ret = luaL_checktype(L, -1, LUA_TBOOLEAN);
// ret = luaL_checkint(L, -1);
lua_pop(L, 1); lua_pop(L, 1);
if (ret == 0) if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt);
_elua_obj_free(L, (Edje_Lua_Obj *)elt);
_elua_gc(L); _elua_gc(L);
return ret; return ret;
} }
@ -323,7 +327,7 @@ _elua_timer_cb(void *data)
static void static void
_elua_timer_free(void *obj) _elua_timer_free(void *obj)
{ {
Edje_Lua_Timer *elt = (Edje_Lua_Timer *)obj; Edje_Lua_Timer *elt = obj;
lua_State *L; lua_State *L;
if (!elt->obj.ed) return; if (!elt->obj.ed) return;
L = elt->obj.ed->L; L = elt->obj.ed->L;
@ -343,27 +347,77 @@ _elua_timer(lua_State *L)
val = luaL_checknumber(L, 1); val = luaL_checknumber(L, 1);
luaL_checkany(L, 2); luaL_checkany(L, 2);
elt = (Edje_Lua_Timer *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Timer)); //+1 elt = (Edje_Lua_Timer *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Timer));
elt->obj.free_func = _elua_timer_free; elt->obj.free_func = _elua_timer_free;
elt->timer = ecore_timer_add(val, _elua_timer_cb, elt); elt->timer = ecore_timer_add(val, _elua_timer_cb, elt);
lua_pushvalue(L, 2); //+1 lua_pushvalue(L, 2);
elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX);
_elua_gc(L); _elua_gc(L);
return 1; return 1;
} }
//------------- //-------------
static int static Eina_Bool
_elua_anim(lua_State *L) _elua_animator_cb(void *data)
{ {
// xxxxx Edje_Lua_Animator *ela = data;
// not done yet - but do like timer (but 1 arg only - no timeout val) lua_State *L;
// xxxxx int ret = 0;
Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); int err;
return 1;
if (!ela->obj.ed) return 0;
L = ela->obj.ed->L;
if (!L) return 0;
lua_rawgeti(L, LUA_REGISTRYINDEX, ela->fn_ref);
if ((err = lua_pcall(L, 0, 1, 0)))
{
_edje_lua2_error(L, err);
_elua_obj_free(L, (Edje_Lua_Obj *)ela);
_elua_gc(L);
return 0;
}
ret = lua_toboolean(L, -1);
lua_pop(L, 1);
if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)ela);
_elua_gc(L);
return ret;
} }
static void
_elua_animator_free(void *obj)
{
Edje_Lua_Animator *ela = obj;
lua_State *L;
if (!ela->obj.ed) return;
L = ela->obj.ed->L;
luaL_unref(L, LUA_REGISTRYINDEX, ela->fn_ref); //0
ela->fn_ref = 0;
ecore_animator_del(ela->animator);
ela->animator = NULL;
}
static int
_elua_animator(lua_State *L)
{
Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key);
Edje_Lua_Animator *ela;
luaL_checkany(L, 1);
ela = (Edje_Lua_Animator *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Animator));
ela->obj.free_func = _elua_animator_free;
ela->animator = ecore_animator_add(_elua_animator_cb, ela);
lua_pushvalue(L, 1);
ela->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX);
_elua_gc(L);
return 1;
}
//-------------
//---------------
//-------------------
//---------------------------
//-------------------------------------------
//----------------------------------------------------------------------------
//------------- //-------------
void void
@ -450,12 +504,7 @@ _edje_lua2_script_shutdown(Edje *ed)
void void
_edje_lua2_script_load(Edje_Part_Collection *edc, void *data, int size) _edje_lua2_script_load(Edje_Part_Collection *edc, void *data, int size)
{ {
int err;
lua_State *L;
_elua_init(); _elua_init();
if (!lstate) return;
L = lstate;
return;
} }
void void