e_view: Added e_view_reparent_append 38/325438/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 16 Apr 2025 06:01:16 +0000 (15:01 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Jun 2025 09:37:49 +0000 (18:37 +0900)
Change-Id: I3ba3b827369e5d0ac95bc6c88e7a670e5e0ca625

src/bin/core/e_view.c
src/bin/core/e_view_intern.h
src/bin/core/e_view_tree.c
src/bin/inputmgr/e_comp_input.c
src/bin/windowmgr/e_policy_desk_area.c

index 5c07efb922aca7f5e576ef176c01e29d8f5f82c4..a9c832a1a554c0164169a6d01991adc6f7a8508e 100644 (file)
@@ -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)
 {
index 430db3d9b9a511815d377b8ecbe432912dcd10a7..0b17b8f9125419d01b9edfc881674e10dc1cc6bc 100644 (file)
@@ -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);
index d5896ba4cf05c35ba6277804869924a1674716e0..c7f22c38502d4ab692014fecb2d8016b958c261f 100644 (file)
@@ -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)
 {
index b08d94ffca33ef7012c9c20c0c2bf73d241723b7..fb039f52974640dd09acddf7d600611a3fac4da4 100644 (file)
@@ -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)
index a4d76080d49928d98b282b5f77fb34a29931ac43..29409382e6daeb97f65f0e5a30c9bb8d41d4d967 100644 (file)
@@ -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);
           }
      }