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)
{
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)
{
};
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);
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)
{
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)
{
// 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);
}
}