diff --git a/repos/gems/src/app/window_layouter/main.cc b/repos/gems/src/app/window_layouter/main.cc index 65990bde3..28ae45779 100644 --- a/repos/gems/src/app/window_layouter/main.cc +++ b/repos/gems/src/app/window_layouter/main.cc @@ -105,6 +105,9 @@ struct Window_layouter::Main : Operations, _assign_list.for_each([&] (Assign &assign) { _target_list.for_each([&] (Target const &target) { + if (target.name() != assign.target_name()) + return; + assign.for_each_member([&] (Assign::Member &member) { member.window.floating(assign.floating()); diff --git a/repos/gems/src/app/window_layouter/target.h b/repos/gems/src/app/window_layouter/target.h index a8272a245..6ae9b1cb8 100644 --- a/repos/gems/src/app/window_layouter/target.h +++ b/repos/gems/src/app/window_layouter/target.h @@ -26,19 +26,23 @@ class Window_layouter::Target : Noncopyable typedef String<64> Name; + enum class Visible { YES, NO }; + private: Name const _name; unsigned const _layer; Rect const _geometry; + bool const _visible; public: - Target(Xml_node target, Rect geometry) + Target(Xml_node target, Rect geometry, Visible visible) : _name (target.attribute_value("name", Name())), _layer(target.attribute_value("layer", 9999UL)), - _geometry(geometry) + _geometry(geometry), + _visible(visible == Visible::YES) { } /* needed to use class as 'Registered' */ @@ -47,6 +51,7 @@ class Window_layouter::Target : Noncopyable Name name() const { return _name; } unsigned layer() const { return _layer; } Rect geometry() const { return _geometry; } + bool visible() const { return _visible; } }; #endif /* _TARGET_H_ */ diff --git a/repos/gems/src/app/window_layouter/target_list.h b/repos/gems/src/app/window_layouter/target_list.h index d482a6420..579775864 100644 --- a/repos/gems/src/app/window_layouter/target_list.h +++ b/repos/gems/src/app/window_layouter/target_list.h @@ -39,7 +39,8 @@ class Window_layouter::Target_list * * \param row true of 'node' is a row, false if 'node' is a column */ - void _process_rec(Xml_node node, Rect avail, bool row) + void _process_rec(Xml_node node, Rect avail, bool row, + Target::Visible visible) { unsigned long const avail_px = row ? avail.w() : avail.h(); @@ -118,11 +119,11 @@ class Window_layouter::Target_list : Rect(Point(avail.x1(), px_pos), Area(avail.w(), px_size)); - _process_rec(child, sub_rect, !row); + _process_rec(child, sub_rect, !row, visible); if (child.attribute_value("name", Target::Name()).valid()) new (_alloc) - Registered(_targets, child, sub_rect); + Registered(_targets, child, sub_rect, visible); px_pos += px_size; }); @@ -158,6 +159,9 @@ class Window_layouter::Target_list if (target.layer() != layer) return; + if (!target.visible()) + return; + /* found target area, iterate though all assigned windows */ assign.for_each_member([&] (Assign::Member const &member) { member.window.generate(xml); }); @@ -185,18 +189,21 @@ class Window_layouter::Target_list _rules.construct(_alloc, rules); - if (!rules.has_sub_node("screen")) - return; + /* targets are only visible on first screen */ + Target::Visible visible = Target::Visible::YES; - Xml_node const screen = rules.sub_node("screen"); + rules.for_each_sub_node("screen", [&] (Xml_node const &screen) { - Rect const avail(Point(0, 0), screen_size); + Rect const avail(Point(0, 0), screen_size); - if (screen.attribute_value("name", Target::Name()).valid()) - new (_alloc) - Registered(_targets, screen, avail); + if (screen.attribute_value("name", Target::Name()).valid()) + new (_alloc) + Registered(_targets, screen, avail, visible); - _process_rec(screen, avail, true); + _process_rec(screen, avail, true, visible); + + visible = Target::Visible::NO; + }); } void gen_layout(Xml_generator &xml, Assign_list const &assignments) const