layout: Don't always extend struts to the screen edge

NetWM struts are defined in terms of screen edges (rather than monitor
edges), which works poorly with vertical monitor layouts (as it renders
entire monitors unusable). Don't extend struts in those cases.

https://bugzilla.gnome.org/show_bug.cgi?id=663690
This commit is contained in:
Florian Müllner 2014-04-15 17:24:07 +02:00
parent b4a48a7644
commit 76c4ec8ee4

View File

@ -1018,19 +1018,39 @@ const LayoutManager = new Lang.Class({
continue; continue;
// Ensure that the strut rects goes all the way to the screen edge, // Ensure that the strut rects goes all the way to the screen edge,
// as this really what mutter expects. // as this really what mutter expects. However skip this step
// in cases where this would render an entire monitor unusable.
switch (side) { switch (side) {
case Meta.Side.TOP: case Meta.Side.TOP:
y1 = 0; let hasMonitorsAbove = this.monitors.some(Lang.bind(this,
function(mon) {
return this._isAboveOrBelowPrimary(mon) &&
mon.y < primary.y;
}));
if (!hasMonitorsAbove)
y1 = 0;
break; break;
case Meta.Side.BOTTOM: case Meta.Side.BOTTOM:
y2 = global.screen_height; if (this.primaryIndex == this.bottomIndex)
y2 = global.screen_height;
break; break;
case Meta.Side.LEFT: case Meta.Side.LEFT:
x1 = 0; let hasMonitorsLeft = this.monitors.some(Lang.bind(this,
function(mon) {
return !this._isAboveOrBelowPrimary(mon) &&
mon.x < primary.x;
}));
if (!hasMonitorsLeft)
x1 = 0;
break; break;
case Meta.Side.RIGHT: case Meta.Side.RIGHT:
x2 = global.screen_width; let hasMonitorsRight = this.monitors.some(Lang.bind(this,
function(mon) {
return !this._isAboveOrBelowPrimary(mon) &&
mon.x > primary.x;
}));
if (!hasMonitorsRight)
x2 = global.screen_width;
break; break;
} }