window layouter: restore screen tiling

This commit fixes a regression introduced by "window_layouter: add
dynamic screen handling", rendering the sub-division of screens in
columns and row unusable. The said commit removed a condition needed
for the correct window placement. This patch restores the condition.

Issues #3646
This commit is contained in:
Norman Feske 2020-03-27 15:01:41 +01:00 committed by Christian Helmuth
parent 4dd110ce5e
commit 40c21b6d0f
3 changed files with 28 additions and 13 deletions

View File

@ -105,6 +105,9 @@ struct Window_layouter::Main : Operations,
_assign_list.for_each([&] (Assign &assign) { _assign_list.for_each([&] (Assign &assign) {
_target_list.for_each([&] (Target const &target) { _target_list.for_each([&] (Target const &target) {
if (target.name() != assign.target_name())
return;
assign.for_each_member([&] (Assign::Member &member) { assign.for_each_member([&] (Assign::Member &member) {
member.window.floating(assign.floating()); member.window.floating(assign.floating());

View File

@ -26,19 +26,23 @@ class Window_layouter::Target : Noncopyable
typedef String<64> Name; typedef String<64> Name;
enum class Visible { YES, NO };
private: private:
Name const _name; Name const _name;
unsigned const _layer; unsigned const _layer;
Rect const _geometry; Rect const _geometry;
bool const _visible;
public: public:
Target(Xml_node target, Rect geometry) Target(Xml_node target, Rect geometry, Visible visible)
: :
_name (target.attribute_value("name", Name())), _name (target.attribute_value("name", Name())),
_layer(target.attribute_value("layer", 9999UL)), _layer(target.attribute_value("layer", 9999UL)),
_geometry(geometry) _geometry(geometry),
_visible(visible == Visible::YES)
{ } { }
/* needed to use class as 'Registered<Target>' */ /* needed to use class as 'Registered<Target>' */
@ -47,6 +51,7 @@ class Window_layouter::Target : Noncopyable
Name name() const { return _name; } Name name() const { return _name; }
unsigned layer() const { return _layer; } unsigned layer() const { return _layer; }
Rect geometry() const { return _geometry; } Rect geometry() const { return _geometry; }
bool visible() const { return _visible; }
}; };
#endif /* _TARGET_H_ */ #endif /* _TARGET_H_ */

View File

@ -39,7 +39,8 @@ class Window_layouter::Target_list
* *
* \param row true of 'node' is a row, false if 'node' is a column * \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(); 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), : Rect(Point(avail.x1(), px_pos),
Area(avail.w(), px_size)); 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()) if (child.attribute_value("name", Target::Name()).valid())
new (_alloc) new (_alloc)
Registered<Target>(_targets, child, sub_rect); Registered<Target>(_targets, child, sub_rect, visible);
px_pos += px_size; px_pos += px_size;
}); });
@ -158,6 +159,9 @@ class Window_layouter::Target_list
if (target.layer() != layer) if (target.layer() != layer)
return; return;
if (!target.visible())
return;
/* found target area, iterate though all assigned windows */ /* found target area, iterate though all assigned windows */
assign.for_each_member([&] (Assign::Member const &member) { assign.for_each_member([&] (Assign::Member const &member) {
member.window.generate(xml); }); member.window.generate(xml); });
@ -185,18 +189,21 @@ class Window_layouter::Target_list
_rules.construct(_alloc, rules); _rules.construct(_alloc, rules);
if (!rules.has_sub_node("screen")) /* targets are only visible on first screen */
return; 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()) if (screen.attribute_value("name", Target::Name()).valid())
new (_alloc) new (_alloc)
Registered<Target>(_targets, screen, avail); Registered<Target>(_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 void gen_layout(Xml_generator &xml, Assign_list const &assignments) const