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) {
_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());

View File

@ -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<Target>' */
@ -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_ */

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
*/
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<Target>(_targets, child, sub_rect);
Registered<Target>(_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<Target>(_targets, screen, avail);
if (screen.attribute_value("name", Target::Name()).valid())
new (_alloc)
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