summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2018-08-07 13:25:34 +0900
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>2018-08-07 13:25:34 +0900
commitf36880088b9a9dd14bac478aa1a514c3d9bdb361 (patch)
tree88be4a24475ad747949c7f21166bc20854a65f0b
parentc54b7a4ab344eea057209dbe580c5918391ee4b6 (diff)
downloadefl-f36880088b9a9dd14bac478aa1a514c3d9bdb361.tar.gz
elm_genlist: fix item registration by correct realization
Summary: there was a case when a block could be realized while a item that is realized was brought from one block to the this new one. The block now is simply realized using api instead of just setting the flag, this sets the correct focus registrations. While fixing this the error of double regiration of items came up, this is also fixed by unregistration and reregistration in the correct block. fix T7247 Reviewers: zmike, SanghyeonLee, YOhoho Reviewed By: zmike Subscribers: Hermet, cedric, #committers Tags: #efl Maniphest Tasks: T7247 Differential Revision: https://phab.enlightenment.org/D6737
-rw-r--r--src/lib/elementary/elm_genlist.c27
-rw-r--r--src/lib/elementary/elm_widget_item_static_focus.c5
2 files changed, 29 insertions, 3 deletions
diff --git a/src/lib/elementary/elm_genlist.c b/src/lib/elementary/elm_genlist.c
index d5d2eec871..8ee19ae005 100644
--- a/src/lib/elementary/elm_genlist.c
+++ b/src/lib/elementary/elm_genlist.c
@@ -2542,6 +2542,8 @@ _item_block_realize(Item_Block *itb)
if (!itb->adapter)
{
itb->adapter = efl_add(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, itb->sd->obj);
+ efl_ui_focus_composition_adapter_focus_manager_parent_set(itb->adapter, itb->sd->obj);
+ efl_ui_focus_composition_adapter_focus_manager_object_set(itb->adapter, itb->sd->obj);
efl_ui_focus_manager_calc_register_logical(itb->sd->obj, itb->adapter, itb->sd->obj, NULL);
_flush_block_order(itb->sd);
}
@@ -3578,9 +3580,13 @@ _item_block_merge(Item_Block *left,
EINA_LIST_FOREACH(right->items, l, it2)
{
+ if (right->realized)
+ efl_ui_focus_manager_calc_unregister(right->sd->obj, EO_OBJ(it2));
it2->item->block = left;
left->count++;
left->changed = EINA_TRUE;
+ if (left->realized)
+ efl_ui_focus_manager_calc_register_logical(right->sd->obj, EO_OBJ(it2), left->adapter, NULL);
}
left->items = eina_list_merge(left->items, right->items);
}
@@ -4576,8 +4582,10 @@ newblock:
itb->items = eina_list_remove_list
(itb->items, itb->items);
itb->count--;
+ efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itbp->items = eina_list_append(itbp->items, it2);
+ _update_block_registration(itbp, it2);
it2->item->block = itbp;
itbp->count++;
if (!it2->hide)
@@ -4587,7 +4595,10 @@ newblock:
itbp->vis_count++;
}
- if (it2->realized) itbp->realized = EINA_TRUE;
+ if (it2->realized)
+ {
+ _item_block_realize(itbp);
+ }
}
done = EINA_TRUE;
@@ -4609,8 +4620,10 @@ newblock:
it2 = eina_list_data_get(l);
itb->items = eina_list_remove_list(itb->items, l);
itb->count--;
+ efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itbn->items = eina_list_prepend(itbn->items, it2);
+ _update_block_registration(itbn, it2);
it2->item->block = itbn;
itbn->count++;
if (!it2->hide)
@@ -4621,7 +4634,10 @@ newblock:
itbn->vis_count++;
}
- if (it2->realized) itbn->realized = EINA_TRUE;
+ if (it2->realized)
+ {
+ _item_block_realize(itbn);
+ }
}
done = EINA_TRUE;
@@ -4646,8 +4662,10 @@ newblock:
it2 = l->data;
itb->items = eina_list_remove_list(itb->items, l);
itb->count--;
+ efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itb2->items = eina_list_prepend(itb2->items, it2);
+ _update_block_registration(itb2, it2);
it2->item->block = itb2;
itb2->count++;
if (!it2->hide)
@@ -4658,7 +4676,10 @@ newblock:
itb2->h += it2->item->h;
}
- if (it2->realized) itb2->realized = EINA_TRUE;
+ if (it2->realized)
+ {
+ _item_block_realize(itb2);
+ }
}
itb2->num = itb->num + itb->vis_count;
diff --git a/src/lib/elementary/elm_widget_item_static_focus.c b/src/lib/elementary/elm_widget_item_static_focus.c
index 4a90d5f822..4c859f4d83 100644
--- a/src/lib/elementary/elm_widget_item_static_focus.c
+++ b/src/lib/elementary/elm_widget_item_static_focus.c
@@ -98,6 +98,11 @@ _elm_widget_item_static_focus_efl_ui_focus_object_prepare_logical_none_recursive
{
next_widget = NULL;
}
+ //check if this is the item block representation of genlist
+ else if (efl_isa(next_widget, EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS) && efl_ui_focus_object_focus_parent_get(next_widget) == wpd->widget)
+ {
+ next_widget = NULL;
+ }
logical_child = next_widget;
}