From: Junseok Kim Date: Wed, 16 Apr 2025 06:01:16 +0000 (+0900) Subject: e_view: Added e_view_reparent_append X-Git-Tag: accepted/tizen/unified/20250612.024607~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b1150775c751f28c8ac9c478d5c9b04dca057913;p=platform%2Fupstream%2Fenlightenment.git e_view: Added e_view_reparent_append Change-Id: I3ba3b827369e5d0ac95bc6c88e7a670e5e0ca625 --- diff --git a/src/bin/core/e_view.c b/src/bin/core/e_view.c index 5c07efb922..a9c832a1a5 100644 --- a/src/bin/core/e_view.c +++ b/src/bin/core/e_view.c @@ -689,6 +689,18 @@ _view_eo_raise(E_View *view) evas_object_raise(view->eo); } +static void +_view_eo_lower(E_View *view) +{ + assert(view->parent); + + if (!view->reorderable) + return; + + if (view->eo) + evas_object_lower(view->eo); +} + E_API void e_view_reparent(E_View *view, E_View_Tree *new_parent) { @@ -725,6 +737,42 @@ e_view_reparent(E_View *view, E_View_Tree *new_parent) wl_signal_emit_mutable(&view->events.restack, view); } +EINTERN void +e_view_reparent_bottom(E_View *view, E_View_Tree *new_parent) +{ + E_View_Tree *ancestor; + + assert(new_parent != NULL); + + if (!view->reorderable) + return; + + if (view->parent == new_parent) + return; + + /* Ensure that a view cannot become its own ancestor */ + for (ancestor = new_parent; ancestor != NULL; ancestor = ancestor->view.parent) + assert(&ancestor->view != view); + + if (view->parent) + e_view_tree_child_remove(view->parent, view); + + view->parent = new_parent; + e_view_tree_child_add_prepend(new_parent, view); + + /* WORKAROUND: doing object stack lower instead of stack update + * In some case, there're stack order mismatch between evas_object and e_view by unknown issue. + * in that situation, _view_eo_stack_update could makes some object place to middle of layer + * even if the object request layer change. + * To ensure the object place top of the layer, call evas_object_lower instad of stack update. + */ + //_view_eo_stack_update(view); + _view_eo_lower(view); + _view_eo_position_update(view); + + wl_signal_emit_mutable(&view->events.restack, view); +} + E_API void e_view_pass_events_set(E_View *view, bool set) { diff --git a/src/bin/core/e_view_intern.h b/src/bin/core/e_view_intern.h index 430db3d9b9..0b17b8f912 100644 --- a/src/bin/core/e_view_intern.h +++ b/src/bin/core/e_view_intern.h @@ -77,11 +77,13 @@ struct _E_View_Tree }; void e_view_init(E_View *view, E_View_Type type, E_View_Impl *impl, Evas_Object *eo, E_View_Tree *parent); +void e_view_reparent_bottom(E_View *view, E_View_Tree *new_parent); void e_view_reorderable_set(E_View *view, bool reorderable); E_View_Tree *e_view_tree_from_view(E_View *view); void e_view_tree_init(E_View_Tree *tree, const E_View_Tree_Impl *impl, E_View_Tree *parent); void e_view_tree_child_add(E_View_Tree *tree, E_View *view); +void e_view_tree_child_add_prepend(E_View_Tree *tree, E_View *view); void e_view_tree_child_remove(E_View_Tree *tree, E_View *view); E_View *e_view_tree_top_get(E_View_Tree *tree); E_View *e_view_tree_bottom_get(E_View_Tree *tree); diff --git a/src/bin/core/e_view_tree.c b/src/bin/core/e_view_tree.c index d5896ba4cf..c7f22c3850 100644 --- a/src/bin/core/e_view_tree.c +++ b/src/bin/core/e_view_tree.c @@ -76,6 +76,15 @@ e_view_tree_child_add(E_View_Tree *tree, E_View *view) tree->impl->child_add(tree, view); } +EINTERN void +e_view_tree_child_add_prepend(E_View_Tree *tree, E_View *view) +{ + wl_list_insert(&tree->children, &view->link); + + if (tree->impl && tree->impl->child_add) + tree->impl->child_add(tree, view); +} + EINTERN void e_view_tree_child_remove(E_View_Tree *tree, E_View *view) { diff --git a/src/bin/inputmgr/e_comp_input.c b/src/bin/inputmgr/e_comp_input.c index b08d94ffca..fb039f5297 100644 --- a/src/bin/inputmgr/e_comp_input.c +++ b/src/bin/inputmgr/e_comp_input.c @@ -114,7 +114,7 @@ EINTERN void e_comp_input_layers_update(E_Comp_Input_Layer_Data *layer_data) e_view_reparent(itc_view, &e_comp_input->layer_tree[layer_data->layer]); break; case E_COMP_INPUT_INLIST_PREPEND: - e_view_reparent(itc_view, &e_comp_input->layer_tree[layer_data->layer]); + e_view_reparent_bottom(itc_view, &e_comp_input->layer_tree[layer_data->layer]); break; case E_COMP_INPUT_INLIST_APPEND_RELATIVE: if (!relative_itc_view) diff --git a/src/bin/windowmgr/e_policy_desk_area.c b/src/bin/windowmgr/e_policy_desk_area.c index a4d76080d4..29409382e6 100644 --- a/src/bin/windowmgr/e_policy_desk_area.c +++ b/src/bin/windowmgr/e_policy_desk_area.c @@ -2143,13 +2143,20 @@ _e_comp_object_layers_add(E_Desk_Area *eda, E_Comp_Object *cw, E_Comp_Object *ab { // prepend means bottom E_View *layer_obj = e_policy_desk_area_layer_obj_get(pdal); - e_view_place_above(view, layer_obj); + if (layer_obj) e_view_place_above(view, layer_obj); + else + { + E_View_Tree *view_tree = e_policy_desk_area_layer_view_tree_get(pdal); + e_view_reparent_bottom(view, view_tree); + e_view_lower_to_bottom(view); + } _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_PREPEND, cw->ec, NULL); } else { E_View_Tree *view_tree = e_policy_desk_area_layer_view_tree_get(pdal); e_view_reparent(view, view_tree); + e_view_raise_to_top(view); _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_APPEND, cw->ec, NULL); } }