boxpointer: reposition after a size change

If the BoxPointer changes size (eg, when opening the "More" section of
the network menu), reposition it to make sure it's still aligned
correctly and still completely on-screen.

This is not the right fix for this problem (and causes the menu to be
drawn in the wrong position for one frame). The right fix would
involve a ClutterConstraint, but that would be more invasive, and can
happen post-3.0.0.

https://bugzilla.gnome.org/show_bug.cgi?id=645647
This commit is contained in:
Dan Winship 2011-03-25 10:04:28 -04:00
parent 31b12635d1
commit 475161f716

View File

@ -2,6 +2,7 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Meta = imports.gi.Meta;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@ -176,6 +177,18 @@ BoxPointer.prototype = {
break; break;
} }
this.bin.allocate(childBox, flags); this.bin.allocate(childBox, flags);
if (this._sourceActor) {
Meta.later_add (Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function () {
// This won't cause a loop if _allocate() was
// called as a result of repositioning, because in
// that case _reposition() will set the same
// coordinates again, which Clutter will just
// ignore.
this._reposition(this._sourceActor, this._gap, this._alignment);
}));
}
}, },
_drawBorder: function(area) { _drawBorder: function(area) {
@ -306,6 +319,14 @@ BoxPointer.prototype = {
// so that we can query the correct size. // so that we can query the correct size.
this.actor.show(); this.actor.show();
this._sourceActor = sourceActor;
this._gap = gap;
this._alignment = alignment;
this._reposition(sourceActor, gap, alignment);
},
_reposition: function(sourceActor, gap, alignment) {
// Position correctly relative to the sourceActor // Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node(); let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());