From f8c57b1af7d0b7276005c6fd70d2cb9d07ce4acf Mon Sep 17 00:00:00 2001 From: onefang Date: Sun, 13 Nov 2011 17:58:11 +0000 Subject: [PATCH] Fix up a problem with geom and friends when some external thingy moves stuff behind our backs. This happens during startup at least and did cause problems. Restrict image loading to images from the same edje file we are in, as per rasters request. Some minor cleanups. This commit fixes the last of the known problems. So it's ready for release, except for adding docs. I'll be adding docs over the next week anyway. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@65136 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/examples/lua_script.edc | 23 ++++++------ src/lib/edje_lua2.c | 86 +++++++++++++++++++++++++++++++++------------ 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/src/examples/lua_script.edc b/src/examples/lua_script.edc index 60743b5..6a892c1 100644 --- a/src/examples/lua_script.edc +++ b/src/examples/lua_script.edc @@ -22,6 +22,7 @@ collections { local D; local count = 0; local fndata = 99; + local text_geom; local function mycb3 (v) print("lua::callback transition " .. D.val .. " v: " .. v); @@ -138,6 +139,7 @@ collections { D.text:color (255, 0, 0, 255); D.text:font("Sans:style=Bold", 32); D.text:text("Lua rocks!"); + text_geom = D.text:geom(); print(D.text:text()); D.text:show(); @@ -224,28 +226,32 @@ collections { function shutdown () print("lua::shutdown ... " .. D.val); end + function show () print("lua::show ... " .. D.val); end + function hide () print("lua::hide ... " .. D.val); end + function move (x, y) - print("lua::move ... " .. D.val); - print(" x=" .. x .. " x=" .. y); + print("lua::move x=" .. x .. " x=" .. y); end + function resize (w, h) - print("lua::resize ... " .. D.val); - print(" w=" .. w .. " h=" .. h); + print("lua::resize w=" .. w .. " h=" .. h); + D.text:move((w - text_geom.w) / 2, (h - text_geom.h) / 8); end + function message (id, type, v1, v2) - print("lua::message ... " .. D.val); - print(" id=" .. id .. " type=" .. type); + print("lua::message id=" .. id .. " type=" .. type); --// handle your message type here. check id + type then use v1 --// and/or v2 (or neither) appropriately. they are the same as --// the 2nd and 3rd param passed to edje.messagesend() (if any --// are passed at all) end + function signal (sig, src) print("lua::signal sig= " .. sig .. " src= " .. src); end @@ -265,7 +271,7 @@ collections { row = { }; for j = 1, bubbleCols do image = edje.image(); - image:image("bubble.png", ""); + image:image("bubble.png"); image:show(); table.insert(row, image); end @@ -273,9 +279,6 @@ collections { end function resize (w, h) - --// Don't ask why. lol (This should go away soon.) - bubbles[1][1]:move(12345, 12345); - for i = 1, bubbleRows do for j = 1, bubbleCols do w1 = w / bubbleCols; diff --git a/src/lib/edje_lua2.c b/src/lib/edje_lua2.c index ed55b23..d5bc986 100644 --- a/src/lib/edje_lua2.c +++ b/src/lib/edje_lua2.c @@ -953,7 +953,7 @@ _elua_animator(lua_State *L) luaL_checkany(L, 1); - // FIXME: This, and the other two timer thingies, should be it's own class I think. + // FIXME: This, and the other two timer thingies, should be it's own class I think. But that might be API change, so wait until after the freeze. 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); @@ -1159,9 +1159,8 @@ 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; } @@ -1522,26 +1521,26 @@ _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; - Evas_Coord ow, oh; + Evas_Coord ox, oy, ow, oh; int x, y, w, h; if (!_elua_isa(obj, _elua_evas_meta)) return 0; - evas_object_geometry_get(elo->evas_obj, NULL, NULL, &ow, &oh); + evas_object_geometry_get(elo->evas_obj, &ox, &oy, &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)) + if ((x != (ox - obj->ed->x)) || (y != (oy - obj->ed->y))) { - elo->x = x; - elo->y = y; evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, - obj->ed->y + elo->y); + obj->ed->x + x, + obj->ed->y + 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); } + evas_object_geometry_get(elo->evas_obj, &ox, &oy, &ow, &oh); + elo->x = ox - obj->ed->x; + elo->y = oy - obj->ed->y; } _elua_ret(L, "%x %y %w %h", elo->x, elo->y, ow, oh); return 1; @@ -1552,19 +1551,22 @@ _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; + Evas_Coord ox, oy; int x, y; if (!_elua_isa(obj, _elua_evas_meta)) return 0; + evas_object_geometry_get(elo->evas_obj, &ox, &oy, NULL, NULL); if (_elua_scan_params(L, 2, EINA_TRUE, "%x %y", &x, &y) > 0) { - if ((x != elo->x) || (y != elo->y)) + if ((x != (ox - obj->ed->x)) || (y != (oy - obj->ed->y))) { - elo->x = x; - elo->y = y; evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, - obj->ed->y + elo->y); + obj->ed->x + x, + obj->ed->y + y); + evas_object_geometry_get(elo->evas_obj, &ox, &oy, NULL, NULL); } + elo->x = ox - obj->ed->x; + elo->y = oy - obj->ed->y; } _elua_ret(L, "%x %y", elo->x, elo->y); return 1; @@ -1906,24 +1908,62 @@ _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; + int n, id = -1; 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) + n = _elua_scan_params(L, 2, EINA_TRUE, "$file $key", &file, &key); + if (0 >= n) { file = (char *) obj->ed->file->path; key = (char *) lua_tostring(L, 2); + n = 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); + if (obj->ed->file->image_dir) + { + Edje_Image_Directory_Entry *de; + unsigned int i; + char *name; + + /* Image name */ + if ((name = strrchr(key, '/'))) name++; + else name = (char *)key; + + /* Loop through image directory to find if image exists */ + for (i = 0; i < obj->ed->file->image_dir->entries_count; ++i) + { + de = obj->ed->file->image_dir->entries + i; + + if (de->entry) + { + if (strcmp(name, de->entry) == 0) + { + char buf[32]; + + id = i; + // This is copied from _edje_image_recalc_apply()), dunno if it provides any benefit over sprintf(). + /* Replace snprint("edje/images/%i") == memcpy + itoa */ +#define IMAGES "edje/images/" + memcpy(buf, IMAGES, strlen(IMAGES)); + eina_convert_itoa(id, buf + strlen(IMAGES)); /* No need to check length as 2³² need only 10 characters. */ + evas_object_image_file_set(elo->evas_obj, obj->ed->file->path, buf); + break; + } + } + } + } + + /* Sandbox lua - Only allow access to images within the same edje file. I'm not so sure we need this level of sandboxing though. So leaving it here, just in case. */ + if (-1 == id) + { + printf("Image %s not found in our edje file, trying external image file %s.\n", key, 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); -- 2.7.4