static int _elua_rect(lua_State *L);
+#define ELO "|-ELO"
+
//--------------------------------------------------------------------------//
static lua_State *lstate = NULL;
static jmp_buf panic_jmp;
+// FIXME: methods lua scrupt can provide that edje will call (not done yet):
+// // scale set
+// // key down
+// // key up
+// // get dragable pos
+// // set dragable pos
+// // get part text
+// // set part text
+// // get swallow part
+// // set swallow part
+// // textclass change
+// // colorclass change
+//
static const struct luaL_reg _elua_edje_api [] =
{
// add an echo too to make it more shelly
{"echo", _elua_echo}, // test func - echo (i know we have print. test)
- // generic object methods
- {"del", _elua_obj_del}, // generic del any object created for edje (evas objects, timers, animators, transitions... everything)
-
// time based "callback" systems
{"timer", _elua_timer}, // add timer
{"animator", _elua_animator}, // add animator
// FIXME: query color classes
// FIXME: query text classes
+
+ {"rect", _elua_rect}, // new rect
+ // FIXME: need image(filled, normal), text, textblock, edje
+
+ {NULL, NULL} // end
+};
+
+static const struct luaL_reg _elua_edje_evas_obj [] =
+{
+ // generic object methods
+ {"del", _elua_obj_del}, // generic del any object created for edje (evas objects, timers, animators, transitions... everything)
// now evas stuff (manipulate, delete etc.)
{"show", _elua_show}, // show, return current visibility
// FIXME: set callbacks (mouse down, up, blah blah blah)
// FIXME: map api here
-
- {"rect", _elua_rect}, // new rect
- // FIXME: need image(filled, normal), text, textblock, edje
-
- // FIXME: methods lua scrupt can provide that edje will call (not done yet):
- // // scale set
- // // key down
- // // key up
- // // get dragable pos
- // // set dragable pos
- // // get part text
- // // set part text
- // // get swallow part
- // // set swallow part
- // // textclass change
- // // colorclass change
{NULL, NULL} // end
};
+
static const struct luaL_reg _elua_edje_meta [] =
{
{"__gc", _elua_obj_gc}, // garbage collector func for edje objects
{NULL, NULL} // end
};
+
static const luaL_Reg _elua_libs[] =
{
{"", luaopen_base},
{NULL, NULL} // end
};
static const char *_elua_key = "key";
+static const char *_elua_objs = "objs";
//--------------------------------------------------------------------------//
static void *
luaL_newmetatable(L, "edje");
luaL_register(L, 0, _elua_edje_meta);
+ luaL_register(L, "edje_evas_obj", _elua_edje_evas_obj);
+ luaL_newmetatable(L, "edje_evas_obj");
+ luaL_register(L, 0, _elua_edje_meta);
+
lua_pushliteral(L, "__index");
lua_pushvalue(L, -3);
lua_rawset(L, -3);
lua_pop(L, 2);
+
+ // weak table for our objects
+ lua_pushlightuserdata(L, &_elua_objs);
+ lua_newtable(L);
+ lua_pushstring(L, "__mode");
+ lua_pushstring(L, "v");
+ lua_rawset(L, -3);
+ lua_rawset(L, LUA_REGISTRYINDEX);
}
}
//-------------
+/**
+ * Cori: Assumes object to be saved on top of stack
+ */
+static void
+_elua_ref_set(lua_State *L, void *key)
+{
+ lua_pushlightuserdata(L, &_elua_objs);
+ lua_rawget(L, LUA_REGISTRYINDEX);
+ lua_pushlightuserdata(L, key);
+ lua_pushvalue(L,-3); // key & obj table & obj
+ lua_rawset(L, -3);
+ lua_pop(L, 1); // pop obj table
+}
+
+/**
+ * Cori: Get an object from the object table
+ */
+static void *
+_elua_ref_get(lua_State *L, void *key)
+{
+ lua_pushlightuserdata(L, &_elua_objs);
+ lua_rawget(L, LUA_REGISTRYINDEX);
+ lua_pushlightuserdata(L, key);
+ lua_rawget(L, -2);
+ lua_remove(L, -2); // kill obj table
+ return lua_touserdata(L, -2);
+}
+
static Edje_Lua_Obj *
_elua_obj_new(lua_State *L, Edje *ed, int size)
{
Edje_Lua_Obj *obj;
-
+
obj = (Edje_Lua_Obj *)lua_newuserdata(L, size);
memset(obj, 0, size);
ed->lua_objs = eina_inlist_append(ed->lua_objs, EINA_INLIST_GET(obj));
- luaL_getmetatable(L, "edje");
+
+ luaL_getmetatable(L, "edje_evas_obj");
lua_setmetatable(L, -2);
obj->ed = ed;
+
+ _elua_ref_set(L, obj);
return obj;
}
return 0;
}
ret = lua_toboolean(L, -1);
-// ret = luaL_checktype(L, -1, LUA_TBOOLEAN);
-// ret = luaL_checkint(L, -1);
lua_pop(L, 1);
if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt);
_elua_gc(L);
lua_State *L;
if (!ela->obj.ed) return;
L = ela->obj.ed->L;
- luaL_unref(L, LUA_REGISTRYINDEX, ela->fn_ref); //0
+ luaL_unref(L, LUA_REGISTRYINDEX, ela->fn_ref);
ela->fn_ref = 0;
ecore_animator_del(ela->animator);
ela->animator = NULL;
if (!obj) return 0;
if (!obj->is_evas_obj) return 0;
if (!(o = evas_object_above_get(elo->evas_obj))) return 0;
- if (!(elo2 = evas_object_data_get(o, "elo"))) return 0;
- lua_pushlightuserdata(L, elo2);
+ if (!(elo2 = evas_object_data_get(o, ELO))) return 0;
+ _elua_ref_get(L, elo2);
return 1;
}
static int
_elua_below(lua_State *L)
{
- return 0;
+ Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1);
+ Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj;
+ Edje_Lua_Evas_Object *elo2;
+ Evas_Object *o;
+ if (!obj) return 0;
+ if (!obj->is_evas_obj) return 0;
+ if (!(o = evas_object_below_get(elo->evas_obj))) return 0;
+ if (!(elo2 = evas_object_data_get(o, ELO))) return 0;
+ _elua_ref_get(L, elo2);
+ return 1;
}
static int
_elua_top(lua_State *L)
{
+ Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1);
+ Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj;
+ Edje_Lua_Evas_Object *elo2;
+ Evas_Object *o;
+ Eina_List *list, *l;
+ if (!obj) return 0;
+ if (!obj->is_evas_obj) return 0;
+ if (!(list = (Eina_List *)evas_object_smart_members_get(obj->ed->obj))) return 0;
+ if (!list) return 0;
+ for (l = eina_list_last(list); l; l = l->prev)
+ {
+ o = l->data;
+ if ((elo2 = evas_object_data_get(o, ELO)))
+ {
+ _elua_ref_get(L, elo2);
+ return 1;
+ }
+ }
return 0;
}
static int
_elua_bottom(lua_State *L)
{
+ Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1);
+ Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj;
+ Edje_Lua_Evas_Object *elo2;
+ Evas_Object *o;
+ Eina_List *list, *l;
+ if (!obj) return 0;
+ if (!obj->is_evas_obj) return 0;
+ if (!(list = (Eina_List *)evas_object_smart_members_get(obj->ed->obj))) return 0;
+ for (l = list; l; l = l->next)
+ {
+ o = l->data;
+ if ((elo2 = evas_object_data_get(o, ELO)))
+ {
+ _elua_ref_get(L, elo2);
+ return 1;
+ }
+ }
return 0;
}
evas_object_clip_set(elo->evas_obj, ed->clipper);
evas_object_move(elo->evas_obj, ed->x, ed->y);
evas_object_resize(elo->evas_obj, 0, 0);
- evas_object_data_set(elo->evas_obj, "elo", elo);
+ evas_object_data_set(elo->evas_obj, ELO, elo);
return 1;
}
char buf[256];
void *data;
int size;
+ lua_State *L;
if (ed->L) return;
_elua_init();
- ed->L = lua_newstate(_elua_alloc, &ela);
- lua_atpanic(ed->L, _elua_custom_panic);
+ L = ed->L = lua_newstate(_elua_alloc, &ela);
+ lua_atpanic(L, _elua_custom_panic);
// FIXME: figure out optimal gc settings later
-// lua_gc(ed->L, LUA_GCSETPAUSE, 200);
-// lua_gc(ed->L, LUA_GCSETSTEPMUL, 200);
+// lua_gc(L, LUA_GCSETPAUSE, 200);
+// lua_gc(L, LUA_GCSETSTEPMUL, 200);
for (l = _elua_libs; l->func; l++)
{
- lua_pushcfunction(ed->L, l->func);
- lua_pushstring(ed->L, l->name);
- lua_call(ed->L, 1, 0);
+ lua_pushcfunction(L, l->func);
+ lua_pushstring(L, l->name);
+ lua_call(L, 1, 0);
}
- luaL_register(ed->L, "edje", _elua_edje_api);
- luaL_newmetatable(ed->L, "edje");
- luaL_register(ed->L, 0, _elua_edje_meta);
-
- lua_pushliteral(ed->L, "__index");
- lua_pushvalue(ed->L, -3);
- lua_rawset(ed->L, -3);
- lua_pop(ed->L, 2);
- _elua_table_ptr_set(ed->L, _elua_key, ed);
+ luaL_register(L, "edje", _elua_edje_api);
+ luaL_newmetatable(L, "edje");
+ luaL_register(L, 0, _elua_edje_meta);
+
+ luaL_register(L, "edje_evas_obj", _elua_edje_evas_obj);
+ luaL_newmetatable(L, "edje_evas_obj");
+ luaL_register(L, 0, _elua_edje_meta);
+
+ lua_pushliteral(L, "__index");
+ lua_pushvalue(L, -3);
+ lua_rawset(L, -3);
+ lua_pop(L, 2);
+
+ // weak table for our objects
+ lua_pushlightuserdata(L, &_elua_objs);
+ lua_newtable(L);
+ lua_pushstring(L, "__mode");
+ lua_pushstring(L, "v");
+ lua_rawset(L, -3);
+ lua_rawset(L, LUA_REGISTRYINDEX);
+
+ _elua_table_ptr_set(L, _elua_key, ed);
snprintf(buf, sizeof(buf), "lua_scripts/%i", ed->collection->id);
data = eet_read(ed->file->ef, buf, &size);
{
int err;
- err = luaL_loadbuffer(ed->L, data, size, "edje_lua_script");
+ err = luaL_loadbuffer(L, data, size, "edje_lua_script");
if (err)
{
if (err == LUA_ERRSYNTAX)
ERR("lua load syntax error: %s",
- lua_tostring(ed->L, -1));
+ lua_tostring(L, -1));
else if (err == LUA_ERRMEM)
ERR("lua load memory allocation error: %s",
- lua_tostring(ed->L, -1));
+ lua_tostring(L, -1));
}
free(data);
if (setjmp(panic_jmp) == 1)
ERR("Script init panic");
return;
}
- if ((err = lua_pcall(ed->L, 0, 0, 0)))
- _edje_lua2_error(ed->L, err);
+ if ((err = lua_pcall(L, 0, 0, 0)))
+ _edje_lua2_error(L, err);
}
}