wm: avoid initial flickering of child views

When starting testnit with the wm, the child views briefly appear at a
position relative to the top-left corner of the screen until the
top-level view has been positioned by the layouter. This patch keeps
child views invisible until their respective parent views are
positioned.
This commit is contained in:
Norman Feske 2024-09-16 12:34:41 +02:00
parent 75266e467d
commit d565598489

View File

@ -89,6 +89,7 @@ class Wm::Gui::View : private Weak_object<View>, public Rpc_object< ::Gui::View>
Weak_ptr<View> _neighbor_ptr { }; Weak_ptr<View> _neighbor_ptr { };
bool _neighbor_behind { }; bool _neighbor_behind { };
bool _has_alpha; bool _has_alpha;
bool _layouted = false;
void _with_temporary_view_id(View_capability cap, auto const &fn) void _with_temporary_view_id(View_capability cap, auto const &fn)
{ {
@ -208,6 +209,8 @@ class Wm::Gui::View : private Weak_object<View>, public Rpc_object< ::Gui::View>
} }
bool has_alpha() const { return _has_alpha; } bool has_alpha() const { return _has_alpha; }
bool layouted() const { return _layouted; }
}; };
@ -343,6 +346,8 @@ class Wm::Gui::Top_level_view : public View, private List<Top_level_view>::Eleme
_content_geometry = rect; _content_geometry = rect;
_layouted = true;
if (position_changed) if (position_changed)
_input_origin_changed_handler.input_origin_changed(); _input_origin_changed_handler.input_origin_changed();
} }
@ -409,7 +414,14 @@ class Wm::Gui::Child_view : public View, private List<Child_view>::Element
_neighbor_ptr = neighbor_ptr; _neighbor_ptr = neighbor_ptr;
_neighbor_behind = behind; _neighbor_behind = behind;
_apply_view_config(); auto parent_position_known = [&]
{
Locked_ptr<View> parent(_parent);
return parent.valid() && parent->layouted();
};
if (parent_position_known())
_apply_view_config();
} }
bool belongs_to_win_id(Window_registry::Id id) const override bool belongs_to_win_id(Window_registry::Id id) const override
@ -456,10 +468,12 @@ class Wm::Gui::Child_view : public View, private List<Child_view>::Element
_visible = true; _visible = true;
}); });
if (_neighbor_ptr == _parent) if (parent->layouted()) {
_unsynchronized_apply_view_config(parent); if (_neighbor_ptr == _parent)
else _unsynchronized_apply_view_config(parent);
_apply_view_config(); else
_apply_view_config();
}
return result; return result;
} }