//--------------------------------------------------------------------------//
#define MAX_LUA_MEM (4 * (1024 * 1024))
+#define ELO "|-ELO"
#ifdef _WIN32
# define FMT_SIZE_T "%Iu"
# 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;
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;
};
//--------------------------------------------------------------------------//
-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);
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):
// 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
{"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)
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
};
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
};
{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)
{
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
*/
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)
{
obj->ed = NULL;
}
-//-------------
static int
_elua_obj_gc(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 #
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;
}
return 0;
}
-//-------------
static int
_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)
{
//-------------
//-------------
+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;
}
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);
}
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);
}
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);
return 1;
}
+//-------------
static int
_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);
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)
{
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;
}
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;
}
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;
}
return 1;
}
-
static int
_elua_map_rotate3d(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)
{
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)
{
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);
+}