From 5097335d982d1c2e2a689d6d952bd05a3601d835 Mon Sep 17 00:00:00 2001 From: onefang Date: Sat, 12 Nov 2011 10:42:56 +0000 Subject: [PATCH] Rearrange the source code. No functional changes. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@65094 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/edje_lua2.c | 2087 ++++++++++++++++++++++++++------------------------- 1 file changed, 1048 insertions(+), 1039 deletions(-) diff --git a/src/lib/edje_lua2.c b/src/lib/edje_lua2.c index 4108678..a485b1e 100644 --- a/src/lib/edje_lua2.c +++ b/src/lib/edje_lua2.c @@ -3,6 +3,7 @@ //--------------------------------------------------------------------------// #define MAX_LUA_MEM (4 * (1024 * 1024)) +#define ELO "|-ELO" #ifdef _WIN32 # define FMT_SIZE_T "%Iu" @@ -10,17 +11,15 @@ # define FMT_SIZE_T "%zu" #endif - //--------------------------------------------------------------------------// typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc; typedef struct _Edje_Lua_Obj Edje_Lua_Obj; -typedef struct _Edje_Lua_Timer Edje_Lua_Timer; typedef struct _Edje_Lua_Animator Edje_Lua_Animator; +typedef struct _Edje_Lua_Timer Edje_Lua_Timer; typedef struct _Edje_Lua_Transition Edje_Lua_Transition; typedef struct _Edje_Lua_Evas_Object Edje_Lua_Evas_Object; typedef struct _Edje_Lua_Map Edje_Lua_Map; -//--------------------------------------------------------------------------// struct _Edje_Lua_Alloc { size_t max, cur; @@ -35,17 +34,17 @@ struct _Edje_Lua_Obj const char *meta; }; -struct _Edje_Lua_Timer +struct _Edje_Lua_Animator { Edje_Lua_Obj obj; - Ecore_Timer *timer; + Ecore_Animator *animator; int fn_ref; }; -struct _Edje_Lua_Animator +struct _Edje_Lua_Timer { Edje_Lua_Obj obj; - Ecore_Animator *animator; + Ecore_Timer *timer; int fn_ref; }; @@ -72,75 +71,77 @@ struct _Edje_Lua_Map //--------------------------------------------------------------------------// -static int _elua_obj_gc(lua_State *L); -static int _elua_obj_del(lua_State *L); - static int _elua_echo(lua_State *L); -static int _elua_timer(lua_State *L); -static int _elua_animator(lua_State *L); -static int _elua_transition(lua_State *L); - -static int _elua_seconds(lua_State *L); -static int _elua_looptime(lua_State *L); static int _elua_date(lua_State *L); +static int _elua_looptime(lua_State *L); +static int _elua_seconds(lua_State *L); + +static int _elua_objgeom(lua_State *L); +static int _elua_objpos(lua_State *L); +static int _elua_objsize(lua_State *L); static int _elua_emit(lua_State *L); static int _elua_messagesend(lua_State *L); -static int _elua_objpos(lua_State *L); -static int _elua_objsize(lua_State *L); -static int _elua_objgeom(lua_State *L); +static int _elua_animator(lua_State *L); +static int _elua_timer(lua_State *L); +static int _elua_transition(lua_State *L); static int _elua_color_class(lua_State *L); static int _elua_text_class(lua_State *L); -static int _elua_show(lua_State *L); +static int _elua_edje(lua_State *L); +static int _elua_image(lua_State *L); +static int _elua_line(lua_State *L); +static int _elua_map(lua_State *L); +static int _elua_polygon(lua_State *L); +static int _elua_rect(lua_State *L); +static int _elua_text(lua_State *L); +//static int _elua_textblock(lua_State *L); /* XXX: disabled until there are enough textblock functions implemented to make it actually useful + +static int _elua_obj_del(lua_State *L); + static int _elua_hide(lua_State *L); +static int _elua_show(lua_State *L); static int _elua_visible(lua_State *L); -static int _elua_move(lua_State *L); -static int _elua_resize(lua_State *L); -static int _elua_pos(lua_State *L); -static int _elua_size(lua_State *L); -static int _elua_geom(lua_State *L); -static int _elua_raise(lua_State *L); -static int _elua_lower(lua_State *L); + static int _elua_above(lua_State *L); static int _elua_below(lua_State *L); -static int _elua_top(lua_State *L); static int _elua_bottom(lua_State *L); -static int _elua_color(lua_State *L); +static int _elua_lower(lua_State *L); +static int _elua_raise(lua_State *L); +static int _elua_top(lua_State *L); + +static int _elua_geom(lua_State *L); +static int _elua_move(lua_State *L); +static int _elua_pos(lua_State *L); +static int _elua_resize(lua_State *L); +static int _elua_size(lua_State *L); + static int _elua_clip(lua_State *L); -static int _elua_unclip(lua_State *L); static int _elua_clipees(lua_State *L); +static int _elua_unclip(lua_State *L); + static int _elua_type(lua_State *L); + static int _elua_pass(lua_State *L); -static int _elua_repeat(lua_State *L); static int _elua_precise(lua_State *L); +static int _elua_repeat(lua_State *L); -static int _elua_rect(lua_State *L); -static int _elua_image(lua_State *L); -static int _elua_text(lua_State *L); -//static int _elua_textblock(lua_State *L); /* XXX: disabled until there are enough textblock functions implemented to make it actually useful -static int _elua_edje(lua_State *L); -static int _elua_line(lua_State *L); -static int _elua_polygon(lua_State *L); -static int _elua_map(lua_State *L); +static int _elua_color(lua_State *L); static int _elua_obj_map(lua_State *L); static int _elua_obj_map_enable(lua_State *L); static int _elua_obj_map_source(lua_State *L); -static int _elua_text_text(lua_State *L); -static int _elua_text_font(lua_State *L); -static int _elua_image_image(lua_State *L); +static int _elua_edje_file(lua_State *L); + static int _elua_image_fill(lua_State *L); static int _elua_image_filled(lua_State *L); +static int _elua_image_image(lua_State *L); -static int _elua_edje_file(lua_State *L); static int _elua_line_xy(lua_State *L); -static int _elua_polygon_point(lua_State *L); -static int _elua_polygon_clear(lua_State *L); static int _elua_map_alpha(lua_State *L); static int _elua_map_clockwise(lua_State *L); @@ -155,10 +156,18 @@ static int _elua_map_smooth(lua_State *L); static int _elua_map_uv(lua_State *L); static int _elua_map_zoom(lua_State *L); -#define ELO "|-ELO" +static int _elua_polygon_clear(lua_State *L); +static int _elua_polygon_point(lua_State *L); + +static int _elua_text_font(lua_State *L); +static int _elua_text_text(lua_State *L); + +static int _elua_obj_gc(lua_State *L); //--------------------------------------------------------------------------// static lua_State *lstate = NULL; +static const char *_elua_key = "key"; +static const char *_elua_objs = "objs"; static jmp_buf panic_jmp; // FIXME: methods lua script can provide that edje will call (not done yet): @@ -201,39 +210,40 @@ static const struct luaL_reg _elua_edje_funcs [] = // add an echo too to make it more shelly {"echo", _elua_echo}, // test func - echo (i know we have print. test) - // time based "callback" systems - {"timer", _elua_timer}, // add timer - {"animator", _elua_animator}, // add animator - {"transition", _elua_transition}, // add transition - // FIXME: need poller - // system information (time, date blah blah) - {"seconds", _elua_seconds}, // get seconds - {"looptime", _elua_looptime}, // get loop time {"date", _elua_date}, // get date in a table + {"looptime", _elua_looptime}, // get loop time + {"seconds", _elua_seconds}, // get seconds + + // query edje - size, pos + {"geom", _elua_objgeom}, // get while edje object geometry in canvas + {"pos", _elua_objpos}, // get while edje object pos in canvas + {"size", _elua_objsize}, // get while edje object pos in canvas // talk to application/caller {"emit", _elua_emit}, // emit signal + src {"messagesend", _elua_messagesend}, // send a structured message - // query edje - size, pos - {"pos", _elua_objpos}, // get while edje object pos in canvas - {"size", _elua_objsize}, // get while edje object pos in canvas - {"geom", _elua_objgeom}, // get while edje object geometry in canvas + // time based "callback" systems + {"animator", _elua_animator}, // add animator + {"timer", _elua_timer}, // add timer + {"transition", _elua_transition}, // add transition + // FIXME: need poller // set and query color / text class {"color_class", _elua_color_class}, {"text_class", _elua_text_class}, // create new objects - {"rect", _elua_rect}, - {"image", _elua_image}, // defaults to a filled image. - {"text", _elua_text}, -// {"textblock", _elua_textblock}, /* XXX: disabled until there are enough textblock functions implemented to make it actually useful {"edje", _elua_edje}, + {"image", _elua_image}, // defaults to a filled image. {"line", _elua_line}, - {"polygon", _elua_polygon}, {"map", _elua_map}, + {"polygon", _elua_polygon}, + {"rect", _elua_rect}, + {"text", _elua_text}, +// {"textblock", _elua_textblock}, /* XXX: disabled until there are enough textblock functions implemented to make it actually useful + // FIXME: add the new sound stuff. {NULL, NULL} // end @@ -247,30 +257,34 @@ static const struct luaL_reg _elua_evas_funcs [] = {"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 {"hide", _elua_hide}, // hide, return current visibility + {"show", _elua_show}, // show, return current visibility {"visible", _elua_visible}, // get object visibility - {"move", _elua_move}, // move, return current position - {"resize", _elua_resize}, // resize, return current size - {"pos", _elua_pos}, // move, return current position - {"size", _elua_size}, // resize, return current size - {"geom", _elua_geom}, // move and resize and return current geometry - {"raise", _elua_raise}, // raise to top - {"lower", _elua_lower}, // lower to bottom {"above", _elua_above}, // get object above or stack obj above given obj {"below", _elua_below}, // get object below or stack obj below given obj - {"top", _elua_top}, // get top {"bottom", _elua_bottom}, // get bottom - {"color", _elua_color}, // set color, return color + {"lower", _elua_lower}, // lower to bottom + {"raise", _elua_raise}, // raise to top + {"top", _elua_top}, // get top + + {"geom", _elua_geom}, // move and resize and return current geometry + {"move", _elua_move}, // move, return current position + {"pos", _elua_pos}, // move, return current position + {"resize", _elua_resize}, // resize, return current size + {"size", _elua_size}, // resize, return current size + {"clip", _elua_clip}, // set clip obj, return clip object - {"unclip", _elua_unclip}, // clear clip obj {"clipees", _elua_clipees}, // get clip children + {"unclip", _elua_unclip}, // clear clip obj + {"type", _elua_type}, // get object type + {"pass", _elua_pass}, // set pass events, get pass events - {"repeat", _elua_repeat}, // set repeat events, get repeat events {"precise", _elua_precise}, // set precise inside flag, get precise + {"repeat", _elua_repeat}, // set repeat events, get repeat events + {"color", _elua_color}, // set color, return color // {"color_class", _elua_object_color_class}, // get or set object color class // FIXME: set callbacks (mouse down, up, blah blah blah) @@ -306,9 +320,9 @@ static const char *_elua_evas_image_parent = "evas_image_parent"; static const struct luaL_reg _elua_evas_image_funcs [] = { // image object specific - {"image", _elua_image_image}, // get or set image {"fill", _elua_image_fill}, // get or set the fill parameters {"filled", _elua_image_filled}, // get or set the filled state (overrides fill()) + {"image", _elua_image_image}, // get or set image {NULL, NULL} // end }; @@ -352,8 +366,8 @@ static const char *_elua_evas_polygon_parent = "evas_polygon_parent"; static const struct luaL_reg _elua_evas_polygon_funcs [] = { // polygon object specific - {"point", _elua_polygon_point}, // add a polygon point {"clear", _elua_polygon_clear}, // clear all polygon points + {"point", _elua_polygon_point}, // add a polygon point {NULL, NULL} // end }; @@ -391,36 +405,8 @@ static const luaL_Reg _elua_libs[] = {NULL, NULL} // end }; -static const char *_elua_key = "key"; -static const char *_elua_objs = "objs"; //--------------------------------------------------------------------------// - - -static void -_elua_add_functions(lua_State *L, const char *api, const luaL_Reg *funcs, const char *meta, const char *parent, const char *base) -{ - luaL_register(L, api, funcs); - luaL_newmetatable(L, meta); - luaL_register(L, 0, _elua_edje_gc_funcs); - lua_pushliteral(L, "__index"); - lua_pushvalue(L, -3); - lua_rawset(L, -3); - - if (base && parent) - { - // Inherit from base - lua_getglobal(L, base); - luaL_newmetatable(L, parent); - lua_pushliteral(L, "__index"); - lua_pushvalue(L, -3); - lua_rawset(L, -3); - lua_getglobal(L, api); - luaL_getmetatable(L, parent); - lua_setmetatable(L, -2); - } -} - static void * _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { @@ -453,113 +439,85 @@ _elua_custom_panic(lua_State *L __UNUSED__) return 1; } - -//------------- -void -_edje_lua2_error_full(const char *file, const char *fnc, int line, - lua_State *L, int err_code) +// Really only used to manage the pointer to our edje. +static void +_elua_table_ptr_set(lua_State *L, const void *key, const void *val) { - const char *err_type; + lua_pushlightuserdata(L, (void *)key); + lua_pushlightuserdata(L, (void *)val); + lua_settable(L, LUA_REGISTRYINDEX); +} - switch (err_code) - { - case LUA_ERRRUN: - err_type = "runtime"; - break; - case LUA_ERRSYNTAX: - err_type = "syntax"; - break; - case LUA_ERRMEM: - err_type = "memory allocation"; - break; - case LUA_ERRERR: - err_type = "error handler"; - break; - default: - err_type = "unknown"; - break; - } - eina_log_print - (_edje_default_log_dom, EINA_LOG_LEVEL_ERR, file, fnc, line, - "Lua %s error: %s", err_type, lua_tostring(L, -1)); +static const void * +_elua_table_ptr_get(lua_State *L, const void *key) +{ + const void *ptr; + lua_pushlightuserdata(L, (void *)key); + lua_gettable(L, LUA_REGISTRYINDEX); + ptr = lua_topointer(L, -1); + lua_pop(L, 1); + return ptr; } +/* XXX: not used static void -_elua_init(void) +_elua_table_ptr_del(lua_State *L, const void *key) { - static Edje_Lua_Alloc ela = { MAX_LUA_MEM, 0 }; - const luaL_Reg *l; - lua_State *L; - - if (lstate) return; - - lstate = L = lua_newstate(_elua_alloc, &ela); - lua_atpanic(L, _elua_custom_panic); + lua_pushlightuserdata(L, (void *)key); + lua_pushnil(L); + lua_settable(L, LUA_REGISTRYINDEX); +} +*/ -// FIXME: figure out optimal gc settings later -// lua_gc(L, LUA_GCSETPAUSE, 200); -// lua_gc(L, LUA_GCSETSTEPMUL, 200); - - for (l = _elua_libs; l->func; l++) - { - lua_pushcfunction(L, l->func); - lua_pushstring(L, l->name); - lua_call(L, 1, 0); - } - - luaL_register(L, _elua_edje_api, _elua_edje_funcs); - luaL_newmetatable(L, _elua_edje_meta); - luaL_register(L, 0, _elua_edje_gc_funcs); - - _elua_add_functions(L, _elua_evas_api, _elua_evas_funcs, _elua_evas_meta, NULL, NULL); - - // 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); -} - - -//------------- +// Brain dead inheritance thingy, built for speed. Kinda. static void -_elua_table_ptr_set(lua_State *L, const void *key, const void *val) +_elua_add_functions(lua_State *L, const char *api, const luaL_Reg *funcs, const char *meta, const char *parent, const char *base) { - lua_pushlightuserdata(L, (void *)key); - lua_pushlightuserdata(L, (void *)val); - lua_settable(L, LUA_REGISTRYINDEX); -} + luaL_register(L, api, funcs); + luaL_newmetatable(L, meta); + luaL_register(L, 0, _elua_edje_gc_funcs); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -3); + lua_rawset(L, -3); -static const void * -_elua_table_ptr_get(lua_State *L, const void *key) -{ - const void *ptr; - lua_pushlightuserdata(L, (void *)key); - lua_gettable(L, LUA_REGISTRYINDEX); - ptr = lua_topointer(L, -1); - lua_pop(L, 1); - return ptr; + if (base && parent) + { + // Inherit from base + lua_getglobal(L, base); + luaL_newmetatable(L, parent); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -3); + lua_rawset(L, -3); + lua_getglobal(L, api); + luaL_getmetatable(L, parent); + lua_setmetatable(L, -2); + } } -/* XXX: not used -static void -_elua_table_ptr_del(lua_State *L, const void *key) +static Eina_Bool +_elua_isa(Edje_Lua_Obj *obj, const char *type) { - lua_pushlightuserdata(L, (void *)key); - lua_pushnil(L); - lua_settable(L, LUA_REGISTRYINDEX); -} -*/ + Eina_Bool isa = EINA_FALSE; -static void -_elua_gc(lua_State *L) -{ - lua_gc(L, LUA_GCCOLLECT, 0); + if (!obj) return isa; + if (obj->meta == type) + isa = EINA_TRUE; + if (_elua_evas_meta == type) + { + if (obj->meta == _elua_evas_image_meta) + isa = EINA_TRUE; + else if (obj->meta == _elua_evas_text_meta) + isa = EINA_TRUE; + else if (obj->meta == _elua_evas_edje_meta) + isa = EINA_TRUE; + else if (obj->meta == _elua_evas_line_meta) + isa = EINA_TRUE; + else if (obj->meta == _elua_evas_polygon_meta) + isa = EINA_TRUE; + } + return isa; } -//------------- /** * Cori: Assumes object to be saved on top of stack */ @@ -588,31 +546,6 @@ _elua_ref_get(lua_State *L, void *key) return lua_touserdata(L, -2); } -// Brain dead inheritance thingy, built for speed. Kinda. -static Eina_Bool -_elua_isa(Edje_Lua_Obj *obj, const char *type) -{ - Eina_Bool isa = EINA_FALSE; - - if (!obj) return isa; - if (obj->meta == type) - isa = EINA_TRUE; - if (_elua_evas_meta == type) - { - if (obj->meta == _elua_evas_image_meta) - isa = EINA_TRUE; - else if (obj->meta == _elua_evas_text_meta) - isa = EINA_TRUE; - else if (obj->meta == _elua_evas_edje_meta) - isa = EINA_TRUE; - else if (obj->meta == _elua_evas_line_meta) - isa = EINA_TRUE; - else if (obj->meta == _elua_evas_polygon_meta) - isa = EINA_TRUE; - } - return isa; -} - static Edje_Lua_Obj * _elua_obj_new(lua_State *L, Edje *ed, int size, const char *metatable) { @@ -641,7 +574,6 @@ _elua_obj_free(lua_State *L __UNUSED__, Edje_Lua_Obj *obj) obj->ed = NULL; } -//------------- static int _elua_obj_gc(lua_State *L) { @@ -657,6 +589,12 @@ _elua_obj_del(lua_State *L) return _elua_obj_gc(L); } +static void +_elua_gc(lua_State *L) +{ + lua_gc(L, LUA_GCCOLLECT, 0); +} + // These are what the various symbols are for each type - // int % // num # @@ -884,488 +822,100 @@ _elua_ret(lua_State *L, char *params, ...) return n; } -//---------------------------------------------------------------------------- -//------------------------------------------- -//--------------------------- -//------------------- -//--------------- -//------------- - -void -_edje_lua2_script_func_shutdown(Edje *ed) +static void +_elua_color_fix(int *r, int *g, int *b, int *a) { - int err; - - lua_getglobal(ed->L, "shutdown"); - if (!lua_isnil(ed->L, -1)) - { - if ((err = lua_pcall(ed->L, 0, 0, 0))) - _edje_lua2_error(ed->L, err); - } - else - lua_pop(ed->L, 1); - _edje_lua2_script_shutdown(ed); + if (*r > *a) *r = *a; + if (*g > *a) *g = *a; + if (*b > *a) *b = *a; } -void -_edje_lua2_script_func_show(Edje *ed) +//--------------------------------------------------------------------------// +static int +_elua_echo(lua_State *L) { - int err; - - lua_getglobal(ed->L, "show"); - if (!lua_isnil(ed->L, -1)) - { - if ((err = lua_pcall(ed->L, 0, 0, 0))) - _edje_lua2_error(ed->L, err); - } - else - lua_pop(ed->L, 1); + const char *string = luaL_checkstring(L, 1); + printf("%s\n", string); + return 0; } -void -_edje_lua2_script_func_hide(Edje *ed) +//------------- +static int +_elua_date(lua_State *L) { - int err; + static time_t last_tzset = 0; + struct timeval timev; + struct tm *tm; + time_t tt; - lua_getglobal(ed->L, "hide"); - if (!lua_isnil(ed->L, -1)) + lua_newtable(L); + gettimeofday(&timev, NULL); + tt = (time_t)(timev.tv_sec); + if ((tt > (last_tzset + 1)) || (tt < (last_tzset - 1))) { - if ((err = lua_pcall(ed->L, 0, 0, 0))) - _edje_lua2_error(ed->L, err); + last_tzset = tt; + tzset(); } - else - lua_pop(ed->L, 1); -} + tm = localtime(&tt); + if (tm) + { + _elua_ret(L, "%year %month %day %yearday %weekday %hour %min #sec", + (int)(tm->tm_year + 1900), + (int)(tm->tm_mon + 1), + (int)(tm->tm_mday), + (int)(tm->tm_yday), + (int)((tm->tm_wday + 6) % 7), + (int)(tm->tm_hour), + (int)(tm->tm_min), + (double)((double)tm->tm_sec + (((double)timev.tv_usec) / 1000000)) + ); -void -_edje_lua2_script_func_move(Edje *ed) -{ - int err; - // FIXME: move all objects created by script - lua_getglobal(ed->L, "move"); - if (!lua_isnil(ed->L, -1)) - { - lua_pushinteger(ed->L, ed->x); - lua_pushinteger(ed->L, ed->y); - if ((err = lua_pcall(ed->L, 2, 0, 0))) - _edje_lua2_error(ed->L, err); } - else - lua_pop(ed->L, 1); + return 1; } -void -_edje_lua2_script_func_resize(Edje *ed) +static int +_elua_looptime(lua_State *L) { - int err; + double t = ecore_loop_time_get(); + lua_pushnumber(L, t); + return 1; +} - lua_getglobal(ed->L, "resize"); - if (!lua_isnil(ed->L, -1)) - { - lua_pushinteger(ed->L, ed->w); - lua_pushinteger(ed->L, ed->h); - if ((err = lua_pcall(ed->L, 2, 0, 0))) - _edje_lua2_error(ed->L, err); - } - else - lua_pop(ed->L, 1); +static int +_elua_seconds(lua_State *L) +{ + double t = ecore_time_get(); + lua_pushnumber(L, t); + return 1; } -void -_edje_lua2_script_func_message(Edje *ed, Edje_Message *em) +//------------- +static int +_elua_objgeom(lua_State *L) { - int err, n, c, i; + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + if (!lua_istable(L, 1)) lua_newtable(L); + _elua_ret(L, "%x %y %w %h", ed->x, ed->y, ed->w, ed->h); + return 1; +} +static int - lua_getglobal(ed->L, "message"); - if (!lua_isnil(ed->L, -1)) - { - n = 2; - lua_pushinteger(ed->L, em->id); - switch (em->type) - { - case EDJE_MESSAGE_NONE: - lua_pushstring(ed->L, "none"); - break; - case EDJE_MESSAGE_SIGNAL: - break; - case EDJE_MESSAGE_STRING: - lua_pushstring(ed->L, "str"); - lua_pushstring(ed->L, ((Edje_Message_String *)em->msg)->str); - n += 1; - break; - case EDJE_MESSAGE_INT: - lua_pushstring(ed->L, "int"); - lua_pushinteger(ed->L, ((Edje_Message_Int *)em->msg)->val); - n += 1; - break; - case EDJE_MESSAGE_FLOAT: - lua_pushstring(ed->L, "float"); - lua_pushnumber(ed->L, ((Edje_Message_Float *)em->msg)->val); - n += 1; - break; - case EDJE_MESSAGE_STRING_SET: - lua_pushstring(ed->L, "strset"); - c = ((Edje_Message_String_Set *)em->msg)->count; - lua_createtable(ed->L, c, 0); - for (i = 0; i < c; i++) - { - lua_pushstring(ed->L, ((Edje_Message_String_Set *)em->msg)->str[i]); - lua_rawseti(ed->L, -2, i + 1); - } - n += 1; - break; - case EDJE_MESSAGE_INT_SET: - lua_pushstring(ed->L, "intset"); - c = ((Edje_Message_Int_Set *)em->msg)->count; - lua_createtable(ed->L, c, 0); - for (i = 0; i < c; i++) - { - lua_pushinteger(ed->L, ((Edje_Message_Int_Set *)em->msg)->val[i]); - lua_rawseti(ed->L, -2, i + 1); - } - n += 1; - break; - case EDJE_MESSAGE_FLOAT_SET: - lua_pushstring(ed->L, "floatset"); - c = ((Edje_Message_Float_Set *)em->msg)->count; - lua_createtable(ed->L, c, 0); - for (i = 0; i < c; i++) - { - lua_pushnumber(ed->L, ((Edje_Message_Float_Set *)em->msg)->val[i]); - lua_rawseti(ed->L, -2, i + 1); - } - n += 1; - break; - case EDJE_MESSAGE_STRING_INT: - lua_pushstring(ed->L, "strint"); - lua_pushstring(ed->L, ((Edje_Message_String_Int *)em->msg)->str); - lua_pushinteger(ed->L, ((Edje_Message_String_Int *)em->msg)->val); - n += 2; - break; - case EDJE_MESSAGE_STRING_FLOAT: - lua_pushstring(ed->L, "strfloat"); - lua_pushstring(ed->L, ((Edje_Message_String_Float *)em->msg)->str); - lua_pushnumber(ed->L, ((Edje_Message_String_Float *)em->msg)->val); - n += 2; - break; - case EDJE_MESSAGE_STRING_INT_SET: - lua_pushstring(ed->L, "strintset"); - lua_pushstring(ed->L, ((Edje_Message_String_Int_Set *)em->msg)->str); - c = ((Edje_Message_String_Int_Set *)em->msg)->count; - lua_createtable(ed->L, c, 0); - for (i = 0; i < c; i++) - { - lua_pushinteger(ed->L, ((Edje_Message_String_Int_Set *)em->msg)->val[i]); - lua_rawseti(ed->L, -2, i + 1); - } - n += 2; - break; - case EDJE_MESSAGE_STRING_FLOAT_SET: - lua_pushstring(ed->L, "strfloatset"); - lua_pushstring(ed->L, ((Edje_Message_String_Float_Set *)em->msg)->str); - c = ((Edje_Message_String_Float_Set *)em->msg)->count; - lua_createtable(ed->L, c, 0); - for (i = 0; i < c; i++) - { - lua_pushnumber(ed->L, ((Edje_Message_String_Float_Set *)em->msg)->val[i]); - lua_rawseti(ed->L, -2, i + 1); - } - n += 2; - break; - default: - break; - } - if ((err = lua_pcall(ed->L, n, 0, 0))) - _edje_lua2_error(ed->L, err); - } - else - lua_pop(ed->L, 1); -} - -void -_edje_lua2_script_func_signal(Edje *ed, const char *sig, const char *src) -{ - int err; - - lua_getglobal(ed->L, "signal"); - if (!lua_isnil(ed->L, -1)) - { - lua_pushstring(ed->L, sig); - lua_pushstring(ed->L, src); - if ((err = lua_pcall(ed->L, 2, 0, 0))) - _edje_lua2_error(ed->L, err); - } - else - lua_pop(ed->L, 1); -} - -//------------- -//------------- -//------------- -static int -_elua_echo(lua_State *L) -{ - const char *string = luaL_checkstring(L, 1); - printf("%s\n", string); - return 0; -} - -//------------- -static Eina_Bool -_elua_timer_cb(void *data) -{ - Edje_Lua_Timer *elt = data; - lua_State *L; - int ret = 0, err = 0; - - if (!elt->obj.ed) return 0; - L = elt->obj.ed->L; - if (!L) return 0; - lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); - if (setjmp(panic_jmp) == 1) - { - ERR("Timer callback panic"); - _edje_lua2_error(L, err); - _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return 0; - } - if ((err = lua_pcall(L, 0, 1, 0))) - { - _edje_lua2_error(L, err); - _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return 0; - } - ret = lua_toboolean(L, -1); - lua_pop(L, 1); - if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return ret; -} - -static void -_elua_timer_free(void *obj) -{ - Edje_Lua_Timer *elt = obj; - lua_State *L; - if (!elt->obj.ed) return; - L = elt->obj.ed->L; - luaL_unref(L, LUA_REGISTRYINDEX, elt->fn_ref); //0 - elt->fn_ref = 0; - ecore_timer_del(elt->timer); - elt->timer = NULL; -} - -static int -_elua_timer(lua_State *L) -{ - Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - Edje_Lua_Timer *elt; - double val; - - val = luaL_checknumber(L, 1); - luaL_checkany(L, 2); - - elt = (Edje_Lua_Timer *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Timer), _elua_evas_meta); - elt->obj.free_func = _elua_timer_free; - elt->timer = ecore_timer_add(val, _elua_timer_cb, elt); - lua_pushvalue(L, 2); - elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); - _elua_gc(L); - return 1; -} - -//------------- -static Eina_Bool -_elua_animator_cb(void *data) -{ - Edje_Lua_Animator *ela = data; - lua_State *L; - int ret = 0, err = 0; - - if (!ela->obj.ed) return 0; - L = ela->obj.ed->L; - if (!L) return 0; - lua_rawgeti(L, LUA_REGISTRYINDEX, ela->fn_ref); - if (setjmp(panic_jmp) == 1) - { - ERR("Animator callback panic"); - _edje_lua2_error(L, err); - _elua_obj_free(L, (Edje_Lua_Obj *)ela); - _elua_gc(L); - return 0; - } - 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); - 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), _elua_evas_meta); - 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; -} - -//------------- -static Eina_Bool -_elua_transition_cb(void *data) -{ - Edje_Lua_Transition *elt = data; - lua_State *L; - int ret = 0, err = 0; - double t; - - if (!elt->obj.ed) return 0; - L = elt->obj.ed->L; - if (!L) return 0; - t = (ecore_loop_time_get() - elt->start) / elt->transition; - if (t > 1.0) t = 1.0; - lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); - lua_pushnumber(L, t); - if (setjmp(panic_jmp) == 1) - { - ERR("Transition callback panic"); - _edje_lua2_error(L, err); - _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return 0; - } - if ((err = lua_pcall(L, 1, 1, 0))) - { - _edje_lua2_error(L, err); - _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return 0; - } - ret = lua_toboolean(L, -1); - lua_pop(L, 1); - if (t >= 1.0) ret = 0; - if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt); - _elua_gc(L); - return ret; -} - -static void -_elua_transition_free(void *obj) -{ - Edje_Lua_Transition *elt = obj; - lua_State *L; - if (!elt->obj.ed) return; - L = elt->obj.ed->L; - luaL_unref(L, LUA_REGISTRYINDEX, elt->fn_ref); //0 - elt->fn_ref = 0; - ecore_animator_del(elt->animator); - elt->animator = NULL; -} - -static int -_elua_transition(lua_State *L) +_elua_objpos(lua_State *L) { Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - Edje_Lua_Transition *elt; - double val; - - val = luaL_checknumber(L, 1); - luaL_checkany(L, 2); - - elt = (Edje_Lua_Transition *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Transition), _elua_evas_meta); - elt->obj.free_func = _elua_transition_free; - elt->animator = ecore_animator_add(_elua_transition_cb, elt); - if (val < 0.0000001) val = 0.0000001; - elt->transition = val; - elt->start = ecore_loop_time_get(); - lua_pushvalue(L, 2); - elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); - _elua_gc(L); - return 1; -} - -//------------- -static int -_elua_seconds(lua_State *L) -{ - double t = ecore_time_get(); - lua_pushnumber(L, t); - return 1; -} - -//------------- -static int -_elua_looptime(lua_State *L) -{ - double t = ecore_loop_time_get(); - lua_pushnumber(L, t); + if (!lua_istable(L, 1)) lua_newtable(L); + _elua_ret(L, "%x %y", ed->x, ed->y); return 1; } -//------------- static int -_elua_date(lua_State *L) +_elua_objsize(lua_State *L) { - static time_t last_tzset = 0; - struct timeval timev; - struct tm *tm; - time_t tt; - - lua_newtable(L); - gettimeofday(&timev, NULL); - tt = (time_t)(timev.tv_sec); - if ((tt > (last_tzset + 1)) || (tt < (last_tzset - 1))) - { - last_tzset = tt; - tzset(); - } - tm = localtime(&tt); - if (tm) - { - _elua_ret(L, "%year %month %day %yearday %weekday %hour %min #sec", - (int)(tm->tm_year + 1900), - (int)(tm->tm_mon + 1), - (int)(tm->tm_mday), - (int)(tm->tm_yday), - (int)((tm->tm_wday + 6) % 7), - (int)(tm->tm_hour), - (int)(tm->tm_min), - (double)((double)tm->tm_sec + (((double)timev.tv_usec) / 1000000)) - ); - - - } + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + if (!lua_istable(L, 1)) lua_newtable(L); + _elua_ret(L, "%w %h", ed->w, ed->h); return 1; } @@ -1381,7 +931,6 @@ _elua_emit(lua_State *L) return 0; } -//------------- static int _elua_messagesend(lua_State *L) { @@ -1524,48 +1073,212 @@ _elua_messagesend(lua_State *L) } _edje_message_send(ed, EDJE_QUEUE_APP, EDJE_MESSAGE_STRING_FLOAT_SET, id, emsg); } - return 0; + return 0; +} + +//------------- +static Eina_Bool +_elua_animator_cb(void *data) +{ + Edje_Lua_Animator *ela = data; + lua_State *L; + int ret = 0, err = 0; + + if (!ela->obj.ed) return 0; + L = ela->obj.ed->L; + if (!L) return 0; + lua_rawgeti(L, LUA_REGISTRYINDEX, ela->fn_ref); + if (setjmp(panic_jmp) == 1) + { + ERR("Animator callback panic"); + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)ela); + _elua_gc(L); + return 0; + } + 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); + 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), _elua_evas_meta); + 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; +} + +static Eina_Bool +_elua_timer_cb(void *data) +{ + Edje_Lua_Timer *elt = data; + lua_State *L; + int ret = 0, err = 0; + + if (!elt->obj.ed) return 0; + L = elt->obj.ed->L; + if (!L) return 0; + lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); + if (setjmp(panic_jmp) == 1) + { + ERR("Timer callback panic"); + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return 0; + } + if ((err = lua_pcall(L, 0, 1, 0))) + { + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return 0; + } + ret = lua_toboolean(L, -1); + lua_pop(L, 1); + if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return ret; +} + +static void +_elua_timer_free(void *obj) +{ + Edje_Lua_Timer *elt = obj; + lua_State *L; + if (!elt->obj.ed) return; + L = elt->obj.ed->L; + luaL_unref(L, LUA_REGISTRYINDEX, elt->fn_ref); //0 + elt->fn_ref = 0; + ecore_timer_del(elt->timer); + elt->timer = NULL; +} + +static int +_elua_timer(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Timer *elt; + double val; + + val = luaL_checknumber(L, 1); + luaL_checkany(L, 2); + + elt = (Edje_Lua_Timer *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Timer), _elua_evas_meta); + elt->obj.free_func = _elua_timer_free; + elt->timer = ecore_timer_add(val, _elua_timer_cb, elt); + lua_pushvalue(L, 2); + elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); + _elua_gc(L); + return 1; +} + +static Eina_Bool +_elua_transition_cb(void *data) +{ + Edje_Lua_Transition *elt = data; + lua_State *L; + int ret = 0, err = 0; + double t; + + if (!elt->obj.ed) return 0; + L = elt->obj.ed->L; + if (!L) return 0; + t = (ecore_loop_time_get() - elt->start) / elt->transition; + if (t > 1.0) t = 1.0; + lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); + lua_pushnumber(L, t); + if (setjmp(panic_jmp) == 1) + { + ERR("Transition callback panic"); + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return 0; + } + if ((err = lua_pcall(L, 1, 1, 0))) + { + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return 0; + } + ret = lua_toboolean(L, -1); + lua_pop(L, 1); + if (t >= 1.0) ret = 0; + if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return ret; } -//------------- -static int -_elua_objpos(lua_State *L) +static void +_elua_transition_free(void *obj) { - Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - if (!lua_istable(L, 1)) lua_newtable(L); - _elua_ret(L, "%x %y", ed->x, ed->y); - return 1; + Edje_Lua_Transition *elt = obj; + lua_State *L; + if (!elt->obj.ed) return; + L = elt->obj.ed->L; + luaL_unref(L, LUA_REGISTRYINDEX, elt->fn_ref); //0 + elt->fn_ref = 0; + ecore_animator_del(elt->animator); + elt->animator = NULL; } static int -_elua_objsize(lua_State *L) +_elua_transition(lua_State *L) { Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - if (!lua_istable(L, 1)) lua_newtable(L); - _elua_ret(L, "%w %h", ed->w, ed->h); - return 1; -} + Edje_Lua_Transition *elt; + double val; -static int -_elua_objgeom(lua_State *L) -{ - Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - if (!lua_istable(L, 1)) lua_newtable(L); - _elua_ret(L, "%x %y %w %h", ed->x, ed->y, ed->w, ed->h); - return 1; -} + val = luaL_checknumber(L, 1); + luaL_checkany(L, 2); -static void -_elua_color_fix(int *r, int *g, int *b, int *a) -{ - if (*r > *a) *r = *a; - if (*g > *a) *g = *a; - if (*b > *a) *b = *a; + elt = (Edje_Lua_Transition *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Transition), _elua_evas_meta); + elt->obj.free_func = _elua_transition_free; + elt->animator = ecore_animator_add(_elua_transition_cb, elt); + if (val < 0.0000001) val = 0.0000001; + elt->transition = val; + elt->start = ecore_loop_time_get(); + lua_pushvalue(L, 2); + elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); + _elua_gc(L); + return 1; } //------------- -//------------- - static int _elua_color_class(lua_State *L) { @@ -1621,24 +1334,61 @@ _elua_text_class(lua_State *L) //------------- //------------- +static void +_elua_evas_obj_free(void *obj) +{ + Edje_Lua_Evas_Object *elo = obj; +// lua_State *L; + if (!elo->obj.ed) return; +// L = elo->obj.ed->L; + evas_object_del(elo->evas_obj); + elo->evas_obj = NULL; +} + +#define _ELUA_PLANT_EVAS_OBJECT(type, meta, free) \ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); \ + type *elo; \ + elo = (type *)_elua_obj_new(L, ed, sizeof(type), meta); \ + elo->obj.free_func = free; + +static void +_elua_polish_evas_object(Edje *ed, Edje_Lua_Evas_Object *elo) +{ + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.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); +} + static int -_elua_show(lua_State *L) +_elua_rect(lua_State *L) +{ + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_meta, _elua_evas_obj_free) + elo->evas_obj = evas_object_rectangle_add(evas_object_evas_get(ed->obj)); + _elua_polish_evas_object(ed, elo); + return 1; +} + +//------------- +static int +_elua_hide(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_show(elo->evas_obj); + evas_object_hide(elo->evas_obj); lua_pushboolean(L, evas_object_visible_get(elo->evas_obj)); return 1; } static int -_elua_hide(lua_State *L) +_elua_show(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_hide(elo->evas_obj); + evas_object_show(elo->evas_obj); lua_pushboolean(L, evas_object_visible_get(elo->evas_obj)); return 1; } @@ -1663,205 +1413,190 @@ _elua_visible(lua_State *L) return 1; } +//------------- static int -_elua_move(lua_State *L) +_elua_above(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - int x, y; - + Edje_Lua_Evas_Object *elo2; + Evas_Object *o; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - if (_elua_scan_params(L, 2, EINA_TRUE, "%x %y", &x, &y) > 0) - { - if ((x != elo->x) || (y != elo->y)) - { - elo->x = x; - elo->y = y; - evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, - obj->ed->y + elo->y); - } - } - _elua_ret(L, "%x %y", elo->x, elo->y); + if (!(o = evas_object_above_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_resize(lua_State *L) +_elua_below(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - Evas_Coord ow, oh; - int w, h; - + Edje_Lua_Evas_Object *elo2; + Evas_Object *o; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); - if (_elua_scan_params(L, 2, EINA_TRUE, "%w %h", &w, &h) > 0) - { - if ((w != ow) || (h != oh)) - { - evas_object_resize(elo->evas_obj, w, h); - evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); - } - } - _elua_ret(L, "%w %h", ow, oh); + 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_pos(lua_State *L) -{ - return _elua_move(L); -} - -static int -_elua_size(lua_State *L) -{ - return _elua_resize(L); -} - -static int -_elua_geom(lua_State *L) +_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; - Evas_Coord ow, oh; - int x, y, w, h; - +// Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + Edje_Lua_Evas_Object *elo2; + Evas_Object *o; + Eina_List *list, *l; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); - if (_elua_scan_params(L, 2, EINA_TRUE, "%x %y %w %h", &x, &y, &w, &h) > 0) + if (!(list = (Eina_List *)evas_object_smart_members_get(obj->ed->obj))) return 0; + for (l = list; l; l = l->next) { - if ((x != elo->x) || (y != elo->y)) - { - elo->x = x; - elo->y = y; - evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, - obj->ed->y + elo->y); - } - if ((w != ow) || (h != oh)) + o = l->data; + if ((elo2 = evas_object_data_get(o, ELO))) { - evas_object_resize(elo->evas_obj, w, h); - evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + _elua_ref_get(L, elo2); + return 1; } } - _elua_ret(L, "%x %y %w %h", elo->x, elo->y, ow, oh); - return 1; + return 0; } static int -_elua_raise(lua_State *L) +_elua_lower(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_raise(elo->evas_obj); + evas_object_lower(elo->evas_obj); return 0; } static int -_elua_lower(lua_State *L) +_elua_raise(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_lower(elo->evas_obj); + evas_object_raise(elo->evas_obj); return 0; } static int -_elua_above(lua_State *L) +_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 *elo = (Edje_Lua_Evas_Object *)obj; Edje_Lua_Evas_Object *elo2; Evas_Object *o; + Eina_List *list, *l; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - if (!(o = evas_object_above_get(elo->evas_obj))) return 0; - if (!(elo2 = evas_object_data_get(o, ELO))) return 0; - _elua_ref_get(L, elo2); - return 1; + 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_below(lua_State *L) +_elua_geom(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; + Evas_Coord ow, oh; + int x, y, w, h; + if (!_elua_isa(obj, _elua_evas_meta)) 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); + evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + if (_elua_scan_params(L, 2, EINA_TRUE, "%x %y %w %h", &x, &y, &w, &h) > 0) + { + if ((x != elo->x) || (y != elo->y)) + { + elo->x = x; + elo->y = y; + evas_object_move(elo->evas_obj, + obj->ed->x + elo->x, + obj->ed->y + elo->y); + } + if ((w != ow) || (h != oh)) + { + evas_object_resize(elo->evas_obj, w, h); + evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + } + } + _elua_ret(L, "%x %y %w %h", elo->x, elo->y, ow, oh); return 1; } static int -_elua_top(lua_State *L) +_elua_move(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; + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + int x, y; + if (!_elua_isa(obj, _elua_evas_meta)) 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) + if (_elua_scan_params(L, 2, EINA_TRUE, "%x %y", &x, &y) > 0) { - o = l->data; - if ((elo2 = evas_object_data_get(o, ELO))) + if ((x != elo->x) || (y != elo->y)) { - _elua_ref_get(L, elo2); - return 1; + elo->x = x; + elo->y = y; + evas_object_move(elo->evas_obj, + obj->ed->x + elo->x, + obj->ed->y + elo->y); } } - return 0; + _elua_ret(L, "%x %y", elo->x, elo->y); + return 1; } static int -_elua_bottom(lua_State *L) +_elua_pos(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 (!_elua_isa(obj, _elua_evas_meta)) 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; + return _elua_move(L); } static int -_elua_color(lua_State *L) +_elua_resize(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - int r, g, b, a; + Evas_Coord ow, oh; + int w, h; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - if (_elua_scan_params(L, 2, EINA_TRUE, "%r %g %b %a", &r, &g, &b, &a) > 0) + evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + if (_elua_scan_params(L, 2, EINA_TRUE, "%w %h", &w, &h) > 0) { - _elua_color_fix(&r, &g, &b, &a); - evas_object_color_set(elo->evas_obj, r, g, b, a); + if ((w != ow) || (h != oh)) + { + evas_object_resize(elo->evas_obj, w, h); + evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + } } - evas_object_color_get(elo->evas_obj, &r, &g, &b, &a); - _elua_ret(L, "%r %g %b %a", r, g, b, a); + _elua_ret(L, "%w %h", ow, oh); return 1; } static int +_elua_size(lua_State *L) +{ + return _elua_resize(L); +} + +//------------- +static int _elua_clip(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); @@ -1885,16 +1620,6 @@ _elua_clip(lua_State *L) } static int -_elua_unclip(lua_State *L) -{ - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_clip_unset(elo->evas_obj); - return 0; -} - -static int _elua_clipees(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); @@ -1917,6 +1642,17 @@ _elua_clipees(lua_State *L) } static int +_elua_unclip(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + if (!_elua_isa(obj, _elua_evas_meta)) return 0; + evas_object_clip_unset(elo->evas_obj); + return 0; +} + +//------------- +static int _elua_type(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); @@ -1929,6 +1665,7 @@ _elua_type(lua_State *L) return 1; } +//------------- static int _elua_pass(lua_State *L) { @@ -1949,6 +1686,22 @@ _elua_pass(lua_State *L) } static int +_elua_precise(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + int n; + if (!_elua_isa(obj, _elua_evas_meta)) return 0; + n = lua_gettop(L); + if (n == 2) + { + evas_object_precise_is_inside_set(elo->evas_obj, lua_toboolean(L, 2)); + } + lua_pushboolean(L, evas_object_precise_is_inside_get(elo->evas_obj)); + return 1; +} + +static int _elua_repeat(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); @@ -1967,22 +1720,26 @@ _elua_repeat(lua_State *L) return 1; } +//------------- static int -_elua_precise(lua_State *L) +_elua_color(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - int n; + int r, g, b, a; + if (!_elua_isa(obj, _elua_evas_meta)) return 0; - n = lua_gettop(L); - if (n == 2) + if (_elua_scan_params(L, 2, EINA_TRUE, "%r %g %b %a", &r, &g, &b, &a) > 0) { - evas_object_precise_is_inside_set(elo->evas_obj, lua_toboolean(L, 2)); + _elua_color_fix(&r, &g, &b, &a); + evas_object_color_set(elo->evas_obj, r, g, b, a); } - lua_pushboolean(L, evas_object_precise_is_inside_get(elo->evas_obj)); + evas_object_color_get(elo->evas_obj, &r, &g, &b, &a); + _elua_ret(L, "%r %g %b %a", r, g, b, a); return 1; } +//------------- static int _elua_obj_map(lua_State *L) { @@ -2043,102 +1800,47 @@ _elua_obj_map_source(lua_State *L) return 1; } +//------------- +//------------- + static int -_elua_text_font(lua_State *L) +_elua_edje(lua_State *L) { - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - char *font, *font2 = NULL; - Evas_Font_Size size; - int inlined_font = 0; - - if (!_elua_isa(obj, _elua_evas_text_meta)) return 0; - - if (_elua_scan_params(L, 2, EINA_TRUE, "$font %size", &font, &size) > 0) - { - /* Check if the font is embedded in the .edj - * This is a simple check. - * There is a much more complicated version in edje_text.c _edje_text_recalc_apply(). - * If we need to get more complicated, we can do that later, - * and maybe refactor things. - */ - if (obj->ed->file->fonts) - { - Edje_Font_Directory_Entry *fnt = eina_hash_find(obj->ed->file->fonts, font); - - if (fnt) - { - size_t len = strlen(font) + sizeof("edje/fonts/") + 1; - font2 = alloca(len); - sprintf(font2, "edje/fonts/%s", font); - font = font2; - inlined_font = 1; - font2 = NULL; - } - } - - if (inlined_font) evas_object_text_font_source_set(elo->evas_obj, obj->ed->path); - else evas_object_text_font_source_set(elo->evas_obj, NULL); - - evas_object_text_font_set(elo->evas_obj, font, size); - } - - // When one external API says it's gotta be const, and another one says not, then one of them's gotta be cast. :-P - evas_object_text_font_get(elo->evas_obj, (const char **) &font, &size); - _elua_ret(L, "$font %size", font, size); + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_edje_meta, _elua_evas_obj_free) + elo->evas_obj = edje_object_add(evas_object_evas_get(ed->obj)); + _elua_polish_evas_object(ed, elo); return 1; } static int -_elua_text_text(lua_State *L) +_elua_edje_file(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - int n; + const char *file = NULL, *group = NULL; - if (!_elua_isa(obj, _elua_evas_text_meta)) return 0; - n = lua_gettop(L); - if (n == 2) - { - if (lua_isstring(L, 2)) - { - const char *str; + if (!_elua_isa(obj, _elua_evas_edje_meta)) return 0; - if (str = lua_tostring(L, 2)) - evas_object_text_text_set(elo->evas_obj, str); - } + if (_elua_scan_params(L, 2, EINA_TRUE, "$file $group", &file, &group) > 0) + { + // Sandbox lua - Only allow access to groups within the same file. + // By the simple expedient of completely ignoring what file was requested. + edje_object_file_set(elo->evas_obj, obj->ed->file->path, group); } - lua_pushstring(L, evas_object_text_text_get(elo->evas_obj)); + edje_object_file_get(elo->evas_obj, &file, &group); + _elua_ret(L, "$file $group", file, group); return 1; } +//------------- +//------------- + static int -_elua_image_image(lua_State *L) +_elua_image(lua_State *L) { - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - const char *file = NULL, *key = NULL; - int n; - - if (!_elua_isa(obj, _elua_evas_image_meta)) return 0; - - n = lua_gettop(L); - - if (3 == n) - n = _elua_scan_params(L, 2, EINA_TRUE, "$file $key", &file, &key); - else if (2 == n) - { - file = (char *) obj->ed->file->path; - key = (char *) lua_tostring(L, 2); - } - - if (1 < n) - { - // FIXME: Sandbox lua - Only allow access to images within the same file. - evas_object_image_file_set(elo->evas_obj, file, key); - } - evas_object_image_file_get(elo->evas_obj, &file, &key); - _elua_ret(L, "$file $key", file, key); + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_image_meta, _elua_evas_obj_free) + elo->evas_obj = evas_object_image_filled_add(evas_object_evas_get(ed->obj)); + _elua_polish_evas_object(ed, elo); return 1; } @@ -2170,32 +1872,54 @@ _elua_image_filled(lua_State *L) if (!_elua_isa(obj, _elua_evas_image_meta)) return 0; - n = lua_gettop(L); - if (n == 2) + n = lua_gettop(L); + if (n == 2) + { + evas_object_image_filled_set(elo->evas_obj, lua_toboolean(L, 2)); + } + lua_pushboolean(L, evas_object_image_filled_get(elo->evas_obj)); + return 1; +} + +static int +_elua_image_image(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + const char *file = NULL, *key = NULL; + int n; + + if (!_elua_isa(obj, _elua_evas_image_meta)) return 0; + + n = lua_gettop(L); + + if (3 == n) + n = _elua_scan_params(L, 2, EINA_TRUE, "$file $key", &file, &key); + else if (2 == n) + { + file = (char *) obj->ed->file->path; + key = (char *) lua_tostring(L, 2); + } + + if (1 < n) { - evas_object_image_filled_set(elo->evas_obj, lua_toboolean(L, 2)); + // FIXME: Sandbox lua - Only allow access to images within the same file. + evas_object_image_file_set(elo->evas_obj, file, key); } - lua_pushboolean(L, evas_object_image_filled_get(elo->evas_obj)); + evas_object_image_file_get(elo->evas_obj, &file, &key); + _elua_ret(L, "$file $key", file, key); return 1; } +//------------- +//------------- + static int -_elua_edje_file(lua_State *L) +_elua_line(lua_State *L) { - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - const char *file = NULL, *group = NULL; - - if (!_elua_isa(obj, _elua_evas_edje_meta)) return 0; - - if (_elua_scan_params(L, 2, EINA_TRUE, "$file $group", &file, &group) > 0) - { - // Sandbox lua - Only allow access to groups within the same file. - // By the simple expedient of completely ignoring what file was requested. - edje_object_file_set(elo->evas_obj, obj->ed->file->path, group); - } - edje_object_file_get(elo->evas_obj, &file, &group); - _elua_ret(L, "$file $group", file, group); + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_line_meta, _elua_evas_obj_free) + elo->evas_obj = evas_object_line_add(evas_object_evas_get(ed->obj)); + _elua_polish_evas_object(ed, elo); return 1; } @@ -2216,29 +1940,32 @@ static int _elua_line_xy(lua_State *L) return 1; } -static int _elua_polygon_point(lua_State *L) -{ - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - Evas_Coord x, y; - - if (!_elua_isa(obj, _elua_evas_polygon_meta)) return 0; - - if (_elua_scan_params(L, 2, EINA_FALSE, "%x %y", &x, &y) > 0) - { - evas_object_polygon_point_add(elo->evas_obj, x, y); - } +//------------- +//------------- - return 1; +static void +_elua_map_free(void *obj) +{ + Edje_Lua_Map *elm = obj; + if (!elm->obj.ed) return; + evas_map_free(elm->map); + elm->map = NULL; } -static int _elua_polygon_clear(lua_State *L) +static int +_elua_map(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 *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Map *elm; + int count; - if (!_elua_isa(obj, _elua_evas_polygon_meta)) return 0; - evas_object_polygon_points_clear(elo->evas_obj); + count = luaL_checkinteger(L, 1); + + elm = (Edje_Lua_Map *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Map), _elua_evas_map_meta); + elm->obj.free_func = _elua_map_free; + elm->map = evas_map_new(count); + lua_pushvalue(L, 2); + _elua_gc(L); return 1; } @@ -2437,7 +2164,6 @@ _elua_map_rotate(lua_State *L) return 1; } - static int _elua_map_rotate3d(lua_State *L) { @@ -2518,51 +2244,46 @@ _elua_map_zoom(lua_State *L) } //------------- -static void -_elua_evas_obj_free(void *obj) -{ - Edje_Lua_Evas_Object *elo = obj; -// lua_State *L; - if (!elo->obj.ed) return; -// L = elo->obj.ed->L; - evas_object_del(elo->evas_obj); - elo->evas_obj = NULL; -} - -#define _ELUA_PLANT_EVAS_OBJECT(type, meta, free) \ - Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); \ - type *elo; \ - elo = (type *)_elua_obj_new(L, ed, sizeof(type), meta); \ - elo->obj.free_func = free; +//------------- -static void -_elua_polish_evas_object(Edje *ed, Edje_Lua_Evas_Object *elo) +static int +_elua_polygon(lua_State *L) { - evas_object_smart_member_add(elo->evas_obj, ed->obj); - evas_object_clip_set(elo->evas_obj, ed->base.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); + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_polygon_meta, _elua_evas_obj_free) + elo->evas_obj = evas_object_polygon_add(evas_object_evas_get(ed->obj)); + _elua_polish_evas_object(ed, elo); + return 1; } -static int -_elua_rect(lua_State *L) +static int _elua_polygon_clear(lua_State *L) { - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_meta, _elua_evas_obj_free) - elo->evas_obj = evas_object_rectangle_add(evas_object_evas_get(ed->obj)); - _elua_polish_evas_object(ed, elo); + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + + if (!_elua_isa(obj, _elua_evas_polygon_meta)) return 0; + evas_object_polygon_points_clear(elo->evas_obj); return 1; } -static int -_elua_image(lua_State *L) +static int _elua_polygon_point(lua_State *L) { - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_image_meta, _elua_evas_obj_free) - elo->evas_obj = evas_object_image_filled_add(evas_object_evas_get(ed->obj)); - _elua_polish_evas_object(ed, elo); + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + Evas_Coord x, y; + + if (!_elua_isa(obj, _elua_evas_polygon_meta)) return 0; + + if (_elua_scan_params(L, 2, EINA_FALSE, "%x %y", &x, &y) > 0) + { + evas_object_polygon_point_add(elo->evas_obj, x, y); + } + return 1; } +//------------- +//------------- + static int _elua_text(lua_State *L) { @@ -2572,78 +2293,128 @@ _elua_text(lua_State *L) return 1; } -/* XXX: disabled until there are enough textblock functions implemented to make it actually useful static int -_elua_textblock(lua_State *L) +_elua_text_font(lua_State *L) { - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_textblock_meta, _elua_evas_obj_free) - elo->evas_obj = evas_object_textblock_add(evas_object_evas_get(ed->obj)); - _elua_polish_evas_object(ed, elo); - return 1; -} -*/ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + char *font, *font2 = NULL; + Evas_Font_Size size; + int inlined_font = 0; -static int -_elua_edje(lua_State *L) -{ - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_edje_meta, _elua_evas_obj_free) - elo->evas_obj = edje_object_add(evas_object_evas_get(ed->obj)); - _elua_polish_evas_object(ed, elo); + if (!_elua_isa(obj, _elua_evas_text_meta)) return 0; + + if (_elua_scan_params(L, 2, EINA_TRUE, "$font %size", &font, &size) > 0) + { + /* Check if the font is embedded in the .edj + * This is a simple check. + * There is a much more complicated version in edje_text.c _edje_text_recalc_apply(). + * If we need to get more complicated, we can do that later, + * and maybe refactor things. + */ + if (obj->ed->file->fonts) + { + Edje_Font_Directory_Entry *fnt = eina_hash_find(obj->ed->file->fonts, font); + + if (fnt) + { + size_t len = strlen(font) + sizeof("edje/fonts/") + 1; + font2 = alloca(len); + sprintf(font2, "edje/fonts/%s", font); + font = font2; + inlined_font = 1; + font2 = NULL; + } + } + + if (inlined_font) evas_object_text_font_source_set(elo->evas_obj, obj->ed->path); + else evas_object_text_font_source_set(elo->evas_obj, NULL); + + evas_object_text_font_set(elo->evas_obj, font, size); + } + + // When one external API says it's gotta be const, and another one says not, then one of them's gotta be cast. :-P + evas_object_text_font_get(elo->evas_obj, (const char **) &font, &size); + _elua_ret(L, "$font %size", font, size); return 1; } static int -_elua_line(lua_State *L) +_elua_text_text(lua_State *L) { - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_line_meta, _elua_evas_obj_free) - elo->evas_obj = evas_object_line_add(evas_object_evas_get(ed->obj)); - _elua_polish_evas_object(ed, elo); + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + int n; + + if (!_elua_isa(obj, _elua_evas_text_meta)) return 0; + n = lua_gettop(L); + if (n == 2) + { + if (lua_isstring(L, 2)) + { + const char *str; + + if (str = lua_tostring(L, 2)) + evas_object_text_text_set(elo->evas_obj, str); + } + } + lua_pushstring(L, evas_object_text_text_get(elo->evas_obj)); return 1; } +//------------- +//------------- + +/* XXX: disabled until there are enough textblock functions implemented to make it actually useful static int -_elua_polygon(lua_State *L) +_elua_textblock(lua_State *L) { - _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_polygon_meta, _elua_evas_obj_free) - elo->evas_obj = evas_object_polygon_add(evas_object_evas_get(ed->obj)); + _ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_textblock_meta, _elua_evas_obj_free) + elo->evas_obj = evas_object_textblock_add(evas_object_evas_get(ed->obj)); _elua_polish_evas_object(ed, elo); return 1; } +*/ +//--------------------------------------------------------------------------// static void -_elua_map_free(void *obj) +_elua_init(void) { - Edje_Lua_Map *elm = obj; - if (!elm->obj.ed) return; - evas_map_free(elm->map); - elm->map = NULL; -} + static Edje_Lua_Alloc ela = { MAX_LUA_MEM, 0 }; + const luaL_Reg *l; + lua_State *L; -static int -_elua_map(lua_State *L) -{ - Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); - Edje_Lua_Map *elm; - int count; + if (lstate) return; + + lstate = L = lua_newstate(_elua_alloc, &ela); + lua_atpanic(L, _elua_custom_panic); + +// FIXME: figure out optimal gc settings later +// lua_gc(L, LUA_GCSETPAUSE, 200); +// lua_gc(L, LUA_GCSETSTEPMUL, 200); + + for (l = _elua_libs; l->func; l++) + { + lua_pushcfunction(L, l->func); + lua_pushstring(L, l->name); + lua_call(L, 1, 0); + } + + luaL_register(L, _elua_edje_api, _elua_edje_funcs); + luaL_newmetatable(L, _elua_edje_meta); + luaL_register(L, 0, _elua_edje_gc_funcs); - count = luaL_checkinteger(L, 1); + _elua_add_functions(L, _elua_evas_api, _elua_evas_funcs, _elua_evas_meta, NULL, NULL); - elm = (Edje_Lua_Map *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Map), _elua_evas_map_meta); - elm->obj.free_func = _elua_map_free; - elm->map = evas_map_new(count); - lua_pushvalue(L, 2); - _elua_gc(L); - return 1; + // 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); } -//------------- -//--------------- -//------------------- -//--------------------------- -//------------------------------------------- -//---------------------------------------------------------------------------- - -//------------- void _edje_lua2_script_init(Edje *ed) { @@ -2759,3 +2530,241 @@ _edje_lua2_script_unload(Edje_Part_Collection *edc __UNUSED__) L = lstate; lua_gc(L, LUA_GCCOLLECT, 0); } + +void +_edje_lua2_error_full(const char *file, const char *fnc, int line, + lua_State *L, int err_code) +{ + const char *err_type; + + switch (err_code) + { + case LUA_ERRRUN: + err_type = "runtime"; + break; + case LUA_ERRSYNTAX: + err_type = "syntax"; + break; + case LUA_ERRMEM: + err_type = "memory allocation"; + break; + case LUA_ERRERR: + err_type = "error handler"; + break; + default: + err_type = "unknown"; + break; + } + eina_log_print + (_edje_default_log_dom, EINA_LOG_LEVEL_ERR, file, fnc, line, + "Lua %s error: %s", err_type, lua_tostring(L, -1)); +} + +void +_edje_lua2_script_func_shutdown(Edje *ed) +{ + int err; + + lua_getglobal(ed->L, "shutdown"); + if (!lua_isnil(ed->L, -1)) + { + if ((err = lua_pcall(ed->L, 0, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); + _edje_lua2_script_shutdown(ed); +} + +void +_edje_lua2_script_func_show(Edje *ed) +{ + int err; + + lua_getglobal(ed->L, "show"); + if (!lua_isnil(ed->L, -1)) + { + if ((err = lua_pcall(ed->L, 0, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} + +void +_edje_lua2_script_func_hide(Edje *ed) +{ + int err; + + lua_getglobal(ed->L, "hide"); + if (!lua_isnil(ed->L, -1)) + { + if ((err = lua_pcall(ed->L, 0, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} + +void +_edje_lua2_script_func_move(Edje *ed) +{ + int err; + + // FIXME: move all objects created by script + lua_getglobal(ed->L, "move"); + if (!lua_isnil(ed->L, -1)) + { + lua_pushinteger(ed->L, ed->x); + lua_pushinteger(ed->L, ed->y); + if ((err = lua_pcall(ed->L, 2, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} + +void +_edje_lua2_script_func_resize(Edje *ed) +{ + int err; + + lua_getglobal(ed->L, "resize"); + if (!lua_isnil(ed->L, -1)) + { + lua_pushinteger(ed->L, ed->w); + lua_pushinteger(ed->L, ed->h); + if ((err = lua_pcall(ed->L, 2, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} + +void +_edje_lua2_script_func_message(Edje *ed, Edje_Message *em) +{ + int err, n, c, i; + + lua_getglobal(ed->L, "message"); + if (!lua_isnil(ed->L, -1)) + { + n = 2; + lua_pushinteger(ed->L, em->id); + switch (em->type) + { + case EDJE_MESSAGE_NONE: + lua_pushstring(ed->L, "none"); + break; + case EDJE_MESSAGE_SIGNAL: + break; + case EDJE_MESSAGE_STRING: + lua_pushstring(ed->L, "str"); + lua_pushstring(ed->L, ((Edje_Message_String *)em->msg)->str); + n += 1; + break; + case EDJE_MESSAGE_INT: + lua_pushstring(ed->L, "int"); + lua_pushinteger(ed->L, ((Edje_Message_Int *)em->msg)->val); + n += 1; + break; + case EDJE_MESSAGE_FLOAT: + lua_pushstring(ed->L, "float"); + lua_pushnumber(ed->L, ((Edje_Message_Float *)em->msg)->val); + n += 1; + break; + case EDJE_MESSAGE_STRING_SET: + lua_pushstring(ed->L, "strset"); + c = ((Edje_Message_String_Set *)em->msg)->count; + lua_createtable(ed->L, c, 0); + for (i = 0; i < c; i++) + { + lua_pushstring(ed->L, ((Edje_Message_String_Set *)em->msg)->str[i]); + lua_rawseti(ed->L, -2, i + 1); + } + n += 1; + break; + case EDJE_MESSAGE_INT_SET: + lua_pushstring(ed->L, "intset"); + c = ((Edje_Message_Int_Set *)em->msg)->count; + lua_createtable(ed->L, c, 0); + for (i = 0; i < c; i++) + { + lua_pushinteger(ed->L, ((Edje_Message_Int_Set *)em->msg)->val[i]); + lua_rawseti(ed->L, -2, i + 1); + } + n += 1; + break; + case EDJE_MESSAGE_FLOAT_SET: + lua_pushstring(ed->L, "floatset"); + c = ((Edje_Message_Float_Set *)em->msg)->count; + lua_createtable(ed->L, c, 0); + for (i = 0; i < c; i++) + { + lua_pushnumber(ed->L, ((Edje_Message_Float_Set *)em->msg)->val[i]); + lua_rawseti(ed->L, -2, i + 1); + } + n += 1; + break; + case EDJE_MESSAGE_STRING_INT: + lua_pushstring(ed->L, "strint"); + lua_pushstring(ed->L, ((Edje_Message_String_Int *)em->msg)->str); + lua_pushinteger(ed->L, ((Edje_Message_String_Int *)em->msg)->val); + n += 2; + break; + case EDJE_MESSAGE_STRING_FLOAT: + lua_pushstring(ed->L, "strfloat"); + lua_pushstring(ed->L, ((Edje_Message_String_Float *)em->msg)->str); + lua_pushnumber(ed->L, ((Edje_Message_String_Float *)em->msg)->val); + n += 2; + break; + case EDJE_MESSAGE_STRING_INT_SET: + lua_pushstring(ed->L, "strintset"); + lua_pushstring(ed->L, ((Edje_Message_String_Int_Set *)em->msg)->str); + c = ((Edje_Message_String_Int_Set *)em->msg)->count; + lua_createtable(ed->L, c, 0); + for (i = 0; i < c; i++) + { + lua_pushinteger(ed->L, ((Edje_Message_String_Int_Set *)em->msg)->val[i]); + lua_rawseti(ed->L, -2, i + 1); + } + n += 2; + break; + case EDJE_MESSAGE_STRING_FLOAT_SET: + lua_pushstring(ed->L, "strfloatset"); + lua_pushstring(ed->L, ((Edje_Message_String_Float_Set *)em->msg)->str); + c = ((Edje_Message_String_Float_Set *)em->msg)->count; + lua_createtable(ed->L, c, 0); + for (i = 0; i < c; i++) + { + lua_pushnumber(ed->L, ((Edje_Message_String_Float_Set *)em->msg)->val[i]); + lua_rawseti(ed->L, -2, i + 1); + } + n += 2; + break; + default: + break; + } + if ((err = lua_pcall(ed->L, n, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} + +void +_edje_lua2_script_func_signal(Edje *ed, const char *sig, const char *src) +{ + int err; + + lua_getglobal(ed->L, "signal"); + if (!lua_isnil(ed->L, -1)) + { + lua_pushstring(ed->L, sig); + lua_pushstring(ed->L, src); + if ((err = lua_pcall(ed->L, 2, 0, 0))) + _edje_lua2_error(ed->L, err); + } + else + lua_pop(ed->L, 1); +} -- 2.7.4