overview: Compensate for the window's invisible borders
https://bugzilla.gnome.org/show_bug.cgi?id=656335
This commit is contained in:
parent
1dee10c575
commit
e5bc3a2ba8
@ -94,22 +94,38 @@ function WindowClone(realWindow) {
|
|||||||
|
|
||||||
WindowClone.prototype = {
|
WindowClone.prototype = {
|
||||||
_init : function(realWindow) {
|
_init : function(realWindow) {
|
||||||
this.actor = new Clutter.Clone({ source: realWindow.get_texture(),
|
|
||||||
reactive: true,
|
|
||||||
x: realWindow.x,
|
|
||||||
y: realWindow.y });
|
|
||||||
this.actor._delegate = this;
|
|
||||||
this.realWindow = realWindow;
|
this.realWindow = realWindow;
|
||||||
this.metaWindow = realWindow.meta_window;
|
this.metaWindow = realWindow.meta_window;
|
||||||
this.metaWindow._delegate = this;
|
this.metaWindow._delegate = this;
|
||||||
this.origX = realWindow.x;
|
|
||||||
this.origY = realWindow.y;
|
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||||
|
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture(),
|
||||||
|
x: -borderX,
|
||||||
|
y: -borderY });
|
||||||
|
|
||||||
|
this.origX = realWindow.x + borderX;
|
||||||
|
this.origY = realWindow.y + borderY;
|
||||||
|
|
||||||
|
let outerRect = realWindow.meta_window.get_outer_rect();
|
||||||
|
|
||||||
|
// The MetaShapedTexture that we clone has a size that includes
|
||||||
|
// the invisible border; this is inconvenient; rather than trying
|
||||||
|
// to compensate all over the place we insert a ClutterGroup into
|
||||||
|
// the hierarchy that is sized to only the visible portion.
|
||||||
|
this.actor = new Clutter.Group({ reactive: true,
|
||||||
|
x: this.origX,
|
||||||
|
y: this.origY,
|
||||||
|
width: outerRect.width,
|
||||||
|
height: outerRect.height });
|
||||||
|
|
||||||
|
this.actor.add_actor(this._windowClone);
|
||||||
|
|
||||||
|
this.actor._delegate = this;
|
||||||
|
|
||||||
this._stackAbove = null;
|
this._stackAbove = null;
|
||||||
|
|
||||||
this._sizeChangedId = this.realWindow.connect('size-changed', Lang.bind(this, function() {
|
this._sizeChangedId = this.realWindow.connect('size-changed',
|
||||||
this.emit('size-changed');
|
Lang.bind(this, this._onRealWindowSizeChanged));
|
||||||
}));
|
|
||||||
this._realWindowDestroyId = this.realWindow.connect('destroy',
|
this._realWindowDestroyId = this.realWindow.connect('destroy',
|
||||||
Lang.bind(this, this._disconnectRealWindowSignals));
|
Lang.bind(this, this._disconnectRealWindowSignals));
|
||||||
|
|
||||||
@ -176,6 +192,32 @@ WindowClone.prototype = {
|
|||||||
this._realWindowDestroyId = 0;
|
this._realWindowDestroyId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getInvisibleBorderPadding: function() {
|
||||||
|
// We need to adjust the position of the actor because of the
|
||||||
|
// consequences of invisible borders -- in reality, the texture
|
||||||
|
// has an extra set of "padding" around it that we need to trim
|
||||||
|
// down.
|
||||||
|
|
||||||
|
// The outer rect paradoxically is the smaller rectangle,
|
||||||
|
// containing the positions of the visible frame. The input
|
||||||
|
// rect contains everything, including the invisible border
|
||||||
|
// padding.
|
||||||
|
let outerRect = this.metaWindow.get_outer_rect();
|
||||||
|
let inputRect = this.metaWindow.get_input_rect();
|
||||||
|
let [borderX, borderY] = [outerRect.x - inputRect.x,
|
||||||
|
outerRect.y - inputRect.y];
|
||||||
|
|
||||||
|
return [borderX, borderY];
|
||||||
|
},
|
||||||
|
|
||||||
|
_onRealWindowSizeChanged: function() {
|
||||||
|
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||||
|
let outerRect = this.metaWindow.get_outer_rect();
|
||||||
|
this.actor.set_size(outerRect.width, outerRect.height);
|
||||||
|
this._windowClone.set_position(-borderX, -borderY);
|
||||||
|
this.emit('size-changed');
|
||||||
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._disconnectRealWindowSignals();
|
this._disconnectRealWindowSignals();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user