diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-07 17:26:41 +0200 |
---|---|---|
committer | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-07 17:26:41 +0200 |
commit | 1dde64922c9e910b19ede558e0b083479ae192f4 (patch) | |
tree | 9d34e93c1c9b2fb9b35c6434b9c5840c649a32f6 | |
parent | 0ffc51aee05d507afe4f4d78c39a8c0c86682a10 (diff) | |
download | efl-devs/bu5hm4n/focus_optimize.tar.gz |
-rw-r--r-- | src/benchmarks/elementary/item_container.c | 2 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_widget.c | 56 | ||||
-rw-r--r-- | src/lib/elementary/elm_widget.h | 2 |
3 files changed, 41 insertions, 19 deletions
diff --git a/src/benchmarks/elementary/item_container.c b/src/benchmarks/elementary/item_container.c index 982df1df81..e8369d252f 100644 --- a/src/benchmarks/elementary/item_container.c +++ b/src/benchmarks/elementary/item_container.c @@ -76,7 +76,7 @@ efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) efl_ui_collection_position_manager_set(efl_added, list)); efl_content_set(win, item_container); - printf("Building 5000 objects\n"); + printf("Building 5000 objects %d\n", getpid()); for (int i = 0; i < 5000; ++i) { Eo *il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, item_container); diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index e99465b856..ab9e80e9c7 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -184,7 +184,6 @@ _elm_scrollable_is(const Evas_Object *obj) static void _on_sub_obj_del(void *data, const Efl_Event *event); static void _propagate_event(void *data, const Efl_Event *eo_event); -static void _elm_widget_focus_tree_unfocusable_handle(Eo *obj); static void _elm_widget_shadow_update(Efl_Ui_Widget *obj); EFL_CALLBACKS_ARRAY_DEFINE(elm_widget_subitems_callbacks, @@ -273,7 +272,10 @@ _candidacy_exam(Eo *obj) Elm_Widget_Smart_Data *wid_pd; wid_pd = efl_data_scope_get(wid, MY_CLASS); - do { + + if (wid_pd->disabled > 0) return EINA_TRUE; + if (wid_pd->tree_unfocusable > 0) return EINA_TRUE; +/* do { if (wid_pd->disabled) return EINA_TRUE; if (wid_pd->tree_unfocusable) return EINA_TRUE; @@ -293,9 +295,9 @@ _candidacy_exam(Eo *obj) } } - } while (1); + } while (1);*/ - return !efl_isa(top, EFL_UI_WIN_CLASS); + return EINA_FALSE; } static void _full_eval(Eo *obj, Elm_Widget_Smart_Data *pd); @@ -1675,6 +1677,15 @@ elm_widget_child_can_focus_get(const Eo *obj) return sd->logical.child_count > 0; } + +static int +_tree_unfocusable_counter_get(Eo *widget) +{ + ELM_WIDGET_DATA_GET_OR_RETURN(widget, pd, -1); + + return pd->tree_unfocusable; +} + /** * @internal * @@ -1693,16 +1704,33 @@ elm_widget_child_can_focus_get(const Eo *obj) EAPI void elm_widget_tree_unfocusable_set(Eo *obj, Eina_Bool tree_unfocusable) { - Elm_Widget_Smart_Data *sd = efl_data_scope_safe_get(obj, MY_CLASS); - if (!sd) return; + Efl_Ui_Widget *subs; + Eina_List *n; + Elm_Widget_Smart_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS); + if (!pd) return; + int distance, parent_counter = (pd->parent_obj ? _tree_unfocusable_counter_get(pd->parent_obj) : 0); - tree_unfocusable = !!tree_unfocusable; - if (sd->tree_unfocusable == tree_unfocusable) return; - sd->tree_unfocusable = tree_unfocusable; - _elm_widget_focus_tree_unfocusable_handle(obj); + if (tree_unfocusable) + pd->tree_unfocusable ++; + else + pd->tree_unfocusable --; + + distance = pd->disabled - parent_counter; + + if ((distance < 0) || (distance > 1)) + { + distance = MAX(MIN(tree_unfocusable, 1), 0); + pd->disabled = parent_counter + distance; + } + + EINA_LIST_FOREACH(pd->subobjs, n, subs) + { + if (efl_isa(subs, EFL_UI_WIDGET_CLASS)) + efl_ui_widget_disabled_set(subs, elm_widget_tree_unfocusable_get(obj)); + } //focus state eval on all children - _elm_widget_full_eval_children(obj, sd); + _elm_widget_full_eval_children(obj, pd); } /** @@ -2910,12 +2938,6 @@ elm_widget_focus_mouse_up_handle(Eo *obj) } } -static void -_elm_widget_focus_tree_unfocusable_handle(Eo *obj EINA_UNUSED) -{ - //FIXME -} - /* * @internal * diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h index dfdfdb83f7..68b45ca8d3 100644 --- a/src/lib/elementary/elm_widget.h +++ b/src/lib/elementary/elm_widget.h @@ -355,6 +355,7 @@ typedef struct _Elm_Widget_Smart_Data int child_drag_x_locked; int child_drag_y_locked; int disabled; + int tree_unfocusable; Eina_Inlist *translate_strings; Eina_List *focus_chain; @@ -397,7 +398,6 @@ typedef struct _Elm_Widget_Smart_Data Eina_Bool can_focus : 1; Eina_Bool focused : 1; Eina_Bool top_win_focused : 1; - Eina_Bool tree_unfocusable : 1; Eina_Bool focus_move_policy_auto_mode : 1; /* This is TRUE by default */ Eina_Bool highlight_ignore : 1; Eina_Bool highlight_in_theme : 1; |