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:
parent
4dd110ce5e
commit
40c21b6d0f
|
@ -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());
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue