summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-12-07 16:48:00 +0100
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>2017-04-19 13:31:58 +0200
commita371f0032ffb053d9f5cbab6c79031e63fc18639 (patch)
treeeb47d99fc1c31a67f98fa06d8c127827225a002d
parent7c87dd93151b804bc713a8b4ccc2f39a419bb61b (diff)
downloadefl-a371f0032ffb053d9f5cbab6c79031e63fc18639.tar.gz
efl_ui_focus_manager: fix up tracking and returning of data
a logical parent should not be in the border elements. The child should also be not deleted itself. If we do so correct deletion could fail.
-rw-r--r--src/lib/elementary/efl_ui_focus_manager.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/lib/elementary/efl_ui_focus_manager.c b/src/lib/elementary/efl_ui_focus_manager.c
index 2a04d6193a..05a4d6d5fb 100644
--- a/src/lib/elementary/efl_ui_focus_manager.c
+++ b/src/lib/elementary/efl_ui_focus_manager.c
@@ -466,15 +466,7 @@ _focus_in_cb(void *data, const Efl_Event *event)
efl_ui_focus_manager_focus(data, event->object);
}
-static void
-_child_del(void *data, const Efl_Event *event)
-{
- WRN("The manager itself catched a deletion of a child. BAD");
- efl_ui_focus_manager_unregister(data, event->object);
-}
-
EFL_CALLBACKS_ARRAY_DEFINE(focusable_node,
- {EFL_EVENT_DEL, _child_del},
{EFL_GFX_EVENT_RESIZE, _node_new_geometery_cb},
{EFL_GFX_EVENT_MOVE, _node_new_geometery_cb},
//FIXME this is not correctly NOOOO ELM WIDGETS EVENTS HERE
@@ -681,15 +673,17 @@ _efl_ui_focus_manager_unregister(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data
EOLIAN static void
_efl_ui_focus_manager_redirect_set(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Manager *redirect)
{
+ printf("Now redirect %p\n", redirect);
+
if (pd->redirect == redirect) return;
if (pd->redirect)
- efl_unref(pd->redirect);
+ efl_wref_del(pd->redirect, &pd->redirect);
pd->redirect = redirect;
if (pd->redirect)
- efl_ref(pd->redirect);
+ efl_wref_add(pd->redirect, &pd->redirect);
}
EOLIAN static Efl_Ui_Focus_Manager *
@@ -758,7 +752,8 @@ _iterator_next(Border_Elements_Iterator *it, void **data)
{
for(int i = 0 ;i < NODE_DIRECTIONS_COUNT; i++)
{
- if (!node->graph.directions[i].partners)
+ if (node->type != NODE_TYPE_ONLY_LOGICAL &&
+ !node->graph.directions[i].partners)
{
*data = node->focusable;
return EINA_TRUE;
@@ -1033,9 +1028,12 @@ _efl_ui_focus_manager_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, E
if (pd->redirect)
{
- return efl_ui_focus_manager_move(pd->redirect, direction);
+ candidate = efl_ui_focus_manager_move(pd->redirect, direction);
+ if (!candidate)
+ efl_ui_focus_manager_redirect_set(obj, NULL);
}
- else
+
+ if (!pd->redirect)
{
candidate = efl_ui_focus_manager_request_move(obj, direction);
if (candidate)