From: Mike Blumenkrantz Date: Wed, 16 Jan 2019 20:02:43 +0000 (-0500) Subject: edje: apply maps to textblock cursors and backgrounds X-Git-Tag: submit/tizen/20190308.115227~242 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6de5f6c06352324a35a0b7082c1e5853187470c1;p=platform%2Fupstream%2Fefl.git edje: apply maps to textblock cursors and backgrounds when a map is applied to an edje part, it is expected that all components of the part respect the map attributes. this requires that, in the case of textblock parts, all the sub-parts which are internal to the textblock (entry) object also go through the map populate and apply codepaths fix T4977 @fix Reviewed-by: Cedric BAIL Differential Revision: https://phab.enlightenment.org/D7648 --- diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index 4b55895..83a16be 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -3745,7 +3745,7 @@ _map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2, static void _edje_map_prop_set(Evas_Map *map, const Edje_Calc_Params *pf, Edje_Part_Description_Common *chosen_desc, - Edje_Real_Part *ep, Evas_Object *mo) + Edje_Real_Part *ep, Evas_Object *mo, Evas_Object *populate_obj) { Edje_Map_Color *color, **colors; int colors_cnt, i; @@ -3755,7 +3755,7 @@ _edje_map_prop_set(Evas_Map *map, const Edje_Calc_Params *pf, colors = pf->ext->map->colors; colors_cnt = pf->ext->map->colors_count; - evas_map_util_points_populate_from_object(map, ep->object); + evas_map_util_points_populate_from_object(map, populate_obj ?: ep->object); if (ep->part->type == EDJE_PART_TYPE_IMAGE || ((ep->part->type == EDJE_PART_TYPE_SWALLOW) && @@ -5252,10 +5252,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta if (ep->part->type != EDJE_PART_TYPE_SPACER) { Evas_Object *map_obj; + Evas_Object *cursor_objs[EDJE_ENTRY_NUM_CURSOR_OBJS]; + int c = 0, num_cursors = 0; /* Apply map to smart obj holding nested parts */ if (ep->nested_smart) map_obj = ep->nested_smart; else map_obj = mo; + if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) + num_cursors = _edje_entry_real_part_cursor_objs_get(ep, cursor_objs); if (chosen_desc->map.on) { @@ -5265,12 +5269,21 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta // create map and populate with part geometry if (!map) map = evas_map_new(4); - _edje_map_prop_set(map, pf, chosen_desc, ep, mo); + _edje_map_prop_set(map, pf, chosen_desc, ep, mo, NULL); if (map_obj) { evas_object_map_set(map_obj, map); evas_object_map_enable_set(map_obj, EINA_TRUE); + if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) + { + for (c = 0; c < num_cursors; c++) + { + _edje_map_prop_set(map, pf, chosen_desc, ep, mo, cursor_objs[c]); + evas_object_map_set(cursor_objs[c], map); + evas_object_map_enable_set(cursor_objs[c], EINA_TRUE); + } + } } } else @@ -5284,6 +5297,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta #endif evas_object_map_enable_set(mo, EINA_FALSE); evas_object_map_set(mo, NULL); + if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) + { + for (c = 0; c < num_cursors; c++) + { + evas_object_map_enable_set(cursor_objs[c], EINA_FALSE); + evas_object_map_set(cursor_objs[c], NULL); + } + } #ifdef HAVE_EPHYSICS } #endif diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index 193bef6..4732614 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c @@ -27,6 +27,7 @@ struct _Entry Evas_Coord ox, oy; Evas_Object *cursor_bg; Evas_Object *cursor_fg, *cursor_fg2; +/* CHANGE EDJE_ENTRY_NUM_CURSOR_OBJS IF YOU ADD MORE OBJECTS HERE */ Evas_Textblock_Cursor *cursor; Evas_Textblock_Cursor *sel_start, *sel_end; Evas_Textblock_Cursor *cursor_user, *cursor_user_extra; @@ -3253,6 +3254,23 @@ _edje_entry_shutdown(Edje *ed) _evas_focus_out_cb, ed); } +int +_edje_entry_real_part_cursor_objs_get(Edje_Real_Part *rp, Evas_Object **cursor_objs) +{ + Entry *en; + int ret = 0; + + if ((rp->type != EDJE_RP_TYPE_TEXT) || + (!rp->typedata.text) || (!rp->typedata.text->entry_data)) return -1; + + en = rp->typedata.text->entry_data; + + if (en->cursor_bg) cursor_objs[ret++] = en->cursor_bg; + if (en->cursor_fg) cursor_objs[ret++] = en->cursor_fg; + if (en->cursor_fg2) cursor_objs[ret++] = en->cursor_fg2; + return ret; +} + void _edje_entry_real_part_init(Edje *ed, Edje_Real_Part *rp, Ecore_IMF_Context *ic) { diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 2ca6904..0ff29ed 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -190,6 +190,8 @@ EAPI extern int _edje_default_log_dom ; #endif +#define EDJE_ENTRY_NUM_CURSOR_OBJS 3 + /* Inheritable Edje Smart API. For now private so only Edje Edit makes * use of this, but who knows what will be possible in the future */ #define EDJE_SMART_API_VERSION 1 @@ -3059,6 +3061,7 @@ void _edje_lua_script_only_message(Edje *ed, Edje_Message *em); void _edje_entry_init(Edje *ed); void _edje_entry_shutdown(Edje *ed); +int _edje_entry_real_part_cursor_objs_get(Edje_Real_Part *rp, Evas_Object **objs); void _edje_entry_real_part_init(Edje *ed, Edje_Real_Part *rp, Ecore_IMF_Context *ic); void _edje_entry_real_part_shutdown(Edje *ed, Edje_Real_Part *rp, Eina_Bool reuse_ic); void _edje_entry_real_part_configure(Edje *ed, Edje_Real_Part *rp);