mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-21 10:01:57 +00:00
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) {
|
||||
_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());
|
||||
|
@ -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_ */
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user